diff mbox

[v3] Input: wm97xx-core - add retries to wm97xx_read_aux_adc

Message ID 1283519614-14963-1-git-send-email-emillbrandt@dekaresearch.com (mailing list archive)
State Accepted
Headers show

Commit Message

Eric Millbrandt Sept. 3, 2010, 1:13 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
index cbfef1e..035f089 100644
--- a/drivers/input/touchscreen/wm97xx-core.c
+++ b/drivers/input/touchscreen/wm97xx-core.c
@@ -125,6 +125,8 @@  int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
 {
        int power_adc = 0, auxval;
        u16 power = 0;
+       int rc = 0;
+       int timeout = 0;

        /* get codec */
        mutex_lock(&wm->codec_mutex);
@@ -143,7 +145,9 @@  int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)

        /* Turn polling mode on to read AUX ADC */
        wm->pen_probably_down = 1;
-       wm->codec->poll_sample(wm, adcsel, &auxval);
+
+       while (rc != RC_VALID && timeout++ < 5)
+               rc = wm->codec->poll_sample(wm, adcsel, &auxval);

        if (power_adc)
                wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000);
@@ -152,8 +156,15 @@  int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)

        wm->pen_probably_down = 0;

+       if (timeout >= 5) {
+               dev_err(wm->dev,
+                       "timeout reading auxadc %d, disabling digitiser\n",
+                       adcsel);
+               wm->codec->dig_enable(wm, false);
+       }
+
        mutex_unlock(&wm->codec_mutex);
-       return auxval & 0xfff;
+       return (rc == RC_VALID ? auxval & 0xfff : -EBUSY);
 }
 EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc);