diff options
Diffstat (limited to 'drivers/input/touchscreen/imx6ul_tsc.c')
-rw-r--r-- | drivers/input/touchscreen/imx6ul_tsc.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/input/touchscreen/imx6ul_tsc.c b/drivers/input/touchscreen/imx6ul_tsc.c index ff0b75813daa..8275267eac25 100644 --- a/drivers/input/touchscreen/imx6ul_tsc.c +++ b/drivers/input/touchscreen/imx6ul_tsc.c | |||
@@ -94,7 +94,7 @@ struct imx6ul_tsc { | |||
94 | * TSC module need ADC to get the measure value. So | 94 | * TSC module need ADC to get the measure value. So |
95 | * before config TSC, we should initialize ADC module. | 95 | * before config TSC, we should initialize ADC module. |
96 | */ | 96 | */ |
97 | static void imx6ul_adc_init(struct imx6ul_tsc *tsc) | 97 | static int imx6ul_adc_init(struct imx6ul_tsc *tsc) |
98 | { | 98 | { |
99 | int adc_hc = 0; | 99 | int adc_hc = 0; |
100 | int adc_gc; | 100 | int adc_gc; |
@@ -122,17 +122,23 @@ static void imx6ul_adc_init(struct imx6ul_tsc *tsc) | |||
122 | 122 | ||
123 | timeout = wait_for_completion_timeout | 123 | timeout = wait_for_completion_timeout |
124 | (&tsc->completion, ADC_TIMEOUT); | 124 | (&tsc->completion, ADC_TIMEOUT); |
125 | if (timeout == 0) | 125 | if (timeout == 0) { |
126 | dev_err(tsc->dev, "Timeout for adc calibration\n"); | 126 | dev_err(tsc->dev, "Timeout for adc calibration\n"); |
127 | return -ETIMEDOUT; | ||
128 | } | ||
127 | 129 | ||
128 | adc_gs = readl(tsc->adc_regs + REG_ADC_GS); | 130 | adc_gs = readl(tsc->adc_regs + REG_ADC_GS); |
129 | if (adc_gs & ADC_CALF) | 131 | if (adc_gs & ADC_CALF) { |
130 | dev_err(tsc->dev, "ADC calibration failed\n"); | 132 | dev_err(tsc->dev, "ADC calibration failed\n"); |
133 | return -EINVAL; | ||
134 | } | ||
131 | 135 | ||
132 | /* TSC need the ADC work in hardware trigger */ | 136 | /* TSC need the ADC work in hardware trigger */ |
133 | adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); | 137 | adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); |
134 | adc_cfg |= ADC_HARDWARE_TRIGGER; | 138 | adc_cfg |= ADC_HARDWARE_TRIGGER; |
135 | writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); | 139 | writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); |
140 | |||
141 | return 0; | ||
136 | } | 142 | } |
137 | 143 | ||
138 | /* | 144 | /* |
@@ -188,11 +194,17 @@ static void imx6ul_tsc_set(struct imx6ul_tsc *tsc) | |||
188 | writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); | 194 | writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); |
189 | } | 195 | } |
190 | 196 | ||
191 | static void imx6ul_tsc_init(struct imx6ul_tsc *tsc) | 197 | static int imx6ul_tsc_init(struct imx6ul_tsc *tsc) |
192 | { | 198 | { |
193 | imx6ul_adc_init(tsc); | 199 | int err; |
200 | |||
201 | err = imx6ul_adc_init(tsc); | ||
202 | if (err) | ||
203 | return err; | ||
194 | imx6ul_tsc_channel_config(tsc); | 204 | imx6ul_tsc_channel_config(tsc); |
195 | imx6ul_tsc_set(tsc); | 205 | imx6ul_tsc_set(tsc); |
206 | |||
207 | return 0; | ||
196 | } | 208 | } |
197 | 209 | ||
198 | static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) | 210 | static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) |
@@ -311,9 +323,7 @@ static int imx6ul_tsc_open(struct input_dev *input_dev) | |||
311 | return err; | 323 | return err; |
312 | } | 324 | } |
313 | 325 | ||
314 | imx6ul_tsc_init(tsc); | 326 | return imx6ul_tsc_init(tsc); |
315 | |||
316 | return 0; | ||
317 | } | 327 | } |
318 | 328 | ||
319 | static void imx6ul_tsc_close(struct input_dev *input_dev) | 329 | static void imx6ul_tsc_close(struct input_dev *input_dev) |
@@ -337,7 +347,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
337 | int tsc_irq; | 347 | int tsc_irq; |
338 | int adc_irq; | 348 | int adc_irq; |
339 | 349 | ||
340 | tsc = devm_kzalloc(&pdev->dev, sizeof(struct imx6ul_tsc), GFP_KERNEL); | 350 | tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL); |
341 | if (!tsc) | 351 | if (!tsc) |
342 | return -ENOMEM; | 352 | return -ENOMEM; |
343 | 353 | ||
@@ -345,7 +355,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
345 | if (!input_dev) | 355 | if (!input_dev) |
346 | return -ENOMEM; | 356 | return -ENOMEM; |
347 | 357 | ||
348 | input_dev->name = "iMX6UL TouchScreen Controller"; | 358 | input_dev->name = "iMX6UL Touchscreen Controller"; |
349 | input_dev->id.bustype = BUS_HOST; | 359 | input_dev->id.bustype = BUS_HOST; |
350 | 360 | ||
351 | input_dev->open = imx6ul_tsc_open; | 361 | input_dev->open = imx6ul_tsc_open; |
@@ -406,7 +416,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
406 | } | 416 | } |
407 | 417 | ||
408 | adc_irq = platform_get_irq(pdev, 1); | 418 | adc_irq = platform_get_irq(pdev, 1); |
409 | if (adc_irq <= 0) { | 419 | if (adc_irq < 0) { |
410 | dev_err(&pdev->dev, "no adc irq resource?\n"); | 420 | dev_err(&pdev->dev, "no adc irq resource?\n"); |
411 | return adc_irq; | 421 | return adc_irq; |
412 | } | 422 | } |
@@ -491,7 +501,7 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev) | |||
491 | goto out; | 501 | goto out; |
492 | } | 502 | } |
493 | 503 | ||
494 | imx6ul_tsc_init(tsc); | 504 | retval = imx6ul_tsc_init(tsc); |
495 | } | 505 | } |
496 | 506 | ||
497 | out: | 507 | out: |