Lines Matching +full:touchscreen +full:- +full:max +full:- +full:pressure

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc.
5 * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver
16 * - corgi_ts.c
17 * Copyright (C) 2004-2005 Richard Purdie
18 * - omap_ts.[hc], ads7846.h, ts_osk.c
39 #define MAX_12BIT ((1<<12)-1)
119 #define AD7877_SER (1 << 11) /* non-differential */
139 * Non-touchscreen sensors only use single-ended conversions.
206 return -ENOMEM; in ad7877_read()
208 spi_message_init(&req->msg); in ad7877_read()
210 req->command = (u16) (AD7877_WRITEADD(AD7877_REG_CTRL1) | in ad7877_read()
212 req->xfer[0].tx_buf = &req->command; in ad7877_read()
213 req->xfer[0].len = 2; in ad7877_read()
214 req->xfer[0].cs_change = 1; in ad7877_read()
216 req->xfer[1].rx_buf = &req->sample; in ad7877_read()
217 req->xfer[1].len = 2; in ad7877_read()
219 spi_message_add_tail(&req->xfer[0], &req->msg); in ad7877_read()
220 spi_message_add_tail(&req->xfer[1], &req->msg); in ad7877_read()
222 status = spi_sync(spi, &req->msg); in ad7877_read()
223 ret = status ? : req->sample; in ad7877_read()
237 return -ENOMEM; in ad7877_write()
239 spi_message_init(&req->msg); in ad7877_write()
241 req->command = (u16) (AD7877_WRITEADD(reg) | (val & MAX_12BIT)); in ad7877_write()
242 req->xfer[0].tx_buf = &req->command; in ad7877_write()
243 req->xfer[0].len = 2; in ad7877_write()
245 spi_message_add_tail(&req->xfer[0], &req->msg); in ad7877_write()
247 status = spi_sync(spi, &req->msg); in ad7877_write()
264 return -ENOMEM; in ad7877_read_adc()
266 spi_message_init(&req->msg); in ad7877_read_adc()
269 req->ref_on = AD7877_WRITEADD(AD7877_REG_CTRL2) | in ad7877_read_adc()
270 AD7877_POL(ts->stopacq_polarity) | in ad7877_read_adc()
272 AD7877_ACQ(ts->acquisition_time) | AD7877_FCD(0); in ad7877_read_adc()
274 req->reset = AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_MODE_NOC; in ad7877_read_adc()
276 req->command = (u16) command; in ad7877_read_adc()
278 req->xfer[0].tx_buf = &req->reset; in ad7877_read_adc()
279 req->xfer[0].len = 2; in ad7877_read_adc()
280 req->xfer[0].cs_change = 1; in ad7877_read_adc()
282 req->xfer[1].tx_buf = &req->ref_on; in ad7877_read_adc()
283 req->xfer[1].len = 2; in ad7877_read_adc()
284 req->xfer[1].delay.value = ts->vref_delay_usecs; in ad7877_read_adc()
285 req->xfer[1].delay.unit = SPI_DELAY_UNIT_USECS; in ad7877_read_adc()
286 req->xfer[1].cs_change = 1; in ad7877_read_adc()
288 req->xfer[2].tx_buf = &req->command; in ad7877_read_adc()
289 req->xfer[2].len = 2; in ad7877_read_adc()
290 req->xfer[2].delay.value = ts->vref_delay_usecs; in ad7877_read_adc()
291 req->xfer[2].delay.unit = SPI_DELAY_UNIT_USECS; in ad7877_read_adc()
292 req->xfer[2].cs_change = 1; in ad7877_read_adc()
294 req->xfer[3].rx_buf = &req->sample; in ad7877_read_adc()
295 req->xfer[3].len = 2; in ad7877_read_adc()
296 req->xfer[3].cs_change = 1; in ad7877_read_adc()
298 req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/ in ad7877_read_adc()
299 req->xfer[4].len = 2; in ad7877_read_adc()
300 req->xfer[4].cs_change = 1; in ad7877_read_adc()
302 req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/ in ad7877_read_adc()
303 req->xfer[5].len = 2; in ad7877_read_adc()
306 * reading touchscreen state; disable penirq while sampling in ad7877_read_adc()
309 spi_message_add_tail(&req->xfer[i], &req->msg); in ad7877_read_adc()
311 status = spi_sync(spi, &req->msg); in ad7877_read_adc()
312 sample = req->sample; in ad7877_read_adc()
321 struct input_dev *input_dev = ts->input; in ad7877_process_data()
325 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; in ad7877_process_data()
326 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; in ad7877_process_data()
327 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; in ad7877_process_data()
328 z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT; in ad7877_process_data()
336 * Other user-programmable conversion controls include variable acquisition time, in ad7877_process_data()
341 /* compute touch pressure resistance using equation #1 */ in ad7877_process_data()
342 Rt = (z2 - z1) * x * ts->x_plate_ohms; in ad7877_process_data()
347 * Sample found inconsistent, pressure is beyond in ad7877_process_data()
350 if (Rt > ts->pressure_max) in ad7877_process_data()
351 return -EINVAL; in ad7877_process_data()
353 if (!timer_pending(&ts->timer)) in ad7877_process_data()
364 return -EINVAL; in ad7877_process_data()
369 struct input_dev *input_dev = ts->input; in ad7877_ts_event_release()
381 spin_lock_irqsave(&ts->lock, flags); in ad7877_timer()
383 spin_unlock_irqrestore(&ts->lock, flags); in ad7877_timer()
392 error = spi_sync(ts->spi, &ts->msg); in ad7877_irq()
394 dev_err(&ts->spi->dev, "spi_sync --> %d\n", error); in ad7877_irq()
398 spin_lock_irqsave(&ts->lock, flags); in ad7877_irq()
401 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); in ad7877_irq()
402 spin_unlock_irqrestore(&ts->lock, flags); in ad7877_irq()
412 mutex_lock(&ts->mutex); in ad7877_disable()
414 if (!ts->disabled) { in ad7877_disable()
415 ts->disabled = true; in ad7877_disable()
416 disable_irq(ts->spi->irq); in ad7877_disable()
418 if (timer_delete_sync(&ts->timer)) in ad7877_disable()
427 mutex_unlock(&ts->mutex); in ad7877_disable()
432 mutex_lock(&ts->mutex); in ad7877_enable()
434 if (ts->disabled) { in ad7877_enable()
435 ts->disabled = false; in ad7877_enable()
436 enable_irq(ts->spi->irq); in ad7877_enable()
439 mutex_unlock(&ts->mutex); in ad7877_enable()
446 ssize_t v = ad7877_read_adc(ts->spi, \
467 return sprintf(buf, "%u\n", ts->disabled); in SHOW()
497 return sprintf(buf, "%u\n", ts->dac); in ad7877_dac_show()
512 mutex_lock(&ts->mutex); in ad7877_dac_store()
513 ts->dac = val & 0xFF; in ad7877_dac_store()
514 ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF); in ad7877_dac_store()
515 mutex_unlock(&ts->mutex); in ad7877_dac_store()
527 return sprintf(buf, "%u\n", ts->gpio3); in ad7877_gpio3_show()
542 mutex_lock(&ts->mutex); in ad7877_gpio3_store()
543 ts->gpio3 = !!val; in ad7877_gpio3_store()
544 ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | in ad7877_gpio3_store()
545 (ts->gpio4 << 4) | (ts->gpio3 << 5)); in ad7877_gpio3_store()
546 mutex_unlock(&ts->mutex); in ad7877_gpio3_store()
558 return sprintf(buf, "%u\n", ts->gpio4); in ad7877_gpio4_show()
573 mutex_lock(&ts->mutex); in ad7877_gpio4_store()
574 ts->gpio4 = !!val; in ad7877_gpio4_store()
575 ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | in ad7877_gpio4_store()
576 (ts->gpio4 << 4) | (ts->gpio3 << 5)); in ad7877_gpio4_store()
577 mutex_unlock(&ts->mutex); in ad7877_gpio4_store()
602 umode_t mode = attr->mode; in ad7877_attr_is_visible()
626 ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) | in ad7877_setup_ts_def_msg()
627 AD7877_POL(ts->stopacq_polarity) | in ad7877_setup_ts_def_msg()
628 AD7877_AVG(ts->averaging) | AD7877_PM(1) | in ad7877_setup_ts_def_msg()
629 AD7877_TMR(ts->pen_down_acc_interval) | in ad7877_setup_ts_def_msg()
630 AD7877_ACQ(ts->acquisition_time) | in ad7877_setup_ts_def_msg()
631 AD7877_FCD(ts->first_conversion_delay); in ad7877_setup_ts_def_msg()
633 ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2); in ad7877_setup_ts_def_msg()
635 ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) | in ad7877_setup_ts_def_msg()
636 AD7877_READADD(AD7877_REG_XPLUS-1) | in ad7877_setup_ts_def_msg()
639 ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); in ad7877_setup_ts_def_msg()
641 ts->cmd_dummy = 0; in ad7877_setup_ts_def_msg()
643 m = &ts->msg; in ad7877_setup_ts_def_msg()
647 m->context = ts; in ad7877_setup_ts_def_msg()
649 ts->xfer[0].tx_buf = &ts->cmd_crtl1; in ad7877_setup_ts_def_msg()
650 ts->xfer[0].len = 2; in ad7877_setup_ts_def_msg()
651 ts->xfer[0].cs_change = 1; in ad7877_setup_ts_def_msg()
653 spi_message_add_tail(&ts->xfer[0], m); in ad7877_setup_ts_def_msg()
655 ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */ in ad7877_setup_ts_def_msg()
656 ts->xfer[1].len = 2; in ad7877_setup_ts_def_msg()
657 ts->xfer[1].cs_change = 1; in ad7877_setup_ts_def_msg()
659 spi_message_add_tail(&ts->xfer[1], m); in ad7877_setup_ts_def_msg()
662 ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i]; in ad7877_setup_ts_def_msg()
663 ts->xfer[i + 2].len = 2; in ad7877_setup_ts_def_msg()
664 if (i < (AD7877_NR_SENSE - 1)) in ad7877_setup_ts_def_msg()
665 ts->xfer[i + 2].cs_change = 1; in ad7877_setup_ts_def_msg()
666 spi_message_add_tail(&ts->xfer[i + 2], m); in ad7877_setup_ts_def_msg()
674 struct ad7877_platform_data *pdata = dev_get_platdata(&spi->dev); in ad7877_probe()
678 if (!spi->irq) { in ad7877_probe()
679 dev_dbg(&spi->dev, "no IRQ?\n"); in ad7877_probe()
680 return -ENODEV; in ad7877_probe()
684 dev_dbg(&spi->dev, "no platform data?\n"); in ad7877_probe()
685 return -ENODEV; in ad7877_probe()
688 /* don't exceed max specified SPI CLK frequency */ in ad7877_probe()
689 if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { in ad7877_probe()
690 dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz); in ad7877_probe()
691 return -EINVAL; in ad7877_probe()
694 spi->bits_per_word = 16; in ad7877_probe()
697 dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); in ad7877_probe()
701 ts = devm_kzalloc(&spi->dev, sizeof(struct ad7877), GFP_KERNEL); in ad7877_probe()
703 return -ENOMEM; in ad7877_probe()
705 input_dev = devm_input_allocate_device(&spi->dev); in ad7877_probe()
707 return -ENOMEM; in ad7877_probe()
709 err = devm_add_action_or_reset(&spi->dev, ad7877_disable, ts); in ad7877_probe()
714 ts->spi = spi; in ad7877_probe()
715 ts->input = input_dev; in ad7877_probe()
717 timer_setup(&ts->timer, ad7877_timer, 0); in ad7877_probe()
718 mutex_init(&ts->mutex); in ad7877_probe()
719 spin_lock_init(&ts->lock); in ad7877_probe()
721 ts->model = pdata->model ? : 7877; in ad7877_probe()
722 ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; in ad7877_probe()
723 ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; in ad7877_probe()
724 ts->pressure_max = pdata->pressure_max ? : ~0; in ad7877_probe()
726 ts->stopacq_polarity = pdata->stopacq_polarity; in ad7877_probe()
727 ts->first_conversion_delay = pdata->first_conversion_delay; in ad7877_probe()
728 ts->acquisition_time = pdata->acquisition_time; in ad7877_probe()
729 ts->averaging = pdata->averaging; in ad7877_probe()
730 ts->pen_down_acc_interval = pdata->pen_down_acc_interval; in ad7877_probe()
732 snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); in ad7877_probe()
734 input_dev->name = "AD7877 Touchscreen"; in ad7877_probe()
735 input_dev->phys = ts->phys; in ad7877_probe()
736 input_dev->dev.parent = &spi->dev; in ad7877_probe()
738 __set_bit(EV_KEY, input_dev->evbit); in ad7877_probe()
739 __set_bit(BTN_TOUCH, input_dev->keybit); in ad7877_probe()
740 __set_bit(EV_ABS, input_dev->evbit); in ad7877_probe()
741 __set_bit(ABS_X, input_dev->absbit); in ad7877_probe()
742 __set_bit(ABS_Y, input_dev->absbit); in ad7877_probe()
743 __set_bit(ABS_PRESSURE, input_dev->absbit); in ad7877_probe()
746 pdata->x_min ? : 0, in ad7877_probe()
747 pdata->x_max ? : MAX_12BIT, in ad7877_probe()
750 pdata->y_min ? : 0, in ad7877_probe()
751 pdata->y_max ? : MAX_12BIT, in ad7877_probe()
754 pdata->pressure_min, pdata->pressure_max, 0, 0); in ad7877_probe()
761 dev_err(&spi->dev, "%s: Failed to probe %s\n", in ad7877_probe()
762 dev_name(&spi->dev), input_dev->name); in ad7877_probe()
763 return -ENODEV; in ad7877_probe()
773 err = devm_request_threaded_irq(&spi->dev, spi->irq, NULL, ad7877_irq, in ad7877_probe()
775 spi->dev.driver->name, ts); in ad7877_probe()
777 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); in ad7877_probe()
820 MODULE_DESCRIPTION("AD7877 touchscreen Driver");