aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2011-07-04 22:22:00 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-07-04 22:31:38 -0400
commitc8f205258bc8942e79cd37ebc1c8ec4652a1a501 (patch)
treef8851068e51f6b9575ef9778c7f24f4ba1a9aba3
parent2456689b3b11ddecc091cd5f00b9adea6a9854cf (diff)
Input: wm97xx - refactor channel selection in poll_sample()
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>
-rw-r--r--drivers/input/touchscreen/wm9705.c14
-rw-r--r--drivers/input/touchscreen/wm9712.c14
-rw-r--r--drivers/input/touchscreen/wm9713.c18
-rw-r--r--include/linux/wm97xx.h10
4 files changed, 25 insertions, 31 deletions
diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c
index 98e61175d3f5..363d61dbe83c 100644
--- a/drivers/input/touchscreen/wm9705.c
+++ b/drivers/input/touchscreen/wm9705.c
@@ -224,13 +224,10 @@ static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
224 } 224 }
225 225
226 /* set up digitiser */ 226 /* set up digitiser */
227 if (adcsel & 0x8000)
228 adcsel = ((adcsel & 0x7fff) + 3) << 12;
229
230 if (wm->mach_ops && wm->mach_ops->pre_sample) 227 if (wm->mach_ops && wm->mach_ops->pre_sample)
231 wm->mach_ops->pre_sample(adcsel); 228 wm->mach_ops->pre_sample(adcsel);
232 wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 229 wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK)
233 adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); 230 | WM97XX_POLL | WM97XX_DELAY(delay));
234 231
235 /* wait 3 AC97 time slots + delay for conversion */ 232 /* wait 3 AC97 time slots + delay for conversion */
236 poll_delay(delay); 233 poll_delay(delay);
@@ -256,9 +253,10 @@ static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
256 wm->mach_ops->post_sample(adcsel); 253 wm->mach_ops->post_sample(adcsel);
257 254
258 /* check we have correct sample */ 255 /* check we have correct sample */
259 if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { 256 if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
260 dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel, 257 dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
261 *sample & WM97XX_ADCSEL_MASK); 258 adcsel & WM97XX_ADCSEL_MASK,
259 *sample & WM97XX_ADCSEL_MASK);
262 return RC_PENUP; 260 return RC_PENUP;
263 } 261 }
264 262
diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c
index 2bc2fb801009..d26093f479d1 100644
--- a/drivers/input/touchscreen/wm9712.c
+++ b/drivers/input/touchscreen/wm9712.c
@@ -264,13 +264,10 @@ static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
264 } 264 }
265 265
266 /* set up digitiser */ 266 /* set up digitiser */
267 if (adcsel & 0x8000)
268 adcsel = ((adcsel & 0x7fff) + 3) << 12;
269
270 if (wm->mach_ops && wm->mach_ops->pre_sample) 267 if (wm->mach_ops && wm->mach_ops->pre_sample)
271 wm->mach_ops->pre_sample(adcsel); 268 wm->mach_ops->pre_sample(adcsel);
272 wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 269 wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK)
273 adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); 270 | WM97XX_POLL | WM97XX_DELAY(delay));
274 271
275 /* wait 3 AC97 time slots + delay for conversion */ 272 /* wait 3 AC97 time slots + delay for conversion */
276 poll_delay(delay); 273 poll_delay(delay);
@@ -296,9 +293,10 @@ static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
296 wm->mach_ops->post_sample(adcsel); 293 wm->mach_ops->post_sample(adcsel);
297 294
298 /* check we have correct sample */ 295 /* check we have correct sample */
299 if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { 296 if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
300 dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel, 297 dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
301 *sample & WM97XX_ADCSEL_MASK); 298 adcsel & WM97XX_ADCSEL_MASK,
299 *sample & WM97XX_ADCSEL_MASK);
302 return RC_PENUP; 300 return RC_PENUP;
303 } 301 }
304 302
diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c
index 13cd9d1fa07a..a7558015429b 100644
--- a/drivers/input/touchscreen/wm9713.c
+++ b/drivers/input/touchscreen/wm9713.c
@@ -270,15 +270,14 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
270 } 270 }
271 271
272 /* set up digitiser */ 272 /* set up digitiser */
273 if (adcsel & 0x8000)
274 adcsel = 1 << ((adcsel & 0x7fff) + 3);
275
276 dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); 273 dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1);
277 dig1 &= ~WM9713_ADCSEL_MASK; 274 dig1 &= ~WM9713_ADCSEL_MASK;
275 /* WM97XX_ADCSEL_* channels need to be converted to WM9713 format */
276 dig1 |= 1 << ((adcsel & WM97XX_ADCSEL_MASK) >> 12);
278 277
279 if (wm->mach_ops && wm->mach_ops->pre_sample) 278 if (wm->mach_ops && wm->mach_ops->pre_sample)
280 wm->mach_ops->pre_sample(adcsel); 279 wm->mach_ops->pre_sample(adcsel);
281 wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel | WM9713_POLL); 280 wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL);
282 281
283 /* wait 3 AC97 time slots + delay for conversion */ 282 /* wait 3 AC97 time slots + delay for conversion */
284 poll_delay(delay); 283 poll_delay(delay);
@@ -304,8 +303,9 @@ static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample)
304 wm->mach_ops->post_sample(adcsel); 303 wm->mach_ops->post_sample(adcsel);
305 304
306 /* check we have correct sample */ 305 /* check we have correct sample */
307 if ((*sample & WM97XX_ADCSEL_MASK) != ffs(adcsel >> 1) << 12) { 306 if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) {
308 dev_dbg(wm->dev, "adc wrong sample, read %x got %x", adcsel, 307 dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x",
308 adcsel & WM97XX_ADCSEL_MASK,
309 *sample & WM97XX_ADCSEL_MASK); 309 *sample & WM97XX_ADCSEL_MASK);
310 return RC_PENUP; 310 return RC_PENUP;
311 } 311 }
@@ -400,14 +400,14 @@ static int wm9713_poll_touch(struct wm97xx *wm, struct wm97xx_data *data)
400 if (rc != RC_VALID) 400 if (rc != RC_VALID)
401 return rc; 401 return rc;
402 } else { 402 } else {
403 rc = wm9713_poll_sample(wm, WM9713_ADCSEL_X, &data->x); 403 rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_X, &data->x);
404 if (rc != RC_VALID) 404 if (rc != RC_VALID)
405 return rc; 405 return rc;
406 rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y); 406 rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y);
407 if (rc != RC_VALID) 407 if (rc != RC_VALID)
408 return rc; 408 return rc;
409 if (pil) { 409 if (pil) {
410 rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES, 410 rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_PRES,
411 &data->p); 411 &data->p);
412 if (rc != RC_VALID) 412 if (rc != RC_VALID)
413 return rc; 413 return rc;
diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h
index 10b9e614fccd..fd98bb968219 100644
--- a/include/linux/wm97xx.h
+++ b/include/linux/wm97xx.h
@@ -38,6 +38,10 @@
38#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ 38#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */
39#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ 39#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */
40#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ 40#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */
41#define WM97XX_AUX_ID1 0x4000
42#define WM97XX_AUX_ID2 0x5000
43#define WM97XX_AUX_ID3 0x6000
44#define WM97XX_AUX_ID4 0x7000
41#define WM97XX_ADCSEL_MASK 0x7000 /* ADC selection mask */ 45#define WM97XX_ADCSEL_MASK 0x7000 /* ADC selection mask */
42#define WM97XX_COO 0x0800 /* enable coordinate mode */ 46#define WM97XX_COO 0x0800 /* enable coordinate mode */
43#define WM97XX_CTC 0x0400 /* enable continuous mode */ 47#define WM97XX_CTC 0x0400 /* enable continuous mode */
@@ -62,12 +66,6 @@
62#define WM97XX_RPR 0x2000 /* wake up on pen down */ 66#define WM97XX_RPR 0x2000 /* wake up on pen down */
63#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ 67#define WM97XX_PEN_DOWN 0x8000 /* pen is down */
64 68
65#define WM97XX_AUX_ID1 0x8001
66#define WM97XX_AUX_ID2 0x8002
67#define WM97XX_AUX_ID3 0x8003
68#define WM97XX_AUX_ID4 0x8004
69
70
71/* WM9712 Bits */ 69/* WM9712 Bits */
72#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ 70#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */
73#define WM9712_PDEN 0x0800 /* measure only when pen down */ 71#define WM9712_PDEN 0x0800 /* measure only when pen down */