Lines Matching refs:tsc
97 static int imx6ul_adc_init(struct imx6ul_tsc *tsc) in imx6ul_adc_init() argument
105 reinit_completion(&tsc->completion); in imx6ul_adc_init()
107 adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
111 writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
116 writel(adc_hc, tsc->adc_regs + REG_ADC_HC0); in imx6ul_adc_init()
119 adc_gc = readl(tsc->adc_regs + REG_ADC_GC); in imx6ul_adc_init()
121 writel(adc_gc, tsc->adc_regs + REG_ADC_GC); in imx6ul_adc_init()
124 (&tsc->completion, ADC_TIMEOUT); in imx6ul_adc_init()
126 dev_err(tsc->dev, "Timeout for adc calibration\n"); in imx6ul_adc_init()
130 adc_gs = readl(tsc->adc_regs + REG_ADC_GS); in imx6ul_adc_init()
132 dev_err(tsc->dev, "ADC calibration failed\n"); in imx6ul_adc_init()
137 adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
139 writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
149 static void imx6ul_tsc_channel_config(struct imx6ul_tsc *tsc) in imx6ul_tsc_channel_config() argument
154 writel(adc_hc0, tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_channel_config()
157 writel(adc_hc1, tsc->adc_regs + REG_ADC_HC1); in imx6ul_tsc_channel_config()
160 writel(adc_hc2, tsc->adc_regs + REG_ADC_HC2); in imx6ul_tsc_channel_config()
163 writel(adc_hc3, tsc->adc_regs + REG_ADC_HC3); in imx6ul_tsc_channel_config()
166 writel(adc_hc4, tsc->adc_regs + REG_ADC_HC4); in imx6ul_tsc_channel_config()
174 static void imx6ul_tsc_set(struct imx6ul_tsc *tsc) in imx6ul_tsc_set() argument
179 basic_setting |= tsc->measure_delay_time << 8; in imx6ul_tsc_set()
181 writel(basic_setting, tsc->tsc_regs + REG_TSC_BASIC_SETING); in imx6ul_tsc_set()
183 writel(DE_GLITCH_2, tsc->tsc_regs + REG_TSC_DEBUG_MODE2); in imx6ul_tsc_set()
185 writel(tsc->pre_charge_time, tsc->tsc_regs + REG_TSC_PRE_CHARGE_TIME); in imx6ul_tsc_set()
186 writel(MEASURE_INT_EN, tsc->tsc_regs + REG_TSC_INT_EN); in imx6ul_tsc_set()
188 tsc->tsc_regs + REG_TSC_INT_SIG_EN); in imx6ul_tsc_set()
191 start = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_set()
194 writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_set()
197 static int imx6ul_tsc_init(struct imx6ul_tsc *tsc) in imx6ul_tsc_init() argument
201 err = imx6ul_adc_init(tsc); in imx6ul_tsc_init()
204 imx6ul_tsc_channel_config(tsc); in imx6ul_tsc_init()
205 imx6ul_tsc_set(tsc); in imx6ul_tsc_init()
210 static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) in imx6ul_tsc_disable() argument
216 tsc_flow = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_disable()
218 writel(tsc_flow, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_disable()
221 adc_cfg = readl(tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_disable()
223 writel(adc_cfg, tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_disable()
227 static bool tsc_wait_detect_mode(struct imx6ul_tsc *tsc) in tsc_wait_detect_mode() argument
238 debug_mode2 = readl(tsc->tsc_regs + REG_TSC_DEBUG_MODE2); in tsc_wait_detect_mode()
248 struct imx6ul_tsc *tsc = dev_id; in tsc_irq_fn() local
254 status = readl(tsc->tsc_regs + REG_TSC_INT_STATUS); in tsc_irq_fn()
258 tsc->tsc_regs + REG_TSC_INT_STATUS); in tsc_irq_fn()
261 start = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in tsc_irq_fn()
263 writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in tsc_irq_fn()
266 value = readl(tsc->tsc_regs + REG_TSC_MEASURE_VALUE); in tsc_irq_fn()
274 if (!tsc_wait_detect_mode(tsc) || in tsc_irq_fn()
275 gpiod_get_value_cansleep(tsc->xnur_gpio)) { in tsc_irq_fn()
276 input_report_key(tsc->input, BTN_TOUCH, 1); in tsc_irq_fn()
277 input_report_abs(tsc->input, ABS_X, x); in tsc_irq_fn()
278 input_report_abs(tsc->input, ABS_Y, y); in tsc_irq_fn()
280 input_report_key(tsc->input, BTN_TOUCH, 0); in tsc_irq_fn()
283 input_sync(tsc->input); in tsc_irq_fn()
291 struct imx6ul_tsc *tsc = dev_id; in adc_irq_fn() local
295 coco = readl(tsc->adc_regs + REG_ADC_HS); in adc_irq_fn()
297 value = readl(tsc->adc_regs + REG_ADC_R0); in adc_irq_fn()
298 complete(&tsc->completion); in adc_irq_fn()
306 struct imx6ul_tsc *tsc = input_get_drvdata(input_dev); in imx6ul_tsc_open() local
309 err = clk_prepare_enable(tsc->adc_clk); in imx6ul_tsc_open()
311 dev_err(tsc->dev, in imx6ul_tsc_open()
317 err = clk_prepare_enable(tsc->tsc_clk); in imx6ul_tsc_open()
319 dev_err(tsc->dev, in imx6ul_tsc_open()
322 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_open()
326 return imx6ul_tsc_init(tsc); in imx6ul_tsc_open()
331 struct imx6ul_tsc *tsc = input_get_drvdata(input_dev); in imx6ul_tsc_close() local
333 imx6ul_tsc_disable(tsc); in imx6ul_tsc_close()
335 clk_disable_unprepare(tsc->tsc_clk); in imx6ul_tsc_close()
336 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_close()
342 struct imx6ul_tsc *tsc; in imx6ul_tsc_probe() local
350 tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL); in imx6ul_tsc_probe()
351 if (!tsc) in imx6ul_tsc_probe()
368 input_set_drvdata(input_dev, tsc); in imx6ul_tsc_probe()
370 tsc->dev = &pdev->dev; in imx6ul_tsc_probe()
371 tsc->input = input_dev; in imx6ul_tsc_probe()
372 init_completion(&tsc->completion); in imx6ul_tsc_probe()
374 tsc->xnur_gpio = devm_gpiod_get(&pdev->dev, "xnur", GPIOD_IN); in imx6ul_tsc_probe()
375 if (IS_ERR(tsc->xnur_gpio)) { in imx6ul_tsc_probe()
376 err = PTR_ERR(tsc->xnur_gpio); in imx6ul_tsc_probe()
383 tsc->tsc_regs = devm_ioremap_resource(&pdev->dev, tsc_mem); in imx6ul_tsc_probe()
384 if (IS_ERR(tsc->tsc_regs)) { in imx6ul_tsc_probe()
385 err = PTR_ERR(tsc->tsc_regs); in imx6ul_tsc_probe()
391 tsc->adc_regs = devm_ioremap_resource(&pdev->dev, adc_mem); in imx6ul_tsc_probe()
392 if (IS_ERR(tsc->adc_regs)) { in imx6ul_tsc_probe()
393 err = PTR_ERR(tsc->adc_regs); in imx6ul_tsc_probe()
398 tsc->tsc_clk = devm_clk_get(&pdev->dev, "tsc"); in imx6ul_tsc_probe()
399 if (IS_ERR(tsc->tsc_clk)) { in imx6ul_tsc_probe()
400 err = PTR_ERR(tsc->tsc_clk); in imx6ul_tsc_probe()
405 tsc->adc_clk = devm_clk_get(&pdev->dev, "adc"); in imx6ul_tsc_probe()
406 if (IS_ERR(tsc->adc_clk)) { in imx6ul_tsc_probe()
407 err = PTR_ERR(tsc->adc_clk); in imx6ul_tsc_probe()
424 err = devm_request_threaded_irq(tsc->dev, tsc_irq, in imx6ul_tsc_probe()
426 dev_name(&pdev->dev), tsc); in imx6ul_tsc_probe()
434 err = devm_request_irq(tsc->dev, adc_irq, adc_irq_fn, 0, in imx6ul_tsc_probe()
435 dev_name(&pdev->dev), tsc); in imx6ul_tsc_probe()
444 &tsc->measure_delay_time); in imx6ul_tsc_probe()
446 tsc->measure_delay_time = 0xffff; in imx6ul_tsc_probe()
449 &tsc->pre_charge_time); in imx6ul_tsc_probe()
451 tsc->pre_charge_time = 0xfff; in imx6ul_tsc_probe()
453 err = input_register_device(tsc->input); in imx6ul_tsc_probe()
460 platform_set_drvdata(pdev, tsc); in imx6ul_tsc_probe()
467 struct imx6ul_tsc *tsc = platform_get_drvdata(pdev); in imx6ul_tsc_suspend() local
468 struct input_dev *input_dev = tsc->input; in imx6ul_tsc_suspend()
473 imx6ul_tsc_disable(tsc); in imx6ul_tsc_suspend()
475 clk_disable_unprepare(tsc->tsc_clk); in imx6ul_tsc_suspend()
476 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_suspend()
487 struct imx6ul_tsc *tsc = platform_get_drvdata(pdev); in imx6ul_tsc_resume() local
488 struct input_dev *input_dev = tsc->input; in imx6ul_tsc_resume()
494 retval = clk_prepare_enable(tsc->adc_clk); in imx6ul_tsc_resume()
498 retval = clk_prepare_enable(tsc->tsc_clk); in imx6ul_tsc_resume()
500 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_resume()
504 retval = imx6ul_tsc_init(tsc); in imx6ul_tsc_resume()