Input: wm97xx - refactor channel selection in poll_sample()
authorWolfram Sang <w.sang@pengutronix.de>
Tue, 5 Jul 2011 02:22:00 +0000 (19:22 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 5 Jul 2011 02:31:38 +0000 (19:31 -0700)
The current implementation of poll_sample() has the problem that one of
its arguments, the channel to be selected, differs from wm9713 to other
variants. This parameter gets passed to the (currently unused)
mach-specific functions pre_sample() and post_sample() which thus have
to deal with codec-specific differences. Refactor the routine so that
the argument to poll_sample() is generic for all codecs and do necessary
conversions only in the codec-specific driver. The outcome even uses
less code and removes the non-standard use of the PEN_DOWN bit to mark
the AUX-channels.

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
include/linux/wm97xx.h

index 98e61175d3f516ae23ca39de24435426e2bd5298..363d61dbe83c0687d794b1ab754cd692629f96e5 100644 (file)
@@ -224,13 +224,10 @@ static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
        }
 
        /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-
        if (wm->mach_ops && wm->mach_ops->pre_sample)
                wm->mach_ops->pre_sample(adcsel);
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1,
-                        adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
+       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK)
+                               | WM97XX_POLL | WM97XX_DELAY(delay));
 
        /* wait 3 AC97 time slots + delay for conversion */
        poll_delay(delay);
@@ -256,9 +253,10 @@ static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                wm->mach_ops->post_sample(adcsel);
 
        /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel,
-               *sample & WM97XX_ADCSEL_MASK);
+       if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
+               dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
+                       adcsel & WM97XX_ADCSEL_MASK,
+                       *sample & WM97XX_ADCSEL_MASK);
                return RC_PENUP;
        }
 
index 2bc2fb801009d47211e6f4f6bc4d0a987c44a3a2..d26093f479d15366f75ed33a9aed1796071676ac 100644 (file)
@@ -264,13 +264,10 @@ static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
        }
 
        /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-
        if (wm->mach_ops && wm->mach_ops->pre_sample)
                wm->mach_ops->pre_sample(adcsel);
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1,
-                        adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
+       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK)
+                               | WM97XX_POLL | WM97XX_DELAY(delay));
 
        /* wait 3 AC97 time slots + delay for conversion */
        poll_delay(delay);
@@ -296,9 +293,10 @@ static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                wm->mach_ops->post_sample(adcsel);
 
        /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel,
-               *sample & WM97XX_ADCSEL_MASK);
+       if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
+               dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
+                       adcsel & WM97XX_ADCSEL_MASK,
+                       *sample & WM97XX_ADCSEL_MASK);
                return RC_PENUP;
        }
 
index 13cd9d1fa07a2dadef5a7563e731611c558838b0..a7558015429b8d8e9c80639237505e698d10a054 100644 (file)
@@ -270,15 +270,14 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
        }
 
        /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = 1 << ((adcsel & 0x7fff) + 3);
-
        dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1);
        dig1 &= ~WM9713_ADCSEL_MASK;
+       /* WM97XX_ADCSEL_* channels need to be converted to WM9713 format */
+       dig1 |= 1 << ((adcsel & WM97XX_ADCSEL_MASK) >> 12);
 
        if (wm->mach_ops && wm->mach_ops->pre_sample)
                wm->mach_ops->pre_sample(adcsel);
-       wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel | WM9713_POLL);
+       wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL);
 
        /* wait 3 AC97 time slots + delay for conversion */
        poll_delay(delay);
@@ -304,8 +303,9 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
                wm->mach_ops->post_sample(adcsel);
 
        /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != ffs(adcsel >> 1) << 12) {
-               dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel,
+       if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
+               dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
+                       adcsel & WM97XX_ADCSEL_MASK,
                        *sample & WM97XX_ADCSEL_MASK);
                return RC_PENUP;
        }
@@ -400,14 +400,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, WM9713_ADCSEL_X, &data->x);
+               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_X, &data->x);
                if (rc != RC_VALID)
                        return rc;
-               rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y);
+               rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y);
                if (rc != RC_VALID)
                        return rc;
                if (pil) {
-                       rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES,
+                       rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_PRES,
                                                &data->p);
                        if (rc != RC_VALID)
                                return rc;
index 10b9e614fccdd69dbbbe685e9aaeae9bc9a1a16b..fd98bb968219f19724b84d19202888b6e564d26d 100644 (file)
 #define WM97XX_ADCSEL_X                0x1000  /* x coord measurement */
 #define WM97XX_ADCSEL_Y                0x2000  /* y coord measurement */
 #define WM97XX_ADCSEL_PRES     0x3000  /* pressure measurement */
+#define WM97XX_AUX_ID1         0x4000
+#define WM97XX_AUX_ID2         0x5000
+#define WM97XX_AUX_ID3         0x6000
+#define WM97XX_AUX_ID4         0x7000
 #define WM97XX_ADCSEL_MASK     0x7000  /* ADC selection mask */
 #define WM97XX_COO             0x0800  /* enable coordinate mode */
 #define WM97XX_CTC             0x0400  /* enable continuous mode */
 #define WM97XX_RPR             0x2000  /* wake up on pen down */
 #define WM97XX_PEN_DOWN                0x8000  /* pen is down */
 
-#define WM97XX_AUX_ID1         0x8001
-#define WM97XX_AUX_ID2         0x8002
-#define WM97XX_AUX_ID3         0x8003
-#define WM97XX_AUX_ID4         0x8004
-
-
 /* WM9712 Bits */
 #define WM9712_45W             0x1000  /* set for 5-wire touchscreen */
 #define WM9712_PDEN            0x0800  /* measure only when pen down */