aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2015-11-13 14:56:45 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-11-13 14:56:45 -0500
commitbbdb5c22e12507e7f1637091bc24fe4d33e128e5 (patch)
treeb66d1f87c6659d6875b5b0bd6b71cbfe3bbe2285
parente60e063c14b13d0f66ffc708b8aa5d1a8208606e (diff)
parent5e0baca8b3247f459af50947eaafc68bb8168b33 (diff)
Merge branch 'next' into for-linus
Prepare second round of input updates for 4.3 merge window.
-rw-r--r--Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt34
-rw-r--r--drivers/input/mouse/elantech.c7
-rw-r--r--drivers/input/serio/parkbd.c2
-rw-r--r--drivers/input/touchscreen/Kconfig17
-rw-r--r--drivers/input/touchscreen/Makefile2
-rw-r--r--drivers/input/touchscreen/tsc2004.c83
-rw-r--r--drivers/input/touchscreen/tsc2005.c714
-rw-r--r--drivers/input/touchscreen/tsc200x-core.c665
-rw-r--r--drivers/input/touchscreen/tsc200x-core.h78
9 files changed, 899 insertions, 703 deletions
diff --git a/Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt b/Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt
index 09089a6d69ed..b80c04b0e5c0 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt
@@ -1,14 +1,15 @@
1* Texas Instruments tsc2005 touchscreen controller 1* Texas Instruments tsc2004 and tsc2005 touchscreen controllers
2 2
3Required properties: 3Required properties:
4 - compatible : "ti,tsc2005" 4 - compatible : "ti,tsc2004" or "ti,tsc2005"
5 - reg : SPI device address 5 - reg : Device address
6 - spi-max-frequency : Maximal SPI speed
7 - interrupts : IRQ specifier 6 - interrupts : IRQ specifier
8 - reset-gpios : GPIO specifier 7 - spi-max-frequency : Maximum SPI clocking speed of the device
9 - vio-supply : Regulator specifier 8 (for tsc2005)
10 9
11Optional properties: 10Optional properties:
11 - vio-supply : Regulator specifier
12 - reset-gpios : GPIO specifier for the controller reset line
12 - ti,x-plate-ohms : integer, resistance of the touchscreen's X plates 13 - ti,x-plate-ohms : integer, resistance of the touchscreen's X plates
13 in ohm (defaults to 280) 14 in ohm (defaults to 280)
14 - ti,esd-recovery-timeout-ms : integer, if the touchscreen does not respond after 15 - ti,esd-recovery-timeout-ms : integer, if the touchscreen does not respond after
@@ -18,6 +19,27 @@ Optional properties:
18 19
19Example: 20Example:
20 21
22&i2c3 {
23 tsc2004@48 {
24 compatible = "ti,tsc2004";
25 reg = <0x48>;
26 vio-supply = <&vio>;
27
28 reset-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
29 interrupts-extended = <&gpio1 27 IRQ_TYPE_EDGE_RISING>;
30
31 touchscreen-fuzz-x = <4>;
32 touchscreen-fuzz-y = <7>;
33 touchscreen-fuzz-pressure = <2>;
34 touchscreen-size-x = <4096>;
35 touchscreen-size-y = <4096>;
36 touchscreen-max-pressure = <2048>;
37
38 ti,x-plate-ohms = <280>;
39 ti,esd-recovery-timeout-ms = <8000>;
40 };
41}
42
21&mcspi1 { 43&mcspi1 {
22 tsc2005@0 { 44 tsc2005@0 {
23 compatible = "ti,tsc2005"; 45 compatible = "ti,tsc2005";
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 2955f1d0ca6c..537ebb0e193a 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -1520,6 +1520,13 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
1520 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"), 1520 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"),
1521 }, 1521 },
1522 }, 1522 },
1523 {
1524 /* Fujitsu LIFEBOOK U745 does not work with crc_enabled == 0 */
1525 .matches = {
1526 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1527 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
1528 },
1529 },
1523#endif 1530#endif
1524 { } 1531 { }
1525}; 1532};
diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c
index 74bb17270255..92c31b8f8fb4 100644
--- a/drivers/input/serio/parkbd.c
+++ b/drivers/input/serio/parkbd.c
@@ -164,7 +164,7 @@ static int parkbd_getport(struct parport *pp)
164 return 0; 164 return 0;
165} 165}
166 166
167static struct serio * __init parkbd_allocate_serio(void) 167static struct serio *parkbd_allocate_serio(void)
168{ 168{
169 struct serio *serio; 169 struct serio *serio;
170 170
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 80cc69897a43..ae33da7ab51f 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -939,10 +939,27 @@ config TOUCHSCREEN_TSC_SERIO
939 To compile this driver as a module, choose M here: the 939 To compile this driver as a module, choose M here: the
940 module will be called tsc40. 940 module will be called tsc40.
941 941
942config TOUCHSCREEN_TSC200X_CORE
943 tristate
944
945config TOUCHSCREEN_TSC2004
946 tristate "TSC2004 based touchscreens"
947 depends on I2C
948 select REGMAP_I2C
949 select TOUCHSCREEN_TSC200X_CORE
950 help
951 Say Y here if you have a TSC2004 based touchscreen.
952
953 If unsure, say N.
954
955 To compile this driver as a module, choose M here: the
956 module will be called tsc2004.
957
942config TOUCHSCREEN_TSC2005 958config TOUCHSCREEN_TSC2005
943 tristate "TSC2005 based touchscreens" 959 tristate "TSC2005 based touchscreens"
944 depends on SPI_MASTER 960 depends on SPI_MASTER
945 select REGMAP_SPI 961 select REGMAP_SPI
962 select TOUCHSCREEN_TSC200X_CORE
946 help 963 help
947 Say Y here if you have a TSC2005 based touchscreen. 964 Say Y here if you have a TSC2005 based touchscreen.
948 965
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 17435c7e97e3..cbaa6abb08da 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -69,6 +69,8 @@ obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
69obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o 69obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
70obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o 70obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
71obj-$(CONFIG_TOUCHSCREEN_TSC_SERIO) += tsc40.o 71obj-$(CONFIG_TOUCHSCREEN_TSC_SERIO) += tsc40.o
72obj-$(CONFIG_TOUCHSCREEN_TSC200X_CORE) += tsc200x-core.o
73obj-$(CONFIG_TOUCHSCREEN_TSC2004) += tsc2004.o
72obj-$(CONFIG_TOUCHSCREEN_TSC2005) += tsc2005.o 74obj-$(CONFIG_TOUCHSCREEN_TSC2005) += tsc2005.o
73obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o 75obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o
74obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o 76obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o
diff --git a/drivers/input/touchscreen/tsc2004.c b/drivers/input/touchscreen/tsc2004.c
new file mode 100644
index 000000000000..7295c198aa08
--- /dev/null
+++ b/drivers/input/touchscreen/tsc2004.c
@@ -0,0 +1,83 @@
1/*
2 * TSC2004 touchscreen driver
3 *
4 * Copyright (C) 2015 QWERTY Embedded Design
5 * Copyright (C) 2015 EMAC Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
18#include <linux/module.h>
19#include <linux/input.h>
20#include <linux/of.h>
21#include <linux/i2c.h>
22#include <linux/regmap.h>
23#include "tsc200x-core.h"
24
25static int tsc2004_cmd(struct device *dev, u8 cmd)
26{
27 u8 tx = TSC200X_CMD | TSC200X_CMD_12BIT | cmd;
28 s32 data;
29 struct i2c_client *i2c = to_i2c_client(dev);
30
31 data = i2c_smbus_write_byte(i2c, tx);
32 if (data < 0) {
33 dev_err(dev, "%s: failed, command: %x i2c error: %d\n",
34 __func__, cmd, data);
35 return data;
36 }
37
38 return 0;
39}
40
41static int tsc2004_probe(struct i2c_client *i2c,
42 const struct i2c_device_id *id)
43
44{
45 return tsc200x_probe(&i2c->dev, i2c->irq, BUS_I2C,
46 devm_regmap_init_i2c(i2c, &tsc200x_regmap_config),
47 tsc2004_cmd);
48}
49
50static int tsc2004_remove(struct i2c_client *i2c)
51{
52 return tsc200x_remove(&i2c->dev);
53}
54
55static const struct i2c_device_id tsc2004_idtable[] = {
56 { "tsc2004", 0 },
57 { }
58};
59MODULE_DEVICE_TABLE(i2c, tsc2004_idtable);
60
61#ifdef CONFIG_OF
62static const struct of_device_id tsc2004_of_match[] = {
63 { .compatible = "ti,tsc2004" },
64 { /* sentinel */ }
65};
66MODULE_DEVICE_TABLE(of, tsc2004_of_match);
67#endif
68
69static struct i2c_driver tsc2004_driver = {
70 .driver = {
71 .name = "tsc2004",
72 .of_match_table = of_match_ptr(tsc2004_of_match),
73 .pm = &tsc200x_pm_ops,
74 },
75 .id_table = tsc2004_idtable,
76 .probe = tsc2004_probe,
77 .remove = tsc2004_remove,
78};
79module_i2c_driver(tsc2004_driver);
80
81MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>");
82MODULE_DESCRIPTION("TSC2004 Touchscreen Driver");
83MODULE_LICENSE("GPL");
diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c
index 0f65d02eeb26..1bbe64c89a10 100644
--- a/drivers/input/touchscreen/tsc2005.c
+++ b/drivers/input/touchscreen/tsc2005.c
@@ -2,9 +2,10 @@
2 * TSC2005 touchscreen driver 2 * TSC2005 touchscreen driver
3 * 3 *
4 * Copyright (C) 2006-2010 Nokia Corporation 4 * Copyright (C) 2006-2010 Nokia Corporation
5 * Copyright (C) 2015 QWERTY Embedded Design
6 * Copyright (C) 2015 EMAC Inc.
5 * 7 *
6 * Author: Lauri Leukkunen <lauri.leukkunen@nokia.com> 8 * Based on original tsc2005.c by Lauri Leukkunen <lauri.leukkunen@nokia.com>
7 * based on TSC2301 driver by Klaus K. Pedersen <klaus.k.pedersen@nokia.com>
8 * 9 *
9 * This program is free software; you can redistribute it and/or modify 10 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 11 * it under the terms of the GNU General Public License as published by
@@ -15,192 +16,32 @@
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details. 18 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 *
23 */ 19 */
24 20
25#include <linux/kernel.h>
26#include <linux/module.h> 21#include <linux/module.h>
27#include <linux/input.h> 22#include <linux/input.h>
28#include <linux/input/touchscreen.h>
29#include <linux/interrupt.h>
30#include <linux/delay.h>
31#include <linux/pm.h>
32#include <linux/of.h>
33#include <linux/spi/spi.h> 23#include <linux/spi/spi.h>
34#include <linux/spi/tsc2005.h>
35#include <linux/regulator/consumer.h>
36#include <linux/regmap.h> 24#include <linux/regmap.h>
37#include <linux/gpio/consumer.h> 25#include "tsc200x-core.h"
38
39/*
40 * The touchscreen interface operates as follows:
41 *
42 * 1) Pen is pressed against the touchscreen.
43 * 2) TSC2005 performs AD conversion.
44 * 3) After the conversion is done TSC2005 drives DAV line down.
45 * 4) GPIO IRQ is received and tsc2005_irq_thread() is scheduled.
46 * 5) tsc2005_irq_thread() queues up an spi transfer to fetch the x, y, z1, z2
47 * values.
48 * 6) tsc2005_irq_thread() reports coordinates to input layer and sets up
49 * tsc2005_penup_timer() to be called after TSC2005_PENUP_TIME_MS (40ms).
50 * 7) When the penup timer expires, there have not been touch or DAV interrupts
51 * during the last 40ms which means the pen has been lifted.
52 *
53 * ESD recovery via a hardware reset is done if the TSC2005 doesn't respond
54 * after a configurable period (in ms) of activity. If esd_timeout is 0, the
55 * watchdog is disabled.
56 */
57
58/* control byte 1 */
59#define TSC2005_CMD 0x80
60#define TSC2005_CMD_NORMAL 0x00
61#define TSC2005_CMD_STOP 0x01
62#define TSC2005_CMD_12BIT 0x04
63
64/* control byte 0 */
65#define TSC2005_REG_READ 0x01 /* R/W access */
66#define TSC2005_REG_PND0 0x02 /* Power Not Down Control */
67#define TSC2005_REG_X (0x0 << 3)
68#define TSC2005_REG_Y (0x1 << 3)
69#define TSC2005_REG_Z1 (0x2 << 3)
70#define TSC2005_REG_Z2 (0x3 << 3)
71#define TSC2005_REG_AUX (0x4 << 3)
72#define TSC2005_REG_TEMP1 (0x5 << 3)
73#define TSC2005_REG_TEMP2 (0x6 << 3)
74#define TSC2005_REG_STATUS (0x7 << 3)
75#define TSC2005_REG_AUX_HIGH (0x8 << 3)
76#define TSC2005_REG_AUX_LOW (0x9 << 3)
77#define TSC2005_REG_TEMP_HIGH (0xA << 3)
78#define TSC2005_REG_TEMP_LOW (0xB << 3)
79#define TSC2005_REG_CFR0 (0xC << 3)
80#define TSC2005_REG_CFR1 (0xD << 3)
81#define TSC2005_REG_CFR2 (0xE << 3)
82#define TSC2005_REG_CONV_FUNC (0xF << 3)
83
84/* configuration register 0 */
85#define TSC2005_CFR0_PRECHARGE_276US 0x0040
86#define TSC2005_CFR0_STABTIME_1MS 0x0300
87#define TSC2005_CFR0_CLOCK_1MHZ 0x1000
88#define TSC2005_CFR0_RESOLUTION12 0x2000
89#define TSC2005_CFR0_PENMODE 0x8000
90#define TSC2005_CFR0_INITVALUE (TSC2005_CFR0_STABTIME_1MS | \
91 TSC2005_CFR0_CLOCK_1MHZ | \
92 TSC2005_CFR0_RESOLUTION12 | \
93 TSC2005_CFR0_PRECHARGE_276US | \
94 TSC2005_CFR0_PENMODE)
95
96/* bits common to both read and write of configuration register 0 */
97#define TSC2005_CFR0_RW_MASK 0x3fff
98
99/* configuration register 1 */
100#define TSC2005_CFR1_BATCHDELAY_4MS 0x0003
101#define TSC2005_CFR1_INITVALUE TSC2005_CFR1_BATCHDELAY_4MS
102
103/* configuration register 2 */
104#define TSC2005_CFR2_MAVE_Z 0x0004
105#define TSC2005_CFR2_MAVE_Y 0x0008
106#define TSC2005_CFR2_MAVE_X 0x0010
107#define TSC2005_CFR2_AVG_7 0x0800
108#define TSC2005_CFR2_MEDIUM_15 0x3000
109#define TSC2005_CFR2_INITVALUE (TSC2005_CFR2_MAVE_X | \
110 TSC2005_CFR2_MAVE_Y | \
111 TSC2005_CFR2_MAVE_Z | \
112 TSC2005_CFR2_MEDIUM_15 | \
113 TSC2005_CFR2_AVG_7)
114
115#define MAX_12BIT 0xfff
116#define TSC2005_DEF_X_FUZZ 4
117#define TSC2005_DEF_Y_FUZZ 8
118#define TSC2005_DEF_P_FUZZ 2
119#define TSC2005_DEF_RESISTOR 280
120
121#define TSC2005_SPI_MAX_SPEED_HZ 10000000
122#define TSC2005_PENUP_TIME_MS 40
123
124static const struct regmap_range tsc2005_writable_ranges[] = {
125 regmap_reg_range(TSC2005_REG_AUX_HIGH, TSC2005_REG_CFR2),
126};
127
128static const struct regmap_access_table tsc2005_writable_table = {
129 .yes_ranges = tsc2005_writable_ranges,
130 .n_yes_ranges = ARRAY_SIZE(tsc2005_writable_ranges),
131};
132
133static struct regmap_config tsc2005_regmap_config = {
134 .reg_bits = 8,
135 .val_bits = 16,
136 .reg_stride = 0x08,
137 .max_register = 0x78,
138 .read_flag_mask = TSC2005_REG_READ,
139 .write_flag_mask = TSC2005_REG_PND0,
140 .wr_table = &tsc2005_writable_table,
141 .use_single_rw = true,
142};
143
144struct tsc2005_data {
145 u16 x;
146 u16 y;
147 u16 z1;
148 u16 z2;
149} __packed;
150#define TSC2005_DATA_REGS 4
151
152struct tsc2005 {
153 struct spi_device *spi;
154 struct regmap *regmap;
155
156 struct input_dev *idev;
157 char phys[32];
158
159 struct mutex mutex;
160
161 /* raw copy of previous x,y,z */
162 int in_x;
163 int in_y;
164 int in_z1;
165 int in_z2;
166
167 spinlock_t lock;
168 struct timer_list penup_timer;
169 26
170 unsigned int esd_timeout; 27static int tsc2005_cmd(struct device *dev, u8 cmd)
171 struct delayed_work esd_work;
172 unsigned long last_valid_interrupt;
173
174 unsigned int x_plate_ohm;
175
176 bool opened;
177 bool suspended;
178
179 bool pen_down;
180
181 struct regulator *vio;
182
183 struct gpio_desc *reset_gpio;
184 void (*set_reset)(bool enable);
185};
186
187static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd)
188{ 28{
189 u8 tx = TSC2005_CMD | TSC2005_CMD_12BIT | cmd; 29 u8 tx = TSC200X_CMD | TSC200X_CMD_12BIT | cmd;
190 struct spi_transfer xfer = { 30 struct spi_transfer xfer = {
191 .tx_buf = &tx, 31 .tx_buf = &tx,
192 .len = 1, 32 .len = 1,
193 .bits_per_word = 8, 33 .bits_per_word = 8,
194 }; 34 };
195 struct spi_message msg; 35 struct spi_message msg;
36 struct spi_device *spi = to_spi_device(dev);
196 int error; 37 int error;
197 38
198 spi_message_init(&msg); 39 spi_message_init(&msg);
199 spi_message_add_tail(&xfer, &msg); 40 spi_message_add_tail(&xfer, &msg);
200 41
201 error = spi_sync(ts->spi, &msg); 42 error = spi_sync(spi, &msg);
202 if (error) { 43 if (error) {
203 dev_err(&ts->spi->dev, "%s: failed, command: %x, error: %d\n", 44 dev_err(dev, "%s: failed, command: %x, spi error: %d\n",
204 __func__, cmd, error); 45 __func__, cmd, error);
205 return error; 46 return error;
206 } 47 }
@@ -208,382 +49,10 @@ static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd)
208 return 0; 49 return 0;
209} 50}
210 51
211static void tsc2005_update_pen_state(struct tsc2005 *ts,
212 int x, int y, int pressure)
213{
214 if (pressure) {
215 input_report_abs(ts->idev, ABS_X, x);
216 input_report_abs(ts->idev, ABS_Y, y);
217 input_report_abs(ts->idev, ABS_PRESSURE, pressure);
218 if (!ts->pen_down) {
219 input_report_key(ts->idev, BTN_TOUCH, !!pressure);
220 ts->pen_down = true;
221 }
222 } else {
223 input_report_abs(ts->idev, ABS_PRESSURE, 0);
224 if (ts->pen_down) {
225 input_report_key(ts->idev, BTN_TOUCH, 0);
226 ts->pen_down = false;
227 }
228 }
229 input_sync(ts->idev);
230 dev_dbg(&ts->spi->dev, "point(%4d,%4d), pressure (%4d)\n", x, y,
231 pressure);
232}
233
234static irqreturn_t tsc2005_irq_thread(int irq, void *_ts)
235{
236 struct tsc2005 *ts = _ts;
237 unsigned long flags;
238 unsigned int pressure;
239 struct tsc2005_data tsdata;
240 int error;
241
242 /* read the coordinates */
243 error = regmap_bulk_read(ts->regmap, TSC2005_REG_X, &tsdata,
244 TSC2005_DATA_REGS);
245 if (unlikely(error))
246 goto out;
247
248 /* validate position */
249 if (unlikely(tsdata.x > MAX_12BIT || tsdata.y > MAX_12BIT))
250 goto out;
251
252 /* Skip reading if the pressure components are out of range */
253 if (unlikely(tsdata.z1 == 0 || tsdata.z2 > MAX_12BIT))
254 goto out;
255 if (unlikely(tsdata.z1 >= tsdata.z2))
256 goto out;
257
258 /*
259 * Skip point if this is a pen down with the exact same values as
260 * the value before pen-up - that implies SPI fed us stale data
261 */
262 if (!ts->pen_down &&
263 ts->in_x == tsdata.x && ts->in_y == tsdata.y &&
264 ts->in_z1 == tsdata.z1 && ts->in_z2 == tsdata.z2) {
265 goto out;
266 }
267
268 /*
269 * At this point we are happy we have a valid and useful reading.
270 * Remember it for later comparisons. We may now begin downsampling.
271 */
272 ts->in_x = tsdata.x;
273 ts->in_y = tsdata.y;
274 ts->in_z1 = tsdata.z1;
275 ts->in_z2 = tsdata.z2;
276
277 /* Compute touch pressure resistance using equation #1 */
278 pressure = tsdata.x * (tsdata.z2 - tsdata.z1) / tsdata.z1;
279 pressure = pressure * ts->x_plate_ohm / 4096;
280 if (unlikely(pressure > MAX_12BIT))
281 goto out;
282
283 spin_lock_irqsave(&ts->lock, flags);
284
285 tsc2005_update_pen_state(ts, tsdata.x, tsdata.y, pressure);
286 mod_timer(&ts->penup_timer,
287 jiffies + msecs_to_jiffies(TSC2005_PENUP_TIME_MS));
288
289 spin_unlock_irqrestore(&ts->lock, flags);
290
291 ts->last_valid_interrupt = jiffies;
292out:
293 return IRQ_HANDLED;
294}
295
296static void tsc2005_penup_timer(unsigned long data)
297{
298 struct tsc2005 *ts = (struct tsc2005 *)data;
299 unsigned long flags;
300
301 spin_lock_irqsave(&ts->lock, flags);
302 tsc2005_update_pen_state(ts, 0, 0, 0);
303 spin_unlock_irqrestore(&ts->lock, flags);
304}
305
306static void tsc2005_start_scan(struct tsc2005 *ts)
307{
308 regmap_write(ts->regmap, TSC2005_REG_CFR0, TSC2005_CFR0_INITVALUE);
309 regmap_write(ts->regmap, TSC2005_REG_CFR1, TSC2005_CFR1_INITVALUE);
310 regmap_write(ts->regmap, TSC2005_REG_CFR2, TSC2005_CFR2_INITVALUE);
311 tsc2005_cmd(ts, TSC2005_CMD_NORMAL);
312}
313
314static void tsc2005_stop_scan(struct tsc2005 *ts)
315{
316 tsc2005_cmd(ts, TSC2005_CMD_STOP);
317}
318
319static void tsc2005_set_reset(struct tsc2005 *ts, bool enable)
320{
321 if (ts->reset_gpio)
322 gpiod_set_value_cansleep(ts->reset_gpio, enable);
323 else if (ts->set_reset)
324 ts->set_reset(enable);
325}
326
327/* must be called with ts->mutex held */
328static void __tsc2005_disable(struct tsc2005 *ts)
329{
330 tsc2005_stop_scan(ts);
331
332 disable_irq(ts->spi->irq);
333 del_timer_sync(&ts->penup_timer);
334
335 cancel_delayed_work_sync(&ts->esd_work);
336
337 enable_irq(ts->spi->irq);
338}
339
340/* must be called with ts->mutex held */
341static void __tsc2005_enable(struct tsc2005 *ts)
342{
343 tsc2005_start_scan(ts);
344
345 if (ts->esd_timeout && (ts->set_reset || ts->reset_gpio)) {
346 ts->last_valid_interrupt = jiffies;
347 schedule_delayed_work(&ts->esd_work,
348 round_jiffies_relative(
349 msecs_to_jiffies(ts->esd_timeout)));
350 }
351
352}
353
354static ssize_t tsc2005_selftest_show(struct device *dev,
355 struct device_attribute *attr,
356 char *buf)
357{
358 struct tsc2005 *ts = dev_get_drvdata(dev);
359 unsigned int temp_high;
360 unsigned int temp_high_orig;
361 unsigned int temp_high_test;
362 bool success = true;
363 int error;
364
365 mutex_lock(&ts->mutex);
366
367 /*
368 * Test TSC2005 communications via temp high register.
369 */
370 __tsc2005_disable(ts);
371
372 error = regmap_read(ts->regmap, TSC2005_REG_TEMP_HIGH, &temp_high_orig);
373 if (error) {
374 dev_warn(dev, "selftest failed: read error %d\n", error);
375 success = false;
376 goto out;
377 }
378
379 temp_high_test = (temp_high_orig - 1) & MAX_12BIT;
380
381 error = regmap_write(ts->regmap, TSC2005_REG_TEMP_HIGH, temp_high_test);
382 if (error) {
383 dev_warn(dev, "selftest failed: write error %d\n", error);
384 success = false;
385 goto out;
386 }
387
388 error = regmap_read(ts->regmap, TSC2005_REG_TEMP_HIGH, &temp_high);
389 if (error) {
390 dev_warn(dev, "selftest failed: read error %d after write\n",
391 error);
392 success = false;
393 goto out;
394 }
395
396 if (temp_high != temp_high_test) {
397 dev_warn(dev, "selftest failed: %d != %d\n",
398 temp_high, temp_high_test);
399 success = false;
400 }
401
402 /* hardware reset */
403 tsc2005_set_reset(ts, false);
404 usleep_range(100, 500); /* only 10us required */
405 tsc2005_set_reset(ts, true);
406
407 if (!success)
408 goto out;
409
410 /* test that the reset really happened */
411 error = regmap_read(ts->regmap, TSC2005_REG_TEMP_HIGH, &temp_high);
412 if (error) {
413 dev_warn(dev, "selftest failed: read error %d after reset\n",
414 error);
415 success = false;
416 goto out;
417 }
418
419 if (temp_high != temp_high_orig) {
420 dev_warn(dev, "selftest failed after reset: %d != %d\n",
421 temp_high, temp_high_orig);
422 success = false;
423 }
424
425out:
426 __tsc2005_enable(ts);
427 mutex_unlock(&ts->mutex);
428
429 return sprintf(buf, "%d\n", success);
430}
431
432static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
433
434static struct attribute *tsc2005_attrs[] = {
435 &dev_attr_selftest.attr,
436 NULL
437};
438
439static umode_t tsc2005_attr_is_visible(struct kobject *kobj,
440 struct attribute *attr, int n)
441{
442 struct device *dev = container_of(kobj, struct device, kobj);
443 struct tsc2005 *ts = dev_get_drvdata(dev);
444 umode_t mode = attr->mode;
445
446 if (attr == &dev_attr_selftest.attr) {
447 if (!ts->set_reset && !ts->reset_gpio)
448 mode = 0;
449 }
450
451 return mode;
452}
453
454static const struct attribute_group tsc2005_attr_group = {
455 .is_visible = tsc2005_attr_is_visible,
456 .attrs = tsc2005_attrs,
457};
458
459static void tsc2005_esd_work(struct work_struct *work)
460{
461 struct tsc2005 *ts = container_of(work, struct tsc2005, esd_work.work);
462 int error;
463 unsigned int r;
464
465 if (!mutex_trylock(&ts->mutex)) {
466 /*
467 * If the mutex is taken, it means that disable or enable is in
468 * progress. In that case just reschedule the work. If the work
469 * is not needed, it will be canceled by disable.
470 */
471 goto reschedule;
472 }
473
474 if (time_is_after_jiffies(ts->last_valid_interrupt +
475 msecs_to_jiffies(ts->esd_timeout)))
476 goto out;
477
478 /* We should be able to read register without disabling interrupts. */
479 error = regmap_read(ts->regmap, TSC2005_REG_CFR0, &r);
480 if (!error &&
481 !((r ^ TSC2005_CFR0_INITVALUE) & TSC2005_CFR0_RW_MASK)) {
482 goto out;
483 }
484
485 /*
486 * If we could not read our known value from configuration register 0
487 * then we should reset the controller as if from power-up and start
488 * scanning again.
489 */
490 dev_info(&ts->spi->dev, "TSC2005 not responding - resetting\n");
491
492 disable_irq(ts->spi->irq);
493 del_timer_sync(&ts->penup_timer);
494
495 tsc2005_update_pen_state(ts, 0, 0, 0);
496
497 tsc2005_set_reset(ts, false);
498 usleep_range(100, 500); /* only 10us required */
499 tsc2005_set_reset(ts, true);
500
501 enable_irq(ts->spi->irq);
502 tsc2005_start_scan(ts);
503
504out:
505 mutex_unlock(&ts->mutex);
506reschedule:
507 /* re-arm the watchdog */
508 schedule_delayed_work(&ts->esd_work,
509 round_jiffies_relative(
510 msecs_to_jiffies(ts->esd_timeout)));
511}
512
513static int tsc2005_open(struct input_dev *input)
514{
515 struct tsc2005 *ts = input_get_drvdata(input);
516
517 mutex_lock(&ts->mutex);
518
519 if (!ts->suspended)
520 __tsc2005_enable(ts);
521
522 ts->opened = true;
523
524 mutex_unlock(&ts->mutex);
525
526 return 0;
527}
528
529static void tsc2005_close(struct input_dev *input)
530{
531 struct tsc2005 *ts = input_get_drvdata(input);
532
533 mutex_lock(&ts->mutex);
534
535 if (!ts->suspended)
536 __tsc2005_disable(ts);
537
538 ts->opened = false;
539
540 mutex_unlock(&ts->mutex);
541}
542
543static int tsc2005_probe(struct spi_device *spi) 52static int tsc2005_probe(struct spi_device *spi)
544{ 53{
545 const struct tsc2005_platform_data *pdata = dev_get_platdata(&spi->dev);
546 struct device_node *np = spi->dev.of_node;
547
548 struct tsc2005 *ts;
549 struct input_dev *input_dev;
550 unsigned int max_x = MAX_12BIT;
551 unsigned int max_y = MAX_12BIT;
552 unsigned int max_p = MAX_12BIT;
553 unsigned int fudge_x = TSC2005_DEF_X_FUZZ;
554 unsigned int fudge_y = TSC2005_DEF_Y_FUZZ;
555 unsigned int fudge_p = TSC2005_DEF_P_FUZZ;
556 unsigned int x_plate_ohm = TSC2005_DEF_RESISTOR;
557 unsigned int esd_timeout;
558 int error; 54 int error;
559 55
560 if (!np && !pdata) {
561 dev_err(&spi->dev, "no platform data\n");
562 return -ENODEV;
563 }
564
565 if (spi->irq <= 0) {
566 dev_err(&spi->dev, "no irq\n");
567 return -ENODEV;
568 }
569
570 if (pdata) {
571 fudge_x = pdata->ts_x_fudge;
572 fudge_y = pdata->ts_y_fudge;
573 fudge_p = pdata->ts_pressure_fudge;
574 max_x = pdata->ts_x_max;
575 max_y = pdata->ts_y_max;
576 max_p = pdata->ts_pressure_max;
577 x_plate_ohm = pdata->ts_x_plate_ohm;
578 esd_timeout = pdata->esd_timeout_ms;
579 } else {
580 x_plate_ohm = TSC2005_DEF_RESISTOR;
581 of_property_read_u32(np, "ti,x-plate-ohms", &x_plate_ohm);
582 esd_timeout = 0;
583 of_property_read_u32(np, "ti,esd-recovery-timeout-ms",
584 &esd_timeout);
585 }
586
587 spi->mode = SPI_MODE_0; 56 spi->mode = SPI_MODE_0;
588 spi->bits_per_word = 8; 57 spi->bits_per_word = 8;
589 if (!spi->max_speed_hz) 58 if (!spi->max_speed_hz)
@@ -593,175 +62,28 @@ static int tsc2005_probe(struct spi_device *spi)
593 if (error) 62 if (error)
594 return error; 63 return error;
595 64
596 ts = devm_kzalloc(&spi->dev, sizeof(*ts), GFP_KERNEL); 65 return tsc200x_probe(&spi->dev, spi->irq, BUS_SPI,
597 if (!ts) 66 devm_regmap_init_spi(spi, &tsc200x_regmap_config),
598 return -ENOMEM; 67 tsc2005_cmd);
599
600 input_dev = devm_input_allocate_device(&spi->dev);
601 if (!input_dev)
602 return -ENOMEM;
603
604 ts->spi = spi;
605 ts->idev = input_dev;
606
607 ts->regmap = devm_regmap_init_spi(spi, &tsc2005_regmap_config);
608 if (IS_ERR(ts->regmap))
609 return PTR_ERR(ts->regmap);
610
611 ts->x_plate_ohm = x_plate_ohm;
612 ts->esd_timeout = esd_timeout;
613
614 ts->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset",
615 GPIOD_OUT_HIGH);
616 if (IS_ERR(ts->reset_gpio)) {
617 error = PTR_ERR(ts->reset_gpio);
618 dev_err(&spi->dev, "error acquiring reset gpio: %d\n", error);
619 return error;
620 }
621
622 ts->vio = devm_regulator_get_optional(&spi->dev, "vio");
623 if (IS_ERR(ts->vio)) {
624 error = PTR_ERR(ts->vio);
625 dev_err(&spi->dev, "vio regulator missing (%d)", error);
626 return error;
627 }
628
629 if (!ts->reset_gpio && pdata)
630 ts->set_reset = pdata->set_reset;
631
632 mutex_init(&ts->mutex);
633
634 spin_lock_init(&ts->lock);
635 setup_timer(&ts->penup_timer, tsc2005_penup_timer, (unsigned long)ts);
636
637 INIT_DELAYED_WORK(&ts->esd_work, tsc2005_esd_work);
638
639 snprintf(ts->phys, sizeof(ts->phys),
640 "%s/input-ts", dev_name(&spi->dev));
641
642 input_dev->name = "TSC2005 touchscreen";
643 input_dev->phys = ts->phys;
644 input_dev->id.bustype = BUS_SPI;
645 input_dev->dev.parent = &spi->dev;
646 input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY);
647 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
648
649 input_set_abs_params(input_dev, ABS_X, 0, max_x, fudge_x, 0);
650 input_set_abs_params(input_dev, ABS_Y, 0, max_y, fudge_y, 0);
651 input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0);
652
653 if (np)
654 touchscreen_parse_properties(input_dev, false);
655
656 input_dev->open = tsc2005_open;
657 input_dev->close = tsc2005_close;
658
659 input_set_drvdata(input_dev, ts);
660
661 /* Ensure the touchscreen is off */
662 tsc2005_stop_scan(ts);
663
664 error = devm_request_threaded_irq(&spi->dev, spi->irq, NULL,
665 tsc2005_irq_thread,
666 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
667 "tsc2005", ts);
668 if (error) {
669 dev_err(&spi->dev, "Failed to request irq, err: %d\n", error);
670 return error;
671 }
672
673 /* enable regulator for DT */
674 if (ts->vio) {
675 error = regulator_enable(ts->vio);
676 if (error)
677 return error;
678 }
679
680 dev_set_drvdata(&spi->dev, ts);
681 error = sysfs_create_group(&spi->dev.kobj, &tsc2005_attr_group);
682 if (error) {
683 dev_err(&spi->dev,
684 "Failed to create sysfs attributes, err: %d\n", error);
685 goto disable_regulator;
686 }
687
688 error = input_register_device(ts->idev);
689 if (error) {
690 dev_err(&spi->dev,
691 "Failed to register input device, err: %d\n", error);
692 goto err_remove_sysfs;
693 }
694
695 irq_set_irq_wake(spi->irq, 1);
696 return 0;
697
698err_remove_sysfs:
699 sysfs_remove_group(&spi->dev.kobj, &tsc2005_attr_group);
700disable_regulator:
701 if (ts->vio)
702 regulator_disable(ts->vio);
703 return error;
704} 68}
705 69
706static int tsc2005_remove(struct spi_device *spi) 70static int tsc2005_remove(struct spi_device *spi)
707{ 71{
708 struct tsc2005 *ts = dev_get_drvdata(&spi->dev); 72 return tsc200x_remove(&spi->dev);
709
710 sysfs_remove_group(&spi->dev.kobj, &tsc2005_attr_group);
711
712 if (ts->vio)
713 regulator_disable(ts->vio);
714
715 return 0;
716}
717
718static int __maybe_unused tsc2005_suspend(struct device *dev)
719{
720 struct tsc2005 *ts = dev_get_drvdata(dev);
721
722 mutex_lock(&ts->mutex);
723
724 if (!ts->suspended && ts->opened)
725 __tsc2005_disable(ts);
726
727 ts->suspended = true;
728
729 mutex_unlock(&ts->mutex);
730
731 return 0;
732}
733
734static int __maybe_unused tsc2005_resume(struct device *dev)
735{
736 struct tsc2005 *ts = dev_get_drvdata(dev);
737
738 mutex_lock(&ts->mutex);
739
740 if (ts->suspended && ts->opened)
741 __tsc2005_enable(ts);
742
743 ts->suspended = false;
744
745 mutex_unlock(&ts->mutex);
746
747 return 0;
748} 73}
749 74
750static SIMPLE_DEV_PM_OPS(tsc2005_pm_ops, tsc2005_suspend, tsc2005_resume);
751
752static struct spi_driver tsc2005_driver = { 75static struct spi_driver tsc2005_driver = {
753 .driver = { 76 .driver = {
754 .name = "tsc2005", 77 .name = "tsc2005",
755 .owner = THIS_MODULE, 78 .owner = THIS_MODULE,
756 .pm = &tsc2005_pm_ops, 79 .pm = &tsc200x_pm_ops,
757 }, 80 },
758 .probe = tsc2005_probe, 81 .probe = tsc2005_probe,
759 .remove = tsc2005_remove, 82 .remove = tsc2005_remove,
760}; 83};
761
762module_spi_driver(tsc2005_driver); 84module_spi_driver(tsc2005_driver);
763 85
764MODULE_AUTHOR("Lauri Leukkunen <lauri.leukkunen@nokia.com>"); 86MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>");
765MODULE_DESCRIPTION("TSC2005 Touchscreen Driver"); 87MODULE_DESCRIPTION("TSC2005 Touchscreen Driver");
766MODULE_LICENSE("GPL"); 88MODULE_LICENSE("GPL");
767MODULE_ALIAS("spi:tsc2005"); 89MODULE_ALIAS("spi:tsc2005");
diff --git a/drivers/input/touchscreen/tsc200x-core.c b/drivers/input/touchscreen/tsc200x-core.c
new file mode 100644
index 000000000000..15240c1ee850
--- /dev/null
+++ b/drivers/input/touchscreen/tsc200x-core.c
@@ -0,0 +1,665 @@
1/*
2 * TSC2004/TSC2005 touchscreen driver core
3 *
4 * Copyright (C) 2006-2010 Nokia Corporation
5 * Copyright (C) 2015 QWERTY Embedded Design
6 * Copyright (C) 2015 EMAC Inc.
7 *
8 * Author: Lauri Leukkunen <lauri.leukkunen@nokia.com>
9 * based on TSC2301 driver by Klaus K. Pedersen <klaus.k.pedersen@nokia.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 */
21
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/input.h>
25#include <linux/input/touchscreen.h>
26#include <linux/interrupt.h>
27#include <linux/delay.h>
28#include <linux/pm.h>
29#include <linux/of.h>
30#include <linux/spi/tsc2005.h>
31#include <linux/regulator/consumer.h>
32#include <linux/regmap.h>
33#include <linux/gpio/consumer.h>
34#include "tsc200x-core.h"
35
36/*
37 * The touchscreen interface operates as follows:
38 *
39 * 1) Pen is pressed against the touchscreen.
40 * 2) TSC200X performs AD conversion.
41 * 3) After the conversion is done TSC200X drives DAV line down.
42 * 4) GPIO IRQ is received and tsc200x_irq_thread() is scheduled.
43 * 5) tsc200x_irq_thread() queues up a transfer to fetch the x, y, z1, z2
44 * values.
45 * 6) tsc200x_irq_thread() reports coordinates to input layer and sets up
46 * tsc200x_penup_timer() to be called after TSC200X_PENUP_TIME_MS (40ms).
47 * 7) When the penup timer expires, there have not been touch or DAV interrupts
48 * during the last 40ms which means the pen has been lifted.
49 *
50 * ESD recovery via a hardware reset is done if the TSC200X doesn't respond
51 * after a configurable period (in ms) of activity. If esd_timeout is 0, the
52 * watchdog is disabled.
53 */
54
55static const struct regmap_range tsc200x_writable_ranges[] = {
56 regmap_reg_range(TSC200X_REG_AUX_HIGH, TSC200X_REG_CFR2),
57};
58
59static const struct regmap_access_table tsc200x_writable_table = {
60 .yes_ranges = tsc200x_writable_ranges,
61 .n_yes_ranges = ARRAY_SIZE(tsc200x_writable_ranges),
62};
63
64const struct regmap_config tsc200x_regmap_config = {
65 .reg_bits = 8,
66 .val_bits = 16,
67 .reg_stride = 0x08,
68 .max_register = 0x78,
69 .read_flag_mask = TSC200X_REG_READ,
70 .write_flag_mask = TSC200X_REG_PND0,
71 .wr_table = &tsc200x_writable_table,
72 .use_single_rw = true,
73};
74EXPORT_SYMBOL_GPL(tsc200x_regmap_config);
75
76struct tsc200x_data {
77 u16 x;
78 u16 y;
79 u16 z1;
80 u16 z2;
81} __packed;
82#define TSC200X_DATA_REGS 4
83
84struct tsc200x {
85 struct device *dev;
86 struct regmap *regmap;
87 __u16 bustype;
88
89 struct input_dev *idev;
90 char phys[32];
91
92 struct mutex mutex;
93
94 /* raw copy of previous x,y,z */
95 int in_x;
96 int in_y;
97 int in_z1;
98 int in_z2;
99
100 spinlock_t lock;
101 struct timer_list penup_timer;
102
103 unsigned int esd_timeout;
104 struct delayed_work esd_work;
105 unsigned long last_valid_interrupt;
106
107 unsigned int x_plate_ohm;
108
109 bool opened;
110 bool suspended;
111
112 bool pen_down;
113
114 struct regulator *vio;
115
116 struct gpio_desc *reset_gpio;
117 void (*set_reset)(bool enable);
118 int (*tsc200x_cmd)(struct device *dev, u8 cmd);
119 int irq;
120};
121
122static void tsc200x_update_pen_state(struct tsc200x *ts,
123 int x, int y, int pressure)
124{
125 if (pressure) {
126 input_report_abs(ts->idev, ABS_X, x);
127 input_report_abs(ts->idev, ABS_Y, y);
128 input_report_abs(ts->idev, ABS_PRESSURE, pressure);
129 if (!ts->pen_down) {
130 input_report_key(ts->idev, BTN_TOUCH, !!pressure);
131 ts->pen_down = true;
132 }
133 } else {
134 input_report_abs(ts->idev, ABS_PRESSURE, 0);
135 if (ts->pen_down) {
136 input_report_key(ts->idev, BTN_TOUCH, 0);
137 ts->pen_down = false;
138 }
139 }
140 input_sync(ts->idev);
141 dev_dbg(ts->dev, "point(%4d,%4d), pressure (%4d)\n", x, y,
142 pressure);
143}
144
145static irqreturn_t tsc200x_irq_thread(int irq, void *_ts)
146{
147 struct tsc200x *ts = _ts;
148 unsigned long flags;
149 unsigned int pressure;
150 struct tsc200x_data tsdata;
151 int error;
152
153 /* read the coordinates */
154 error = regmap_bulk_read(ts->regmap, TSC200X_REG_X, &tsdata,
155 TSC200X_DATA_REGS);
156 if (unlikely(error))
157 goto out;
158
159 /* validate position */
160 if (unlikely(tsdata.x > MAX_12BIT || tsdata.y > MAX_12BIT))
161 goto out;
162
163 /* Skip reading if the pressure components are out of range */
164 if (unlikely(tsdata.z1 == 0 || tsdata.z2 > MAX_12BIT))
165 goto out;
166 if (unlikely(tsdata.z1 >= tsdata.z2))
167 goto out;
168
169 /*
170 * Skip point if this is a pen down with the exact same values as
171 * the value before pen-up - that implies SPI fed us stale data
172 */
173 if (!ts->pen_down &&
174 ts->in_x == tsdata.x && ts->in_y == tsdata.y &&
175 ts->in_z1 == tsdata.z1 && ts->in_z2 == tsdata.z2) {
176 goto out;
177 }
178
179 /*
180 * At this point we are happy we have a valid and useful reading.
181 * Remember it for later comparisons. We may now begin downsampling.
182 */
183 ts->in_x = tsdata.x;
184 ts->in_y = tsdata.y;
185 ts->in_z1 = tsdata.z1;
186 ts->in_z2 = tsdata.z2;
187
188 /* Compute touch pressure resistance using equation #1 */
189 pressure = tsdata.x * (tsdata.z2 - tsdata.z1) / tsdata.z1;
190 pressure = pressure * ts->x_plate_ohm / 4096;
191 if (unlikely(pressure > MAX_12BIT))
192 goto out;
193
194 spin_lock_irqsave(&ts->lock, flags);
195
196 tsc200x_update_pen_state(ts, tsdata.x, tsdata.y, pressure);
197 mod_timer(&ts->penup_timer,
198 jiffies + msecs_to_jiffies(TSC200X_PENUP_TIME_MS));
199
200 spin_unlock_irqrestore(&ts->lock, flags);
201
202 ts->last_valid_interrupt = jiffies;
203out:
204 return IRQ_HANDLED;
205}
206
207static void tsc200x_penup_timer(unsigned long data)
208{
209 struct tsc200x *ts = (struct tsc200x *)data;
210 unsigned long flags;
211
212 spin_lock_irqsave(&ts->lock, flags);
213 tsc200x_update_pen_state(ts, 0, 0, 0);
214 spin_unlock_irqrestore(&ts->lock, flags);
215}
216
217static void tsc200x_start_scan(struct tsc200x *ts)
218{
219 regmap_write(ts->regmap, TSC200X_REG_CFR0, TSC200X_CFR0_INITVALUE);
220 regmap_write(ts->regmap, TSC200X_REG_CFR1, TSC200X_CFR1_INITVALUE);
221 regmap_write(ts->regmap, TSC200X_REG_CFR2, TSC200X_CFR2_INITVALUE);
222 ts->tsc200x_cmd(ts->dev, TSC200X_CMD_NORMAL);
223}
224
225static void tsc200x_stop_scan(struct tsc200x *ts)
226{
227 ts->tsc200x_cmd(ts->dev, TSC200X_CMD_STOP);
228}
229
230static void tsc200x_set_reset(struct tsc200x *ts, bool enable)
231{
232 if (ts->reset_gpio)
233 gpiod_set_value_cansleep(ts->reset_gpio, enable);
234 else if (ts->set_reset)
235 ts->set_reset(enable);
236}
237
238/* must be called with ts->mutex held */
239static void __tsc200x_disable(struct tsc200x *ts)
240{
241 tsc200x_stop_scan(ts);
242
243 disable_irq(ts->irq);
244 del_timer_sync(&ts->penup_timer);
245
246 cancel_delayed_work_sync(&ts->esd_work);
247
248 enable_irq(ts->irq);
249}
250
251/* must be called with ts->mutex held */
252static void __tsc200x_enable(struct tsc200x *ts)
253{
254 tsc200x_start_scan(ts);
255
256 if (ts->esd_timeout && (ts->set_reset || ts->reset_gpio)) {
257 ts->last_valid_interrupt = jiffies;
258 schedule_delayed_work(&ts->esd_work,
259 round_jiffies_relative(
260 msecs_to_jiffies(ts->esd_timeout)));
261 }
262}
263
264static ssize_t tsc200x_selftest_show(struct device *dev,
265 struct device_attribute *attr,
266 char *buf)
267{
268 struct tsc200x *ts = dev_get_drvdata(dev);
269 unsigned int temp_high;
270 unsigned int temp_high_orig;
271 unsigned int temp_high_test;
272 bool success = true;
273 int error;
274
275 mutex_lock(&ts->mutex);
276
277 /*
278 * Test TSC200X communications via temp high register.
279 */
280 __tsc200x_disable(ts);
281
282 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high_orig);
283 if (error) {
284 dev_warn(dev, "selftest failed: read error %d\n", error);
285 success = false;
286 goto out;
287 }
288
289 temp_high_test = (temp_high_orig - 1) & MAX_12BIT;
290
291 error = regmap_write(ts->regmap, TSC200X_REG_TEMP_HIGH, temp_high_test);
292 if (error) {
293 dev_warn(dev, "selftest failed: write error %d\n", error);
294 success = false;
295 goto out;
296 }
297
298 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high);
299 if (error) {
300 dev_warn(dev, "selftest failed: read error %d after write\n",
301 error);
302 success = false;
303 goto out;
304 }
305
306 if (temp_high != temp_high_test) {
307 dev_warn(dev, "selftest failed: %d != %d\n",
308 temp_high, temp_high_test);
309 success = false;
310 }
311
312 /* hardware reset */
313 tsc200x_set_reset(ts, false);
314 usleep_range(100, 500); /* only 10us required */
315 tsc200x_set_reset(ts, true);
316
317 if (!success)
318 goto out;
319
320 /* test that the reset really happened */
321 error = regmap_read(ts->regmap, TSC200X_REG_TEMP_HIGH, &temp_high);
322 if (error) {
323 dev_warn(dev, "selftest failed: read error %d after reset\n",
324 error);
325 success = false;
326 goto out;
327 }
328
329 if (temp_high != temp_high_orig) {
330 dev_warn(dev, "selftest failed after reset: %d != %d\n",
331 temp_high, temp_high_orig);
332 success = false;
333 }
334
335out:
336 __tsc200x_enable(ts);
337 mutex_unlock(&ts->mutex);
338
339 return sprintf(buf, "%d\n", success);
340}
341
342static DEVICE_ATTR(selftest, S_IRUGO, tsc200x_selftest_show, NULL);
343
344static struct attribute *tsc200x_attrs[] = {
345 &dev_attr_selftest.attr,
346 NULL
347};
348
349static umode_t tsc200x_attr_is_visible(struct kobject *kobj,
350 struct attribute *attr, int n)
351{
352 struct device *dev = container_of(kobj, struct device, kobj);
353 struct tsc200x *ts = dev_get_drvdata(dev);
354 umode_t mode = attr->mode;
355
356 if (attr == &dev_attr_selftest.attr) {
357 if (!ts->set_reset && !ts->reset_gpio)
358 mode = 0;
359 }
360
361 return mode;
362}
363
364static const struct attribute_group tsc200x_attr_group = {
365 .is_visible = tsc200x_attr_is_visible,
366 .attrs = tsc200x_attrs,
367};
368
369static void tsc200x_esd_work(struct work_struct *work)
370{
371 struct tsc200x *ts = container_of(work, struct tsc200x, esd_work.work);
372 int error;
373 unsigned int r;
374
375 if (!mutex_trylock(&ts->mutex)) {
376 /*
377 * If the mutex is taken, it means that disable or enable is in
378 * progress. In that case just reschedule the work. If the work
379 * is not needed, it will be canceled by disable.
380 */
381 goto reschedule;
382 }
383
384 if (time_is_after_jiffies(ts->last_valid_interrupt +
385 msecs_to_jiffies(ts->esd_timeout)))
386 goto out;
387
388 /* We should be able to read register without disabling interrupts. */
389 error = regmap_read(ts->regmap, TSC200X_REG_CFR0, &r);
390 if (!error &&
391 !((r ^ TSC200X_CFR0_INITVALUE) & TSC200X_CFR0_RW_MASK)) {
392 goto out;
393 }
394
395 /*
396 * If we could not read our known value from configuration register 0
397 * then we should reset the controller as if from power-up and start
398 * scanning again.
399 */
400 dev_info(ts->dev, "TSC200X not responding - resetting\n");
401
402 disable_irq(ts->irq);
403 del_timer_sync(&ts->penup_timer);
404
405 tsc200x_update_pen_state(ts, 0, 0, 0);
406
407 tsc200x_set_reset(ts, false);
408 usleep_range(100, 500); /* only 10us required */
409 tsc200x_set_reset(ts, true);
410
411 enable_irq(ts->irq);
412 tsc200x_start_scan(ts);
413
414out:
415 mutex_unlock(&ts->mutex);
416reschedule:
417 /* re-arm the watchdog */
418 schedule_delayed_work(&ts->esd_work,
419 round_jiffies_relative(
420 msecs_to_jiffies(ts->esd_timeout)));
421}
422
423static int tsc200x_open(struct input_dev *input)
424{
425 struct tsc200x *ts = input_get_drvdata(input);
426
427 mutex_lock(&ts->mutex);
428
429 if (!ts->suspended)
430 __tsc200x_enable(ts);
431
432 ts->opened = true;
433
434 mutex_unlock(&ts->mutex);
435
436 return 0;
437}
438
439static void tsc200x_close(struct input_dev *input)
440{
441 struct tsc200x *ts = input_get_drvdata(input);
442
443 mutex_lock(&ts->mutex);
444
445 if (!ts->suspended)
446 __tsc200x_disable(ts);
447
448 ts->opened = false;
449
450 mutex_unlock(&ts->mutex);
451}
452
453int tsc200x_probe(struct device *dev, int irq, __u16 bustype,
454 struct regmap *regmap,
455 int (*tsc200x_cmd)(struct device *dev, u8 cmd))
456{
457 const struct tsc2005_platform_data *pdata = dev_get_platdata(dev);
458 struct device_node *np = dev->of_node;
459
460 struct tsc200x *ts;
461 struct input_dev *input_dev;
462 unsigned int max_x = MAX_12BIT;
463 unsigned int max_y = MAX_12BIT;
464 unsigned int max_p = MAX_12BIT;
465 unsigned int fudge_x = TSC200X_DEF_X_FUZZ;
466 unsigned int fudge_y = TSC200X_DEF_Y_FUZZ;
467 unsigned int fudge_p = TSC200X_DEF_P_FUZZ;
468 unsigned int x_plate_ohm = TSC200X_DEF_RESISTOR;
469 unsigned int esd_timeout;
470 int error;
471
472 if (!np && !pdata) {
473 dev_err(dev, "no platform data\n");
474 return -ENODEV;
475 }
476
477 if (irq <= 0) {
478 dev_err(dev, "no irq\n");
479 return -ENODEV;
480 }
481
482 if (IS_ERR(regmap))
483 return PTR_ERR(regmap);
484
485 if (!tsc200x_cmd) {
486 dev_err(dev, "no cmd function\n");
487 return -ENODEV;
488 }
489
490 if (pdata) {
491 fudge_x = pdata->ts_x_fudge;
492 fudge_y = pdata->ts_y_fudge;
493 fudge_p = pdata->ts_pressure_fudge;
494 max_x = pdata->ts_x_max;
495 max_y = pdata->ts_y_max;
496 max_p = pdata->ts_pressure_max;
497 x_plate_ohm = pdata->ts_x_plate_ohm;
498 esd_timeout = pdata->esd_timeout_ms;
499 } else {
500 x_plate_ohm = TSC200X_DEF_RESISTOR;
501 of_property_read_u32(np, "ti,x-plate-ohms", &x_plate_ohm);
502 esd_timeout = 0;
503 of_property_read_u32(np, "ti,esd-recovery-timeout-ms",
504 &esd_timeout);
505 }
506
507 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
508 if (!ts)
509 return -ENOMEM;
510
511 input_dev = devm_input_allocate_device(dev);
512 if (!input_dev)
513 return -ENOMEM;
514
515 ts->irq = irq;
516 ts->dev = dev;
517 ts->idev = input_dev;
518 ts->regmap = regmap;
519 ts->tsc200x_cmd = tsc200x_cmd;
520 ts->x_plate_ohm = x_plate_ohm;
521 ts->esd_timeout = esd_timeout;
522
523 ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
524 if (IS_ERR(ts->reset_gpio)) {
525 error = PTR_ERR(ts->reset_gpio);
526 dev_err(dev, "error acquiring reset gpio: %d\n", error);
527 return error;
528 }
529
530 ts->vio = devm_regulator_get_optional(dev, "vio");
531 if (IS_ERR(ts->vio)) {
532 error = PTR_ERR(ts->vio);
533 dev_err(dev, "vio regulator missing (%d)", error);
534 return error;
535 }
536
537 if (!ts->reset_gpio && pdata)
538 ts->set_reset = pdata->set_reset;
539
540 mutex_init(&ts->mutex);
541
542 spin_lock_init(&ts->lock);
543 setup_timer(&ts->penup_timer, tsc200x_penup_timer, (unsigned long)ts);
544
545 INIT_DELAYED_WORK(&ts->esd_work, tsc200x_esd_work);
546
547 snprintf(ts->phys, sizeof(ts->phys),
548 "%s/input-ts", dev_name(dev));
549
550 input_dev->name = "TSC200X touchscreen";
551 input_dev->phys = ts->phys;
552 input_dev->id.bustype = bustype;
553 input_dev->dev.parent = dev;
554 input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY);
555 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
556
557 input_set_abs_params(input_dev, ABS_X, 0, max_x, fudge_x, 0);
558 input_set_abs_params(input_dev, ABS_Y, 0, max_y, fudge_y, 0);
559 input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0);
560
561 if (np)
562 touchscreen_parse_properties(input_dev, false);
563
564 input_dev->open = tsc200x_open;
565 input_dev->close = tsc200x_close;
566
567 input_set_drvdata(input_dev, ts);
568
569 /* Ensure the touchscreen is off */
570 tsc200x_stop_scan(ts);
571
572 error = devm_request_threaded_irq(dev, irq, NULL,
573 tsc200x_irq_thread,
574 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
575 "tsc200x", ts);
576 if (error) {
577 dev_err(dev, "Failed to request irq, err: %d\n", error);
578 return error;
579 }
580
581 /* enable regulator for DT */
582 if (ts->vio) {
583 error = regulator_enable(ts->vio);
584 if (error)
585 return error;
586 }
587
588 dev_set_drvdata(dev, ts);
589 error = sysfs_create_group(&dev->kobj, &tsc200x_attr_group);
590 if (error) {
591 dev_err(dev,
592 "Failed to create sysfs attributes, err: %d\n", error);
593 goto disable_regulator;
594 }
595
596 error = input_register_device(ts->idev);
597 if (error) {
598 dev_err(dev,
599 "Failed to register input device, err: %d\n", error);
600 goto err_remove_sysfs;
601 }
602
603 irq_set_irq_wake(irq, 1);
604 return 0;
605
606err_remove_sysfs:
607 sysfs_remove_group(&dev->kobj, &tsc200x_attr_group);
608disable_regulator:
609 if (ts->vio)
610 regulator_disable(ts->vio);
611 return error;
612}
613EXPORT_SYMBOL_GPL(tsc200x_probe);
614
615int tsc200x_remove(struct device *dev)
616{
617 struct tsc200x *ts = dev_get_drvdata(dev);
618
619 sysfs_remove_group(&dev->kobj, &tsc200x_attr_group);
620
621 if (ts->vio)
622 regulator_disable(ts->vio);
623
624 return 0;
625}
626EXPORT_SYMBOL_GPL(tsc200x_remove);
627
628static int __maybe_unused tsc200x_suspend(struct device *dev)
629{
630 struct tsc200x *ts = dev_get_drvdata(dev);
631
632 mutex_lock(&ts->mutex);
633
634 if (!ts->suspended && ts->opened)
635 __tsc200x_disable(ts);
636
637 ts->suspended = true;
638
639 mutex_unlock(&ts->mutex);
640
641 return 0;
642}
643
644static int __maybe_unused tsc200x_resume(struct device *dev)
645{
646 struct tsc200x *ts = dev_get_drvdata(dev);
647
648 mutex_lock(&ts->mutex);
649
650 if (ts->suspended && ts->opened)
651 __tsc200x_enable(ts);
652
653 ts->suspended = false;
654
655 mutex_unlock(&ts->mutex);
656
657 return 0;
658}
659
660SIMPLE_DEV_PM_OPS(tsc200x_pm_ops, tsc200x_suspend, tsc200x_resume);
661EXPORT_SYMBOL_GPL(tsc200x_pm_ops);
662
663MODULE_AUTHOR("Lauri Leukkunen <lauri.leukkunen@nokia.com>");
664MODULE_DESCRIPTION("TSC200x Touchscreen Driver Core");
665MODULE_LICENSE("GPL");
diff --git a/drivers/input/touchscreen/tsc200x-core.h b/drivers/input/touchscreen/tsc200x-core.h
new file mode 100644
index 000000000000..7a482d102614
--- /dev/null
+++ b/drivers/input/touchscreen/tsc200x-core.h
@@ -0,0 +1,78 @@
1#ifndef _TSC200X_CORE_H
2#define _TSC200X_CORE_H
3
4/* control byte 1 */
5#define TSC200X_CMD 0x80
6#define TSC200X_CMD_NORMAL 0x00
7#define TSC200X_CMD_STOP 0x01
8#define TSC200X_CMD_12BIT 0x04
9
10/* control byte 0 */
11#define TSC200X_REG_READ 0x01 /* R/W access */
12#define TSC200X_REG_PND0 0x02 /* Power Not Down Control */
13#define TSC200X_REG_X (0x0 << 3)
14#define TSC200X_REG_Y (0x1 << 3)
15#define TSC200X_REG_Z1 (0x2 << 3)
16#define TSC200X_REG_Z2 (0x3 << 3)
17#define TSC200X_REG_AUX (0x4 << 3)
18#define TSC200X_REG_TEMP1 (0x5 << 3)
19#define TSC200X_REG_TEMP2 (0x6 << 3)
20#define TSC200X_REG_STATUS (0x7 << 3)
21#define TSC200X_REG_AUX_HIGH (0x8 << 3)
22#define TSC200X_REG_AUX_LOW (0x9 << 3)
23#define TSC200X_REG_TEMP_HIGH (0xA << 3)
24#define TSC200X_REG_TEMP_LOW (0xB << 3)
25#define TSC200X_REG_CFR0 (0xC << 3)
26#define TSC200X_REG_CFR1 (0xD << 3)
27#define TSC200X_REG_CFR2 (0xE << 3)
28#define TSC200X_REG_CONV_FUNC (0xF << 3)
29
30/* configuration register 0 */
31#define TSC200X_CFR0_PRECHARGE_276US 0x0040
32#define TSC200X_CFR0_STABTIME_1MS 0x0300
33#define TSC200X_CFR0_CLOCK_1MHZ 0x1000
34#define TSC200X_CFR0_RESOLUTION12 0x2000
35#define TSC200X_CFR0_PENMODE 0x8000
36#define TSC200X_CFR0_INITVALUE (TSC200X_CFR0_STABTIME_1MS | \
37 TSC200X_CFR0_CLOCK_1MHZ | \
38 TSC200X_CFR0_RESOLUTION12 | \
39 TSC200X_CFR0_PRECHARGE_276US | \
40 TSC200X_CFR0_PENMODE)
41
42/* bits common to both read and write of configuration register 0 */
43#define TSC200X_CFR0_RW_MASK 0x3fff
44
45/* configuration register 1 */
46#define TSC200X_CFR1_BATCHDELAY_4MS 0x0003
47#define TSC200X_CFR1_INITVALUE TSC200X_CFR1_BATCHDELAY_4MS
48
49/* configuration register 2 */
50#define TSC200X_CFR2_MAVE_Z 0x0004
51#define TSC200X_CFR2_MAVE_Y 0x0008
52#define TSC200X_CFR2_MAVE_X 0x0010
53#define TSC200X_CFR2_AVG_7 0x0800
54#define TSC200X_CFR2_MEDIUM_15 0x3000
55#define TSC200X_CFR2_INITVALUE (TSC200X_CFR2_MAVE_X | \
56 TSC200X_CFR2_MAVE_Y | \
57 TSC200X_CFR2_MAVE_Z | \
58 TSC200X_CFR2_MEDIUM_15 | \
59 TSC200X_CFR2_AVG_7)
60
61#define MAX_12BIT 0xfff
62#define TSC200X_DEF_X_FUZZ 4
63#define TSC200X_DEF_Y_FUZZ 8
64#define TSC200X_DEF_P_FUZZ 2
65#define TSC200X_DEF_RESISTOR 280
66
67#define TSC2005_SPI_MAX_SPEED_HZ 10000000
68#define TSC200X_PENUP_TIME_MS 40
69
70extern const struct regmap_config tsc200x_regmap_config;
71extern const struct dev_pm_ops tsc200x_pm_ops;
72
73int tsc200x_probe(struct device *dev, int irq, __u16 bustype,
74 struct regmap *regmap,
75 int (*tsc200x_cmd)(struct device *dev, u8 cmd));
76int tsc200x_remove(struct device *dev);
77
78#endif