2 * TSC2301 touchscreen driver
4 * Copyright (C) 2005-2008 Nokia Corporation
6 * Written by Jarkko Oikarinen, Imre Deak and Juha Yrjola
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/input.h>
27 #include <linux/interrupt.h>
28 #include <linux/delay.h>
29 #include <linux/spi/spi.h>
31 #ifdef CONFIG_ARCH_OMAP
32 #include <asm/arch/gpio.h>
35 #include <linux/spi/tsc2301.h>
38 * The touchscreen interface operates as follows:
41 * Request access to GPIO103 (DAV)
42 * tsc2301_ts_irq_handler will trigger when DAV line goes down
44 * 1) Pen is pressed against touchscreeen
45 * 2) TSC2301 performs AD conversion
46 * 3) After the conversion is done TSC2301 drives DAV line down
47 * 4) GPIO IRQ is received and tsc2301_ts_irq_handler is called
48 * 5) tsc2301_ts_irq_handler queues up an spi transfer to fetch
49 * the x, y, z1, z2 values
50 * 6) SPI framework calls tsc2301_ts_rx after the coordinates are read
51 * 7) When the penup_timer expires, there have not been DAV interrupts
52 * during the last 20ms which means the pen has been lifted.
56 #define TSC2301_TOUCHSCREEN_PRODUCT_ID 0x0052
57 #define TSC2301_TOUCHSCREEN_PRODUCT_VERSION 0x0001
59 #define TSC2301_TS_PENUP_TIME 20
61 #define TSC2301_ADCREG_CONVERSION_CTRL_BY_TSC2301 0x8000
62 #define TSC2301_ADCREG_CONVERSION_CTRL_BY_HOST 0x0000
64 #define TSC2301_ADCREG_FUNCTION_NONE 0x0000
65 #define TSC2301_ADCREG_FUNCTION_XY 0x0400
66 #define TSC2301_ADCREG_FUNCTION_XYZ 0x0800
67 #define TSC2301_ADCREG_FUNCTION_X 0x0C00
68 #define TSC2301_ADCREG_FUNCTION_Y 0x1000
69 #define TSC2301_ADCREG_FUNCTION_Z 0x1400
70 #define TSC2301_ADCREG_FUNCTION_DAT1 0x1800
71 #define TSC2301_ADCREG_FUNCTION_DAT2 0x1C00
72 #define TSC2301_ADCREG_FUNCTION_AUX1 0x2000
73 #define TSC2301_ADCREG_FUNCTION_AUX2 0x2400
74 #define TSC2301_ADCREG_FUNCTION_TEMP 0x2800
76 #define TSC2301_ADCREG_RESOLUTION_8BIT 0x0100
77 #define TSC2301_ADCREG_RESOLUTION_10BIT 0x0200
78 #define TSC2301_ADCREG_RESOLUTION_12BIT 0x0300
80 #define TSC2301_ADCREG_AVERAGING_NONE 0x0000
81 #define TSC2301_ADCREG_AVERAGING_4AVG 0x0040
82 #define TSC2301_ADCREG_AVERAGING_8AVG 0x0080
83 #define TSC2301_ADCREG_AVERAGING_16AVG 0x00C0
85 #define TSC2301_ADCREG_CLOCK_8MHZ 0x0000
86 #define TSC2301_ADCREG_CLOCK_4MHZ 0x0010
87 #define TSC2301_ADCREG_CLOCK_2MHZ 0x0020
88 #define TSC2301_ADCREG_CLOCK_1MHZ 0x0030
90 #define TSC2301_ADCREG_VOLTAGE_STAB_0US 0x0000
91 #define TSC2301_ADCREG_VOLTAGE_STAB_100US 0x0002
92 #define TSC2301_ADCREG_VOLTAGE_STAB_500US 0x0004
93 #define TSC2301_ADCREG_VOLTAGE_STAB_1MS 0x0006
94 #define TSC2301_ADCREG_VOLTAGE_STAB_5MS 0x0008
95 #define TSC2301_ADCREG_VOLTAGE_STAB_10MS 0x000A
96 #define TSC2301_ADCREG_VOLTAGE_STAB_50MS 0x000C
97 #define TSC2301_ADCREG_VOLTAGE_STAB_100MS 0x000E
99 #define TSC2301_ADCREG_STOP_CONVERSION 0x4000
101 #define MAX_12BIT ((1 << 12) - 1)
103 #define TS_RECT_SIZE 8
104 #define TSF_MIN_Z1 100
105 #define TSF_MAX_Z2 4000
107 #define TSF_SAMPLES 4
119 struct input_dev *idev;
121 struct timer_list penup_timer;
124 struct spi_transfer read_xfer[2];
125 struct spi_message read_msg;
128 struct ts_filter filter;
152 static const u16 tsc2301_ts_read_data = 0x8000 | TSC2301_REG_X;
154 static int tsc2301_ts_check_config(struct tsc2301_ts *ts, int *hw_flags)
159 switch (ts->hw_avg_max) {
161 flags |= TSC2301_ADCREG_AVERAGING_NONE;
164 flags |= TSC2301_ADCREG_AVERAGING_4AVG;
167 flags |= TSC2301_ADCREG_AVERAGING_8AVG;
170 flags |= TSC2301_ADCREG_AVERAGING_16AVG;
176 switch (ts->stab_time) {
178 flags |= TSC2301_ADCREG_VOLTAGE_STAB_0US;
181 flags |= TSC2301_ADCREG_VOLTAGE_STAB_100US;
184 flags |= TSC2301_ADCREG_VOLTAGE_STAB_500US;
187 flags |= TSC2301_ADCREG_VOLTAGE_STAB_1MS;
190 flags |= TSC2301_ADCREG_VOLTAGE_STAB_5MS;
193 flags |= TSC2301_ADCREG_VOLTAGE_STAB_10MS;
196 flags |= TSC2301_ADCREG_VOLTAGE_STAB_50MS;
199 flags |= TSC2301_ADCREG_VOLTAGE_STAB_100MS;
210 * This odd three-time initialization is to work around a bug in TSC2301.
211 * See TSC2301 errata for details.
213 static int tsc2301_ts_configure(struct tsc2301 *tsc, int flags)
215 struct spi_transfer xfer[5];
216 struct spi_transfer *x;
217 struct spi_message m;
219 u16 val1, val2, val3;
222 val1 = TSC2301_ADCREG_CONVERSION_CTRL_BY_HOST |
223 TSC2301_ADCREG_STOP_CONVERSION |
224 TSC2301_ADCREG_FUNCTION_NONE |
225 TSC2301_ADCREG_RESOLUTION_12BIT |
226 TSC2301_ADCREG_AVERAGING_NONE |
227 TSC2301_ADCREG_CLOCK_2MHZ |
228 TSC2301_ADCREG_VOLTAGE_STAB_100MS;
230 val2 = TSC2301_ADCREG_CONVERSION_CTRL_BY_HOST |
231 TSC2301_ADCREG_FUNCTION_XYZ |
232 TSC2301_ADCREG_RESOLUTION_12BIT |
233 TSC2301_ADCREG_AVERAGING_16AVG |
234 TSC2301_ADCREG_CLOCK_1MHZ |
235 TSC2301_ADCREG_VOLTAGE_STAB_100MS;
237 /* Averaging and voltage stabilization settings in flags */
238 val3 = TSC2301_ADCREG_CONVERSION_CTRL_BY_TSC2301 |
239 TSC2301_ADCREG_FUNCTION_XYZ |
240 TSC2301_ADCREG_RESOLUTION_12BIT |
241 TSC2301_ADCREG_CLOCK_2MHZ |
244 /* Now we prepare the command for transferring */
245 data[0] = TSC2301_REG_ADC;
247 data[2] = TSC2301_REG_ADC;
249 data[4] = TSC2301_REG_ADC;
251 data[6] = TSC2301_REG_REF;
252 data[7] = 1 << 4 | 1 << 2 | 1; /* intref, 100uS settl, 2.5V ref */
253 data[8] = TSC2301_REG_CONFIG;
254 data[9] = 3 << 3 | 2 << 0; /* 340uS pre-chrg, 544us delay */
256 spi_message_init(&m);
259 memset(xfer, 0, sizeof(xfer));
262 for (i = 0; i < 10; i += 2) {
263 x->tx_buf = &data[i];
267 spi_message_add_tail(x, &m);
275 static void tsc2301_ts_start_scan(struct tsc2301 *tsc)
277 tsc2301_ts_configure(tsc, tsc->ts->hw_flags);
280 static void tsc2301_ts_stop_scan(struct tsc2301 *tsc)
282 tsc2301_write_reg(tsc, TSC2301_REG_ADC, TSC2301_ADCREG_STOP_CONVERSION);
285 static void update_pen_state(struct tsc2301_ts *ts, int x, int y, int pressure)
288 input_report_abs(ts->idev, ABS_X, x);
289 input_report_abs(ts->idev, ABS_Y, y);
290 input_report_abs(ts->idev, ABS_PRESSURE, pressure);
292 input_report_key(ts->idev, BTN_TOUCH, 1);
295 input_report_abs(ts->idev, ABS_PRESSURE, 0);
297 input_report_key(ts->idev, BTN_TOUCH, 0);
301 input_sync(ts->idev);
304 dev_dbg(&tsc->spi->dev, "x %4d y %4d p %4d\n", x, y, pressure);
308 static int filter(struct tsc2301_ts *ts, int x, int y, int z1, int z2)
310 int inside_rect, pressure_limit, Rt;
311 struct ts_filter *tsf = &ts->filter;
313 /* validate pressure and position */
314 if (x > MAX_12BIT || y > MAX_12BIT)
317 /* skip coords if the pressure-components are out of range */
318 if (z1 < TSF_MIN_Z1 || z2 > TSF_MAX_Z2)
321 /* Use the x,y,z1,z2 directly on the first "pen down" event */
322 if (ts->event_sent) {
328 if (++tsf->sample_cnt < TSF_SAMPLES)
330 x = tsf->avg_x / TSF_SAMPLES;
331 y = tsf->avg_y / TSF_SAMPLES;
332 z1 = tsf->avg_z1 / TSF_SAMPLES;
333 z2 = tsf->avg_z2 / TSF_SAMPLES;
341 pressure_limit = ts->event_sent? ts->max_pressure: ts->touch_pressure;
343 /* z1 is always at least 100: */
344 Rt = x * (z2 - z1) / z1;
345 Rt = Rt * ts->x_plate_ohm / 4096;
346 if (Rt > pressure_limit)
349 /* discard the event if it still is within the previous rect - unless
350 * if the pressure is harder, but then use previous x,y position */
352 x > (int)ts->x - TS_RECT_SIZE && x < (int)ts->x + TS_RECT_SIZE &&
353 y > (int)ts->y - TS_RECT_SIZE && y < (int)ts->y + TS_RECT_SIZE);
355 if (!ts->event_sent || !inside_rect) {
360 } else if (Rt < ts->p) {
368 * This procedure is called by the SPI framework after the coordinates
369 * have been read from TSC2301
371 static void tsc2301_ts_rx(void *arg)
373 struct tsc2301 *tsc = arg;
374 struct tsc2301_ts *ts = tsc->ts;
383 send_event = filter(ts, x, y, z1, z2);
385 update_pen_state(ts, ts->x, ts->y, ts->p);
389 mod_timer(&ts->penup_timer,
390 jiffies + msecs_to_jiffies(TSC2301_TS_PENUP_TIME));
394 * Timer is called TSC2301_TS_PENUP_TIME after pen is up
396 static void tsc2301_ts_timer_handler(unsigned long data)
398 struct tsc2301 *tsc = (struct tsc2301 *)data;
399 struct tsc2301_ts *ts = tsc->ts;
401 if (ts->event_sent) {
403 update_pen_state(ts, 0, 0, 0);
408 * This interrupt is called when pen is down and coordinates are
409 * available. That is indicated by a falling edge on DEV line.
411 static irqreturn_t tsc2301_ts_irq_handler(int irq, void *dev_id)
413 struct tsc2301 *tsc = dev_id;
414 struct tsc2301_ts *ts = tsc->ts;
417 r = spi_async(tsc->spi, &ts->read_msg);
419 dev_err(&tsc->spi->dev, "ts: spi_async() failed");
421 mod_timer(&ts->penup_timer,
422 jiffies + msecs_to_jiffies(TSC2301_TS_PENUP_TIME));
427 static void tsc2301_ts_disable(struct tsc2301 *tsc)
429 struct tsc2301_ts *ts = tsc->ts;
431 if (ts->disable_depth++ != 0)
434 disable_irq(ts->irq);
436 /* wait until penup timer expire normally */
439 } while (ts->event_sent);
441 tsc2301_ts_stop_scan(tsc);
442 /* Workaround a bug where turning on / off touchscreen scanner
443 * can get the keypad scanner stuck.
445 tsc2301_kp_restart(tsc);
448 static void tsc2301_ts_enable(struct tsc2301 *tsc)
450 struct tsc2301_ts *ts = tsc->ts;
452 if (--ts->disable_depth != 0)
457 tsc2301_ts_start_scan(tsc);
458 /* Same workaround as above. */
459 tsc2301_kp_restart(tsc);
463 int tsc2301_ts_suspend(struct tsc2301 *tsc)
465 struct tsc2301_ts *ts = tsc->ts;
467 mutex_lock(&ts->mutex);
468 tsc2301_ts_disable(tsc);
469 mutex_unlock(&ts->mutex);
474 void tsc2301_ts_resume(struct tsc2301 *tsc)
476 struct tsc2301_ts *ts = tsc->ts;
478 mutex_lock(&ts->mutex);
479 tsc2301_ts_enable(tsc);
480 mutex_unlock(&ts->mutex);
484 static void tsc2301_ts_setup_spi_xfer(struct tsc2301 *tsc)
486 struct tsc2301_ts *ts = tsc->ts;
487 struct spi_message *m = &ts->read_msg;
488 struct spi_transfer *x = &ts->read_xfer[0];
492 x->tx_buf = &tsc2301_ts_read_data;
494 spi_message_add_tail(x, m);
497 x->rx_buf = &ts->data;
499 spi_message_add_tail(x, m);
501 m->complete = tsc2301_ts_rx;
505 static ssize_t tsc2301_ts_pen_down_show(struct device *dev,
506 struct device_attribute *attr,
509 struct tsc2301 *tsc = dev_get_drvdata(dev);
511 return sprintf(buf, "%u\n", tsc->ts->pen_down);
514 static DEVICE_ATTR(pen_down, S_IRUGO, tsc2301_ts_pen_down_show, NULL);
516 static ssize_t tsc2301_ts_disable_show(struct device *dev,
517 struct device_attribute *attr, char *buf)
519 struct tsc2301 *tsc = dev_get_drvdata(dev);
520 struct tsc2301_ts *ts = tsc->ts;
522 return sprintf(buf, "%u\n", ts->disabled);
525 static ssize_t tsc2301_ts_disable_store(struct device *dev,
526 struct device_attribute *attr,
527 const char *buf, size_t count)
529 struct tsc2301 *tsc = dev_get_drvdata(dev);
530 struct tsc2301_ts *ts = tsc->ts;
534 i = simple_strtoul(buf, &endp, 10);
536 mutex_lock(&ts->mutex);
537 if (i == ts->disabled) goto out;
541 tsc2301_ts_disable(tsc);
543 tsc2301_ts_enable(tsc);
545 mutex_unlock(&ts->mutex);
549 static DEVICE_ATTR(disable_ts, 0664, tsc2301_ts_disable_show,
550 tsc2301_ts_disable_store);
552 int __devinit tsc2301_ts_init(struct tsc2301 *tsc,
553 struct tsc2301_platform_data *pdata)
555 struct tsc2301_ts *ts;
556 struct input_dev *idev;
559 int x_fudge, y_fudge, p_fudge;
561 if (pdata->dav_gpio < 0) {
562 dev_err(&tsc->spi->dev, "need DAV GPIO");
565 dav_gpio = pdata->dav_gpio;
567 ts = kzalloc(sizeof(*ts), GFP_KERNEL);
572 ts->dav_gpio = dav_gpio;
573 #ifdef CONFIG_ARCH_OMAP
574 r = omap_request_gpio(dav_gpio);
576 dev_err(&tsc->spi->dev, "unable to get DAV GPIO");
579 omap_set_gpio_direction(dav_gpio, 1);
580 ts->irq = OMAP_GPIO_IRQ(dav_gpio);
582 init_timer(&ts->penup_timer);
583 setup_timer(&ts->penup_timer, tsc2301_ts_timer_handler,
586 mutex_init(&ts->mutex);
588 ts->x_plate_ohm = pdata->ts_x_plate_ohm ? : 280;
589 ts->hw_avg_max = pdata->ts_hw_avg;
590 ts->max_pressure = pdata->ts_max_pressure ? : MAX_12BIT;
591 ts->touch_pressure = pdata->ts_touch_pressure ? : ts->max_pressure;
592 ts->stab_time = pdata->ts_stab_time;
594 x_max = pdata->ts_x_max ? : 4096;
595 y_max = pdata->ts_y_max ? : 4096;
596 x_fudge = pdata->ts_x_fudge ? : 4;
597 y_fudge = pdata->ts_y_fudge ? : 8;
598 p_fudge = pdata->ts_pressure_fudge ? : 2;
600 if ((r = tsc2301_ts_check_config(ts, &ts->hw_flags))) {
601 dev_err(&tsc->spi->dev, "invalid configuration\n");
605 idev = input_allocate_device();
610 idev->name = "TSC2301 touchscreen";
611 snprintf(ts->phys, sizeof(ts->phys),
612 "%s/input-ts", tsc->spi->dev.bus_id);
613 idev->phys = ts->phys;
615 idev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY);
616 idev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
619 tsc2301_ts_setup_spi_xfer(tsc);
621 /* These parameters should perhaps be configurable? */
622 input_set_abs_params(idev, ABS_X, 0, x_max, x_fudge, 0);
623 input_set_abs_params(idev, ABS_Y, 0, y_max, y_fudge, 0);
624 input_set_abs_params(idev, ABS_PRESSURE, 0, ts->max_pressure,
627 tsc2301_ts_start_scan(tsc);
629 r = request_irq(ts->irq, tsc2301_ts_irq_handler,
630 IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_FALLING,
633 dev_err(&tsc->spi->dev, "unable to get DAV IRQ");
636 set_irq_wake(ts->irq, 1);
638 if (device_create_file(&tsc->spi->dev, &dev_attr_pen_down) < 0)
640 if (device_create_file(&tsc->spi->dev, &dev_attr_disable_ts) < 0)
643 r = input_register_device(idev);
645 dev_err(&tsc->spi->dev, "can't register touchscreen device\n");
651 device_remove_file(&tsc->spi->dev, &dev_attr_disable_ts);
653 device_remove_file(&tsc->spi->dev, &dev_attr_pen_down);
655 free_irq(ts->irq, tsc);
657 tsc2301_ts_stop_scan(tsc);
658 input_free_device(idev);
660 #ifdef CONFIG_ARCH_OMAP
661 omap_free_gpio(dav_gpio);
668 void __devexit tsc2301_ts_exit(struct tsc2301 *tsc)
670 struct tsc2301_ts *ts = tsc->ts;
672 tsc2301_ts_disable(tsc);
674 device_remove_file(&tsc->spi->dev, &dev_attr_disable_ts);
675 device_remove_file(&tsc->spi->dev, &dev_attr_pen_down);
677 free_irq(ts->irq, tsc);
678 input_unregister_device(ts->idev);
680 #ifdef CONFIG_ARCH_OMAP
681 omap_free_gpio(ts->dav_gpio);
685 MODULE_AUTHOR("Jarkko Oikarinen <jarkko.oikarinen@nokia.com>");
686 MODULE_LICENSE("GPL");