Lines Matching refs:tsc

103 static int imx6ul_adc_init(struct imx6ul_tsc *tsc)  in imx6ul_adc_init()  argument
111 reinit_completion(&tsc->completion); in imx6ul_adc_init()
113 adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
118 if (tsc->average_enable) { in imx6ul_adc_init()
120 adc_cfg |= (tsc->average_select) << ADC_AVGS_SHIFT; in imx6ul_adc_init()
123 writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
128 writel(adc_hc, tsc->adc_regs + REG_ADC_HC0); in imx6ul_adc_init()
131 adc_gc = readl(tsc->adc_regs + REG_ADC_GC); in imx6ul_adc_init()
133 if (tsc->average_enable) in imx6ul_adc_init()
135 writel(adc_gc, tsc->adc_regs + REG_ADC_GC); in imx6ul_adc_init()
138 (&tsc->completion, ADC_TIMEOUT); in imx6ul_adc_init()
140 dev_err(tsc->dev, "Timeout for adc calibration\n"); in imx6ul_adc_init()
144 adc_gs = readl(tsc->adc_regs + REG_ADC_GS); in imx6ul_adc_init()
146 dev_err(tsc->dev, "ADC calibration failed\n"); in imx6ul_adc_init()
151 adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
153 writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); in imx6ul_adc_init()
163 static void imx6ul_tsc_channel_config(struct imx6ul_tsc *tsc) in imx6ul_tsc_channel_config() argument
168 writel(adc_hc0, tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_channel_config()
171 writel(adc_hc1, tsc->adc_regs + REG_ADC_HC1); in imx6ul_tsc_channel_config()
174 writel(adc_hc2, tsc->adc_regs + REG_ADC_HC2); in imx6ul_tsc_channel_config()
177 writel(adc_hc3, tsc->adc_regs + REG_ADC_HC3); in imx6ul_tsc_channel_config()
180 writel(adc_hc4, tsc->adc_regs + REG_ADC_HC4); in imx6ul_tsc_channel_config()
188 static void imx6ul_tsc_set(struct imx6ul_tsc *tsc) in imx6ul_tsc_set() argument
193 basic_setting |= tsc->measure_delay_time << 8; in imx6ul_tsc_set()
195 writel(basic_setting, tsc->tsc_regs + REG_TSC_BASIC_SETING); in imx6ul_tsc_set()
197 writel(DE_GLITCH_2, tsc->tsc_regs + REG_TSC_DEBUG_MODE2); in imx6ul_tsc_set()
199 writel(tsc->pre_charge_time, tsc->tsc_regs + REG_TSC_PRE_CHARGE_TIME); in imx6ul_tsc_set()
200 writel(MEASURE_INT_EN, tsc->tsc_regs + REG_TSC_INT_EN); in imx6ul_tsc_set()
202 tsc->tsc_regs + REG_TSC_INT_SIG_EN); in imx6ul_tsc_set()
205 start = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_set()
208 writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_set()
211 static int imx6ul_tsc_init(struct imx6ul_tsc *tsc) in imx6ul_tsc_init() argument
215 err = imx6ul_adc_init(tsc); in imx6ul_tsc_init()
218 imx6ul_tsc_channel_config(tsc); in imx6ul_tsc_init()
219 imx6ul_tsc_set(tsc); in imx6ul_tsc_init()
224 static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) in imx6ul_tsc_disable() argument
230 tsc_flow = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_disable()
232 writel(tsc_flow, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in imx6ul_tsc_disable()
235 adc_cfg = readl(tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_disable()
237 writel(adc_cfg, tsc->adc_regs + REG_ADC_HC0); in imx6ul_tsc_disable()
241 static bool tsc_wait_detect_mode(struct imx6ul_tsc *tsc) in tsc_wait_detect_mode() argument
252 debug_mode2 = readl(tsc->tsc_regs + REG_TSC_DEBUG_MODE2); in tsc_wait_detect_mode()
262 struct imx6ul_tsc *tsc = dev_id; in tsc_irq_fn() local
268 status = readl(tsc->tsc_regs + REG_TSC_INT_STATUS); in tsc_irq_fn()
272 tsc->tsc_regs + REG_TSC_INT_STATUS); in tsc_irq_fn()
275 start = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in tsc_irq_fn()
277 writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); in tsc_irq_fn()
280 value = readl(tsc->tsc_regs + REG_TSC_MEASURE_VALUE); in tsc_irq_fn()
288 if (!tsc_wait_detect_mode(tsc) || in tsc_irq_fn()
289 gpiod_get_value_cansleep(tsc->xnur_gpio)) { in tsc_irq_fn()
290 input_report_key(tsc->input, BTN_TOUCH, 1); in tsc_irq_fn()
291 input_report_abs(tsc->input, ABS_X, x); in tsc_irq_fn()
292 input_report_abs(tsc->input, ABS_Y, y); in tsc_irq_fn()
294 input_report_key(tsc->input, BTN_TOUCH, 0); in tsc_irq_fn()
297 input_sync(tsc->input); in tsc_irq_fn()
305 struct imx6ul_tsc *tsc = dev_id; in adc_irq_fn() local
308 coco = readl(tsc->adc_regs + REG_ADC_HS); in adc_irq_fn()
310 readl(tsc->adc_regs + REG_ADC_R0); in adc_irq_fn()
311 complete(&tsc->completion); in adc_irq_fn()
317 static int imx6ul_tsc_start(struct imx6ul_tsc *tsc) in imx6ul_tsc_start() argument
321 err = clk_prepare_enable(tsc->adc_clk); in imx6ul_tsc_start()
323 dev_err(tsc->dev, in imx6ul_tsc_start()
329 err = clk_prepare_enable(tsc->tsc_clk); in imx6ul_tsc_start()
331 dev_err(tsc->dev, in imx6ul_tsc_start()
337 err = imx6ul_tsc_init(tsc); in imx6ul_tsc_start()
344 clk_disable_unprepare(tsc->tsc_clk); in imx6ul_tsc_start()
346 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_start()
350 static void imx6ul_tsc_stop(struct imx6ul_tsc *tsc) in imx6ul_tsc_stop() argument
352 imx6ul_tsc_disable(tsc); in imx6ul_tsc_stop()
354 clk_disable_unprepare(tsc->tsc_clk); in imx6ul_tsc_stop()
355 clk_disable_unprepare(tsc->adc_clk); in imx6ul_tsc_stop()
361 struct imx6ul_tsc *tsc = input_get_drvdata(input_dev); in imx6ul_tsc_open() local
363 return imx6ul_tsc_start(tsc); in imx6ul_tsc_open()
368 struct imx6ul_tsc *tsc = input_get_drvdata(input_dev); in imx6ul_tsc_close() local
370 imx6ul_tsc_stop(tsc); in imx6ul_tsc_close()
376 struct imx6ul_tsc *tsc; in imx6ul_tsc_probe() local
383 tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL); in imx6ul_tsc_probe()
384 if (!tsc) in imx6ul_tsc_probe()
401 input_set_drvdata(input_dev, tsc); in imx6ul_tsc_probe()
403 tsc->dev = &pdev->dev; in imx6ul_tsc_probe()
404 tsc->input = input_dev; in imx6ul_tsc_probe()
405 init_completion(&tsc->completion); in imx6ul_tsc_probe()
407 tsc->xnur_gpio = devm_gpiod_get(&pdev->dev, "xnur", GPIOD_IN); in imx6ul_tsc_probe()
408 if (IS_ERR(tsc->xnur_gpio)) { in imx6ul_tsc_probe()
409 err = PTR_ERR(tsc->xnur_gpio); in imx6ul_tsc_probe()
415 tsc->tsc_regs = devm_platform_ioremap_resource(pdev, 0); in imx6ul_tsc_probe()
416 if (IS_ERR(tsc->tsc_regs)) { in imx6ul_tsc_probe()
417 err = PTR_ERR(tsc->tsc_regs); in imx6ul_tsc_probe()
422 tsc->adc_regs = devm_platform_ioremap_resource(pdev, 1); in imx6ul_tsc_probe()
423 if (IS_ERR(tsc->adc_regs)) { in imx6ul_tsc_probe()
424 err = PTR_ERR(tsc->adc_regs); in imx6ul_tsc_probe()
429 tsc->tsc_clk = devm_clk_get(&pdev->dev, "tsc"); in imx6ul_tsc_probe()
430 if (IS_ERR(tsc->tsc_clk)) { in imx6ul_tsc_probe()
431 err = PTR_ERR(tsc->tsc_clk); in imx6ul_tsc_probe()
436 tsc->adc_clk = devm_clk_get(&pdev->dev, "adc"); in imx6ul_tsc_probe()
437 if (IS_ERR(tsc->adc_clk)) { in imx6ul_tsc_probe()
438 err = PTR_ERR(tsc->adc_clk); in imx6ul_tsc_probe()
451 err = devm_request_threaded_irq(tsc->dev, tsc_irq, in imx6ul_tsc_probe()
453 dev_name(&pdev->dev), tsc); in imx6ul_tsc_probe()
461 err = devm_request_irq(tsc->dev, adc_irq, adc_irq_fn, 0, in imx6ul_tsc_probe()
462 dev_name(&pdev->dev), tsc); in imx6ul_tsc_probe()
471 &tsc->measure_delay_time); in imx6ul_tsc_probe()
473 tsc->measure_delay_time = 0xffff; in imx6ul_tsc_probe()
476 &tsc->pre_charge_time); in imx6ul_tsc_probe()
478 tsc->pre_charge_time = 0xfff; in imx6ul_tsc_probe()
487 tsc->average_enable = false; in imx6ul_tsc_probe()
488 tsc->average_select = 0; /* value unused; initialize anyway */ in imx6ul_tsc_probe()
494 tsc->average_enable = true; in imx6ul_tsc_probe()
495 tsc->average_select = ilog2(average_samples) - 2; in imx6ul_tsc_probe()
504 err = input_register_device(tsc->input); in imx6ul_tsc_probe()
511 platform_set_drvdata(pdev, tsc); in imx6ul_tsc_probe()
518 struct imx6ul_tsc *tsc = platform_get_drvdata(pdev); in imx6ul_tsc_suspend() local
519 struct input_dev *input_dev = tsc->input; in imx6ul_tsc_suspend()
524 imx6ul_tsc_stop(tsc); in imx6ul_tsc_suspend()
534 struct imx6ul_tsc *tsc = platform_get_drvdata(pdev); in imx6ul_tsc_resume() local
535 struct input_dev *input_dev = tsc->input; in imx6ul_tsc_resume()
541 retval = imx6ul_tsc_start(tsc); in imx6ul_tsc_resume()