aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen/wm97xx-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/touchscreen/wm97xx-core.c')
-rw-r--r--drivers/input/touchscreen/wm97xx-core.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
index cbfef1ea7e3..6b75c9f660a 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)
125{ 125{
126 int power_adc = 0, auxval; 126 int power_adc = 0, auxval;
127 u16 power = 0; 127 u16 power = 0;
128 int rc = 0;
129 int timeout = 0;
128 130
129 /* get codec */ 131 /* get codec */
130 mutex_lock(&wm->codec_mutex); 132 mutex_lock(&wm->codec_mutex);
@@ -143,7 +145,9 @@ int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
143 145
144 /* Turn polling mode on to read AUX ADC */ 146 /* Turn polling mode on to read AUX ADC */
145 wm->pen_probably_down = 1; 147 wm->pen_probably_down = 1;
146 wm->codec->poll_sample(wm, adcsel, &auxval); 148
149 while (rc != RC_VALID && timeout++ < 5)
150 rc = wm->codec->poll_sample(wm, adcsel, &auxval);
147 151
148 if (power_adc) 152 if (power_adc)
149 wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); 153 wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000);
@@ -152,8 +156,15 @@ int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
152 156
153 wm->pen_probably_down = 0; 157 wm->pen_probably_down = 0;
154 158
159 if (timeout >= 5) {
160 dev_err(wm->dev,
161 "timeout reading auxadc %d, disabling digitiser\n",
162 adcsel);
163 wm->codec->dig_enable(wm, false);
164 }
165
155 mutex_unlock(&wm->codec_mutex); 166 mutex_unlock(&wm->codec_mutex);
156 return auxval & 0xfff; 167 return (rc == RC_VALID ? auxval & 0xfff : -EBUSY);
157} 168}
158EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); 169EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc);
159 170
@@ -684,8 +695,7 @@ static int wm97xx_probe(struct device *dev)
684 touch_reg_err: 695 touch_reg_err:
685 platform_device_put(wm->touch_dev); 696 platform_device_put(wm->touch_dev);
686 touch_err: 697 touch_err:
687 platform_device_unregister(wm->battery_dev); 698 platform_device_del(wm->battery_dev);
688 wm->battery_dev = NULL;
689 batt_reg_err: 699 batt_reg_err:
690 platform_device_put(wm->battery_dev); 700 platform_device_put(wm->battery_dev);
691 batt_err: 701 batt_err: