Lines Matching refs:ts

122 static void tsc200x_update_pen_state(struct tsc200x *ts,  in tsc200x_update_pen_state()  argument
126 input_report_abs(ts->idev, ABS_X, x); in tsc200x_update_pen_state()
127 input_report_abs(ts->idev, ABS_Y, y); in tsc200x_update_pen_state()
128 input_report_abs(ts->idev, ABS_PRESSURE, pressure); in tsc200x_update_pen_state()
129 if (!ts->pen_down) { in tsc200x_update_pen_state()
130 input_report_key(ts->idev, BTN_TOUCH, !!pressure); in tsc200x_update_pen_state()
131 ts->pen_down = true; in tsc200x_update_pen_state()
134 input_report_abs(ts->idev, ABS_PRESSURE, 0); in tsc200x_update_pen_state()
135 if (ts->pen_down) { in tsc200x_update_pen_state()
136 input_report_key(ts->idev, BTN_TOUCH, 0); in tsc200x_update_pen_state()
137 ts->pen_down = false; in tsc200x_update_pen_state()
140 input_sync(ts->idev); in tsc200x_update_pen_state()
141 dev_dbg(ts->dev, "point(%4d,%4d), pressure (%4d)\n", x, y, in tsc200x_update_pen_state()
147 struct tsc200x *ts = _ts; in tsc200x_irq_thread() local
154 error = regmap_bulk_read(ts->regmap, TSC200X_REG_X, &tsdata, in tsc200x_irq_thread()
173 if (!ts->pen_down && in tsc200x_irq_thread()
174 ts->in_x == tsdata.x && ts->in_y == tsdata.y && in tsc200x_irq_thread()
175 ts->in_z1 == tsdata.z1 && ts->in_z2 == tsdata.z2) { in tsc200x_irq_thread()
183 ts->in_x = tsdata.x; in tsc200x_irq_thread()
184 ts->in_y = tsdata.y; in tsc200x_irq_thread()
185 ts->in_z1 = tsdata.z1; in tsc200x_irq_thread()
186 ts->in_z2 = tsdata.z2; in tsc200x_irq_thread()
190 pressure = pressure * ts->x_plate_ohm / 4096; in tsc200x_irq_thread()
194 spin_lock_irqsave(&ts->lock, flags); in tsc200x_irq_thread()
196 tsc200x_update_pen_state(ts, tsdata.x, tsdata.y, pressure); in tsc200x_irq_thread()
197 mod_timer(&ts->penup_timer, in tsc200x_irq_thread()
200 spin_unlock_irqrestore(&ts->lock, flags); in tsc200x_irq_thread()
202 ts->last_valid_interrupt = jiffies; in tsc200x_irq_thread()
209 struct tsc200x *ts = (struct tsc200x *)data; in tsc200x_penup_timer() local
212 spin_lock_irqsave(&ts->lock, flags); in tsc200x_penup_timer()
213 tsc200x_update_pen_state(ts, 0, 0, 0); in tsc200x_penup_timer()
214 spin_unlock_irqrestore(&ts->lock, flags); in tsc200x_penup_timer()
217 static void tsc200x_start_scan(struct tsc200x *ts) in tsc200x_start_scan() argument
219 regmap_write(ts->regmap, TSC200X_REG_CFR0, TSC200X_CFR0_INITVALUE); in tsc200x_start_scan()
220 regmap_write(ts->regmap, TSC200X_REG_CFR1, TSC200X_CFR1_INITVALUE); in tsc200x_start_scan()
221 regmap_write(ts->regmap, TSC200X_REG_CFR2, TSC200X_CFR2_INITVALUE); in tsc200x_start_scan()
222 ts->tsc200x_cmd(ts->dev, TSC200X_CMD_NORMAL); in tsc200x_start_scan()
225 static void tsc200x_stop_scan(struct tsc200x *ts) in tsc200x_stop_scan() argument
227 ts->tsc200x_cmd(ts->dev, TSC200X_CMD_STOP); in tsc200x_stop_scan()
230 static void tsc200x_set_reset(struct tsc200x *ts, bool enable) in tsc200x_set_reset() argument
232 if (ts->reset_gpio) in tsc200x_set_reset()
233 gpiod_set_value_cansleep(ts->reset_gpio, enable); in tsc200x_set_reset()
234 else if (ts->set_reset) in tsc200x_set_reset()
235 ts->set_reset(enable); in tsc200x_set_reset()
239 static void __tsc200x_disable(struct tsc200x *ts) in __tsc200x_disable() argument
241 tsc200x_stop_scan(ts); in __tsc200x_disable()
243 disable_irq(ts->irq); in __tsc200x_disable()
244 del_timer_sync(&ts->penup_timer); in __tsc200x_disable()
246 cancel_delayed_work_sync(&ts->esd_work); in __tsc200x_disable()
248 enable_irq(ts->irq); in __tsc200x_disable()
252 static void __tsc200x_enable(struct tsc200x *ts) in __tsc200x_enable() argument
254 tsc200x_start_scan(ts); in __tsc200x_enable()
256 if (ts->esd_timeout && (ts->set_reset || ts->reset_gpio)) { in __tsc200x_enable()
257 ts->last_valid_interrupt = jiffies; in __tsc200x_enable()
258 schedule_delayed_work(&ts->esd_work, in __tsc200x_enable()
260 msecs_to_jiffies(ts->esd_timeout))); in __tsc200x_enable()
268 struct tsc200x *ts = dev_get_drvdata(dev); in tsc200x_selftest_show() local
275 mutex_lock(&ts->mutex); in tsc200x_selftest_show()
280 __tsc200x_disable(ts); in tsc200x_selftest_show()
282 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high_orig); in tsc200x_selftest_show()
291 error = regmap_write(ts->regmap, TSC200X_REG_TEMP_HIGH, temp_high_test); in tsc200x_selftest_show()
298 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high); in tsc200x_selftest_show()
313 tsc200x_set_reset(ts, false); in tsc200x_selftest_show()
315 tsc200x_set_reset(ts, true); in tsc200x_selftest_show()
321 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high); in tsc200x_selftest_show()
336 __tsc200x_enable(ts); in tsc200x_selftest_show()
337 mutex_unlock(&ts->mutex); in tsc200x_selftest_show()
353 struct tsc200x *ts = dev_get_drvdata(dev); in tsc200x_attr_is_visible() local
357 if (!ts->set_reset && !ts->reset_gpio) in tsc200x_attr_is_visible()
371 struct tsc200x *ts = container_of(work, struct tsc200x, esd_work.work); in tsc200x_esd_work() local
375 if (!mutex_trylock(&ts->mutex)) { in tsc200x_esd_work()
384 if (time_is_after_jiffies(ts->last_valid_interrupt + in tsc200x_esd_work()
385 msecs_to_jiffies(ts->esd_timeout))) in tsc200x_esd_work()
389 error = regmap_read(ts->regmap, TSC200X_REG_CFR0, &r); in tsc200x_esd_work()
400 dev_info(ts->dev, "TSC200X not responding - resetting\n"); in tsc200x_esd_work()
402 disable_irq(ts->irq); in tsc200x_esd_work()
403 del_timer_sync(&ts->penup_timer); in tsc200x_esd_work()
405 tsc200x_update_pen_state(ts, 0, 0, 0); in tsc200x_esd_work()
407 tsc200x_set_reset(ts, false); in tsc200x_esd_work()
409 tsc200x_set_reset(ts, true); in tsc200x_esd_work()
411 enable_irq(ts->irq); in tsc200x_esd_work()
412 tsc200x_start_scan(ts); in tsc200x_esd_work()
415 mutex_unlock(&ts->mutex); in tsc200x_esd_work()
418 schedule_delayed_work(&ts->esd_work, in tsc200x_esd_work()
420 msecs_to_jiffies(ts->esd_timeout))); in tsc200x_esd_work()
425 struct tsc200x *ts = input_get_drvdata(input); in tsc200x_open() local
427 mutex_lock(&ts->mutex); in tsc200x_open()
429 if (!ts->suspended) in tsc200x_open()
430 __tsc200x_enable(ts); in tsc200x_open()
432 ts->opened = true; in tsc200x_open()
434 mutex_unlock(&ts->mutex); in tsc200x_open()
441 struct tsc200x *ts = input_get_drvdata(input); in tsc200x_close() local
443 mutex_lock(&ts->mutex); in tsc200x_close()
445 if (!ts->suspended) in tsc200x_close()
446 __tsc200x_disable(ts); in tsc200x_close()
448 ts->opened = false; in tsc200x_close()
450 mutex_unlock(&ts->mutex); in tsc200x_close()
460 struct tsc200x *ts; in tsc200x_probe() local
507 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); in tsc200x_probe()
508 if (!ts) in tsc200x_probe()
515 ts->irq = irq; in tsc200x_probe()
516 ts->dev = dev; in tsc200x_probe()
517 ts->idev = input_dev; in tsc200x_probe()
518 ts->regmap = regmap; in tsc200x_probe()
519 ts->tsc200x_cmd = tsc200x_cmd; in tsc200x_probe()
520 ts->x_plate_ohm = x_plate_ohm; in tsc200x_probe()
521 ts->esd_timeout = esd_timeout; in tsc200x_probe()
523 ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); in tsc200x_probe()
524 if (IS_ERR(ts->reset_gpio)) { in tsc200x_probe()
525 error = PTR_ERR(ts->reset_gpio); in tsc200x_probe()
530 ts->vio = devm_regulator_get_optional(dev, "vio"); in tsc200x_probe()
531 if (IS_ERR(ts->vio)) { in tsc200x_probe()
532 error = PTR_ERR(ts->vio); in tsc200x_probe()
537 if (!ts->reset_gpio && pdata) in tsc200x_probe()
538 ts->set_reset = pdata->set_reset; in tsc200x_probe()
540 mutex_init(&ts->mutex); in tsc200x_probe()
542 spin_lock_init(&ts->lock); in tsc200x_probe()
543 setup_timer(&ts->penup_timer, tsc200x_penup_timer, (unsigned long)ts); in tsc200x_probe()
545 INIT_DELAYED_WORK(&ts->esd_work, tsc200x_esd_work); in tsc200x_probe()
547 snprintf(ts->phys, sizeof(ts->phys), in tsc200x_probe()
551 input_dev->phys = ts->phys; in tsc200x_probe()
567 input_set_drvdata(input_dev, ts); in tsc200x_probe()
570 tsc200x_stop_scan(ts); in tsc200x_probe()
575 "tsc200x", ts); in tsc200x_probe()
582 if (ts->vio) { in tsc200x_probe()
583 error = regulator_enable(ts->vio); in tsc200x_probe()
588 dev_set_drvdata(dev, ts); in tsc200x_probe()
596 error = input_register_device(ts->idev); in tsc200x_probe()
609 if (ts->vio) in tsc200x_probe()
610 regulator_disable(ts->vio); in tsc200x_probe()
617 struct tsc200x *ts = dev_get_drvdata(dev); in tsc200x_remove() local
621 if (ts->vio) in tsc200x_remove()
622 regulator_disable(ts->vio); in tsc200x_remove()
630 struct tsc200x *ts = dev_get_drvdata(dev); in tsc200x_suspend() local
632 mutex_lock(&ts->mutex); in tsc200x_suspend()
634 if (!ts->suspended && ts->opened) in tsc200x_suspend()
635 __tsc200x_disable(ts); in tsc200x_suspend()
637 ts->suspended = true; in tsc200x_suspend()
639 mutex_unlock(&ts->mutex); in tsc200x_suspend()
646 struct tsc200x *ts = dev_get_drvdata(dev); in tsc200x_resume() local
648 mutex_lock(&ts->mutex); in tsc200x_resume()
650 if (ts->suspended && ts->opened) in tsc200x_resume()
651 __tsc200x_enable(ts); in tsc200x_resume()
653 ts->suspended = false; in tsc200x_resume()
655 mutex_unlock(&ts->mutex); in tsc200x_resume()