History

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull more input updates from Dmitry Torokhov: "An update to the tsc2005 driver that allows it to also support tsc2004 (basically the same controller, but uses i2c instead of spi bus), and a couple of bug fixes" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: parkbd - drop bogus __init from parkbd_allocate_serio() Input: elantech - add Fujitsu Lifebook U745 to force crc_enabled Input: tsc2004 - add support for tsc2004 Input: tsc200x-core - rename functions and variables Input: tsc2005 - separate SPI and core functions

Linus Torvalds committed 11 years ago

Commit a30b7ca2 parents d83763f bbdb5c29 files · +899 −703Browse files

Unified · Split

9 files
  1. Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt +28 −6
  2. drivers/input/mouse/elantech.c +7 −0
  3. drivers/input/serio/parkbd.c +1 −1
  4. drivers/input/touchscreen/Kconfig +17 −0
  5. drivers/input/touchscreen/Makefile +2 −0
  6. drivers/input/touchscreen/tsc2004.c +83 −0
  7. drivers/input/touchscreen/tsc2005.c +18 −696
  8. drivers/input/touchscreen/tsc200x-core.c +665 −0
  9. drivers/input/touchscreen/tsc200x-core.h +78 −0
Documentation/devicetree/bindings/input/touchscreen/tsc2005.txt+28−6
@@ -1,14 +1,15 @@
1−* Texas Instruments tsc2005 touchscreen controller
1+* Texas Instruments tsc2004 and tsc2005 touchscreen controllers
22
33 Required properties:
4− - compatible : "ti,tsc2005"
5− - reg : SPI device address
6− - spi-max-frequency : Maximal SPI speed
4+ - compatible : "ti,tsc2004" or "ti,tsc2005"
5+ - reg : Device address
76 - interrupts : IRQ specifier
8− - reset-gpios : GPIO specifier
9− - vio-supply : Regulator specifier
7+ - spi-max-frequency : Maximum SPI clocking speed of the device
8+ (for tsc2005)
109
1110 Optional properties:
11+ - vio-supply : Regulator specifier
12+ - reset-gpios : GPIO specifier for the controller reset line
1213 - ti,x-plate-ohms : integer, resistance of the touchscreen's X plates
1314 in ohm (defaults to 280)
1415 - ti,esd-recovery-timeout-ms : integer, if the touchscreen does not respond after
@@ -18,6 +19,27 @@ Optional properties: · 3 unmodified lines
1819
1920 Example:
2021
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+
2143 &mcspi1 {
2244 tsc2005@0 {
2345 compatible = "ti,tsc2005";
drivers/input/mouse/elantech.c+7−0
@@ -1520,6 +1520,13 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { · 1519 unmodified lines
15201520 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"),
15211521 },
15221522 },
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+ },
15231530 #endif
15241531 { }
15251532 };
drivers/input/serio/parkbd.c+1−1
@@ -164,7 +164,7 @@ static int parkbd_getport(struct parport *pp) · 163 unmodified lines
164164 return 0;
165165 }
166166
167−static struct serio * __init parkbd_allocate_serio(void)
167+static struct serio *parkbd_allocate_serio(void)
168168 {
169169 struct serio *serio;
170170
drivers/input/touchscreen/Kconfig+17−0
@@ -939,10 +939,27 @@ config TOUCHSCREEN_TSC_SERIO · 938 unmodified lines
939939 To compile this driver as a module, choose M here: the
940940 module will be called tsc40.
941941
942+config TOUCHSCREEN_TSC200X_CORE
943+ tristate
944+
945+config 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+
942958 config TOUCHSCREEN_TSC2005
943959 tristate "TSC2005 based touchscreens"
944960 depends on SPI_MASTER
945961 select REGMAP_SPI
962+ select TOUCHSCREEN_TSC200X_CORE
946963 help
947964 Say Y here if you have a TSC2005 based touchscreen.
948965
drivers/input/touchscreen/Makefile+2−0
@@ -69,6 +69,8 @@ obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o · 68 unmodified lines
6969 obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
7070 obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
7171 obj-$(CONFIG_TOUCHSCREEN_TSC_SERIO) += tsc40.o
72+obj-$(CONFIG_TOUCHSCREEN_TSC200X_CORE) += tsc200x-core.o
73+obj-$(CONFIG_TOUCHSCREEN_TSC2004) += tsc2004.o
7274 obj-$(CONFIG_TOUCHSCREEN_TSC2005) += tsc2005.o
7375 obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o
7476 obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o
drivers/input/touchscreen/tsc2004.c+83−0
@@ -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+
25+static 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+
41+static 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+
50+static int tsc2004_remove(struct i2c_client *i2c)
51+{
52+ return tsc200x_remove(&i2c->dev);
53+}
54+
55+static const struct i2c_device_id tsc2004_idtable[] = {
56+ { "tsc2004", 0 },
57+ { }
58+};
59+MODULE_DEVICE_TABLE(i2c, tsc2004_idtable);
60+
61+#ifdef CONFIG_OF
62+static const struct of_device_id tsc2004_of_match[] = {
63+ { .compatible = "ti,tsc2004" },
64+ { /* sentinel */ }
65+};
66+MODULE_DEVICE_TABLE(of, tsc2004_of_match);
67+#endif
68+
69+static 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+};
79+module_i2c_driver(tsc2004_driver);
80+
81+MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>");
82+MODULE_DESCRIPTION("TSC2004 Touchscreen Driver");
83+MODULE_LICENSE("GPL");
drivers/input/touchscreen/tsc2005.c+18−696
@@ -2,9 +2,10 @@ · 1 unmodified line
22 * TSC2005 touchscreen driver
33 *
44 * Copyright (C) 2006-2010 Nokia Corporation
5+ * Copyright (C) 2015 QWERTY Embedded Design
6+ * Copyright (C) 2015 EMAC Inc.
57 *
6− * Author: Lauri Leukkunen <lauri.leukkunen@nokia.com>
7− * based on TSC2301 driver by Klaus K. Pedersen <klaus.k.pedersen@nokia.com>
8+ * Based on original tsc2005.c by Lauri Leukkunen <lauri.leukkunen@nokia.com>
89 *
910 * This program is free software; you can redistribute it and/or modify
1011 * it under the terms of the GNU General Public License as published by
@@ -15,192 +16,32 @@ · 4 unmodified lines
1516 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1617 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1718 * 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− *
2319 */
2420
25−#include <linux/kernel.h>
2621 #include <linux/module.h>
2722 #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>
3323 #include <linux/spi/spi.h>
34−#include <linux/spi/tsc2005.h>
35−#include <linux/regulator/consumer.h>
3624 #include <linux/regmap.h>
37−#include <linux/gpio/consumer.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−
124−static const struct regmap_range tsc2005_writable_ranges[] = {
125− regmap_reg_range(TSC2005_REG_AUX_HIGH, TSC2005_REG_CFR2),
126−};
127−
128−static 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−
133−static 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−
144−struct tsc2005_data {
145− u16 x;
146− u16 y;
147− u16 z1;
148− u16 z2;
149−} __packed;
150−#define TSC2005_DATA_REGS 4
151−
152−struct 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;
25+#include "tsc200x-core.h"
16926
170− unsigned int esd_timeout;
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−
187−static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd)
27+static int tsc2005_cmd(struct device *dev, u8 cmd)
18828 {
189− u8 tx = TSC2005_CMD | TSC2005_CMD_12BIT | cmd;
29+ u8 tx = TSC200X_CMD | TSC200X_CMD_12BIT | cmd;
19030 struct spi_transfer xfer = {
191− .tx_buf = &tx,
192− .len = 1,
193− .bits_per_word = 8,
31+ .tx_buf = &tx,
32+ .len = 1,
33+ .bits_per_word = 8,
19434 };
19535 struct spi_message msg;
36+ struct spi_device *spi = to_spi_device(dev);
19637 int error;
19738
19839 spi_message_init(&msg);
19940 spi_message_add_tail(&xfer, &msg);
20041
201− error = spi_sync(ts->spi, &msg);
42+ error = spi_sync(spi, &msg);
20243 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",
20445 __func__, cmd, error);
20546 return error;
20647 }
@@ -208,382 +49,10 @@ static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd) · 1 unmodified line
20849 return 0;
20950 }
21051
211−static 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−
234−static 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;
292−out:
293− return IRQ_HANDLED;
294−}
295−
296−static 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−
306−static 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−
314−static void tsc2005_stop_scan(struct tsc2005 *ts)
315−{
316− tsc2005_cmd(ts, TSC2005_CMD_STOP);
317−}
318−
319−static 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 */
328−static 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 */
341−static 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−
354−static 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−
425−out:
426− __tsc2005_enable(ts);
427− mutex_unlock(&ts->mutex);
428−
429− return sprintf(buf, "%d\n", success);
430−}
431−
432−static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
433−
434−static struct attribute *tsc2005_attrs[] = {
435− &dev_attr_selftest.attr,
436− NULL
437−};
438−
439−static 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−
454−static const struct attribute_group tsc2005_attr_group = {
455− .is_visible = tsc2005_attr_is_visible,
456− .attrs = tsc2005_attrs,
457−};
458−
459−static 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−
504−out:
505− mutex_unlock(&ts->mutex);
506−reschedule:
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−
513−static 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−
529−static 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−
54352 static int tsc2005_probe(struct spi_device *spi)
54453 {
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;
55854 int error;
55955
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−
58756 spi->mode = SPI_MODE_0;
58857 spi->bits_per_word = 8;
58958 if (!spi->max_speed_hz)
@@ -593,174 +62,27 @@ static int tsc2005_probe(struct spi_device *spi) · 3 unmodified lines
59362 if (error)
59463 return error;
59564
596− ts = devm_kzalloc(&spi->dev, sizeof(*ts), GFP_KERNEL);
597− if (!ts)
598− return -ENOMEM;
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−
698−err_remove_sysfs:
699− sysfs_remove_group(&spi->dev.kobj, &tsc2005_attr_group);
700−disable_regulator:
701− if (ts->vio)
702− regulator_disable(ts->vio);
703− return error;
65+ return tsc200x_probe(&spi->dev, spi->irq, BUS_SPI,
66+ devm_regmap_init_spi(spi, &tsc200x_regmap_config),
67+ tsc2005_cmd);
70468 }
70569
70670 static int tsc2005_remove(struct spi_device *spi)
70771 {
708− struct tsc2005 *ts = dev_get_drvdata(&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−
718−static 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−
734−static 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;
72+ return tsc200x_remove(&spi->dev);
74873 }
74974
750−static SIMPLE_DEV_PM_OPS(tsc2005_pm_ops, tsc2005_suspend, tsc2005_resume);
751−
75275 static struct spi_driver tsc2005_driver = {
75376 .driver = {
75477 .name = "tsc2005",
755− .pm = &tsc2005_pm_ops,
78+ .pm = &tsc200x_pm_ops,
75679 },
75780 .probe = tsc2005_probe,
75881 .remove = tsc2005_remove,
75982 };
760−
76183 module_spi_driver(tsc2005_driver);
76284
763−MODULE_AUTHOR("Lauri Leukkunen <lauri.leukkunen@nokia.com>");
85+MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>");
76486 MODULE_DESCRIPTION("TSC2005 Touchscreen Driver");
76587 MODULE_LICENSE("GPL");
76688 MODULE_ALIAS("spi:tsc2005");
drivers/input/touchscreen/tsc200x-core.c+665−0
@@ -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+
55+static const struct regmap_range tsc200x_writable_ranges[] = {
56+ regmap_reg_range(TSC200X_REG_AUX_HIGH, TSC200X_REG_CFR2),
57+};
58+
59+static 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+
64+const 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+};
74+EXPORT_SYMBOL_GPL(tsc200x_regmap_config);
75+
76+struct tsc200x_data {
77+ u16 x;
78+ u16 y;
79+ u16 z1;
80+ u16 z2;
81+} __packed;
82+#define TSC200X_DATA_REGS 4
83+
84+struct 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+
122+static 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+
145+static 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;
203+out:
204+ return IRQ_HANDLED;
205+}
206+
207+static 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+
217+static 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+
225+static void tsc200x_stop_scan(struct tsc200x *ts)
226+{
227+ ts->tsc200x_cmd(ts->dev, TSC200X_CMD_STOP);
228+}
229+
230+static 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 */
239+static 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 */
252+static 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+
264+static 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+
335+out:
336+ __tsc200x_enable(ts);
337+ mutex_unlock(&ts->mutex);
338+
339+ return sprintf(buf, "%d\n", success);
340+}
341+
342+static DEVICE_ATTR(selftest, S_IRUGO, tsc200x_selftest_show, NULL);
343+
344+static struct attribute *tsc200x_attrs[] = {
345+ &dev_attr_selftest.attr,
346+ NULL
347+};
348+
349+static 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+
364+static const struct attribute_group tsc200x_attr_group = {
365+ .is_visible = tsc200x_attr_is_visible,
366+ .attrs = tsc200x_attrs,
367+};
368+
369+static 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+
414+out:
415+ mutex_unlock(&ts->mutex);
416+reschedule:
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+
423+static 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+
439+static 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+
453+int 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+
606+err_remove_sysfs:
607+ sysfs_remove_group(&dev->kobj, &tsc200x_attr_group);
608+disable_regulator:
609+ if (ts->vio)
610+ regulator_disable(ts->vio);
611+ return error;
612+}
613+EXPORT_SYMBOL_GPL(tsc200x_probe);
614+
615+int 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+}
626+EXPORT_SYMBOL_GPL(tsc200x_remove);
627+
628+static 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+
644+static 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+
660+SIMPLE_DEV_PM_OPS(tsc200x_pm_ops, tsc200x_suspend, tsc200x_resume);
661+EXPORT_SYMBOL_GPL(tsc200x_pm_ops);
662+
663+MODULE_AUTHOR("Lauri Leukkunen <lauri.leukkunen@nokia.com>");
664+MODULE_DESCRIPTION("TSC200x Touchscreen Driver Core");
665+MODULE_LICENSE("GPL");
drivers/input/touchscreen/tsc200x-core.h+78−0
@@ -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+
70+extern const struct regmap_config tsc200x_regmap_config;
71+extern const struct dev_pm_ops tsc200x_pm_ops;
72+
73+int tsc200x_probe(struct device *dev, int irq, __u16 bustype,
74+ struct regmap *regmap,
75+ int (*tsc200x_cmd)(struct device *dev, u8 cmd));
76+int tsc200x_remove(struct device *dev);
77+
78+#endif