imx6ul_adc_init() may fail in two cases, so we should better
propagate the errors and make sure that the callers of
this function also check and propagate the errors accordingly.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
* TSC module need ADC to get the measure value. So
* before config TSC, we should initialize ADC module.
*/
* TSC module need ADC to get the measure value. So
* before config TSC, we should initialize ADC module.
*/
-static void imx6ul_adc_init(struct imx6ul_tsc *tsc)
+static int imx6ul_adc_init(struct imx6ul_tsc *tsc)
{
int adc_hc = 0;
int adc_gc;
{
int adc_hc = 0;
int adc_gc;
timeout = wait_for_completion_timeout
(&tsc->completion, ADC_TIMEOUT);
timeout = wait_for_completion_timeout
(&tsc->completion, ADC_TIMEOUT);
dev_err(tsc->dev, "Timeout for adc calibration\n");
dev_err(tsc->dev, "Timeout for adc calibration\n");
adc_gs = readl(tsc->adc_regs + REG_ADC_GS);
adc_gs = readl(tsc->adc_regs + REG_ADC_GS);
+ if (adc_gs & ADC_CALF) {
dev_err(tsc->dev, "ADC calibration failed\n");
dev_err(tsc->dev, "ADC calibration failed\n");
/* TSC need the ADC work in hardware trigger */
adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG);
adc_cfg |= ADC_HARDWARE_TRIGGER;
writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
/* TSC need the ADC work in hardware trigger */
adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG);
adc_cfg |= ADC_HARDWARE_TRIGGER;
writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL);
}
writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL);
}
-static void imx6ul_tsc_init(struct imx6ul_tsc *tsc)
+static int imx6ul_tsc_init(struct imx6ul_tsc *tsc)
+ int err;
+
+ err = imx6ul_adc_init(tsc);
+ if (err)
+ return err;
imx6ul_tsc_channel_config(tsc);
imx6ul_tsc_set(tsc);
imx6ul_tsc_channel_config(tsc);
imx6ul_tsc_set(tsc);
}
static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc)
}
static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc)
- imx6ul_tsc_init(tsc);
-
- return 0;
+ return imx6ul_tsc_init(tsc);
}
static void imx6ul_tsc_close(struct input_dev *input_dev)
}
static void imx6ul_tsc_close(struct input_dev *input_dev)
+ retval = imx6ul_tsc_init(tsc);