Lines Matching refs:ts
161 static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd) in tsc2005_cmd() argument
175 error = spi_sync(ts->spi, &msg); in tsc2005_cmd()
177 dev_err(&ts->spi->dev, "%s: failed, command: %x, error: %d\n", in tsc2005_cmd()
185 static int tsc2005_write(struct tsc2005 *ts, u8 reg, u16 value) in tsc2005_write() argument
199 error = spi_sync(ts->spi, &msg); in tsc2005_write()
201 dev_err(&ts->spi->dev, in tsc2005_write()
222 static int tsc2005_read(struct tsc2005 *ts, u8 reg, u16 *value) in tsc2005_read() argument
233 error = spi_sync(ts->spi, &msg); in tsc2005_read()
241 static void tsc2005_update_pen_state(struct tsc2005 *ts, in tsc2005_update_pen_state() argument
245 input_report_abs(ts->idev, ABS_X, x); in tsc2005_update_pen_state()
246 input_report_abs(ts->idev, ABS_Y, y); in tsc2005_update_pen_state()
247 input_report_abs(ts->idev, ABS_PRESSURE, pressure); in tsc2005_update_pen_state()
248 if (!ts->pen_down) { in tsc2005_update_pen_state()
249 input_report_key(ts->idev, BTN_TOUCH, !!pressure); in tsc2005_update_pen_state()
250 ts->pen_down = true; in tsc2005_update_pen_state()
253 input_report_abs(ts->idev, ABS_PRESSURE, 0); in tsc2005_update_pen_state()
254 if (ts->pen_down) { in tsc2005_update_pen_state()
255 input_report_key(ts->idev, BTN_TOUCH, 0); in tsc2005_update_pen_state()
256 ts->pen_down = false; in tsc2005_update_pen_state()
259 input_sync(ts->idev); in tsc2005_update_pen_state()
260 dev_dbg(&ts->spi->dev, "point(%4d,%4d), pressure (%4d)\n", x, y, in tsc2005_update_pen_state()
266 struct tsc2005 *ts = _ts; in tsc2005_irq_thread() local
274 error = spi_sync(ts->spi, &ts->spi_read_msg); in tsc2005_irq_thread()
278 x = ts->spi_x.spi_rx; in tsc2005_irq_thread()
279 y = ts->spi_y.spi_rx; in tsc2005_irq_thread()
280 z1 = ts->spi_z1.spi_rx; in tsc2005_irq_thread()
281 z2 = ts->spi_z2.spi_rx; in tsc2005_irq_thread()
295 if (!ts->pen_down && in tsc2005_irq_thread()
296 ts->in_x == x && ts->in_y == y && in tsc2005_irq_thread()
297 ts->in_z1 == z1 && ts->in_z2 == z2) { in tsc2005_irq_thread()
305 ts->in_x = x; in tsc2005_irq_thread()
306 ts->in_y = y; in tsc2005_irq_thread()
307 ts->in_z1 = z1; in tsc2005_irq_thread()
308 ts->in_z2 = z2; in tsc2005_irq_thread()
312 pressure = pressure * ts->x_plate_ohm / 4096; in tsc2005_irq_thread()
316 spin_lock_irqsave(&ts->lock, flags); in tsc2005_irq_thread()
318 tsc2005_update_pen_state(ts, x, y, pressure); in tsc2005_irq_thread()
319 mod_timer(&ts->penup_timer, in tsc2005_irq_thread()
322 spin_unlock_irqrestore(&ts->lock, flags); in tsc2005_irq_thread()
324 ts->last_valid_interrupt = jiffies; in tsc2005_irq_thread()
331 struct tsc2005 *ts = (struct tsc2005 *)data; in tsc2005_penup_timer() local
334 spin_lock_irqsave(&ts->lock, flags); in tsc2005_penup_timer()
335 tsc2005_update_pen_state(ts, 0, 0, 0); in tsc2005_penup_timer()
336 spin_unlock_irqrestore(&ts->lock, flags); in tsc2005_penup_timer()
339 static void tsc2005_start_scan(struct tsc2005 *ts) in tsc2005_start_scan() argument
341 tsc2005_write(ts, TSC2005_REG_CFR0, TSC2005_CFR0_INITVALUE); in tsc2005_start_scan()
342 tsc2005_write(ts, TSC2005_REG_CFR1, TSC2005_CFR1_INITVALUE); in tsc2005_start_scan()
343 tsc2005_write(ts, TSC2005_REG_CFR2, TSC2005_CFR2_INITVALUE); in tsc2005_start_scan()
344 tsc2005_cmd(ts, TSC2005_CMD_NORMAL); in tsc2005_start_scan()
347 static void tsc2005_stop_scan(struct tsc2005 *ts) in tsc2005_stop_scan() argument
349 tsc2005_cmd(ts, TSC2005_CMD_STOP); in tsc2005_stop_scan()
352 static void tsc2005_set_reset(struct tsc2005 *ts, bool enable) in tsc2005_set_reset() argument
354 if (ts->reset_gpio >= 0) in tsc2005_set_reset()
355 gpio_set_value(ts->reset_gpio, enable); in tsc2005_set_reset()
356 else if (ts->set_reset) in tsc2005_set_reset()
357 ts->set_reset(enable); in tsc2005_set_reset()
361 static void __tsc2005_disable(struct tsc2005 *ts) in __tsc2005_disable() argument
363 tsc2005_stop_scan(ts); in __tsc2005_disable()
365 disable_irq(ts->spi->irq); in __tsc2005_disable()
366 del_timer_sync(&ts->penup_timer); in __tsc2005_disable()
368 cancel_delayed_work_sync(&ts->esd_work); in __tsc2005_disable()
370 enable_irq(ts->spi->irq); in __tsc2005_disable()
374 static void __tsc2005_enable(struct tsc2005 *ts) in __tsc2005_enable() argument
376 tsc2005_start_scan(ts); in __tsc2005_enable()
378 if (ts->esd_timeout && (ts->set_reset || ts->reset_gpio)) { in __tsc2005_enable()
379 ts->last_valid_interrupt = jiffies; in __tsc2005_enable()
380 schedule_delayed_work(&ts->esd_work, in __tsc2005_enable()
382 msecs_to_jiffies(ts->esd_timeout))); in __tsc2005_enable()
392 struct tsc2005 *ts = spi_get_drvdata(spi); in tsc2005_selftest_show() local
399 mutex_lock(&ts->mutex); in tsc2005_selftest_show()
404 __tsc2005_disable(ts); in tsc2005_selftest_show()
406 error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high_orig); in tsc2005_selftest_show()
415 error = tsc2005_write(ts, TSC2005_REG_TEMP_HIGH, temp_high_test); in tsc2005_selftest_show()
422 error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); in tsc2005_selftest_show()
437 tsc2005_set_reset(ts, false); in tsc2005_selftest_show()
439 tsc2005_set_reset(ts, true); in tsc2005_selftest_show()
445 error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); in tsc2005_selftest_show()
460 __tsc2005_enable(ts); in tsc2005_selftest_show()
461 mutex_unlock(&ts->mutex); in tsc2005_selftest_show()
478 struct tsc2005 *ts = spi_get_drvdata(spi); in tsc2005_attr_is_visible() local
482 if (!ts->set_reset && !ts->reset_gpio) in tsc2005_attr_is_visible()
496 struct tsc2005 *ts = container_of(work, struct tsc2005, esd_work.work); in tsc2005_esd_work() local
500 if (!mutex_trylock(&ts->mutex)) { in tsc2005_esd_work()
509 if (time_is_after_jiffies(ts->last_valid_interrupt + in tsc2005_esd_work()
510 msecs_to_jiffies(ts->esd_timeout))) in tsc2005_esd_work()
514 error = tsc2005_read(ts, TSC2005_REG_CFR0, &r); in tsc2005_esd_work()
525 dev_info(&ts->spi->dev, "TSC2005 not responding - resetting\n"); in tsc2005_esd_work()
527 disable_irq(ts->spi->irq); in tsc2005_esd_work()
528 del_timer_sync(&ts->penup_timer); in tsc2005_esd_work()
530 tsc2005_update_pen_state(ts, 0, 0, 0); in tsc2005_esd_work()
532 tsc2005_set_reset(ts, false); in tsc2005_esd_work()
534 tsc2005_set_reset(ts, true); in tsc2005_esd_work()
536 enable_irq(ts->spi->irq); in tsc2005_esd_work()
537 tsc2005_start_scan(ts); in tsc2005_esd_work()
540 mutex_unlock(&ts->mutex); in tsc2005_esd_work()
543 schedule_delayed_work(&ts->esd_work, in tsc2005_esd_work()
545 msecs_to_jiffies(ts->esd_timeout))); in tsc2005_esd_work()
550 struct tsc2005 *ts = input_get_drvdata(input); in tsc2005_open() local
552 mutex_lock(&ts->mutex); in tsc2005_open()
554 if (!ts->suspended) in tsc2005_open()
555 __tsc2005_enable(ts); in tsc2005_open()
557 ts->opened = true; in tsc2005_open()
559 mutex_unlock(&ts->mutex); in tsc2005_open()
566 struct tsc2005 *ts = input_get_drvdata(input); in tsc2005_close() local
568 mutex_lock(&ts->mutex); in tsc2005_close()
570 if (!ts->suspended) in tsc2005_close()
571 __tsc2005_disable(ts); in tsc2005_close()
573 ts->opened = false; in tsc2005_close()
575 mutex_unlock(&ts->mutex); in tsc2005_close()
578 static void tsc2005_setup_spi_xfer(struct tsc2005 *ts) in tsc2005_setup_spi_xfer() argument
580 tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, false); in tsc2005_setup_spi_xfer()
581 tsc2005_setup_read(&ts->spi_y, TSC2005_REG_Y, false); in tsc2005_setup_spi_xfer()
582 tsc2005_setup_read(&ts->spi_z1, TSC2005_REG_Z1, false); in tsc2005_setup_spi_xfer()
583 tsc2005_setup_read(&ts->spi_z2, TSC2005_REG_Z2, true); in tsc2005_setup_spi_xfer()
585 spi_message_init(&ts->spi_read_msg); in tsc2005_setup_spi_xfer()
586 spi_message_add_tail(&ts->spi_x.spi_xfer, &ts->spi_read_msg); in tsc2005_setup_spi_xfer()
587 spi_message_add_tail(&ts->spi_y.spi_xfer, &ts->spi_read_msg); in tsc2005_setup_spi_xfer()
588 spi_message_add_tail(&ts->spi_z1.spi_xfer, &ts->spi_read_msg); in tsc2005_setup_spi_xfer()
589 spi_message_add_tail(&ts->spi_z2.spi_xfer, &ts->spi_read_msg); in tsc2005_setup_spi_xfer()
597 struct tsc2005 *ts; in tsc2005_probe() local
645 ts = devm_kzalloc(&spi->dev, sizeof(*ts), GFP_KERNEL); in tsc2005_probe()
646 if (!ts) in tsc2005_probe()
653 ts->spi = spi; in tsc2005_probe()
654 ts->idev = input_dev; in tsc2005_probe()
656 ts->x_plate_ohm = x_plate_ohm; in tsc2005_probe()
657 ts->esd_timeout = esd_timeout; in tsc2005_probe()
660 ts->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0); in tsc2005_probe()
661 if (ts->reset_gpio == -EPROBE_DEFER) in tsc2005_probe()
662 return ts->reset_gpio; in tsc2005_probe()
663 if (ts->reset_gpio < 0) { in tsc2005_probe()
665 ts->reset_gpio); in tsc2005_probe()
666 return ts->reset_gpio; in tsc2005_probe()
669 error = devm_gpio_request_one(&spi->dev, ts->reset_gpio, 0, in tsc2005_probe()
677 ts->vio = devm_regulator_get(&spi->dev, "vio"); in tsc2005_probe()
678 if (IS_ERR(ts->vio)) { in tsc2005_probe()
679 error = PTR_ERR(ts->vio); in tsc2005_probe()
684 ts->reset_gpio = -1; in tsc2005_probe()
685 ts->set_reset = pdata->set_reset; in tsc2005_probe()
688 mutex_init(&ts->mutex); in tsc2005_probe()
690 spin_lock_init(&ts->lock); in tsc2005_probe()
691 setup_timer(&ts->penup_timer, tsc2005_penup_timer, (unsigned long)ts); in tsc2005_probe()
693 INIT_DELAYED_WORK(&ts->esd_work, tsc2005_esd_work); in tsc2005_probe()
695 tsc2005_setup_spi_xfer(ts); in tsc2005_probe()
697 snprintf(ts->phys, sizeof(ts->phys), in tsc2005_probe()
701 input_dev->phys = ts->phys; in tsc2005_probe()
717 input_set_drvdata(input_dev, ts); in tsc2005_probe()
720 tsc2005_stop_scan(ts); in tsc2005_probe()
725 "tsc2005", ts); in tsc2005_probe()
732 if (ts->vio) { in tsc2005_probe()
733 error = regulator_enable(ts->vio); in tsc2005_probe()
738 spi_set_drvdata(spi, ts); in tsc2005_probe()
746 error = input_register_device(ts->idev); in tsc2005_probe()
759 if (ts->vio) in tsc2005_probe()
760 regulator_disable(ts->vio); in tsc2005_probe()
766 struct tsc2005 *ts = spi_get_drvdata(spi); in tsc2005_remove() local
770 if (ts->vio) in tsc2005_remove()
771 regulator_disable(ts->vio); in tsc2005_remove()
779 struct tsc2005 *ts = spi_get_drvdata(spi); in tsc2005_suspend() local
781 mutex_lock(&ts->mutex); in tsc2005_suspend()
783 if (!ts->suspended && ts->opened) in tsc2005_suspend()
784 __tsc2005_disable(ts); in tsc2005_suspend()
786 ts->suspended = true; in tsc2005_suspend()
788 mutex_unlock(&ts->mutex); in tsc2005_suspend()
796 struct tsc2005 *ts = spi_get_drvdata(spi); in tsc2005_resume() local
798 mutex_lock(&ts->mutex); in tsc2005_resume()
800 if (ts->suspended && ts->opened) in tsc2005_resume()
801 __tsc2005_enable(ts); in tsc2005_resume()
803 ts->suspended = false; in tsc2005_resume()
805 mutex_unlock(&ts->mutex); in tsc2005_resume()