Input: wm97xx - mark channels which need pen_down
authorWolfram Sang <w.sang@pengutronix.de>
Tue, 5 Jul 2011 02:22:01 +0000 (19:22 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 5 Jul 2011 02:31:47 +0000 (19:31 -0700)
Currently, battery drivers also use poll_sample() provided by the
wm97xx-core but this code always checks if the pen is down. Mark the
channels which really need this (i.e. for the touchscreen) with the
PEN_DOWN bit, and skip the checks otherwise. Now, the battery channels
can always be read.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/touchscreen/wm9705.c
drivers/input/touchscreen/wm9712.c
drivers/input/touchscreen/wm9713.c

index 363d61dbe83c0687d794b1ab754cd692629f96e5..adc13a523ab5f250a929d4f6b0997ad7891780ea 100644 (file)
@@ -215,8 +215,9 @@ static inline int is_pden(struct wm97xx *wm)
 static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
 {
        int timeout = 5 * delay;
+       bool wants_pen = adcsel & WM97XX_PEN_DOWN;
 
-       if (!wm->pen_probably_down) {
+       if (wants_pen && !wm->pen_probably_down) {
                u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
                if (!(data & WM97XX_PEN_DOWN))
                        return RC_PENUP;
@@ -260,7 +261,7 @@ static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                return RC_PENUP;
        }
 
-       if (!(*sample & WM97XX_PEN_DOWN)) {
+       if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) {
                wm->pen_probably_down = 0;
                return RC_PENUP;
        }
@@ -275,14 +276,14 @@ static int wm9705_poll_touch(struct wm97xx *wm, struct wm97xx_data *data)
 {
        int rc;
 
-       rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X, &data->x);
+       rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN, &data->x);
        if (rc != RC_VALID)
                return rc;
-       rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y);
+       rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN, &data->y);
        if (rc != RC_VALID)
                return rc;
        if (pil) {
-               rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p);
+               rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN, &data->p);
                if (rc != RC_VALID)
                        return rc;
        } else
index d26093f479d15366f75ed33a9aed1796071676ac..6e743e3dfda4a54900d12c7fd9a9a567d80d7751 100644 (file)
@@ -255,8 +255,9 @@ static inline int is_pden(struct wm97xx *wm)
 static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
 {
        int timeout = 5 * delay;
+       bool wants_pen = adcsel & WM97XX_PEN_DOWN;
 
-       if (!wm->pen_probably_down) {
+       if (wants_pen && !wm->pen_probably_down) {
                u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
                if (!(data & WM97XX_PEN_DOWN))
                        return RC_PENUP;
@@ -300,7 +301,7 @@ static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                return RC_PENUP;
        }
 
-       if (!(*sample & WM97XX_PEN_DOWN)) {
+       if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) {
                wm->pen_probably_down = 0;
                return RC_PENUP;
        }
@@ -385,16 +386,18 @@ static int wm9712_poll_touch(struct wm97xx *wm, struct wm97xx_data *data)
                if (rc != RC_VALID)
                        return rc;
        } else {
-               rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x);
+               rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN,
+                                       &data->x);
                if (rc != RC_VALID)
                        return rc;
 
-               rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y);
+               rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN,
+                                       &data->y);
                if (rc != RC_VALID)
                        return rc;
 
                if (pil && !five_wire) {
-                       rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES,
+                       rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN,
                                                &data->p);
                        if (rc != RC_VALID)
                                return rc;
index a7558015429b8d8e9c80639237505e698d10a054..7405353199d7353e31e1bfac4b2f39db3b222fc3 100644 (file)
@@ -261,8 +261,9 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
 {
        u16 dig1;
        int timeout = 5 * delay;
+       bool wants_pen = adcsel & WM97XX_PEN_DOWN;
 
-       if (!wm->pen_probably_down) {
+       if (wants_pen && !wm->pen_probably_down) {
                u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
                if (!(data & WM97XX_PEN_DOWN))
                        return RC_PENUP;
@@ -310,7 +311,7 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                return RC_PENUP;
        }
 
-       if (!(*sample & WM97XX_PEN_DOWN)) {
+       if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) {
                wm->pen_probably_down = 0;
                return RC_PENUP;
        }
@@ -400,14 +401,14 @@ static int wm9713_poll_touch(struct wm97xx *wm, struct wm97xx_data *data)
                if (rc != RC_VALID)
                        return rc;
        } else {
-               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_X, &data->x);
+               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN, &data->x);
                if (rc != RC_VALID)
                        return rc;
-               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y);
+               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN, &data->y);
                if (rc != RC_VALID)
                        return rc;
                if (pil) {
-                       rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_PRES,
+                       rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN,
                                                &data->p);
                        if (rc != RC_VALID)
                                return rc;