From: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Date: Mon Jul 3 21:34:16 2006 +0300

Input: ads7846: switch to hrtimer

Use hrtimer instead of the normal timer, since it provides better
sampling resolution. This will:

 - avoid a problem where we have a 1 jiffy poll period and
   dynamic tick on
 - utilize high resolution HW clocks when they are added to
   the hrtimer framework

Signed-off-by: Imre Deak <[EMAIL PROTECTED]>
Signed-off-by: Juha Yrjola <[EMAIL PROTECTED]>
Signed-off-by: David Brownell <[EMAIL PROTECTED]>

Index: osk/drivers/input/touchscreen/ads7846.c
===================================================================
--- osk.orig/drivers/input/touchscreen/ads7846.c        2006-12-22 
11:08:44.000000000 -0800
+++ osk/drivers/input/touchscreen/ads7846.c     2006-12-22 11:08:45.000000000 
-0800
@@ -55,7 +55,8 @@
  * files.
  */
 
-#define        TS_POLL_PERIOD  msecs_to_jiffies(10)
+#define TS_POLL_DELAY  (1 * 1000000)   /* ns delay before the first sample */
+#define TS_POLL_PERIOD (5 * 1000000)   /* ns delay between samples */
 
 /* this driver doesn't aim at the peak continuous sample rate */
 #define        SAMPLE_BITS     (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after 
*/)
@@ -101,7 +102,7 @@ struct ads7846 {
        u16                     debounce_rep;
 
        spinlock_t              lock;
-       struct timer_list       timer;          /* P: lock */
+       struct hrtimer          timer;
        unsigned                pendown:1;      /* P: lock */
        unsigned                pending:1;      /* P: lock */
 // FIXME remove "irq_disabled"
@@ -470,10 +471,12 @@ static void ads7846_rx(void *ads)
                Rt = 0;
 
        /* Sample found inconsistent by debouncing or pressure is beyond
-       * the maximum. Don't report it to user space, repeat at least
-       * once more the measurement */
+        * the maximum. Don't report it to user space, repeat at least
+        * once more the measurement
+        */
        if (ts->tc.ignore || Rt > ts->pressure_max) {
-               mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
+               hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
+                             HRTIMER_REL);
                return;
        }
 
@@ -515,7 +518,7 @@ static void ads7846_rx(void *ads)
        spin_lock_irqsave(&ts->lock, flags);
 
        ts->pendown = (Rt != 0);
-       mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
+       hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), HRTIMER_REL);
 
        spin_unlock_irqrestore(&ts->lock, flags);
 }
@@ -606,9 +609,9 @@ static void ads7846_rx_val(void *ads)
                                status);
 }
 
-static void ads7846_timer(unsigned long handle)
+static int ads7846_timer(struct hrtimer *handle)
 {
-       struct ads7846  *ts = (void *)handle;
+       struct ads7846  *ts = container_of(handle, struct ads7846, timer);
        int             status = 0;
 
        spin_lock_irq(&ts->lock);
@@ -630,6 +633,7 @@ static void ads7846_timer(unsigned long 
        }
 
        spin_unlock_irq(&ts->lock);
+       return HRTIMER_NORESTART;
 }
 
 static irqreturn_t ads7846_irq(int irq, void *handle)
@@ -648,7 +652,8 @@ static irqreturn_t ads7846_irq(int irq, 
                        ts->irq_disabled = 1;
                        disable_irq(ts->spi->irq);
                        ts->pending = 1;
-                       mod_timer(&ts->timer, jiffies);
+                       hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
+                                       HRTIMER_REL);
                }
        }
        spin_unlock_irqrestore(&ts->lock, flags);
@@ -790,8 +795,7 @@ static int __devinit ads7846_probe(struc
        ts->spi = spi;
        ts->input = input_dev;
 
-       init_timer(&ts->timer);
-       ts->timer.data = (unsigned long) ts;
+       hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_REL);
        ts->timer.function = ads7846_timer;
 
        spin_lock_init(&ts->lock);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to