Lines Matching +full:gpio3 +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc.
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)
102 /* DAC Register Default RANGE 0 to Vcc, Volatge Mode, DAC On */
105 /* If gpio3 is set AUX3/GPIO3 acts as GPIO Output */
119 #define AD7877_SER (1 << 11) /* non-differential */
124 #define AD7877_MODE_SEQ0 (2) /* Sequence 0 in Slave Mode */
125 #define AD7877_MODE_SEQ1 (3) /* Sequence 1 in Master Mode */
139 * Non-touchscreen sensors only use single-ended conversions.
182 bool gpio3; /* P: mutex */ member
195 static bool gpio3; variable
196 module_param(gpio3, bool, 0);
197 MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3");
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_usecs = ts->vref_delay_usecs; in ad7877_read_adc()
285 req->xfer[1].cs_change = 1; in ad7877_read_adc()
287 req->xfer[2].tx_buf = &req->command; in ad7877_read_adc()
288 req->xfer[2].len = 2; in ad7877_read_adc()
289 req->xfer[2].delay_usecs = ts->vref_delay_usecs; in ad7877_read_adc()
290 req->xfer[2].cs_change = 1; in ad7877_read_adc()
292 req->xfer[3].rx_buf = &req->sample; in ad7877_read_adc()
293 req->xfer[3].len = 2; in ad7877_read_adc()
294 req->xfer[3].cs_change = 1; in ad7877_read_adc()
296 req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/ in ad7877_read_adc()
297 req->xfer[4].len = 2; in ad7877_read_adc()
298 req->xfer[4].cs_change = 1; in ad7877_read_adc()
300 req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/ in ad7877_read_adc()
301 req->xfer[5].len = 2; in ad7877_read_adc()
307 spi_message_add_tail(&req->xfer[i], &req->msg); in ad7877_read_adc()
309 status = spi_sync(spi, &req->msg); in ad7877_read_adc()
310 sample = req->sample; in ad7877_read_adc()
319 struct input_dev *input_dev = ts->input; in ad7877_process_data()
323 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; in ad7877_process_data()
324 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; in ad7877_process_data()
325 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; in ad7877_process_data()
326 z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT; in ad7877_process_data()
334 * Other user-programmable conversion controls include variable acquisition time, in ad7877_process_data()
340 Rt = (z2 - z1) * x * ts->x_plate_ohms; in ad7877_process_data()
348 if (Rt > ts->pressure_max) in ad7877_process_data()
349 return -EINVAL; in ad7877_process_data()
351 if (!timer_pending(&ts->timer)) in ad7877_process_data()
362 return -EINVAL; in ad7877_process_data()
367 struct input_dev *input_dev = ts->input; in ad7877_ts_event_release()
379 spin_lock_irqsave(&ts->lock, flags); in ad7877_timer()
381 spin_unlock_irqrestore(&ts->lock, flags); in ad7877_timer()
390 error = spi_sync(ts->spi, &ts->msg); in ad7877_irq()
392 dev_err(&ts->spi->dev, "spi_sync --> %d\n", error); in ad7877_irq()
396 spin_lock_irqsave(&ts->lock, flags); in ad7877_irq()
399 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); in ad7877_irq()
400 spin_unlock_irqrestore(&ts->lock, flags); in ad7877_irq()
410 mutex_lock(&ts->mutex); in ad7877_disable()
412 if (!ts->disabled) { in ad7877_disable()
413 ts->disabled = true; in ad7877_disable()
414 disable_irq(ts->spi->irq); in ad7877_disable()
416 if (del_timer_sync(&ts->timer)) in ad7877_disable()
421 * We know the chip's in lowpower mode since we always in ad7877_disable()
425 mutex_unlock(&ts->mutex); in ad7877_disable()
430 mutex_lock(&ts->mutex); in ad7877_enable()
432 if (ts->disabled) { in ad7877_enable()
433 ts->disabled = false; in ad7877_enable()
434 enable_irq(ts->spi->irq); in ad7877_enable()
437 mutex_unlock(&ts->mutex); in ad7877_enable()
444 ssize_t v = ad7877_read_adc(ts->spi, \
465 return sprintf(buf, "%u\n", ts->disabled); in SHOW()
495 return sprintf(buf, "%u\n", ts->dac); in ad7877_dac_show()
510 mutex_lock(&ts->mutex); in ad7877_dac_store()
511 ts->dac = val & 0xFF; in ad7877_dac_store()
512 ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF); in ad7877_dac_store()
513 mutex_unlock(&ts->mutex); in ad7877_dac_store()
525 return sprintf(buf, "%u\n", ts->gpio3); in ad7877_gpio3_show()
540 mutex_lock(&ts->mutex); in ad7877_gpio3_store()
541 ts->gpio3 = !!val; in ad7877_gpio3_store()
542 ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | in ad7877_gpio3_store()
543 (ts->gpio4 << 4) | (ts->gpio3 << 5)); in ad7877_gpio3_store()
544 mutex_unlock(&ts->mutex); in ad7877_gpio3_store()
549 static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store);
556 return sprintf(buf, "%u\n", ts->gpio4); in ad7877_gpio4_show()
571 mutex_lock(&ts->mutex); in ad7877_gpio4_store()
572 ts->gpio4 = !!val; in ad7877_gpio4_store()
573 ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | in ad7877_gpio4_store()
574 (ts->gpio4 << 4) | (ts->gpio3 << 5)); in ad7877_gpio4_store()
575 mutex_unlock(&ts->mutex); in ad7877_gpio4_store()
600 umode_t mode = attr->mode; in ad7877_attr_is_visible() local
603 if (gpio3) in ad7877_attr_is_visible()
604 mode = 0; in ad7877_attr_is_visible()
606 if (!gpio3) in ad7877_attr_is_visible()
607 mode = 0; in ad7877_attr_is_visible()
610 return mode; in ad7877_attr_is_visible()
623 ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) | in ad7877_setup_ts_def_msg()
624 AD7877_POL(ts->stopacq_polarity) | in ad7877_setup_ts_def_msg()
625 AD7877_AVG(ts->averaging) | AD7877_PM(1) | in ad7877_setup_ts_def_msg()
626 AD7877_TMR(ts->pen_down_acc_interval) | in ad7877_setup_ts_def_msg()
627 AD7877_ACQ(ts->acquisition_time) | in ad7877_setup_ts_def_msg()
628 AD7877_FCD(ts->first_conversion_delay); in ad7877_setup_ts_def_msg()
630 ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2); in ad7877_setup_ts_def_msg()
632 ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) | in ad7877_setup_ts_def_msg()
633 AD7877_READADD(AD7877_REG_XPLUS-1) | in ad7877_setup_ts_def_msg()
636 ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); in ad7877_setup_ts_def_msg()
638 ts->cmd_dummy = 0; in ad7877_setup_ts_def_msg()
640 m = &ts->msg; in ad7877_setup_ts_def_msg()
644 m->context = ts; in ad7877_setup_ts_def_msg()
646 ts->xfer[0].tx_buf = &ts->cmd_crtl1; in ad7877_setup_ts_def_msg()
647 ts->xfer[0].len = 2; in ad7877_setup_ts_def_msg()
648 ts->xfer[0].cs_change = 1; in ad7877_setup_ts_def_msg()
650 spi_message_add_tail(&ts->xfer[0], m); in ad7877_setup_ts_def_msg()
652 ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */ in ad7877_setup_ts_def_msg()
653 ts->xfer[1].len = 2; in ad7877_setup_ts_def_msg()
654 ts->xfer[1].cs_change = 1; in ad7877_setup_ts_def_msg()
656 spi_message_add_tail(&ts->xfer[1], m); in ad7877_setup_ts_def_msg()
659 ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i]; in ad7877_setup_ts_def_msg()
660 ts->xfer[i + 2].len = 2; in ad7877_setup_ts_def_msg()
661 if (i < (AD7877_NR_SENSE - 1)) in ad7877_setup_ts_def_msg()
662 ts->xfer[i + 2].cs_change = 1; in ad7877_setup_ts_def_msg()
663 spi_message_add_tail(&ts->xfer[i + 2], m); in ad7877_setup_ts_def_msg()
671 struct ad7877_platform_data *pdata = dev_get_platdata(&spi->dev); in ad7877_probe()
675 if (!spi->irq) { in ad7877_probe()
676 dev_dbg(&spi->dev, "no IRQ?\n"); in ad7877_probe()
677 return -ENODEV; in ad7877_probe()
681 dev_dbg(&spi->dev, "no platform data?\n"); in ad7877_probe()
682 return -ENODEV; in ad7877_probe()
686 if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { in ad7877_probe()
687 dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz); in ad7877_probe()
688 return -EINVAL; in ad7877_probe()
691 spi->bits_per_word = 16; in ad7877_probe()
694 dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); in ad7877_probe()
698 ts = devm_kzalloc(&spi->dev, sizeof(struct ad7877), GFP_KERNEL); in ad7877_probe()
700 return -ENOMEM; in ad7877_probe()
702 input_dev = devm_input_allocate_device(&spi->dev); in ad7877_probe()
704 return -ENOMEM; in ad7877_probe()
706 err = devm_add_action_or_reset(&spi->dev, ad7877_disable, ts); in ad7877_probe()
711 ts->spi = spi; in ad7877_probe()
712 ts->input = input_dev; in ad7877_probe()
714 timer_setup(&ts->timer, ad7877_timer, 0); in ad7877_probe()
715 mutex_init(&ts->mutex); in ad7877_probe()
716 spin_lock_init(&ts->lock); in ad7877_probe()
718 ts->model = pdata->model ? : 7877; in ad7877_probe()
719 ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; in ad7877_probe()
720 ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; in ad7877_probe()
721 ts->pressure_max = pdata->pressure_max ? : ~0; in ad7877_probe()
723 ts->stopacq_polarity = pdata->stopacq_polarity; in ad7877_probe()
724 ts->first_conversion_delay = pdata->first_conversion_delay; in ad7877_probe()
725 ts->acquisition_time = pdata->acquisition_time; in ad7877_probe()
726 ts->averaging = pdata->averaging; in ad7877_probe()
727 ts->pen_down_acc_interval = pdata->pen_down_acc_interval; in ad7877_probe()
729 snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); in ad7877_probe()
731 input_dev->name = "AD7877 Touchscreen"; in ad7877_probe()
732 input_dev->phys = ts->phys; in ad7877_probe()
733 input_dev->dev.parent = &spi->dev; in ad7877_probe()
735 __set_bit(EV_KEY, input_dev->evbit); in ad7877_probe()
736 __set_bit(BTN_TOUCH, input_dev->keybit); in ad7877_probe()
737 __set_bit(EV_ABS, input_dev->evbit); in ad7877_probe()
738 __set_bit(ABS_X, input_dev->absbit); in ad7877_probe()
739 __set_bit(ABS_Y, input_dev->absbit); in ad7877_probe()
740 __set_bit(ABS_PRESSURE, input_dev->absbit); in ad7877_probe()
743 pdata->x_min ? : 0, in ad7877_probe()
744 pdata->x_max ? : MAX_12BIT, in ad7877_probe()
747 pdata->y_min ? : 0, in ad7877_probe()
748 pdata->y_max ? : MAX_12BIT, in ad7877_probe()
751 pdata->pressure_min, pdata->pressure_max, 0, 0); in ad7877_probe()
758 dev_err(&spi->dev, "%s: Failed to probe %s\n", in ad7877_probe()
759 dev_name(&spi->dev), input_dev->name); in ad7877_probe()
760 return -ENODEV; in ad7877_probe()
763 if (gpio3) in ad7877_probe()
770 err = devm_request_threaded_irq(&spi->dev, spi->irq, NULL, ad7877_irq, in ad7877_probe()
772 spi->dev.driver->name, ts); in ad7877_probe()
774 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); in ad7877_probe()
778 err = devm_device_add_group(&spi->dev, &ad7877_attr_group); in ad7877_probe()