Skip to content

Commit 18fb38e

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull second round of input updates from Dmitry Torokhov: "An update to Elantech driver to support hardware v7, fix to the new cyttsp4 driver to use proper addressing, ads7846 device tree support and nspire-keypad got a small cleanup." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: nspire-keypad - replace magic offset with define Input: elantech - fix for newer hardware versions (v7) Input: cyttsp4 - use 16bit address for I2C/SPI communication Input: ads7846 - add device tree bindings Input: ads7846 - make sure we do not change platform data
2 parents be9c6d9 + 88ce3c3 commit 18fb38e

File tree

9 files changed

+253
-56
lines changed

9 files changed

+253
-56
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
Device tree bindings for TI's ADS7843, ADS7845, ADS7846, ADS7873, TSC2046
2+
SPI driven touch screen controllers.
3+
4+
The node for this driver must be a child node of a SPI controller, hence
5+
all mandatory properties described in
6+
7+
Documentation/devicetree/bindings/spi/spi-bus.txt
8+
9+
must be specified.
10+
11+
Additional required properties:
12+
13+
compatible Must be one of the following, depending on the
14+
model:
15+
"ti,tsc2046"
16+
"ti,ads7843"
17+
"ti,ads7845"
18+
"ti,ads7846"
19+
"ti,ads7873"
20+
21+
interrupt-parent
22+
interrupts An interrupt node describing the IRQ line the chip's
23+
!PENIRQ pin is connected to.
24+
vcc-supply A regulator node for the supply voltage.
25+
26+
27+
Optional properties:
28+
29+
ti,vref-delay-usecs vref supply delay in usecs, 0 for
30+
external vref (u16).
31+
ti,vref-mv The VREF voltage, in millivolts (u16).
32+
ti,keep-vref-on set to keep vref on for differential
33+
measurements as well
34+
ti,swap-xy swap x and y axis
35+
ti,settle-delay-usec Settling time of the analog signals;
36+
a function of Vcc and the capacitance
37+
on the X/Y drivers. If set to non-zero,
38+
two samples are taken with settle_delay
39+
us apart, and the second one is used.
40+
~150 uSec with 0.01uF caps (u16).
41+
ti,penirq-recheck-delay-usecs If set to non-zero, after samples are
42+
taken this delay is applied and penirq
43+
is rechecked, to help avoid false
44+
events. This value is affected by the
45+
material used to build the touch layer
46+
(u16).
47+
ti,x-plate-ohms Resistance of the X-plate,
48+
in Ohms (u16).
49+
ti,y-plate-ohms Resistance of the Y-plate,
50+
in Ohms (u16).
51+
ti,x-min Minimum value on the X axis (u16).
52+
ti,y-min Minimum value on the Y axis (u16).
53+
ti,x-max Maximum value on the X axis (u16).
54+
ti,y-max Minimum value on the Y axis (u16).
55+
ti,pressure-min Minimum reported pressure value
56+
(threshold) - u16.
57+
ti,pressure-max Maximum reported pressure value (u16).
58+
ti,debounce-max Max number of additional readings per
59+
sample (u16).
60+
ti,debounce-tol Tolerance used for filtering (u16).
61+
ti,debounce-rep Additional consecutive good readings
62+
required after the first two (u16).
63+
ti,pendown-gpio-debounce Platform specific debounce time for the
64+
pendown-gpio (u32).
65+
pendown-gpio GPIO handle describing the pin the !PENIRQ
66+
line is connected to.
67+
linux,wakeup use any event on touchscreen as wakeup event.
68+
69+
70+
Example for a TSC2046 chip connected to an McSPI controller of an OMAP SoC::
71+
72+
spi_controller {
73+
tsc2046@0 {
74+
reg = <0>; /* CS0 */
75+
compatible = "ti,tsc2046";
76+
interrupt-parent = <&gpio1>;
77+
interrupts = <8 0>; /* BOOT6 / GPIO 8 */
78+
spi-max-frequency = <1000000>;
79+
pendown-gpio = <&gpio1 8 0>;
80+
vcc-supply = <&reg_vcc3>;
81+
82+
ti,x-min = /bits/ 16 <0>;
83+
ti,x-max = /bits/ 16 <8000>;
84+
ti,y-min = /bits/ 16 <0>;
85+
ti,y-max = /bits/ 16 <4800>;
86+
ti,x-plate-ohms = /bits/ 16 <40>;
87+
ti,pressure-max = /bits/ 16 <255>;
88+
89+
linux,wakeup;
90+
};
91+
};

drivers/input/keyboard/nspire-keypad.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static int nspire_keypad_chip_init(struct nspire_keypad *keypad)
122122

123123
/* Enable interrupts */
124124
keypad->int_mask = 1 << 1;
125-
writel(keypad->int_mask, keypad->reg_base + 0xc);
125+
writel(keypad->int_mask, keypad->reg_base + KEYPAD_INTMSK);
126126

127127
/* Disable GPIO interrupts to prevent hanging on touchpad */
128128
/* Possibly used to detect touchpad events */

drivers/input/mouse/elantech.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -694,18 +694,18 @@ static int elantech_packet_check_v3(struct psmouse *psmouse)
694694
static int elantech_packet_check_v4(struct psmouse *psmouse)
695695
{
696696
unsigned char *packet = psmouse->packet;
697+
unsigned char packet_type = packet[3] & 0x03;
697698

698-
if ((packet[0] & 0x0c) == 0x04 &&
699-
(packet[3] & 0x1f) == 0x11)
699+
switch (packet_type) {
700+
case 0:
701+
return PACKET_V4_STATUS;
702+
703+
case 1:
700704
return PACKET_V4_HEAD;
701705

702-
if ((packet[0] & 0x0c) == 0x04 &&
703-
(packet[3] & 0x1f) == 0x12)
706+
case 2:
704707
return PACKET_V4_MOTION;
705-
706-
if ((packet[0] & 0x0c) == 0x04 &&
707-
(packet[3] & 0x1f) == 0x10)
708-
return PACKET_V4_STATUS;
708+
}
709709

710710
return PACKET_UNKNOWN;
711711
}
@@ -1282,6 +1282,7 @@ static int elantech_set_properties(struct elantech_data *etd)
12821282
etd->hw_version = 3;
12831283
break;
12841284
case 6:
1285+
case 7:
12851286
etd->hw_version = 4;
12861287
break;
12871288
default:

drivers/input/touchscreen/ads7846.c

Lines changed: 108 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
#include <linux/interrupt.h>
2828
#include <linux/slab.h>
2929
#include <linux/pm.h>
30+
#include <linux/of.h>
31+
#include <linux/of_gpio.h>
32+
#include <linux/of_device.h>
3033
#include <linux/gpio.h>
3134
#include <linux/spi/spi.h>
3235
#include <linux/spi/ads7846.h>
@@ -961,9 +964,9 @@ static int ads7846_resume(struct device *dev)
961964
static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume);
962965

963966
static int ads7846_setup_pendown(struct spi_device *spi,
964-
struct ads7846 *ts)
967+
struct ads7846 *ts,
968+
const struct ads7846_platform_data *pdata)
965969
{
966-
struct ads7846_platform_data *pdata = spi->dev.platform_data;
967970
int err;
968971

969972
/*
@@ -1003,7 +1006,7 @@ static int ads7846_setup_pendown(struct spi_device *spi,
10031006
* use formula #2 for pressure, not #3.
10041007
*/
10051008
static void ads7846_setup_spi_msg(struct ads7846 *ts,
1006-
const struct ads7846_platform_data *pdata)
1009+
const struct ads7846_platform_data *pdata)
10071010
{
10081011
struct spi_message *m = &ts->msg[0];
10091012
struct spi_transfer *x = ts->xfer;
@@ -1201,33 +1204,107 @@ static void ads7846_setup_spi_msg(struct ads7846 *ts,
12011204
spi_message_add_tail(x, m);
12021205
}
12031206

1207+
#ifdef CONFIG_OF
1208+
static const struct of_device_id ads7846_dt_ids[] = {
1209+
{ .compatible = "ti,tsc2046", .data = (void *) 7846 },
1210+
{ .compatible = "ti,ads7843", .data = (void *) 7843 },
1211+
{ .compatible = "ti,ads7845", .data = (void *) 7845 },
1212+
{ .compatible = "ti,ads7846", .data = (void *) 7846 },
1213+
{ .compatible = "ti,ads7873", .data = (void *) 7873 },
1214+
{ }
1215+
};
1216+
MODULE_DEVICE_TABLE(of, ads7846_dt_ids);
1217+
1218+
static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev)
1219+
{
1220+
struct ads7846_platform_data *pdata;
1221+
struct device_node *node = dev->of_node;
1222+
const struct of_device_id *match;
1223+
1224+
if (!node) {
1225+
dev_err(dev, "Device does not have associated DT data\n");
1226+
return ERR_PTR(-EINVAL);
1227+
}
1228+
1229+
match = of_match_device(ads7846_dt_ids, dev);
1230+
if (!match) {
1231+
dev_err(dev, "Unknown device model\n");
1232+
return ERR_PTR(-EINVAL);
1233+
}
1234+
1235+
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
1236+
if (!pdata)
1237+
return ERR_PTR(-ENOMEM);
1238+
1239+
pdata->model = (unsigned long)match->data;
1240+
1241+
of_property_read_u16(node, "ti,vref-delay-usecs",
1242+
&pdata->vref_delay_usecs);
1243+
of_property_read_u16(node, "ti,vref-mv", &pdata->vref_mv);
1244+
pdata->keep_vref_on = of_property_read_bool(node, "ti,keep-vref-on");
1245+
1246+
pdata->swap_xy = of_property_read_bool(node, "ti,swap-xy");
1247+
1248+
of_property_read_u16(node, "ti,settle-delay-usec",
1249+
&pdata->settle_delay_usecs);
1250+
of_property_read_u16(node, "ti,penirq-recheck-delay-usecs",
1251+
&pdata->penirq_recheck_delay_usecs);
1252+
1253+
of_property_read_u16(node, "ti,x-plate-ohms", &pdata->x_plate_ohms);
1254+
of_property_read_u16(node, "ti,y-plate-ohms", &pdata->y_plate_ohms);
1255+
1256+
of_property_read_u16(node, "ti,x-min", &pdata->x_min);
1257+
of_property_read_u16(node, "ti,y-min", &pdata->y_min);
1258+
of_property_read_u16(node, "ti,x-max", &pdata->x_max);
1259+
of_property_read_u16(node, "ti,y-max", &pdata->y_max);
1260+
1261+
of_property_read_u16(node, "ti,pressure-min", &pdata->pressure_min);
1262+
of_property_read_u16(node, "ti,pressure-max", &pdata->pressure_max);
1263+
1264+
of_property_read_u16(node, "ti,debounce-max", &pdata->debounce_max);
1265+
of_property_read_u16(node, "ti,debounce-tol", &pdata->debounce_tol);
1266+
of_property_read_u16(node, "ti,debounce-rep", &pdata->debounce_rep);
1267+
1268+
of_property_read_u32(node, "ti,pendown-gpio-debounce",
1269+
&pdata->gpio_pendown_debounce);
1270+
1271+
pdata->wakeup = of_property_read_bool(node, "linux,wakeup");
1272+
1273+
pdata->gpio_pendown = of_get_named_gpio(dev->of_node, "pendown-gpio", 0);
1274+
1275+
return pdata;
1276+
}
1277+
#else
1278+
static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev)
1279+
{
1280+
dev_err(dev, "no platform data defined\n");
1281+
return ERR_PTR(-EINVAL);
1282+
}
1283+
#endif
1284+
12041285
static int ads7846_probe(struct spi_device *spi)
12051286
{
1287+
const struct ads7846_platform_data *pdata;
12061288
struct ads7846 *ts;
12071289
struct ads7846_packet *packet;
12081290
struct input_dev *input_dev;
1209-
struct ads7846_platform_data *pdata = spi->dev.platform_data;
12101291
unsigned long irq_flags;
12111292
int err;
12121293

12131294
if (!spi->irq) {
12141295
dev_dbg(&spi->dev, "no IRQ?\n");
1215-
return -ENODEV;
1216-
}
1217-
1218-
if (!pdata) {
1219-
dev_dbg(&spi->dev, "no platform data?\n");
1220-
return -ENODEV;
1296+
return -EINVAL;
12211297
}
12221298

12231299
/* don't exceed max specified sample rate */
12241300
if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) {
1225-
dev_dbg(&spi->dev, "f(sample) %d KHz?\n",
1301+
dev_err(&spi->dev, "f(sample) %d KHz?\n",
12261302
(spi->max_speed_hz/SAMPLE_BITS)/1000);
12271303
return -EINVAL;
12281304
}
12291305

1230-
/* We'd set TX word size 8 bits and RX word size to 13 bits ... except
1306+
/*
1307+
* We'd set TX word size 8 bits and RX word size to 13 bits ... except
12311308
* that even if the hardware can do that, the SPI controller driver
12321309
* may not. So we stick to very-portable 8 bit words, both RX and TX.
12331310
*/
@@ -1250,17 +1327,25 @@ static int ads7846_probe(struct spi_device *spi)
12501327
ts->packet = packet;
12511328
ts->spi = spi;
12521329
ts->input = input_dev;
1253-
ts->vref_mv = pdata->vref_mv;
1254-
ts->swap_xy = pdata->swap_xy;
12551330

12561331
mutex_init(&ts->lock);
12571332
init_waitqueue_head(&ts->wait);
12581333

1334+
pdata = dev_get_platdata(&spi->dev);
1335+
if (!pdata) {
1336+
pdata = ads7846_probe_dt(&spi->dev);
1337+
if (IS_ERR(pdata))
1338+
return PTR_ERR(pdata);
1339+
}
1340+
12591341
ts->model = pdata->model ? : 7846;
12601342
ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;
12611343
ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
12621344
ts->pressure_max = pdata->pressure_max ? : ~0;
12631345

1346+
ts->vref_mv = pdata->vref_mv;
1347+
ts->swap_xy = pdata->swap_xy;
1348+
12641349
if (pdata->filter != NULL) {
12651350
if (pdata->filter_init != NULL) {
12661351
err = pdata->filter_init(pdata, &ts->filter_data);
@@ -1281,7 +1366,7 @@ static int ads7846_probe(struct spi_device *spi)
12811366
ts->filter = ads7846_no_filter;
12821367
}
12831368

1284-
err = ads7846_setup_pendown(spi, ts);
1369+
err = ads7846_setup_pendown(spi, ts, pdata);
12851370
if (err)
12861371
goto err_cleanup_filter;
12871372

@@ -1370,6 +1455,13 @@ static int ads7846_probe(struct spi_device *spi)
13701455

13711456
device_init_wakeup(&spi->dev, pdata->wakeup);
13721457

1458+
/*
1459+
* If device does not carry platform data we must have allocated it
1460+
* when parsing DT data.
1461+
*/
1462+
if (!dev_get_platdata(&spi->dev))
1463+
devm_kfree(&spi->dev, (void *)pdata);
1464+
13731465
return 0;
13741466

13751467
err_remove_attr_group:
@@ -1437,6 +1529,7 @@ static struct spi_driver ads7846_driver = {
14371529
.name = "ads7846",
14381530
.owner = THIS_MODULE,
14391531
.pm = &ads7846_pm,
1532+
.of_match_table = of_match_ptr(ads7846_dt_ids),
14401533
},
14411534
.probe = ads7846_probe,
14421535
.remove = ads7846_remove,

drivers/input/touchscreen/cyttsp4_core.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,9 @@ struct cyttsp4 {
369369

370370
struct cyttsp4_bus_ops {
371371
u16 bustype;
372-
int (*write)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
372+
int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
373373
const void *values);
374-
int (*read)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
374+
int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
375375
void *values);
376376
};
377377

@@ -448,13 +448,13 @@ enum cyttsp4_event_id {
448448
/* y-axis, 0:origin is on top side of panel, 1: bottom */
449449
#define CY_PCFG_ORIGIN_Y_MASK 0x80
450450

451-
static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u8 addr, int size,
451+
static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u16 addr, int size,
452452
void *buf)
453453
{
454454
return ts->bus_ops->read(ts->dev, ts->xfer_buf, addr, size, buf);
455455
}
456456

457-
static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size,
457+
static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u16 addr, int size,
458458
const void *buf)
459459
{
460460
return ts->bus_ops->write(ts->dev, ts->xfer_buf, addr, size, buf);
@@ -463,9 +463,9 @@ static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size,
463463
extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
464464
struct device *dev, u16 irq, size_t xfer_buf_size);
465465
extern int cyttsp4_remove(struct cyttsp4 *ts);
466-
int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
466+
int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
467467
u8 length, const void *values);
468-
int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
468+
int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
469469
u8 length, void *values);
470470
extern const struct dev_pm_ops cyttsp4_pm_ops;
471471

0 commit comments

Comments
 (0)