aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2014-08-07 02:36:12 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-08-07 02:36:12 -0400
commit5e2aa2ed08e2e280121dc7cf5609c87d464f12ef (patch)
treeca7d7b1480285e3b617fecc5b41f0ce150a82c32 /drivers/input
parentf62d14a8072b9756db36ba394e2b267470a40240 (diff)
parentfc8104bc5a3f6f49d79f45f2706f79f77a9fb2ae (diff)
Merge branch 'next' into for-linus
Prepare first round of input updates for 3.17.
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/keyboard/Kconfig10
-rw-r--r--drivers/input/keyboard/Makefile1
-rw-r--r--drivers/input/keyboard/cap1106.c335
-rw-r--r--drivers/input/keyboard/imx_keypad.c6
-rw-r--r--drivers/input/keyboard/max7359_keypad.c45
-rw-r--r--drivers/input/misc/keyspan_remote.c1
-rw-r--r--drivers/input/misc/soc_button_array.c3
-rw-r--r--drivers/input/misc/uinput.c47
-rw-r--r--drivers/input/mouse/alps.c691
-rw-r--r--drivers/input/mouse/alps.h60
-rw-r--r--drivers/input/serio/hyperv-keyboard.c13
-rw-r--r--drivers/input/tablet/Kconfig18
-rw-r--r--drivers/input/tablet/Makefile4
-rw-r--r--drivers/input/tablet/wacom.h139
-rw-r--r--drivers/input/tablet/wacom_serial4.c620
-rw-r--r--drivers/input/tablet/wacom_sys.c1497
-rw-r--r--drivers/input/tablet/wacom_wac.c2485
-rw-r--r--drivers/input/tablet/wacom_wac.h165
-rw-r--r--drivers/input/touchscreen/Kconfig24
-rw-r--r--drivers/input/touchscreen/Makefile2
-rw-r--r--drivers/input/touchscreen/ads7846.c6
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c1313
-rw-r--r--drivers/input/touchscreen/atmel_tsadcc.c358
-rw-r--r--drivers/input/touchscreen/edt-ft5x06.c3
-rw-r--r--drivers/input/touchscreen/ipaq-micro-ts.c166
-rw-r--r--drivers/input/touchscreen/jornada720_ts.c70
-rw-r--r--drivers/input/touchscreen/mcs5000_ts.c6
-rw-r--r--drivers/input/touchscreen/pixcir_i2c_ts.c250
-rw-r--r--drivers/input/touchscreen/s3c2410_ts.c4
-rw-r--r--drivers/input/touchscreen/zforce_ts.c31
30 files changed, 2985 insertions, 5388 deletions
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index f7e79b481349..a3958c63d7d5 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -665,4 +665,14 @@ config KEYBOARD_CROS_EC
665 To compile this driver as a module, choose M here: the 665 To compile this driver as a module, choose M here: the
666 module will be called cros_ec_keyb. 666 module will be called cros_ec_keyb.
667 667
668config KEYBOARD_CAP1106
669 tristate "Microchip CAP1106 touch sensor"
670 depends on OF && I2C
671 select REGMAP_I2C
672 help
673 Say Y here to enable the CAP1106 touch sensor driver.
674
675 To compile this driver as a module, choose M here: the
676 module will be called cap1106.
677
668endif 678endif
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 7504ae19049d..0a3345634d79 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o
11obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o 11obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o
12obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o 12obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o
13obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o 13obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o
14obj-$(CONFIG_KEYBOARD_CAP1106) += cap1106.o
14obj-$(CONFIG_KEYBOARD_CLPS711X) += clps711x-keypad.o 15obj-$(CONFIG_KEYBOARD_CLPS711X) += clps711x-keypad.o
15obj-$(CONFIG_KEYBOARD_CROS_EC) += cros_ec_keyb.o 16obj-$(CONFIG_KEYBOARD_CROS_EC) += cros_ec_keyb.o
16obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o 17obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o
diff --git a/drivers/input/keyboard/cap1106.c b/drivers/input/keyboard/cap1106.c
new file mode 100644
index 000000000000..f7d7a0d4ab4e
--- /dev/null
+++ b/drivers/input/keyboard/cap1106.c
@@ -0,0 +1,335 @@
1/*
2 * Input driver for Microchip CAP1106, 6 channel capacitive touch sensor
3 *
4 * http://www.microchip.com/wwwproducts/Devices.aspx?product=CAP1106
5 *
6 * (c) 2014 Daniel Mack <linux@zonque.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/kernel.h>
14#include <linux/module.h>
15#include <linux/interrupt.h>
16#include <linux/input.h>
17#include <linux/of_irq.h>
18#include <linux/regmap.h>
19#include <linux/i2c.h>
20#include <linux/gpio/consumer.h>
21
22#define CAP1106_REG_MAIN_CONTROL 0x00
23#define CAP1106_REG_MAIN_CONTROL_GAIN_SHIFT (6)
24#define CAP1106_REG_MAIN_CONTROL_GAIN_MASK (0xc0)
25#define CAP1106_REG_MAIN_CONTROL_DLSEEP BIT(4)
26#define CAP1106_REG_GENERAL_STATUS 0x02
27#define CAP1106_REG_SENSOR_INPUT 0x03
28#define CAP1106_REG_NOISE_FLAG_STATUS 0x0a
29#define CAP1106_REG_SENOR_DELTA(X) (0x10 + (X))
30#define CAP1106_REG_SENSITIVITY_CONTROL 0x1f
31#define CAP1106_REG_CONFIG 0x20
32#define CAP1106_REG_SENSOR_ENABLE 0x21
33#define CAP1106_REG_SENSOR_CONFIG 0x22
34#define CAP1106_REG_SENSOR_CONFIG2 0x23
35#define CAP1106_REG_SAMPLING_CONFIG 0x24
36#define CAP1106_REG_CALIBRATION 0x25
37#define CAP1106_REG_INT_ENABLE 0x26
38#define CAP1106_REG_REPEAT_RATE 0x28
39#define CAP1106_REG_MT_CONFIG 0x2a
40#define CAP1106_REG_MT_PATTERN_CONFIG 0x2b
41#define CAP1106_REG_MT_PATTERN 0x2d
42#define CAP1106_REG_RECALIB_CONFIG 0x2f
43#define CAP1106_REG_SENSOR_THRESH(X) (0x30 + (X))
44#define CAP1106_REG_SENSOR_NOISE_THRESH 0x38
45#define CAP1106_REG_STANDBY_CHANNEL 0x40
46#define CAP1106_REG_STANDBY_CONFIG 0x41
47#define CAP1106_REG_STANDBY_SENSITIVITY 0x42
48#define CAP1106_REG_STANDBY_THRESH 0x43
49#define CAP1106_REG_CONFIG2 0x44
50#define CAP1106_REG_SENSOR_BASE_CNT(X) (0x50 + (X))
51#define CAP1106_REG_SENSOR_CALIB (0xb1 + (X))
52#define CAP1106_REG_SENSOR_CALIB_LSB1 0xb9
53#define CAP1106_REG_SENSOR_CALIB_LSB2 0xba
54#define CAP1106_REG_PRODUCT_ID 0xfd
55#define CAP1106_REG_MANUFACTURER_ID 0xfe
56#define CAP1106_REG_REVISION 0xff
57
58#define CAP1106_NUM_CHN 6
59#define CAP1106_PRODUCT_ID 0x55
60#define CAP1106_MANUFACTURER_ID 0x5d
61
62struct cap1106_priv {
63 struct regmap *regmap;
64 struct input_dev *idev;
65
66 /* config */
67 unsigned int keycodes[CAP1106_NUM_CHN];
68};
69
70static const struct reg_default cap1106_reg_defaults[] = {
71 { CAP1106_REG_MAIN_CONTROL, 0x00 },
72 { CAP1106_REG_GENERAL_STATUS, 0x00 },
73 { CAP1106_REG_SENSOR_INPUT, 0x00 },
74 { CAP1106_REG_NOISE_FLAG_STATUS, 0x00 },
75 { CAP1106_REG_SENSITIVITY_CONTROL, 0x2f },
76 { CAP1106_REG_CONFIG, 0x20 },
77 { CAP1106_REG_SENSOR_ENABLE, 0x3f },
78 { CAP1106_REG_SENSOR_CONFIG, 0xa4 },
79 { CAP1106_REG_SENSOR_CONFIG2, 0x07 },
80 { CAP1106_REG_SAMPLING_CONFIG, 0x39 },
81 { CAP1106_REG_CALIBRATION, 0x00 },
82 { CAP1106_REG_INT_ENABLE, 0x3f },
83 { CAP1106_REG_REPEAT_RATE, 0x3f },
84 { CAP1106_REG_MT_CONFIG, 0x80 },
85 { CAP1106_REG_MT_PATTERN_CONFIG, 0x00 },
86 { CAP1106_REG_MT_PATTERN, 0x3f },
87 { CAP1106_REG_RECALIB_CONFIG, 0x8a },
88 { CAP1106_REG_SENSOR_THRESH(0), 0x40 },
89 { CAP1106_REG_SENSOR_THRESH(1), 0x40 },
90 { CAP1106_REG_SENSOR_THRESH(2), 0x40 },
91 { CAP1106_REG_SENSOR_THRESH(3), 0x40 },
92 { CAP1106_REG_SENSOR_THRESH(4), 0x40 },
93 { CAP1106_REG_SENSOR_THRESH(5), 0x40 },
94 { CAP1106_REG_SENSOR_NOISE_THRESH, 0x01 },
95 { CAP1106_REG_STANDBY_CHANNEL, 0x00 },
96 { CAP1106_REG_STANDBY_CONFIG, 0x39 },
97 { CAP1106_REG_STANDBY_SENSITIVITY, 0x02 },
98 { CAP1106_REG_STANDBY_THRESH, 0x40 },
99 { CAP1106_REG_CONFIG2, 0x40 },
100 { CAP1106_REG_SENSOR_CALIB_LSB1, 0x00 },
101 { CAP1106_REG_SENSOR_CALIB_LSB2, 0x00 },
102};
103
104static bool cap1106_volatile_reg(struct device *dev, unsigned int reg)
105{
106 switch (reg) {
107 case CAP1106_REG_MAIN_CONTROL:
108 case CAP1106_REG_SENSOR_INPUT:
109 case CAP1106_REG_SENOR_DELTA(0):
110 case CAP1106_REG_SENOR_DELTA(1):
111 case CAP1106_REG_SENOR_DELTA(2):
112 case CAP1106_REG_SENOR_DELTA(3):
113 case CAP1106_REG_SENOR_DELTA(4):
114 case CAP1106_REG_SENOR_DELTA(5):
115 case CAP1106_REG_PRODUCT_ID:
116 case CAP1106_REG_MANUFACTURER_ID:
117 case CAP1106_REG_REVISION:
118 return true;
119 }
120
121 return false;
122}
123
124static const struct regmap_config cap1106_regmap_config = {
125 .reg_bits = 8,
126 .val_bits = 8,
127
128 .max_register = CAP1106_REG_REVISION,
129 .reg_defaults = cap1106_reg_defaults,
130
131 .num_reg_defaults = ARRAY_SIZE(cap1106_reg_defaults),
132 .cache_type = REGCACHE_RBTREE,
133 .volatile_reg = cap1106_volatile_reg,
134};
135
136static irqreturn_t cap1106_thread_func(int irq_num, void *data)
137{
138 struct cap1106_priv *priv = data;
139 unsigned int status;
140 int ret, i;
141
142 /*
143 * Deassert interrupt. This needs to be done before reading the status
144 * registers, which will not carry valid values otherwise.
145 */
146 ret = regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL, 1, 0);
147 if (ret < 0)
148 goto out;
149
150 ret = regmap_read(priv->regmap, CAP1106_REG_SENSOR_INPUT, &status);
151 if (ret < 0)
152 goto out;
153
154 for (i = 0; i < CAP1106_NUM_CHN; i++)
155 input_report_key(priv->idev, priv->keycodes[i],
156 status & (1 << i));
157
158 input_sync(priv->idev);
159
160out:
161 return IRQ_HANDLED;
162}
163
164static int cap1106_set_sleep(struct cap1106_priv *priv, bool sleep)
165{
166 return regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL,
167 CAP1106_REG_MAIN_CONTROL_DLSEEP,
168 sleep ? CAP1106_REG_MAIN_CONTROL_DLSEEP : 0);
169}
170
171static int cap1106_input_open(struct input_dev *idev)
172{
173 struct cap1106_priv *priv = input_get_drvdata(idev);
174
175 return cap1106_set_sleep(priv, false);
176}
177
178static void cap1106_input_close(struct input_dev *idev)
179{
180 struct cap1106_priv *priv = input_get_drvdata(idev);
181
182 cap1106_set_sleep(priv, true);
183}
184
185static int cap1106_i2c_probe(struct i2c_client *i2c_client,
186 const struct i2c_device_id *id)
187{
188 struct device *dev = &i2c_client->dev;
189 struct cap1106_priv *priv;
190 struct device_node *node;
191 int i, error, irq, gain = 0;
192 unsigned int val, rev;
193 u32 gain32, keycodes[CAP1106_NUM_CHN];
194
195 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
196 if (!priv)
197 return -ENOMEM;
198
199 priv->regmap = devm_regmap_init_i2c(i2c_client, &cap1106_regmap_config);
200 if (IS_ERR(priv->regmap))
201 return PTR_ERR(priv->regmap);
202
203 error = regmap_read(priv->regmap, CAP1106_REG_PRODUCT_ID, &val);
204 if (error)
205 return error;
206
207 if (val != CAP1106_PRODUCT_ID) {
208 dev_err(dev, "Product ID: Got 0x%02x, expected 0x%02x\n",
209 val, CAP1106_PRODUCT_ID);
210 return -ENODEV;
211 }
212
213 error = regmap_read(priv->regmap, CAP1106_REG_MANUFACTURER_ID, &val);
214 if (error)
215 return error;
216
217 if (val != CAP1106_MANUFACTURER_ID) {
218 dev_err(dev, "Manufacturer ID: Got 0x%02x, expected 0x%02x\n",
219 val, CAP1106_MANUFACTURER_ID);
220 return -ENODEV;
221 }
222
223 error = regmap_read(priv->regmap, CAP1106_REG_REVISION, &rev);
224 if (error < 0)
225 return error;
226
227 dev_info(dev, "CAP1106 detected, revision 0x%02x\n", rev);
228 i2c_set_clientdata(i2c_client, priv);
229 node = dev->of_node;
230
231 if (!of_property_read_u32(node, "microchip,sensor-gain", &gain32)) {
232 if (is_power_of_2(gain32) && gain32 <= 8)
233 gain = ilog2(gain32);
234 else
235 dev_err(dev, "Invalid sensor-gain value %d\n", gain32);
236 }
237
238 BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));
239
240 /* Provide some useful defaults */
241 for (i = 0; i < ARRAY_SIZE(keycodes); i++)
242 keycodes[i] = KEY_A + i;
243
244 of_property_read_u32_array(node, "linux,keycodes",
245 keycodes, ARRAY_SIZE(keycodes));
246
247 for (i = 0; i < ARRAY_SIZE(keycodes); i++)
248 priv->keycodes[i] = keycodes[i];
249
250 error = regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL,
251 CAP1106_REG_MAIN_CONTROL_GAIN_MASK,
252 gain << CAP1106_REG_MAIN_CONTROL_GAIN_SHIFT);
253 if (error)
254 return error;
255
256 /* Disable autorepeat. The Linux input system has its own handling. */
257 error = regmap_write(priv->regmap, CAP1106_REG_REPEAT_RATE, 0);
258 if (error)
259 return error;
260
261 priv->idev = devm_input_allocate_device(dev);
262 if (!priv->idev)
263 return -ENOMEM;
264
265 priv->idev->name = "CAP1106 capacitive touch sensor";
266 priv->idev->id.bustype = BUS_I2C;
267 priv->idev->evbit[0] = BIT_MASK(EV_KEY);
268
269 if (of_property_read_bool(node, "autorepeat"))
270 __set_bit(EV_REP, priv->idev->evbit);
271
272 for (i = 0; i < CAP1106_NUM_CHN; i++)
273 __set_bit(priv->keycodes[i], priv->idev->keybit);
274
275 priv->idev->id.vendor = CAP1106_MANUFACTURER_ID;
276 priv->idev->id.product = CAP1106_PRODUCT_ID;
277 priv->idev->id.version = rev;
278
279 priv->idev->open = cap1106_input_open;
280 priv->idev->close = cap1106_input_close;
281
282 input_set_drvdata(priv->idev, priv);
283
284 /*
285 * Put the device in deep sleep mode for now.
286 * ->open() will bring it back once the it is actually needed.
287 */
288 cap1106_set_sleep(priv, true);
289
290 error = input_register_device(priv->idev);
291 if (error)
292 return error;
293
294 irq = irq_of_parse_and_map(node, 0);
295 if (!irq) {
296 dev_err(dev, "Unable to parse or map IRQ\n");
297 return -ENXIO;
298 }
299
300 error = devm_request_threaded_irq(dev, irq, NULL, cap1106_thread_func,
301 IRQF_ONESHOT, dev_name(dev), priv);
302 if (error)
303 return error;
304
305 return 0;
306}
307
308static const struct of_device_id cap1106_dt_ids[] = {
309 { .compatible = "microchip,cap1106", },
310 {}
311};
312MODULE_DEVICE_TABLE(of, cap1106_dt_ids);
313
314static const struct i2c_device_id cap1106_i2c_ids[] = {
315 { "cap1106", 0 },
316 {}
317};
318MODULE_DEVICE_TABLE(i2c, cap1106_i2c_ids);
319
320static struct i2c_driver cap1106_i2c_driver = {
321 .driver = {
322 .name = "cap1106",
323 .owner = THIS_MODULE,
324 .of_match_table = cap1106_dt_ids,
325 },
326 .id_table = cap1106_i2c_ids,
327 .probe = cap1106_i2c_probe,
328};
329
330module_i2c_driver(cap1106_i2c_driver);
331
332MODULE_ALIAS("platform:cap1106");
333MODULE_DESCRIPTION("Microchip CAP1106 driver");
334MODULE_AUTHOR("Daniel Mack <linux@zonque.org>");
335MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c
index 8280cb16260b..20a99c368d16 100644
--- a/drivers/input/keyboard/imx_keypad.c
+++ b/drivers/input/keyboard/imx_keypad.c
@@ -531,8 +531,7 @@ static int imx_keypad_probe(struct platform_device *pdev)
531 return 0; 531 return 0;
532} 532}
533 533
534#ifdef CONFIG_PM_SLEEP 534static int __maybe_unused imx_kbd_suspend(struct device *dev)
535static int imx_kbd_suspend(struct device *dev)
536{ 535{
537 struct platform_device *pdev = to_platform_device(dev); 536 struct platform_device *pdev = to_platform_device(dev);
538 struct imx_keypad *kbd = platform_get_drvdata(pdev); 537 struct imx_keypad *kbd = platform_get_drvdata(pdev);
@@ -552,7 +551,7 @@ static int imx_kbd_suspend(struct device *dev)
552 return 0; 551 return 0;
553} 552}
554 553
555static int imx_kbd_resume(struct device *dev) 554static int __maybe_unused imx_kbd_resume(struct device *dev)
556{ 555{
557 struct platform_device *pdev = to_platform_device(dev); 556 struct platform_device *pdev = to_platform_device(dev);
558 struct imx_keypad *kbd = platform_get_drvdata(pdev); 557 struct imx_keypad *kbd = platform_get_drvdata(pdev);
@@ -575,7 +574,6 @@ err_clk:
575 574
576 return ret; 575 return ret;
577} 576}
578#endif
579 577
580static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume); 578static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume);
581 579
diff --git a/drivers/input/keyboard/max7359_keypad.c b/drivers/input/keyboard/max7359_keypad.c
index 430b54539720..faa6da53eba8 100644
--- a/drivers/input/keyboard/max7359_keypad.c
+++ b/drivers/input/keyboard/max7359_keypad.c
@@ -203,12 +203,17 @@ static int max7359_probe(struct i2c_client *client,
203 203
204 dev_dbg(&client->dev, "keys FIFO is 0x%02x\n", ret); 204 dev_dbg(&client->dev, "keys FIFO is 0x%02x\n", ret);
205 205
206 keypad = kzalloc(sizeof(struct max7359_keypad), GFP_KERNEL); 206 keypad = devm_kzalloc(&client->dev, sizeof(struct max7359_keypad),
207 input_dev = input_allocate_device(); 207 GFP_KERNEL);
208 if (!keypad || !input_dev) { 208 if (!keypad) {
209 dev_err(&client->dev, "failed to allocate memory\n"); 209 dev_err(&client->dev, "failed to allocate memory\n");
210 error = -ENOMEM; 210 return -ENOMEM;
211 goto failed_free_mem; 211 }
212
213 input_dev = devm_input_allocate_device(&client->dev);
214 if (!input_dev) {
215 dev_err(&client->dev, "failed to allocate input device\n");
216 return -ENOMEM;
212 } 217 }
213 218
214 keypad->client = client; 219 keypad->client = client;
@@ -230,19 +235,20 @@ static int max7359_probe(struct i2c_client *client,
230 235
231 max7359_build_keycode(keypad, keymap_data); 236 max7359_build_keycode(keypad, keymap_data);
232 237
233 error = request_threaded_irq(client->irq, NULL, max7359_interrupt, 238 error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
234 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 239 max7359_interrupt,
235 client->name, keypad); 240 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
241 client->name, keypad);
236 if (error) { 242 if (error) {
237 dev_err(&client->dev, "failed to register interrupt\n"); 243 dev_err(&client->dev, "failed to register interrupt\n");
238 goto failed_free_mem; 244 return error;
239 } 245 }
240 246
241 /* Register the input device */ 247 /* Register the input device */
242 error = input_register_device(input_dev); 248 error = input_register_device(input_dev);
243 if (error) { 249 if (error) {
244 dev_err(&client->dev, "failed to register input device\n"); 250 dev_err(&client->dev, "failed to register input device\n");
245 goto failed_free_irq; 251 return error;
246 } 252 }
247 253
248 /* Initialize MAX7359 */ 254 /* Initialize MAX7359 */
@@ -252,24 +258,6 @@ static int max7359_probe(struct i2c_client *client,
252 device_init_wakeup(&client->dev, 1); 258 device_init_wakeup(&client->dev, 1);
253 259
254 return 0; 260 return 0;
255
256failed_free_irq:
257 free_irq(client->irq, keypad);
258failed_free_mem:
259 input_free_device(input_dev);
260 kfree(keypad);
261 return error;
262}
263
264static int max7359_remove(struct i2c_client *client)
265{
266 struct max7359_keypad *keypad = i2c_get_clientdata(client);
267
268 free_irq(client->irq, keypad);
269 input_unregister_device(keypad->input_dev);
270 kfree(keypad);
271
272 return 0;
273} 261}
274 262
275#ifdef CONFIG_PM_SLEEP 263#ifdef CONFIG_PM_SLEEP
@@ -313,7 +301,6 @@ static struct i2c_driver max7359_i2c_driver = {
313 .pm = &max7359_pm, 301 .pm = &max7359_pm,
314 }, 302 },
315 .probe = max7359_probe, 303 .probe = max7359_probe,
316 .remove = max7359_remove,
317 .id_table = max7359_ids, 304 .id_table = max7359_ids,
318}; 305};
319 306
diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c
index 01f3b5b300f3..a3fe4a990cc9 100644
--- a/drivers/input/misc/keyspan_remote.c
+++ b/drivers/input/misc/keyspan_remote.c
@@ -392,7 +392,6 @@ static void keyspan_irq_recv(struct urb *urb)
392 392
393 default: 393 default:
394 goto resubmit; 394 goto resubmit;
395 break;
396 } 395 }
397 396
398 if (debug) 397 if (debug)
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
index 5a6334be30b8..e34dfc29beb3 100644
--- a/drivers/input/misc/soc_button_array.c
+++ b/drivers/input/misc/soc_button_array.c
@@ -83,6 +83,9 @@ soc_button_device_create(struct pnp_dev *pdev,
83 sizeof(*gpio_keys_pdata) + 83 sizeof(*gpio_keys_pdata) +
84 sizeof(*gpio_keys) * MAX_NBUTTONS, 84 sizeof(*gpio_keys) * MAX_NBUTTONS,
85 GFP_KERNEL); 85 GFP_KERNEL);
86 if (!gpio_keys_pdata)
87 return ERR_PTR(-ENOMEM);
88
86 gpio_keys = (void *)(gpio_keys_pdata + 1); 89 gpio_keys = (void *)(gpio_keys_pdata + 1);
87 90
88 for (info = button_info; info->name; info++) { 91 for (info = button_info; info->name; info++) {
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index 856936247500..421e29e4cd81 100644
--- a/drivers/input/misc/uinput.c
+++ b/drivers/input/misc/uinput.c
@@ -311,7 +311,14 @@ static int uinput_open(struct inode *inode, struct file *file)
311static int uinput_validate_absbits(struct input_dev *dev) 311static int uinput_validate_absbits(struct input_dev *dev)
312{ 312{
313 unsigned int cnt; 313 unsigned int cnt;
314 int retval = 0; 314 int nslot;
315
316 if (!test_bit(EV_ABS, dev->evbit))
317 return 0;
318
319 /*
320 * Check if absmin/absmax/absfuzz/absflat are sane.
321 */
315 322
316 for (cnt = 0; cnt < ABS_CNT; cnt++) { 323 for (cnt = 0; cnt < ABS_CNT; cnt++) {
317 int min, max; 324 int min, max;
@@ -327,8 +334,7 @@ static int uinput_validate_absbits(struct input_dev *dev)
327 UINPUT_NAME, cnt, 334 UINPUT_NAME, cnt,
328 input_abs_get_min(dev, cnt), 335 input_abs_get_min(dev, cnt),
329 input_abs_get_max(dev, cnt)); 336 input_abs_get_max(dev, cnt));
330 retval = -EINVAL; 337 return -EINVAL;
331 break;
332 } 338 }
333 339
334 if (input_abs_get_flat(dev, cnt) > 340 if (input_abs_get_flat(dev, cnt) >
@@ -340,11 +346,18 @@ static int uinput_validate_absbits(struct input_dev *dev)
340 input_abs_get_flat(dev, cnt), 346 input_abs_get_flat(dev, cnt),
341 input_abs_get_min(dev, cnt), 347 input_abs_get_min(dev, cnt),
342 input_abs_get_max(dev, cnt)); 348 input_abs_get_max(dev, cnt));
343 retval = -EINVAL; 349 return -EINVAL;
344 break;
345 } 350 }
346 } 351 }
347 return retval; 352
353 if (test_bit(ABS_MT_SLOT, dev->absbit)) {
354 nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
355 input_mt_init_slots(dev, nslot, 0);
356 } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
357 input_set_events_per_packet(dev, 60);
358 }
359
360 return 0;
348} 361}
349 362
350static int uinput_allocate_device(struct uinput_device *udev) 363static int uinput_allocate_device(struct uinput_device *udev)
@@ -410,19 +423,9 @@ static int uinput_setup_device(struct uinput_device *udev,
410 input_abs_set_flat(dev, i, user_dev->absflat[i]); 423 input_abs_set_flat(dev, i, user_dev->absflat[i]);
411 } 424 }
412 425
413 /* check if absmin/absmax/absfuzz/absflat are filled as 426 retval = uinput_validate_absbits(dev);
414 * told in Documentation/input/input-programming.txt */ 427 if (retval < 0)
415 if (test_bit(EV_ABS, dev->evbit)) { 428 goto exit;
416 retval = uinput_validate_absbits(dev);
417 if (retval < 0)
418 goto exit;
419 if (test_bit(ABS_MT_SLOT, dev->absbit)) {
420 int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
421 input_mt_init_slots(dev, nslot, 0);
422 } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
423 input_set_events_per_packet(dev, 60);
424 }
425 }
426 429
427 udev->state = UIST_SETUP_COMPLETE; 430 udev->state = UIST_SETUP_COMPLETE;
428 retval = count; 431 retval = count;
@@ -720,6 +723,12 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
720 } 723 }
721 724
722 switch (cmd) { 725 switch (cmd) {
726 case UI_GET_VERSION:
727 if (put_user(UINPUT_VERSION,
728 (unsigned int __user *)p))
729 retval = -EFAULT;
730 goto out;
731
723 case UI_DEV_CREATE: 732 case UI_DEV_CREATE:
724 retval = uinput_create_device(udev); 733 retval = uinput_create_device(udev);
725 goto out; 734 goto out;
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index fb15c64ffb95..a59a1a64b674 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -99,6 +99,8 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
99#define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ 99#define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */
100#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with 100#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with
101 6-byte ALPS packet */ 101 6-byte ALPS packet */
102#define ALPS_IS_RUSHMORE 0x100 /* device is a rushmore */
103#define ALPS_BUTTONPAD 0x200 /* device is a clickpad */
102 104
103static const struct alps_model_info alps_model_data[] = { 105static const struct alps_model_info alps_model_data[] = {
104 { { 0x32, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */ 106 { { 0x32, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */
@@ -281,11 +283,10 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
281 * 283 *
282 * The bitmaps don't have enough data to track fingers, so this function 284 * The bitmaps don't have enough data to track fingers, so this function
283 * only generates points representing a bounding box of at most two contacts. 285 * only generates points representing a bounding box of at most two contacts.
284 * These two points are returned in x1, y1, x2, and y2. 286 * These two points are returned in fields->mt.
285 */ 287 */
286static void alps_process_bitmap_dolphin(struct alps_data *priv, 288static void alps_process_bitmap_dolphin(struct alps_data *priv,
287 struct alps_fields *fields, 289 struct alps_fields *fields)
288 int *x1, int *y1, int *x2, int *y2)
289{ 290{
290 int box_middle_x, box_middle_y; 291 int box_middle_x, box_middle_y;
291 unsigned int x_map, y_map; 292 unsigned int x_map, y_map;
@@ -308,8 +309,6 @@ static void alps_process_bitmap_dolphin(struct alps_data *priv,
308 if (x_msb > priv->x_bits || y_msb > priv->y_bits) 309 if (x_msb > priv->x_bits || y_msb > priv->y_bits)
309 return; 310 return;
310 311
311 *x1 = *y1 = *x2 = *y2 = 0;
312
313 if (fields->fingers > 1) { 312 if (fields->fingers > 1) {
314 start_bit = priv->x_bits - x_msb; 313 start_bit = priv->x_bits - x_msb;
315 end_bit = priv->x_bits - x_lsb; 314 end_bit = priv->x_bits - x_lsb;
@@ -320,10 +319,35 @@ static void alps_process_bitmap_dolphin(struct alps_data *priv,
320 end_bit = y_msb - 1; 319 end_bit = y_msb - 1;
321 box_middle_y = (priv->y_max * (start_bit + end_bit)) / 320 box_middle_y = (priv->y_max * (start_bit + end_bit)) /
322 (2 * (priv->y_bits - 1)); 321 (2 * (priv->y_bits - 1));
323 *x1 = fields->x; 322 fields->mt[0] = fields->st;
324 *y1 = fields->y; 323 fields->mt[1].x = 2 * box_middle_x - fields->mt[0].x;
325 *x2 = 2 * box_middle_x - *x1; 324 fields->mt[1].y = 2 * box_middle_y - fields->mt[0].y;
326 *y2 = 2 * box_middle_y - *y1; 325 }
326}
327
328static void alps_get_bitmap_points(unsigned int map,
329 struct alps_bitmap_point *low,
330 struct alps_bitmap_point *high,
331 int *fingers)
332{
333 struct alps_bitmap_point *point;
334 int i, bit, prev_bit = 0;
335
336 point = low;
337 for (i = 0; map != 0; i++, map >>= 1) {
338 bit = map & 1;
339 if (bit) {
340 if (!prev_bit) {
341 point->start_bit = i;
342 point->num_bits = 0;
343 (*fingers)++;
344 }
345 point->num_bits++;
346 } else {
347 if (prev_bit)
348 point = high;
349 }
350 prev_bit = bit;
327 } 351 }
328} 352}
329 353
@@ -334,71 +358,21 @@ static void alps_process_bitmap_dolphin(struct alps_data *priv,
334 * 358 *
335 * The bitmaps don't have enough data to track fingers, so this function 359 * The bitmaps don't have enough data to track fingers, so this function
336 * only generates points representing a bounding box of all contacts. 360 * only generates points representing a bounding box of all contacts.
337 * These points are returned in x1, y1, x2, and y2 when the return value 361 * These points are returned in fields->mt when the return value
338 * is greater than 0. 362 * is greater than 0.
339 */ 363 */
340static int alps_process_bitmap(struct alps_data *priv, 364static int alps_process_bitmap(struct alps_data *priv,
341 unsigned int x_map, unsigned int y_map, 365 struct alps_fields *fields)
342 int *x1, int *y1, int *x2, int *y2)
343{ 366{
344 struct alps_bitmap_point { 367 int i, fingers_x = 0, fingers_y = 0, fingers;
345 int start_bit;
346 int num_bits;
347 };
348
349 int fingers_x = 0, fingers_y = 0, fingers;
350 int i, bit, prev_bit;
351 struct alps_bitmap_point x_low = {0,}, x_high = {0,}; 368 struct alps_bitmap_point x_low = {0,}, x_high = {0,};
352 struct alps_bitmap_point y_low = {0,}, y_high = {0,}; 369 struct alps_bitmap_point y_low = {0,}, y_high = {0,};
353 struct alps_bitmap_point *point;
354 370
355 if (!x_map || !y_map) 371 if (!fields->x_map || !fields->y_map)
356 return 0; 372 return 0;
357 373
358 *x1 = *y1 = *x2 = *y2 = 0; 374 alps_get_bitmap_points(fields->x_map, &x_low, &x_high, &fingers_x);
359 375 alps_get_bitmap_points(fields->y_map, &y_low, &y_high, &fingers_y);
360 prev_bit = 0;
361 point = &x_low;
362 for (i = 0; x_map != 0; i++, x_map >>= 1) {
363 bit = x_map & 1;
364 if (bit) {
365 if (!prev_bit) {
366 point->start_bit = i;
367 fingers_x++;
368 }
369 point->num_bits++;
370 } else {
371 if (prev_bit)
372 point = &x_high;
373 else
374 point->num_bits = 0;
375 }
376 prev_bit = bit;
377 }
378
379 /*
380 * y bitmap is reversed for what we need (lower positions are in
381 * higher bits), so we process from the top end.
382 */
383 y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - priv->y_bits);
384 prev_bit = 0;
385 point = &y_low;
386 for (i = 0; y_map != 0; i++, y_map <<= 1) {
387 bit = y_map & (1 << (sizeof(y_map) * BITS_PER_BYTE - 1));
388 if (bit) {
389 if (!prev_bit) {
390 point->start_bit = i;
391 fingers_y++;
392 }
393 point->num_bits++;
394 } else {
395 if (prev_bit)
396 point = &y_high;
397 else
398 point->num_bits = 0;
399 }
400 prev_bit = bit;
401 }
402 376
403 /* 377 /*
404 * Fingers can overlap, so we use the maximum count of fingers 378 * Fingers can overlap, so we use the maximum count of fingers
@@ -407,58 +381,91 @@ static int alps_process_bitmap(struct alps_data *priv,
407 fingers = max(fingers_x, fingers_y); 381 fingers = max(fingers_x, fingers_y);
408 382
409 /* 383 /*
410 * If total fingers is > 1 but either axis reports only a single 384 * If an axis reports only a single contact, we have overlapping or
411 * contact, we have overlapping or adjacent fingers. For the 385 * adjacent fingers. Divide the single contact between the two points.
412 * purposes of creating a bounding box, divide the single contact
413 * (roughly) equally between the two points.
414 */ 386 */
415 if (fingers > 1) { 387 if (fingers_x == 1) {
416 if (fingers_x == 1) { 388 i = (x_low.num_bits - 1) / 2;
417 i = x_low.num_bits / 2; 389 x_low.num_bits = x_low.num_bits - i;
418 x_low.num_bits = x_low.num_bits - i; 390 x_high.start_bit = x_low.start_bit + i;
419 x_high.start_bit = x_low.start_bit + i; 391 x_high.num_bits = max(i, 1);
420 x_high.num_bits = max(i, 1); 392 }
421 } else if (fingers_y == 1) { 393 if (fingers_y == 1) {
422 i = y_low.num_bits / 2; 394 i = (y_low.num_bits - 1) / 2;
423 y_low.num_bits = y_low.num_bits - i; 395 y_low.num_bits = y_low.num_bits - i;
424 y_high.start_bit = y_low.start_bit + i; 396 y_high.start_bit = y_low.start_bit + i;
425 y_high.num_bits = max(i, 1); 397 y_high.num_bits = max(i, 1);
426 }
427 } 398 }
428 399
429 *x1 = (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) / 400 fields->mt[0].x =
430 (2 * (priv->x_bits - 1)); 401 (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) /
431 *y1 = (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) / 402 (2 * (priv->x_bits - 1));
432 (2 * (priv->y_bits - 1)); 403 fields->mt[0].y =
433 404 (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) /
434 if (fingers > 1) { 405 (2 * (priv->y_bits - 1));
435 *x2 = (priv->x_max * 406
436 (2 * x_high.start_bit + x_high.num_bits - 1)) / 407 fields->mt[1].x =
437 (2 * (priv->x_bits - 1)); 408 (priv->x_max * (2 * x_high.start_bit + x_high.num_bits - 1)) /
438 *y2 = (priv->y_max * 409 (2 * (priv->x_bits - 1));
439 (2 * y_high.start_bit + y_high.num_bits - 1)) / 410 fields->mt[1].y =
440 (2 * (priv->y_bits - 1)); 411 (priv->y_max * (2 * y_high.start_bit + y_high.num_bits - 1)) /
412 (2 * (priv->y_bits - 1));
413
414 /* y-bitmap order is reversed, except on rushmore */
415 if (!(priv->flags & ALPS_IS_RUSHMORE)) {
416 fields->mt[0].y = priv->y_max - fields->mt[0].y;
417 fields->mt[1].y = priv->y_max - fields->mt[1].y;
441 } 418 }
442 419
443 return fingers; 420 return fingers;
444} 421}
445 422
446static void alps_set_slot(struct input_dev *dev, int slot, bool active, 423static void alps_set_slot(struct input_dev *dev, int slot, int x, int y)
447 int x, int y)
448{ 424{
449 input_mt_slot(dev, slot); 425 input_mt_slot(dev, slot);
450 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); 426 input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
451 if (active) { 427 input_report_abs(dev, ABS_MT_POSITION_X, x);
452 input_report_abs(dev, ABS_MT_POSITION_X, x); 428 input_report_abs(dev, ABS_MT_POSITION_Y, y);
453 input_report_abs(dev, ABS_MT_POSITION_Y, y);
454 }
455} 429}
456 430
457static void alps_report_semi_mt_data(struct input_dev *dev, int num_fingers, 431static void alps_report_mt_data(struct psmouse *psmouse, int n)
458 int x1, int y1, int x2, int y2)
459{ 432{
460 alps_set_slot(dev, 0, num_fingers != 0, x1, y1); 433 struct alps_data *priv = psmouse->private;
461 alps_set_slot(dev, 1, num_fingers == 2, x2, y2); 434 struct input_dev *dev = psmouse->dev;
435 struct alps_fields *f = &priv->f;
436 int i, slot[MAX_TOUCHES];
437
438 input_mt_assign_slots(dev, slot, f->mt, n);
439 for (i = 0; i < n; i++)
440 alps_set_slot(dev, slot[i], f->mt[i].x, f->mt[i].y);
441
442 input_mt_sync_frame(dev);
443}
444
445static void alps_report_semi_mt_data(struct psmouse *psmouse, int fingers)
446{
447 struct alps_data *priv = psmouse->private;
448 struct input_dev *dev = psmouse->dev;
449 struct alps_fields *f = &priv->f;
450
451 /* Use st data when we don't have mt data */
452 if (fingers < 2) {
453 f->mt[0].x = f->st.x;
454 f->mt[0].y = f->st.y;
455 fingers = f->pressure > 0 ? 1 : 0;
456 }
457
458 alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 2);
459
460 input_mt_report_finger_count(dev, fingers);
461
462 input_report_key(dev, BTN_LEFT, f->left);
463 input_report_key(dev, BTN_RIGHT, f->right);
464 input_report_key(dev, BTN_MIDDLE, f->middle);
465
466 input_report_abs(dev, ABS_PRESSURE, f->pressure);
467
468 input_sync(dev);
462} 469}
463 470
464static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) 471static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
@@ -532,7 +539,7 @@ static void alps_decode_buttons_v3(struct alps_fields *f, unsigned char *p)
532 f->ts_middle = !!(p[3] & 0x40); 539 f->ts_middle = !!(p[3] & 0x40);
533} 540}
534 541
535static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p, 542static int alps_decode_pinnacle(struct alps_fields *f, unsigned char *p,
536 struct psmouse *psmouse) 543 struct psmouse *psmouse)
537{ 544{
538 f->first_mp = !!(p[4] & 0x40); 545 f->first_mp = !!(p[4] & 0x40);
@@ -546,24 +553,31 @@ static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p,
546 ((p[2] & 0x7f) << 1) | 553 ((p[2] & 0x7f) << 1) |
547 (p[4] & 0x01); 554 (p[4] & 0x01);
548 555
549 f->x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) | 556 f->st.x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) |
550 ((p[0] & 0x30) >> 4); 557 ((p[0] & 0x30) >> 4);
551 f->y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f); 558 f->st.y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f);
552 f->z = p[5] & 0x7f; 559 f->pressure = p[5] & 0x7f;
553 560
554 alps_decode_buttons_v3(f, p); 561 alps_decode_buttons_v3(f, p);
562
563 return 0;
555} 564}
556 565
557static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p, 566static int alps_decode_rushmore(struct alps_fields *f, unsigned char *p,
558 struct psmouse *psmouse) 567 struct psmouse *psmouse)
559{ 568{
560 alps_decode_pinnacle(f, p, psmouse); 569 alps_decode_pinnacle(f, p, psmouse);
561 570
571 /* Rushmore's packet decode has a bit difference with Pinnacle's */
572 f->is_mp = !!(p[5] & 0x40);
573 f->fingers = max((p[5] & 0x3), ((p[5] >> 2) & 0x3)) + 1;
562 f->x_map |= (p[5] & 0x10) << 11; 574 f->x_map |= (p[5] & 0x10) << 11;
563 f->y_map |= (p[5] & 0x20) << 6; 575 f->y_map |= (p[5] & 0x20) << 6;
576
577 return 0;
564} 578}
565 579
566static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p, 580static int alps_decode_dolphin(struct alps_fields *f, unsigned char *p,
567 struct psmouse *psmouse) 581 struct psmouse *psmouse)
568{ 582{
569 u64 palm_data = 0; 583 u64 palm_data = 0;
@@ -573,9 +587,9 @@ static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p,
573 f->is_mp = !!(p[0] & 0x20); 587 f->is_mp = !!(p[0] & 0x20);
574 588
575 if (!f->is_mp) { 589 if (!f->is_mp) {
576 f->x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7)); 590 f->st.x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7));
577 f->y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3)); 591 f->st.y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3));
578 f->z = (p[0] & 4) ? 0 : p[5] & 0x7f; 592 f->pressure = (p[0] & 4) ? 0 : p[5] & 0x7f;
579 alps_decode_buttons_v3(f, p); 593 alps_decode_buttons_v3(f, p);
580 } else { 594 } else {
581 f->fingers = ((p[0] & 0x6) >> 1 | 595 f->fingers = ((p[0] & 0x6) >> 1 |
@@ -596,19 +610,21 @@ static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p,
596 f->x_map = (palm_data >> priv->y_bits) & 610 f->x_map = (palm_data >> priv->y_bits) &
597 (BIT(priv->x_bits) - 1); 611 (BIT(priv->x_bits) - 1);
598 } 612 }
613
614 return 0;
599} 615}
600 616
601static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse) 617static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
602{ 618{
603 struct alps_data *priv = psmouse->private; 619 struct alps_data *priv = psmouse->private;
604 unsigned char *packet = psmouse->packet; 620 unsigned char *packet = psmouse->packet;
605 struct input_dev *dev = psmouse->dev;
606 struct input_dev *dev2 = priv->dev2; 621 struct input_dev *dev2 = priv->dev2;
607 int x1 = 0, y1 = 0, x2 = 0, y2 = 0; 622 struct alps_fields *f = &priv->f;
608 int fingers = 0, bmap_fn; 623 int fingers = 0;
609 struct alps_fields f = {0};
610 624
611 priv->decode_fields(&f, packet, psmouse); 625 memset(f, 0, sizeof(*f));
626
627 priv->decode_fields(f, packet, psmouse);
612 628
613 /* 629 /*
614 * There's no single feature of touchpad position and bitmap packets 630 * There's no single feature of touchpad position and bitmap packets
@@ -623,22 +639,14 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
623 * packet. Check for this, and when it happens process the 639 * packet. Check for this, and when it happens process the
624 * position packet as usual. 640 * position packet as usual.
625 */ 641 */
626 if (f.is_mp) { 642 if (f->is_mp) {
627 fingers = f.fingers; 643 fingers = f->fingers;
628 if (priv->proto_version == ALPS_PROTO_V3) { 644 if (priv->proto_version == ALPS_PROTO_V3) {
629 bmap_fn = alps_process_bitmap(priv, f.x_map, 645 if (alps_process_bitmap(priv, f) == 0)
630 f.y_map, &x1, &y1, 646 fingers = 0; /* Use st data */
631 &x2, &y2);
632
633 /*
634 * We shouldn't report more than one finger if
635 * we don't have two coordinates.
636 */
637 if (fingers > 1 && bmap_fn < 2)
638 fingers = bmap_fn;
639 647
640 /* Now process position packet */ 648 /* Now process position packet */
641 priv->decode_fields(&f, priv->multi_data, 649 priv->decode_fields(f, priv->multi_data,
642 psmouse); 650 psmouse);
643 } else { 651 } else {
644 /* 652 /*
@@ -647,15 +655,14 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
647 * calculate Pt2, so we need to do position 655 * calculate Pt2, so we need to do position
648 * packet decode first. 656 * packet decode first.
649 */ 657 */
650 priv->decode_fields(&f, priv->multi_data, 658 priv->decode_fields(f, priv->multi_data,
651 psmouse); 659 psmouse);
652 660
653 /* 661 /*
654 * Since Dolphin's finger number is reliable, 662 * Since Dolphin's finger number is reliable,
655 * there is no need to compare with bmap_fn. 663 * there is no need to compare with bmap_fn.
656 */ 664 */
657 alps_process_bitmap_dolphin(priv, &f, &x1, &y1, 665 alps_process_bitmap_dolphin(priv, f);
658 &x2, &y2);
659 } 666 }
660 } else { 667 } else {
661 priv->multi_packet = 0; 668 priv->multi_packet = 0;
@@ -670,10 +677,10 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
670 * out misidentified bitmap packets, we reject anything with this 677 * out misidentified bitmap packets, we reject anything with this
671 * bit set. 678 * bit set.
672 */ 679 */
673 if (f.is_mp) 680 if (f->is_mp)
674 return; 681 return;
675 682
676 if (!priv->multi_packet && f.first_mp) { 683 if (!priv->multi_packet && f->first_mp) {
677 priv->multi_packet = 1; 684 priv->multi_packet = 1;
678 memcpy(priv->multi_data, packet, sizeof(priv->multi_data)); 685 memcpy(priv->multi_data, packet, sizeof(priv->multi_data));
679 return; 686 return;
@@ -687,44 +694,15 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
687 * with x, y, and z all zero, so these seem to be flukes. 694 * with x, y, and z all zero, so these seem to be flukes.
688 * Ignore them. 695 * Ignore them.
689 */ 696 */
690 if (f.x && f.y && !f.z) 697 if (f->st.x && f->st.y && !f->pressure)
691 return; 698 return;
692 699
693 /* 700 alps_report_semi_mt_data(psmouse, fingers);
694 * If we don't have MT data or the bitmaps were empty, we have
695 * to rely on ST data.
696 */
697 if (!fingers) {
698 x1 = f.x;
699 y1 = f.y;
700 fingers = f.z > 0 ? 1 : 0;
701 }
702
703 if (f.z >= 64)
704 input_report_key(dev, BTN_TOUCH, 1);
705 else
706 input_report_key(dev, BTN_TOUCH, 0);
707
708 alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
709
710 input_mt_report_finger_count(dev, fingers);
711
712 input_report_key(dev, BTN_LEFT, f.left);
713 input_report_key(dev, BTN_RIGHT, f.right);
714 input_report_key(dev, BTN_MIDDLE, f.middle);
715
716 if (f.z > 0) {
717 input_report_abs(dev, ABS_X, f.x);
718 input_report_abs(dev, ABS_Y, f.y);
719 }
720 input_report_abs(dev, ABS_PRESSURE, f.z);
721
722 input_sync(dev);
723 701
724 if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) { 702 if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) {
725 input_report_key(dev2, BTN_LEFT, f.ts_left); 703 input_report_key(dev2, BTN_LEFT, f->ts_left);
726 input_report_key(dev2, BTN_RIGHT, f.ts_right); 704 input_report_key(dev2, BTN_RIGHT, f->ts_right);
727 input_report_key(dev2, BTN_MIDDLE, f.ts_middle); 705 input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
728 input_sync(dev2); 706 input_sync(dev2);
729 } 707 }
730} 708}
@@ -823,13 +801,8 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
823{ 801{
824 struct alps_data *priv = psmouse->private; 802 struct alps_data *priv = psmouse->private;
825 unsigned char *packet = psmouse->packet; 803 unsigned char *packet = psmouse->packet;
826 struct input_dev *dev = psmouse->dev; 804 struct alps_fields *f = &priv->f;
827 int offset; 805 int offset;
828 int x, y, z;
829 int left, right;
830 int x1, y1, x2, y2;
831 int fingers = 0;
832 unsigned int x_bitmap, y_bitmap;
833 806
834 /* 807 /*
835 * v4 has a 6-byte encoding for bitmap data, but this data is 808 * v4 has a 6-byte encoding for bitmap data, but this data is
@@ -851,71 +824,207 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
851 if (++priv->multi_packet > 2) { 824 if (++priv->multi_packet > 2) {
852 priv->multi_packet = 0; 825 priv->multi_packet = 0;
853 826
854 x_bitmap = ((priv->multi_data[2] & 0x1f) << 10) | 827 f->x_map = ((priv->multi_data[2] & 0x1f) << 10) |
855 ((priv->multi_data[3] & 0x60) << 3) | 828 ((priv->multi_data[3] & 0x60) << 3) |
856 ((priv->multi_data[0] & 0x3f) << 2) | 829 ((priv->multi_data[0] & 0x3f) << 2) |
857 ((priv->multi_data[1] & 0x60) >> 5); 830 ((priv->multi_data[1] & 0x60) >> 5);
858 y_bitmap = ((priv->multi_data[5] & 0x01) << 10) | 831 f->y_map = ((priv->multi_data[5] & 0x01) << 10) |
859 ((priv->multi_data[3] & 0x1f) << 5) | 832 ((priv->multi_data[3] & 0x1f) << 5) |
860 (priv->multi_data[1] & 0x1f); 833 (priv->multi_data[1] & 0x1f);
861 834
862 fingers = alps_process_bitmap(priv, x_bitmap, y_bitmap, 835 f->fingers = alps_process_bitmap(priv, f);
863 &x1, &y1, &x2, &y2);
864
865 /* Store MT data.*/
866 priv->fingers = fingers;
867 priv->x1 = x1;
868 priv->x2 = x2;
869 priv->y1 = y1;
870 priv->y2 = y2;
871 } 836 }
872 837
873 left = packet[4] & 0x01; 838 f->left = packet[4] & 0x01;
874 right = packet[4] & 0x02; 839 f->right = packet[4] & 0x02;
875 840
876 x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | 841 f->st.x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) |
877 ((packet[0] & 0x30) >> 4); 842 ((packet[0] & 0x30) >> 4);
878 y = ((packet[2] & 0x7f) << 4) | (packet[3] & 0x0f); 843 f->st.y = ((packet[2] & 0x7f) << 4) | (packet[3] & 0x0f);
879 z = packet[5] & 0x7f; 844 f->pressure = packet[5] & 0x7f;
880 845
881 /* 846 alps_report_semi_mt_data(psmouse, f->fingers);
882 * If there were no contacts in the bitmap, use ST 847}
883 * points in MT reports. 848
884 * If there were two contacts or more, report MT data. 849static bool alps_is_valid_package_v7(struct psmouse *psmouse)
885 */ 850{
886 if (priv->fingers < 2) { 851 switch (psmouse->pktcnt) {
887 x1 = x; 852 case 3:
888 y1 = y; 853 return (psmouse->packet[2] & 0x40) == 0x40;
889 fingers = z > 0 ? 1 : 0; 854 case 4:
890 } else { 855 return (psmouse->packet[3] & 0x48) == 0x48;
891 fingers = priv->fingers; 856 case 6:
892 x1 = priv->x1; 857 return (psmouse->packet[5] & 0x40) == 0x00;
893 x2 = priv->x2;
894 y1 = priv->y1;
895 y2 = priv->y2;
896 } 858 }
859 return true;
860}
897 861
898 if (z >= 64) 862static unsigned char alps_get_packet_id_v7(char *byte)
899 input_report_key(dev, BTN_TOUCH, 1); 863{
864 unsigned char packet_id;
865
866 if (byte[4] & 0x40)
867 packet_id = V7_PACKET_ID_TWO;
868 else if (byte[4] & 0x01)
869 packet_id = V7_PACKET_ID_MULTI;
870 else if ((byte[0] & 0x10) && !(byte[4] & 0x43))
871 packet_id = V7_PACKET_ID_NEW;
872 else if (byte[1] == 0x00 && byte[4] == 0x00)
873 packet_id = V7_PACKET_ID_IDLE;
900 else 874 else
901 input_report_key(dev, BTN_TOUCH, 0); 875 packet_id = V7_PACKET_ID_UNKNOWN;
902 876
903 alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); 877 return packet_id;
878}
904 879
905 input_mt_report_finger_count(dev, fingers); 880static void alps_get_finger_coordinate_v7(struct input_mt_pos *mt,
881 unsigned char *pkt,
882 unsigned char pkt_id)
883{
884 mt[0].x = ((pkt[2] & 0x80) << 4);
885 mt[0].x |= ((pkt[2] & 0x3F) << 5);
886 mt[0].x |= ((pkt[3] & 0x30) >> 1);
887 mt[0].x |= (pkt[3] & 0x07);
888 mt[0].y = (pkt[1] << 3) | (pkt[0] & 0x07);
889
890 mt[1].x = ((pkt[3] & 0x80) << 4);
891 mt[1].x |= ((pkt[4] & 0x80) << 3);
892 mt[1].x |= ((pkt[4] & 0x3F) << 4);
893 mt[1].y = ((pkt[5] & 0x80) << 3);
894 mt[1].y |= ((pkt[5] & 0x3F) << 4);
895
896 switch (pkt_id) {
897 case V7_PACKET_ID_TWO:
898 mt[1].x &= ~0x000F;
899 mt[1].y |= 0x000F;
900 break;
906 901
907 input_report_key(dev, BTN_LEFT, left); 902 case V7_PACKET_ID_MULTI:
908 input_report_key(dev, BTN_RIGHT, right); 903 mt[1].x &= ~0x003F;
904 mt[1].y &= ~0x0020;
905 mt[1].y |= ((pkt[4] & 0x02) << 4);
906 mt[1].y |= 0x001F;
907 break;
909 908
910 if (z > 0) { 909 case V7_PACKET_ID_NEW:
911 input_report_abs(dev, ABS_X, x); 910 mt[1].x &= ~0x003F;
912 input_report_abs(dev, ABS_Y, y); 911 mt[1].x |= (pkt[0] & 0x20);
912 mt[1].y |= 0x000F;
913 break;
913 } 914 }
914 input_report_abs(dev, ABS_PRESSURE, z); 915
916 mt[0].y = 0x7FF - mt[0].y;
917 mt[1].y = 0x7FF - mt[1].y;
918}
919
920static int alps_get_mt_count(struct input_mt_pos *mt)
921{
922 int i;
923
924 for (i = 0; i < MAX_TOUCHES && mt[i].x != 0 && mt[i].y != 0; i++)
925 /* empty */;
926
927 return i;
928}
929
930static int alps_decode_packet_v7(struct alps_fields *f,
931 unsigned char *p,
932 struct psmouse *psmouse)
933{
934 unsigned char pkt_id;
935
936 pkt_id = alps_get_packet_id_v7(p);
937 if (pkt_id == V7_PACKET_ID_IDLE)
938 return 0;
939 if (pkt_id == V7_PACKET_ID_UNKNOWN)
940 return -1;
941
942 alps_get_finger_coordinate_v7(f->mt, p, pkt_id);
943
944 if (pkt_id == V7_PACKET_ID_TWO || pkt_id == V7_PACKET_ID_MULTI) {
945 f->left = (p[0] & 0x80) >> 7;
946 f->right = (p[0] & 0x20) >> 5;
947 f->middle = (p[0] & 0x10) >> 4;
948 }
949
950 if (pkt_id == V7_PACKET_ID_TWO)
951 f->fingers = alps_get_mt_count(f->mt);
952 else if (pkt_id == V7_PACKET_ID_MULTI)
953 f->fingers = 3 + (p[5] & 0x03);
954
955 return 0;
956}
957
958static void alps_process_trackstick_packet_v7(struct psmouse *psmouse)
959{
960 struct alps_data *priv = psmouse->private;
961 unsigned char *packet = psmouse->packet;
962 struct input_dev *dev2 = priv->dev2;
963 int x, y, z, left, right, middle;
964
965 /*
966 * b7 b6 b5 b4 b3 b2 b1 b0
967 * Byte0 0 1 0 0 1 0 0 0
968 * Byte1 1 1 * * 1 M R L
969 * Byte2 X7 1 X5 X4 X3 X2 X1 X0
970 * Byte3 Z6 1 Y6 X6 1 Y2 Y1 Y0
971 * Byte4 Y7 0 Y5 Y4 Y3 1 1 0
972 * Byte5 T&P 0 Z5 Z4 Z3 Z2 Z1 Z0
973 * M / R / L: Middle / Right / Left button
974 */
975
976 x = ((packet[2] & 0xbf)) | ((packet[3] & 0x10) << 2);
977 y = (packet[3] & 0x07) | (packet[4] & 0xb8) |
978 ((packet[3] & 0x20) << 1);
979 z = (packet[5] & 0x3f) | ((packet[3] & 0x80) >> 1);
980
981 left = (packet[1] & 0x01);
982 right = (packet[1] & 0x02) >> 1;
983 middle = (packet[1] & 0x04) >> 2;
984
985 /* Divide 2 since trackpoint's speed is too fast */
986 input_report_rel(dev2, REL_X, (char)x / 2);
987 input_report_rel(dev2, REL_Y, -((char)y / 2));
988
989 input_report_key(dev2, BTN_LEFT, left);
990 input_report_key(dev2, BTN_RIGHT, right);
991 input_report_key(dev2, BTN_MIDDLE, middle);
992
993 input_sync(dev2);
994}
995
996static void alps_process_touchpad_packet_v7(struct psmouse *psmouse)
997{
998 struct alps_data *priv = psmouse->private;
999 struct input_dev *dev = psmouse->dev;
1000 struct alps_fields *f = &priv->f;
1001
1002 memset(f, 0, sizeof(*f));
1003
1004 if (priv->decode_fields(f, psmouse->packet, psmouse))
1005 return;
1006
1007 alps_report_mt_data(psmouse, alps_get_mt_count(f->mt));
1008
1009 input_mt_report_finger_count(dev, f->fingers);
1010
1011 input_report_key(dev, BTN_LEFT, f->left);
1012 input_report_key(dev, BTN_RIGHT, f->right);
1013 input_report_key(dev, BTN_MIDDLE, f->middle);
915 1014
916 input_sync(dev); 1015 input_sync(dev);
917} 1016}
918 1017
1018static void alps_process_packet_v7(struct psmouse *psmouse)
1019{
1020 unsigned char *packet = psmouse->packet;
1021
1022 if (packet[0] == 0x48 && (packet[4] & 0x47) == 0x06)
1023 alps_process_trackstick_packet_v7(psmouse);
1024 else
1025 alps_process_touchpad_packet_v7(psmouse);
1026}
1027
919static void alps_report_bare_ps2_packet(struct psmouse *psmouse, 1028static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
920 unsigned char packet[], 1029 unsigned char packet[],
921 bool report_buttons) 1030 bool report_buttons)
@@ -1080,6 +1189,14 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
1080 return PSMOUSE_BAD_DATA; 1189 return PSMOUSE_BAD_DATA;
1081 } 1190 }
1082 1191
1192 if (priv->proto_version == ALPS_PROTO_V7 &&
1193 !alps_is_valid_package_v7(psmouse)) {
1194 psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
1195 psmouse->pktcnt - 1,
1196 psmouse->packet[psmouse->pktcnt - 1]);
1197 return PSMOUSE_BAD_DATA;
1198 }
1199
1083 if (psmouse->pktcnt == psmouse->pktsize) { 1200 if (psmouse->pktcnt == psmouse->pktsize) {
1084 priv->process_packet(psmouse); 1201 priv->process_packet(psmouse);
1085 return PSMOUSE_FULL_PACKET; 1202 return PSMOUSE_FULL_PACKET;
@@ -1192,6 +1309,22 @@ static int alps_rpt_cmd(struct psmouse *psmouse, int init_command,
1192 return 0; 1309 return 0;
1193} 1310}
1194 1311
1312static bool alps_check_valid_firmware_id(unsigned char id[])
1313{
1314 if (id[0] == 0x73)
1315 return true;
1316
1317 if (id[0] == 0x88 &&
1318 (id[1] == 0x07 ||
1319 id[1] == 0x08 ||
1320 (id[1] & 0xf0) == 0xb0 ||
1321 (id[1] & 0xf0) == 0xc0)) {
1322 return true;
1323 }
1324
1325 return false;
1326}
1327
1195static int alps_enter_command_mode(struct psmouse *psmouse) 1328static int alps_enter_command_mode(struct psmouse *psmouse)
1196{ 1329{
1197 unsigned char param[4]; 1330 unsigned char param[4];
@@ -1201,8 +1334,7 @@ static int alps_enter_command_mode(struct psmouse *psmouse)
1201 return -1; 1334 return -1;
1202 } 1335 }
1203 1336
1204 if ((param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) && 1337 if (!alps_check_valid_firmware_id(param)) {
1205 param[0] != 0x73) {
1206 psmouse_dbg(psmouse, 1338 psmouse_dbg(psmouse,
1207 "unknown response while entering command mode\n"); 1339 "unknown response while entering command mode\n");
1208 return -1; 1340 return -1;
@@ -1660,6 +1792,45 @@ error:
1660 return -1; 1792 return -1;
1661} 1793}
1662 1794
1795static int alps_get_v3_v7_resolution(struct psmouse *psmouse, int reg_pitch)
1796{
1797 int reg, x_pitch, y_pitch, x_electrode, y_electrode, x_phys, y_phys;
1798 struct alps_data *priv = psmouse->private;
1799
1800 reg = alps_command_mode_read_reg(psmouse, reg_pitch);
1801 if (reg < 0)
1802 return reg;
1803
1804 x_pitch = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */
1805 x_pitch = 50 + 2 * x_pitch; /* In 0.1 mm units */
1806
1807 y_pitch = (char)reg >> 4; /* sign extend upper 4 bits */
1808 y_pitch = 36 + 2 * y_pitch; /* In 0.1 mm units */
1809
1810 reg = alps_command_mode_read_reg(psmouse, reg_pitch + 1);
1811 if (reg < 0)
1812 return reg;
1813
1814 x_electrode = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */
1815 x_electrode = 17 + x_electrode;
1816
1817 y_electrode = (char)reg >> 4; /* sign extend upper 4 bits */
1818 y_electrode = 13 + y_electrode;
1819
1820 x_phys = x_pitch * (x_electrode - 1); /* In 0.1 mm units */
1821 y_phys = y_pitch * (y_electrode - 1); /* In 0.1 mm units */
1822
1823 priv->x_res = priv->x_max * 10 / x_phys; /* units / mm */
1824 priv->y_res = priv->y_max * 10 / y_phys; /* units / mm */
1825
1826 psmouse_dbg(psmouse,
1827 "pitch %dx%d num-electrodes %dx%d physical size %dx%d mm res %dx%d\n",
1828 x_pitch, y_pitch, x_electrode, y_electrode,
1829 x_phys / 10, y_phys / 10, priv->x_res, priv->y_res);
1830
1831 return 0;
1832}
1833
1663static int alps_hw_init_rushmore_v3(struct psmouse *psmouse) 1834static int alps_hw_init_rushmore_v3(struct psmouse *psmouse)
1664{ 1835{
1665 struct alps_data *priv = psmouse->private; 1836 struct alps_data *priv = psmouse->private;
@@ -1680,6 +1851,9 @@ static int alps_hw_init_rushmore_v3(struct psmouse *psmouse)
1680 alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00)) 1851 alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00))
1681 goto error; 1852 goto error;
1682 1853
1854 if (alps_get_v3_v7_resolution(psmouse, 0xc2da))
1855 goto error;
1856
1683 reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6); 1857 reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6);
1684 if (reg_val == -1) 1858 if (reg_val == -1)
1685 goto error; 1859 goto error;
@@ -1856,6 +2030,35 @@ static int alps_hw_init_dolphin_v1(struct psmouse *psmouse)
1856 return 0; 2030 return 0;
1857} 2031}
1858 2032
2033static int alps_hw_init_v7(struct psmouse *psmouse)
2034{
2035 struct ps2dev *ps2dev = &psmouse->ps2dev;
2036 int reg_val, ret = -1;
2037
2038 if (alps_enter_command_mode(psmouse) ||
2039 alps_command_mode_read_reg(psmouse, 0xc2d9) == -1)
2040 goto error;
2041
2042 if (alps_get_v3_v7_resolution(psmouse, 0xc397))
2043 goto error;
2044
2045 if (alps_command_mode_write_reg(psmouse, 0xc2c9, 0x64))
2046 goto error;
2047
2048 reg_val = alps_command_mode_read_reg(psmouse, 0xc2c4);
2049 if (reg_val == -1)
2050 goto error;
2051 if (__alps_command_mode_write_reg(psmouse, reg_val | 0x02))
2052 goto error;
2053
2054 alps_exit_command_mode(psmouse);
2055 return ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
2056
2057error:
2058 alps_exit_command_mode(psmouse);
2059 return ret;
2060}
2061
1859static void alps_set_defaults(struct alps_data *priv) 2062static void alps_set_defaults(struct alps_data *priv)
1860{ 2063{
1861 priv->byte0 = 0x8f; 2064 priv->byte0 = 0x8f;
@@ -1914,6 +2117,21 @@ static void alps_set_defaults(struct alps_data *priv)
1914 priv->x_max = 2047; 2117 priv->x_max = 2047;
1915 priv->y_max = 1535; 2118 priv->y_max = 1535;
1916 break; 2119 break;
2120 case ALPS_PROTO_V7:
2121 priv->hw_init = alps_hw_init_v7;
2122 priv->process_packet = alps_process_packet_v7;
2123 priv->decode_fields = alps_decode_packet_v7;
2124 priv->set_abs_params = alps_set_abs_params_mt;
2125 priv->nibble_commands = alps_v3_nibble_commands;
2126 priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
2127 priv->x_max = 0xfff;
2128 priv->y_max = 0x7ff;
2129 priv->byte0 = 0x48;
2130 priv->mask0 = 0x48;
2131
2132 if (priv->fw_ver[1] != 0xba)
2133 priv->flags |= ALPS_BUTTONPAD;
2134 break;
1917 } 2135 }
1918} 2136}
1919 2137
@@ -1972,6 +2190,9 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
1972 alps_exit_command_mode(psmouse)) 2190 alps_exit_command_mode(psmouse))
1973 return -EIO; 2191 return -EIO;
1974 2192
2193 /* Save the Firmware version */
2194 memcpy(priv->fw_ver, ec, 3);
2195
1975 if (alps_match_table(psmouse, priv, e7, ec) == 0) { 2196 if (alps_match_table(psmouse, priv, e7, ec) == 0) {
1976 return 0; 2197 return 0;
1977 } else if (e7[0] == 0x73 && e7[1] == 0x03 && e7[2] == 0x50 && 2198 } else if (e7[0] == 0x73 && e7[1] == 0x03 && e7[2] == 0x50 &&
@@ -1982,6 +2203,12 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
1982 return -EIO; 2203 return -EIO;
1983 else 2204 else
1984 return 0; 2205 return 0;
2206 } else if (ec[0] == 0x88 &&
2207 ((ec[1] & 0xf0) == 0xb0 || (ec[1] & 0xf0) == 0xc0)) {
2208 priv->proto_version = ALPS_PROTO_V7;
2209 alps_set_defaults(priv);
2210
2211 return 0;
1985 } else if (ec[0] == 0x88 && ec[1] == 0x08) { 2212 } else if (ec[0] == 0x88 && ec[1] == 0x08) {
1986 priv->proto_version = ALPS_PROTO_V3; 2213 priv->proto_version = ALPS_PROTO_V3;
1987 alps_set_defaults(priv); 2214 alps_set_defaults(priv);
@@ -1990,6 +2217,7 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
1990 priv->decode_fields = alps_decode_rushmore; 2217 priv->decode_fields = alps_decode_rushmore;
1991 priv->x_bits = 16; 2218 priv->x_bits = 16;
1992 priv->y_bits = 12; 2219 priv->y_bits = 12;
2220 priv->flags |= ALPS_IS_RUSHMORE;
1993 2221
1994 /* hack to make addr_command, nibble_command available */ 2222 /* hack to make addr_command, nibble_command available */
1995 psmouse->private = priv; 2223 psmouse->private = priv;
@@ -2044,17 +2272,21 @@ static void alps_set_abs_params_st(struct alps_data *priv,
2044static void alps_set_abs_params_mt(struct alps_data *priv, 2272static void alps_set_abs_params_mt(struct alps_data *priv,
2045 struct input_dev *dev1) 2273 struct input_dev *dev1)
2046{ 2274{
2047 set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
2048 input_mt_init_slots(dev1, 2, 0);
2049 input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); 2275 input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0);
2050 input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); 2276 input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0);
2051 2277
2052 set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); 2278 input_abs_set_res(dev1, ABS_MT_POSITION_X, priv->x_res);
2279 input_abs_set_res(dev1, ABS_MT_POSITION_Y, priv->y_res);
2280
2281 input_mt_init_slots(dev1, MAX_TOUCHES, INPUT_MT_POINTER |
2282 INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK | INPUT_MT_SEMI_MT);
2283
2053 set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); 2284 set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
2054 set_bit(BTN_TOOL_QUADTAP, dev1->keybit); 2285 set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
2055 2286
2056 input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0); 2287 /* V7 is real multi-touch */
2057 input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0); 2288 if (priv->proto_version == ALPS_PROTO_V7)
2289 clear_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
2058} 2290}
2059 2291
2060int alps_init(struct psmouse *psmouse) 2292int alps_init(struct psmouse *psmouse)
@@ -2100,7 +2332,9 @@ int alps_init(struct psmouse *psmouse)
2100 dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS); 2332 dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);
2101 2333
2102 priv->set_abs_params(priv, dev1); 2334 priv->set_abs_params(priv, dev1);
2103 input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); 2335 /* No pressure on V7 */
2336 if (priv->proto_version != ALPS_PROTO_V7)
2337 input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);
2104 2338
2105 if (priv->flags & ALPS_WHEEL) { 2339 if (priv->flags & ALPS_WHEEL) {
2106 dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL); 2340 dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL);
@@ -2117,6 +2351,9 @@ int alps_init(struct psmouse *psmouse)
2117 dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1); 2351 dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1);
2118 dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2); 2352 dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2);
2119 dev1->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3); 2353 dev1->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3);
2354 } else if (priv->flags & ALPS_BUTTONPAD) {
2355 set_bit(INPUT_PROP_BUTTONPAD, dev1->propbit);
2356 clear_bit(BTN_RIGHT, dev1->keybit);
2120 } else { 2357 } else {
2121 dev1->keybit[BIT_WORD(BTN_MIDDLE)] |= BIT_MASK(BTN_MIDDLE); 2358 dev1->keybit[BIT_WORD(BTN_MIDDLE)] |= BIT_MASK(BTN_MIDDLE);
2122 } 2359 }
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
index 03f88b6940c7..66240b47819a 100644
--- a/drivers/input/mouse/alps.h
+++ b/drivers/input/mouse/alps.h
@@ -12,17 +12,39 @@
12#ifndef _ALPS_H 12#ifndef _ALPS_H
13#define _ALPS_H 13#define _ALPS_H
14 14
15#include <linux/input/mt.h>
16
15#define ALPS_PROTO_V1 1 17#define ALPS_PROTO_V1 1
16#define ALPS_PROTO_V2 2 18#define ALPS_PROTO_V2 2
17#define ALPS_PROTO_V3 3 19#define ALPS_PROTO_V3 3
18#define ALPS_PROTO_V4 4 20#define ALPS_PROTO_V4 4
19#define ALPS_PROTO_V5 5 21#define ALPS_PROTO_V5 5
20#define ALPS_PROTO_V6 6 22#define ALPS_PROTO_V6 6
23#define ALPS_PROTO_V7 7 /* t3btl t4s */
24
25#define MAX_TOUCHES 2
21 26
22#define DOLPHIN_COUNT_PER_ELECTRODE 64 27#define DOLPHIN_COUNT_PER_ELECTRODE 64
23#define DOLPHIN_PROFILE_XOFFSET 8 /* x-electrode offset */ 28#define DOLPHIN_PROFILE_XOFFSET 8 /* x-electrode offset */
24#define DOLPHIN_PROFILE_YOFFSET 1 /* y-electrode offset */ 29#define DOLPHIN_PROFILE_YOFFSET 1 /* y-electrode offset */
25 30
31/*
32 * enum V7_PACKET_ID - defines the packet type for V7
33 * V7_PACKET_ID_IDLE: There's no finger and no button activity.
34 * V7_PACKET_ID_TWO: There's one or two non-resting fingers on touchpad
35 * or there's button activities.
36 * V7_PACKET_ID_MULTI: There are at least three non-resting fingers.
37 * V7_PACKET_ID_NEW: The finger position in slot is not continues from
38 * previous packet.
39*/
40enum V7_PACKET_ID {
41 V7_PACKET_ID_IDLE,
42 V7_PACKET_ID_TWO,
43 V7_PACKET_ID_MULTI,
44 V7_PACKET_ID_NEW,
45 V7_PACKET_ID_UNKNOWN,
46};
47
26/** 48/**
27 * struct alps_model_info - touchpad ID table 49 * struct alps_model_info - touchpad ID table
28 * @signature: E7 response string to match. 50 * @signature: E7 response string to match.
@@ -46,7 +68,7 @@ struct alps_model_info {
46 unsigned char command_mode_resp; 68 unsigned char command_mode_resp;
47 unsigned char proto_version; 69 unsigned char proto_version;
48 unsigned char byte0, mask0; 70 unsigned char byte0, mask0;
49 unsigned char flags; 71 int flags;
50}; 72};
51 73
52/** 74/**
@@ -65,14 +87,19 @@ struct alps_nibble_commands {
65 unsigned char data; 87 unsigned char data;
66}; 88};
67 89
90struct alps_bitmap_point {
91 int start_bit;
92 int num_bits;
93};
94
68/** 95/**
69 * struct alps_fields - decoded version of the report packet 96 * struct alps_fields - decoded version of the report packet
70 * @x_map: Bitmap of active X positions for MT. 97 * @x_map: Bitmap of active X positions for MT.
71 * @y_map: Bitmap of active Y positions for MT. 98 * @y_map: Bitmap of active Y positions for MT.
72 * @fingers: Number of fingers for MT. 99 * @fingers: Number of fingers for MT.
73 * @x: X position for ST. 100 * @pressure: Pressure.
74 * @y: Y position for ST. 101 * @st: position for ST.
75 * @z: Z position for ST. 102 * @mt: position for MT.
76 * @first_mp: Packet is the first of a multi-packet report. 103 * @first_mp: Packet is the first of a multi-packet report.
77 * @is_mp: Packet is part of a multi-packet report. 104 * @is_mp: Packet is part of a multi-packet report.
78 * @left: Left touchpad button is active. 105 * @left: Left touchpad button is active.
@@ -86,9 +113,11 @@ struct alps_fields {
86 unsigned int x_map; 113 unsigned int x_map;
87 unsigned int y_map; 114 unsigned int y_map;
88 unsigned int fingers; 115 unsigned int fingers;
89 unsigned int x; 116
90 unsigned int y; 117 int pressure;
91 unsigned int z; 118 struct input_mt_pos st;
119 struct input_mt_pos mt[MAX_TOUCHES];
120
92 unsigned int first_mp:1; 121 unsigned int first_mp:1;
93 unsigned int is_mp:1; 122 unsigned int is_mp:1;
94 123
@@ -113,6 +142,7 @@ struct alps_fields {
113 * known format for this model. The first byte of the report, ANDed with 142 * known format for this model. The first byte of the report, ANDed with
114 * mask0, should match byte0. 143 * mask0, should match byte0.
115 * @mask0: The mask used to check the first byte of the report. 144 * @mask0: The mask used to check the first byte of the report.
145 * @fw_ver: cached copy of firmware version (EC report)
116 * @flags: Additional device capabilities (passthrough port, trackstick, etc.). 146 * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
117 * @x_max: Largest possible X position value. 147 * @x_max: Largest possible X position value.
118 * @y_max: Largest possible Y position value. 148 * @y_max: Largest possible Y position value.
@@ -125,11 +155,7 @@ struct alps_fields {
125 * @prev_fin: Finger bit from previous packet. 155 * @prev_fin: Finger bit from previous packet.
126 * @multi_packet: Multi-packet data in progress. 156 * @multi_packet: Multi-packet data in progress.
127 * @multi_data: Saved multi-packet data. 157 * @multi_data: Saved multi-packet data.
128 * @x1: First X coordinate from last MT report. 158 * @f: Decoded packet data fields.
129 * @x2: Second X coordinate from last MT report.
130 * @y1: First Y coordinate from last MT report.
131 * @y2: Second Y coordinate from last MT report.
132 * @fingers: Number of fingers from last MT report.
133 * @quirks: Bitmap of ALPS_QUIRK_*. 159 * @quirks: Bitmap of ALPS_QUIRK_*.
134 * @timer: Timer for flushing out the final report packet in the stream. 160 * @timer: Timer for flushing out the final report packet in the stream.
135 */ 161 */
@@ -142,23 +168,25 @@ struct alps_data {
142 int addr_command; 168 int addr_command;
143 unsigned char proto_version; 169 unsigned char proto_version;
144 unsigned char byte0, mask0; 170 unsigned char byte0, mask0;
145 unsigned char flags; 171 unsigned char fw_ver[3];
172 int flags;
146 int x_max; 173 int x_max;
147 int y_max; 174 int y_max;
148 int x_bits; 175 int x_bits;
149 int y_bits; 176 int y_bits;
177 unsigned int x_res;
178 unsigned int y_res;
150 179
151 int (*hw_init)(struct psmouse *psmouse); 180 int (*hw_init)(struct psmouse *psmouse);
152 void (*process_packet)(struct psmouse *psmouse); 181 void (*process_packet)(struct psmouse *psmouse);
153 void (*decode_fields)(struct alps_fields *f, unsigned char *p, 182 int (*decode_fields)(struct alps_fields *f, unsigned char *p,
154 struct psmouse *psmouse); 183 struct psmouse *psmouse);
155 void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1); 184 void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1);
156 185
157 int prev_fin; 186 int prev_fin;
158 int multi_packet; 187 int multi_packet;
159 unsigned char multi_data[6]; 188 unsigned char multi_data[6];
160 int x1, x2, y1, y2; 189 struct alps_fields f;
161 int fingers;
162 u8 quirks; 190 u8 quirks;
163 struct timer_list timer; 191 struct timer_list timer;
164}; 192};
diff --git a/drivers/input/serio/hyperv-keyboard.c b/drivers/input/serio/hyperv-keyboard.c
index 613261994621..e74e5d6e5f9f 100644
--- a/drivers/input/serio/hyperv-keyboard.c
+++ b/drivers/input/serio/hyperv-keyboard.c
@@ -170,6 +170,15 @@ static void hv_kbd_on_receive(struct hv_device *hv_dev,
170 serio_interrupt(kbd_dev->hv_serio, scan_code, 0); 170 serio_interrupt(kbd_dev->hv_serio, scan_code, 0);
171 } 171 }
172 spin_unlock_irqrestore(&kbd_dev->lock, flags); 172 spin_unlock_irqrestore(&kbd_dev->lock, flags);
173
174 /*
175 * Only trigger a wakeup on key down, otherwise
176 * "echo freeze > /sys/power/state" can't really enter the
177 * state because the Enter-UP can trigger a wakeup at once.
178 */
179 if (!(info & IS_BREAK))
180 pm_wakeup_event(&hv_dev->device, 0);
181
173 break; 182 break;
174 183
175 default: 184 default:
@@ -376,6 +385,9 @@ static int hv_kbd_probe(struct hv_device *hv_dev,
376 goto err_close_vmbus; 385 goto err_close_vmbus;
377 386
378 serio_register_port(kbd_dev->hv_serio); 387 serio_register_port(kbd_dev->hv_serio);
388
389 device_init_wakeup(&hv_dev->device, true);
390
379 return 0; 391 return 0;
380 392
381err_close_vmbus: 393err_close_vmbus:
@@ -390,6 +402,7 @@ static int hv_kbd_remove(struct hv_device *hv_dev)
390{ 402{
391 struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); 403 struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev);
392 404
405 device_init_wakeup(&hv_dev->device, false);
393 serio_unregister_port(kbd_dev->hv_serio); 406 serio_unregister_port(kbd_dev->hv_serio);
394 vmbus_close(hv_dev->channel); 407 vmbus_close(hv_dev->channel);
395 kfree(kbd_dev); 408 kfree(kbd_dev);
diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig
index bed7cbf84cfd..623bb9e0d5a4 100644
--- a/drivers/input/tablet/Kconfig
+++ b/drivers/input/tablet/Kconfig
@@ -73,20 +73,14 @@ config TABLET_USB_KBTAB
73 To compile this driver as a module, choose M here: the 73 To compile this driver as a module, choose M here: the
74 module will be called kbtab. 74 module will be called kbtab.
75 75
76config TABLET_USB_WACOM 76config TABLET_SERIAL_WACOM4
77 tristate "Wacom Intuos/Graphire tablet support (USB)" 77 tristate "Wacom protocol 4 serial tablet support"
78 depends on USB_ARCH_HAS_HCD 78 select SERIO
79 select POWER_SUPPLY
80 select USB
81 select NEW_LEDS
82 select LEDS_CLASS
83 help 79 help
84 Say Y here if you want to use the USB version of the Wacom Intuos 80 Say Y here if you want to use Wacom protocol 4 serial tablets.
85 or Graphire tablet. Make sure to say Y to "Mouse support" 81 E.g. serial versions of the Cintiq, Graphire or Penpartner.
86 (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support"
87 (CONFIG_INPUT_EVDEV) as well.
88 82
89 To compile this driver as a module, choose M here: the 83 To compile this driver as a module, choose M here: the
90 module will be called wacom. 84 module will be called wacom_serial4.
91 85
92endif 86endif
diff --git a/drivers/input/tablet/Makefile b/drivers/input/tablet/Makefile
index 3f6c25220638..2e130101cf3c 100644
--- a/drivers/input/tablet/Makefile
+++ b/drivers/input/tablet/Makefile
@@ -2,12 +2,10 @@
2# Makefile for the tablet drivers 2# Makefile for the tablet drivers
3# 3#
4 4
5# Multipart objects.
6wacom-objs := wacom_wac.o wacom_sys.o
7 5
8obj-$(CONFIG_TABLET_USB_ACECAD) += acecad.o 6obj-$(CONFIG_TABLET_USB_ACECAD) += acecad.o
9obj-$(CONFIG_TABLET_USB_AIPTEK) += aiptek.o 7obj-$(CONFIG_TABLET_USB_AIPTEK) += aiptek.o
10obj-$(CONFIG_TABLET_USB_GTCO) += gtco.o 8obj-$(CONFIG_TABLET_USB_GTCO) += gtco.o
11obj-$(CONFIG_TABLET_USB_HANWANG) += hanwang.o 9obj-$(CONFIG_TABLET_USB_HANWANG) += hanwang.o
12obj-$(CONFIG_TABLET_USB_KBTAB) += kbtab.o 10obj-$(CONFIG_TABLET_USB_KBTAB) += kbtab.o
13obj-$(CONFIG_TABLET_USB_WACOM) += wacom.o 11obj-$(CONFIG_TABLET_SERIAL_WACOM4) += wacom_serial4.o
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
deleted file mode 100644
index 9ebf0ed3b3b3..000000000000
--- a/drivers/input/tablet/wacom.h
+++ /dev/null
@@ -1,139 +0,0 @@
1/*
2 * drivers/input/tablet/wacom.h
3 *
4 * USB Wacom tablet support
5 *
6 * Copyright (c) 2000-2004 Vojtech Pavlik <vojtech@ucw.cz>
7 * Copyright (c) 2000 Andreas Bach Aaen <abach@stofanet.dk>
8 * Copyright (c) 2000 Clifford Wolf <clifford@clifford.at>
9 * Copyright (c) 2000 Sam Mosel <sam.mosel@computer.org>
10 * Copyright (c) 2000 James E. Blair <corvus@gnu.org>
11 * Copyright (c) 2000 Daniel Egger <egger@suse.de>
12 * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com>
13 * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be>
14 * Copyright (c) 2002-2011 Ping Cheng <pingc@wacom.com>
15 *
16 * ChangeLog:
17 * v0.1 (vp) - Initial release
18 * v0.2 (aba) - Support for all buttons / combinations
19 * v0.3 (vp) - Support for Intuos added
20 * v0.4 (sm) - Support for more Intuos models, menustrip
21 * relative mode, proximity.
22 * v0.5 (vp) - Big cleanup, nifty features removed,
23 * they belong in userspace
24 * v1.8 (vp) - Submit URB only when operating, moved to CVS,
25 * use input_report_key instead of report_btn and
26 * other cleanups
27 * v1.11 (vp) - Add URB ->dev setting for new kernels
28 * v1.11 (jb) - Add support for the 4D Mouse & Lens
29 * v1.12 (de) - Add support for two more inking pen IDs
30 * v1.14 (vp) - Use new USB device id probing scheme.
31 * Fix Wacom Graphire mouse wheel
32 * v1.18 (vp) - Fix mouse wheel direction
33 * Make mouse relative
34 * v1.20 (fl) - Report tool id for Intuos devices
35 * - Multi tools support
36 * - Corrected Intuos protocol decoding (airbrush, 4D mouse, lens cursor...)
37 * - Add PL models support
38 * - Fix Wacom Graphire mouse wheel again
39 * v1.21 (vp) - Removed protocol descriptions
40 * - Added MISC_SERIAL for tool serial numbers
41 * (gb) - Identify version on module load.
42 * v1.21.1 (fl) - added Graphire2 support
43 * v1.21.2 (fl) - added Intuos2 support
44 * - added all the PL ids
45 * v1.21.3 (fl) - added another eraser id from Neil Okamoto
46 * - added smooth filter for Graphire from Peri Hankey
47 * - added PenPartner support from Olaf van Es
48 * - new tool ids from Ole Martin Bjoerndalen
49 * v1.29 (pc) - Add support for more tablets
50 * - Fix pressure reporting
51 * v1.30 (vp) - Merge 2.4 and 2.5 drivers
52 * - Since 2.5 now has input_sync(), remove MSC_SERIAL abuse
53 * - Cleanups here and there
54 * v1.30.1 (pi) - Added Graphire3 support
55 * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
56 * v1.43 (pc) - Added support for Cintiq 21UX
57 * - Fixed a Graphire bug
58 * - Merged wacom_intuos3_irq into wacom_intuos_irq
59 * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc.
60 * - Report Device IDs
61 * v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19
62 * - Minor data report fix
63 * v1.46 (pc) - Split wacom.c into wacom_sys.c and wacom_wac.c,
64 * - where wacom_sys.c deals with system specific code,
65 * - and wacom_wac.c deals with Wacom specific code
66 * - Support Intuos3 4x6
67 * v1.47 (pc) - Added support for Bamboo
68 * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
69 * v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A)
70 * v1.50 (pc) - Fixed a TabletPC touch bug in 2.6.28
71 * v1.51 (pc) - Added support for Intuos4
72 * v1.52 (pc) - Query Wacom data upon system resume
73 * - add defines for features->type
74 * - add new devices (0x9F, 0xE2, and 0XE3)
75 */
76
77/*
78 * This program is free software; you can redistribute it and/or modify
79 * it under the terms of the GNU General Public License as published by
80 * the Free Software Foundation; either version 2 of the License, or
81 * (at your option) any later version.
82 */
83#ifndef WACOM_H
84#define WACOM_H
85#include <linux/kernel.h>
86#include <linux/slab.h>
87#include <linux/module.h>
88#include <linux/mod_devicetable.h>
89#include <linux/usb/input.h>
90#include <linux/power_supply.h>
91#include <asm/unaligned.h>
92
93/*
94 * Version Information
95 */
96#define DRIVER_VERSION "v1.53"
97#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
98#define DRIVER_DESC "USB Wacom tablet driver"
99#define DRIVER_LICENSE "GPL"
100
101MODULE_AUTHOR(DRIVER_AUTHOR);
102MODULE_DESCRIPTION(DRIVER_DESC);
103MODULE_LICENSE(DRIVER_LICENSE);
104
105#define USB_VENDOR_ID_WACOM 0x056a
106#define USB_VENDOR_ID_LENOVO 0x17ef
107
108struct wacom {
109 dma_addr_t data_dma;
110 struct usb_device *usbdev;
111 struct usb_interface *intf;
112 struct urb *irq;
113 struct wacom_wac wacom_wac;
114 struct mutex lock;
115 struct work_struct work;
116 bool open;
117 char phys[32];
118 struct wacom_led {
119 u8 select[2]; /* status led selector (0..3) */
120 u8 llv; /* status led brightness no button (1..127) */
121 u8 hlv; /* status led brightness button pressed (1..127) */
122 u8 img_lum; /* OLED matrix display brightness */
123 } led;
124 struct power_supply battery;
125};
126
127static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)
128{
129 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
130 schedule_work(&wacom->work);
131}
132
133extern const struct usb_device_id wacom_ids[];
134
135void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
136void wacom_setup_device_quirks(struct wacom_features *features);
137int wacom_setup_input_capabilities(struct input_dev *input_dev,
138 struct wacom_wac *wacom_wac);
139#endif
diff --git a/drivers/input/tablet/wacom_serial4.c b/drivers/input/tablet/wacom_serial4.c
new file mode 100644
index 000000000000..20ab802461e7
--- /dev/null
+++ b/drivers/input/tablet/wacom_serial4.c
@@ -0,0 +1,620 @@
1/*
2 * Wacom protocol 4 serial tablet driver
3 *
4 * Copyright 2014 Hans de Goede <hdegoede@redhat.com>
5 * Copyright 2011-2012 Julian Squires <julian@cipht.net>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version of 2 of the License, or (at your
10 * option) any later version. See the file COPYING in the main directory of
11 * this archive for more details.
12 *
13 * Many thanks to Bill Seremetis, without whom PenPartner support
14 * would not have been possible. Thanks to Patrick Mahoney.
15 *
16 * This driver was developed with reference to much code written by others,
17 * particularly:
18 * - elo, gunze drivers by Vojtech Pavlik <vojtech@ucw.cz>;
19 * - wacom_w8001 driver by Jaya Kumar <jayakumar.lkml@gmail.com>;
20 * - the USB wacom input driver, credited to many people
21 * (see drivers/input/tablet/wacom.h);
22 * - new and old versions of linuxwacom / xf86-input-wacom credited to
23 * Frederic Lepied, France. <Lepied@XFree86.org> and
24 * Ping Cheng, Wacom. <pingc@wacom.com>;
25 * - and xf86wacom.c (a presumably ancient version of the linuxwacom code),
26 * by Frederic Lepied and Raph Levien <raph@gtk.org>.
27 *
28 * To do:
29 * - support pad buttons; (requires access to a model with pad buttons)
30 * - support (protocol 4-style) tilt (requires access to a > 1.4 rom model)
31 */
32
33/*
34 * Wacom serial protocol 4 documentation taken from linuxwacom-0.9.9 code,
35 * protocol 4 uses 7 or 9 byte of data in the following format:
36 *
37 * Byte 1
38 * bit 7 Sync bit always 1
39 * bit 6 Pointing device detected
40 * bit 5 Cursor = 0 / Stylus = 1
41 * bit 4 Reserved
42 * bit 3 1 if a button on the pointing device has been pressed
43 * bit 2 P0 (optional)
44 * bit 1 X15
45 * bit 0 X14
46 *
47 * Byte 2
48 * bit 7 Always 0
49 * bits 6-0 = X13 - X7
50 *
51 * Byte 3
52 * bit 7 Always 0
53 * bits 6-0 = X6 - X0
54 *
55 * Byte 4
56 * bit 7 Always 0
57 * bit 6 B3
58 * bit 5 B2
59 * bit 4 B1
60 * bit 3 B0
61 * bit 2 P1 (optional)
62 * bit 1 Y15
63 * bit 0 Y14
64 *
65 * Byte 5
66 * bit 7 Always 0
67 * bits 6-0 = Y13 - Y7
68 *
69 * Byte 6
70 * bit 7 Always 0
71 * bits 6-0 = Y6 - Y0
72 *
73 * Byte 7
74 * bit 7 Always 0
75 * bit 6 Sign of pressure data; or wheel-rel for cursor tool
76 * bit 5 P7; or REL1 for cursor tool
77 * bit 4 P6; or REL0 for cursor tool
78 * bit 3 P5
79 * bit 2 P4
80 * bit 1 P3
81 * bit 0 P2
82 *
83 * byte 8 and 9 are optional and present only
84 * in tilt mode.
85 *
86 * Byte 8
87 * bit 7 Always 0
88 * bit 6 Sign of tilt X
89 * bit 5 Xt6
90 * bit 4 Xt5
91 * bit 3 Xt4
92 * bit 2 Xt3
93 * bit 1 Xt2
94 * bit 0 Xt1
95 *
96 * Byte 9
97 * bit 7 Always 0
98 * bit 6 Sign of tilt Y
99 * bit 5 Yt6
100 * bit 4 Yt5
101 * bit 3 Yt4
102 * bit 2 Yt3
103 * bit 1 Yt2
104 * bit 0 Yt1
105 */
106
107#include <linux/completion.h>
108#include <linux/init.h>
109#include <linux/input.h>
110#include <linux/interrupt.h>
111#include <linux/kernel.h>
112#include <linux/module.h>
113#include <linux/serio.h>
114#include <linux/slab.h>
115#include <linux/string.h>
116
117MODULE_AUTHOR("Julian Squires <julian@cipht.net>, Hans de Goede <hdegoede@redhat.com>");
118MODULE_DESCRIPTION("Wacom protocol 4 serial tablet driver");
119MODULE_LICENSE("GPL");
120
121#define REQUEST_MODEL_AND_ROM_VERSION "~#"
122#define REQUEST_MAX_COORDINATES "~C\r"
123#define REQUEST_CONFIGURATION_STRING "~R\r"
124#define REQUEST_RESET_TO_PROTOCOL_IV "\r#"
125/*
126 * Note: sending "\r$\r" causes at least the Digitizer II to send
127 * packets in ASCII instead of binary. "\r#" seems to undo that.
128 */
129
130#define COMMAND_START_SENDING_PACKETS "ST\r"
131#define COMMAND_STOP_SENDING_PACKETS "SP\r"
132#define COMMAND_MULTI_MODE_INPUT "MU1\r"
133#define COMMAND_ORIGIN_IN_UPPER_LEFT "OC1\r"
134#define COMMAND_ENABLE_ALL_MACRO_BUTTONS "~M0\r"
135#define COMMAND_DISABLE_GROUP_1_MACRO_BUTTONS "~M1\r"
136#define COMMAND_TRANSMIT_AT_MAX_RATE "IT0\r"
137#define COMMAND_DISABLE_INCREMENTAL_MODE "IN0\r"
138#define COMMAND_ENABLE_CONTINUOUS_MODE "SR\r"
139#define COMMAND_ENABLE_PRESSURE_MODE "PH1\r"
140#define COMMAND_Z_FILTER "ZF1\r"
141
142/* Note that this is a protocol 4 packet without tilt information. */
143#define PACKET_LENGTH 7
144#define DATA_SIZE 32
145
146/* flags */
147#define F_COVERS_SCREEN 0x01
148#define F_HAS_STYLUS2 0x02
149#define F_HAS_SCROLLWHEEL 0x04
150
151/* device IDs */
152#define STYLUS_DEVICE_ID 0x02
153#define CURSOR_DEVICE_ID 0x06
154#define ERASER_DEVICE_ID 0x0A
155
156enum { STYLUS = 1, ERASER, CURSOR };
157
158static const struct {
159 int device_id;
160 int input_id;
161} tools[] = {
162 { 0, 0 },
163 { STYLUS_DEVICE_ID, BTN_TOOL_PEN },
164 { ERASER_DEVICE_ID, BTN_TOOL_RUBBER },
165 { CURSOR_DEVICE_ID, BTN_TOOL_MOUSE },
166};
167
168struct wacom {
169 struct input_dev *dev;
170 struct completion cmd_done;
171 int result;
172 u8 expect;
173 u8 eraser_mask;
174 unsigned int extra_z_bits;
175 unsigned int flags;
176 unsigned int res_x, res_y;
177 unsigned int max_x, max_y;
178 unsigned int tool;
179 unsigned int idx;
180 u8 data[DATA_SIZE];
181 char phys[32];
182};
183
184enum {
185 MODEL_CINTIQ = 0x504C, /* PL */
186 MODEL_CINTIQ2 = 0x4454, /* DT */
187 MODEL_DIGITIZER_II = 0x5544, /* UD */
188 MODEL_GRAPHIRE = 0x4554, /* ET */
189 MODEL_PENPARTNER = 0x4354, /* CT */
190};
191
192static void wacom_handle_model_response(struct wacom *wacom)
193{
194 int major_v, minor_v, r = 0;
195 char *p;
196
197 p = strrchr(wacom->data, 'V');
198 if (p)
199 r = sscanf(p + 1, "%u.%u", &major_v, &minor_v);
200 if (r != 2)
201 major_v = minor_v = 0;
202
203 switch (wacom->data[2] << 8 | wacom->data[3]) {
204 case MODEL_CINTIQ: /* UNTESTED */
205 case MODEL_CINTIQ2:
206 if ((wacom->data[2] << 8 | wacom->data[3]) == MODEL_CINTIQ) {
207 wacom->dev->name = "Wacom Cintiq";
208 wacom->dev->id.version = MODEL_CINTIQ;
209 } else {
210 wacom->dev->name = "Wacom Cintiq II";
211 wacom->dev->id.version = MODEL_CINTIQ2;
212 }
213 wacom->res_x = 508;
214 wacom->res_y = 508;
215
216 switch (wacom->data[5] << 8 | wacom->data[6]) {
217 case 0x3731: /* PL-710 */
218 wacom->res_x = 2540;
219 wacom->res_y = 2540;
220 /* fall through */
221 case 0x3535: /* PL-550 */
222 case 0x3830: /* PL-800 */
223 wacom->extra_z_bits = 2;
224 }
225
226 wacom->flags = F_COVERS_SCREEN;
227 break;
228
229 case MODEL_PENPARTNER:
230 wacom->dev->name = "Wacom Penpartner";
231 wacom->dev->id.version = MODEL_PENPARTNER;
232 wacom->res_x = 1000;
233 wacom->res_y = 1000;
234 break;
235
236 case MODEL_GRAPHIRE:
237 wacom->dev->name = "Wacom Graphire";
238 wacom->dev->id.version = MODEL_GRAPHIRE;
239 wacom->res_x = 1016;
240 wacom->res_y = 1016;
241 wacom->max_x = 5103;
242 wacom->max_y = 3711;
243 wacom->extra_z_bits = 2;
244 wacom->eraser_mask = 0x08;
245 wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL;
246 break;
247
248 case MODEL_DIGITIZER_II:
249 wacom->dev->name = "Wacom Digitizer II";
250 wacom->dev->id.version = MODEL_DIGITIZER_II;
251 if (major_v == 1 && minor_v <= 2)
252 wacom->extra_z_bits = 0; /* UNTESTED */
253 break;
254
255 default:
256 dev_err(&wacom->dev->dev, "Unsupported Wacom model %s\n",
257 wacom->data);
258 wacom->result = -ENODEV;
259 return;
260 }
261
262 dev_info(&wacom->dev->dev, "%s tablet, version %u.%u\n",
263 wacom->dev->name, major_v, minor_v);
264}
265
266static void wacom_handle_configuration_response(struct wacom *wacom)
267{
268 int r, skip;
269
270 dev_dbg(&wacom->dev->dev, "Configuration string: %s\n", wacom->data);
271 r = sscanf(wacom->data, "~R%x,%u,%u,%u,%u", &skip, &skip, &skip,
272 &wacom->res_x, &wacom->res_y);
273 if (r != 5)
274 dev_warn(&wacom->dev->dev, "could not get resolution\n");
275}
276
277static void wacom_handle_coordinates_response(struct wacom *wacom)
278{
279 int r;
280
281 dev_dbg(&wacom->dev->dev, "Coordinates string: %s\n", wacom->data);
282 r = sscanf(wacom->data, "~C%u,%u", &wacom->max_x, &wacom->max_y);
283 if (r != 2)
284 dev_warn(&wacom->dev->dev, "could not get max coordinates\n");
285}
286
287static void wacom_handle_response(struct wacom *wacom)
288{
289 if (wacom->data[0] != '~' || wacom->data[1] != wacom->expect) {
290 dev_err(&wacom->dev->dev,
291 "Wacom got an unexpected response: %s\n", wacom->data);
292 wacom->result = -EIO;
293 } else {
294 wacom->result = 0;
295
296 switch (wacom->data[1]) {
297 case '#':
298 wacom_handle_model_response(wacom);
299 break;
300 case 'R':
301 wacom_handle_configuration_response(wacom);
302 break;
303 case 'C':
304 wacom_handle_coordinates_response(wacom);
305 break;
306 }
307 }
308
309 complete(&wacom->cmd_done);
310}
311
312static void wacom_handle_packet(struct wacom *wacom)
313{
314 u8 in_proximity_p, stylus_p, button;
315 unsigned int tool;
316 int x, y, z;
317
318 in_proximity_p = wacom->data[0] & 0x40;
319 stylus_p = wacom->data[0] & 0x20;
320 button = (wacom->data[3] & 0x78) >> 3;
321 x = (wacom->data[0] & 3) << 14 | wacom->data[1]<<7 | wacom->data[2];
322 y = (wacom->data[3] & 3) << 14 | wacom->data[4]<<7 | wacom->data[5];
323
324 if (in_proximity_p && stylus_p) {
325 z = wacom->data[6] & 0x7f;
326 if (wacom->extra_z_bits >= 1)
327 z = z << 1 | (wacom->data[3] & 0x4) >> 2;
328 if (wacom->extra_z_bits > 1)
329 z = z << 1 | (wacom->data[0] & 0x4) >> 2;
330 z = z ^ (0x40 << wacom->extra_z_bits);
331 } else {
332 z = -1;
333 }
334
335 if (stylus_p)
336 tool = (button & wacom->eraser_mask) ? ERASER : STYLUS;
337 else
338 tool = CURSOR;
339
340 if (tool != wacom->tool && wacom->tool != 0) {
341 input_report_key(wacom->dev, tools[wacom->tool].input_id, 0);
342 input_sync(wacom->dev);
343 }
344 wacom->tool = tool;
345
346 input_report_key(wacom->dev, tools[tool].input_id, in_proximity_p);
347 input_report_abs(wacom->dev, ABS_MISC,
348 in_proximity_p ? tools[tool].device_id : 0);
349 input_report_abs(wacom->dev, ABS_X, x);
350 input_report_abs(wacom->dev, ABS_Y, y);
351 input_report_abs(wacom->dev, ABS_PRESSURE, z);
352 if (stylus_p) {
353 input_report_key(wacom->dev, BTN_TOUCH, button & 1);
354 input_report_key(wacom->dev, BTN_STYLUS, button & 2);
355 input_report_key(wacom->dev, BTN_STYLUS2, button & 4);
356 } else {
357 input_report_key(wacom->dev, BTN_LEFT, button & 1);
358 input_report_key(wacom->dev, BTN_RIGHT, button & 2);
359 input_report_key(wacom->dev, BTN_MIDDLE, button & 4);
360 /* handle relative wheel for non-stylus device */
361 z = (wacom->data[6] & 0x30) >> 4;
362 if (wacom->data[6] & 0x40)
363 z = -z;
364 input_report_rel(wacom->dev, REL_WHEEL, z);
365 }
366 input_sync(wacom->dev);
367}
368
369static void wacom_clear_data_buf(struct wacom *wacom)
370{
371 memset(wacom->data, 0, DATA_SIZE);
372 wacom->idx = 0;
373}
374
375static irqreturn_t wacom_interrupt(struct serio *serio, unsigned char data,
376 unsigned int flags)
377{
378 struct wacom *wacom = serio_get_drvdata(serio);
379
380 if (data & 0x80)
381 wacom->idx = 0;
382
383 /*
384 * We're either expecting a carriage return-terminated ASCII
385 * response string, or a seven-byte packet with the MSB set on
386 * the first byte.
387 *
388 * Note however that some tablets (the PenPartner, for
389 * example) don't send a carriage return at the end of a
390 * command. We handle these by waiting for timeout.
391 */
392 if (data == '\r' && !(wacom->data[0] & 0x80)) {
393 wacom_handle_response(wacom);
394 wacom_clear_data_buf(wacom);
395 return IRQ_HANDLED;
396 }
397
398 /* Leave place for 0 termination */
399 if (wacom->idx > (DATA_SIZE - 2)) {
400 dev_dbg(&wacom->dev->dev,
401 "throwing away %d bytes of garbage\n", wacom->idx);
402 wacom_clear_data_buf(wacom);
403 }
404 wacom->data[wacom->idx++] = data;
405
406 if (wacom->idx == PACKET_LENGTH && (wacom->data[0] & 0x80)) {
407 wacom_handle_packet(wacom);
408 wacom_clear_data_buf(wacom);
409 }
410
411 return IRQ_HANDLED;
412}
413
414static void wacom_disconnect(struct serio *serio)
415{
416 struct wacom *wacom = serio_get_drvdata(serio);
417
418 serio_close(serio);
419 serio_set_drvdata(serio, NULL);
420 input_unregister_device(wacom->dev);
421 kfree(wacom);
422}
423
424static int wacom_send(struct serio *serio, const u8 *command)
425{
426 int err = 0;
427
428 for (; !err && *command; command++)
429 err = serio_write(serio, *command);
430
431 return err;
432}
433
434static int wacom_send_setup_string(struct wacom *wacom, struct serio *serio)
435{
436 const u8 *cmd;
437
438 switch (wacom->dev->id.version) {
439 case MODEL_CINTIQ: /* UNTESTED */
440 cmd = COMMAND_ORIGIN_IN_UPPER_LEFT
441 COMMAND_TRANSMIT_AT_MAX_RATE
442 COMMAND_ENABLE_CONTINUOUS_MODE
443 COMMAND_START_SENDING_PACKETS;
444 break;
445
446 case MODEL_PENPARTNER:
447 cmd = COMMAND_ENABLE_PRESSURE_MODE
448 COMMAND_START_SENDING_PACKETS;
449 break;
450
451 default:
452 cmd = COMMAND_MULTI_MODE_INPUT
453 COMMAND_ORIGIN_IN_UPPER_LEFT
454 COMMAND_ENABLE_ALL_MACRO_BUTTONS
455 COMMAND_DISABLE_GROUP_1_MACRO_BUTTONS
456 COMMAND_TRANSMIT_AT_MAX_RATE
457 COMMAND_DISABLE_INCREMENTAL_MODE
458 COMMAND_ENABLE_CONTINUOUS_MODE
459 COMMAND_Z_FILTER
460 COMMAND_START_SENDING_PACKETS;
461 break;
462 }
463
464 return wacom_send(serio, cmd);
465}
466
467static int wacom_send_and_wait(struct wacom *wacom, struct serio *serio,
468 const u8 *cmd, const char *desc)
469{
470 int err;
471 unsigned long u;
472
473 wacom->expect = cmd[1];
474 init_completion(&wacom->cmd_done);
475
476 err = wacom_send(serio, cmd);
477 if (err)
478 return err;
479
480 u = wait_for_completion_timeout(&wacom->cmd_done, HZ);
481 if (u == 0) {
482 /* Timeout, process what we've received. */
483 wacom_handle_response(wacom);
484 }
485
486 wacom->expect = 0;
487 return wacom->result;
488}
489
490static int wacom_setup(struct wacom *wacom, struct serio *serio)
491{
492 int err;
493
494 /* Note that setting the link speed is the job of inputattach.
495 * We assume that reset negotiation has already happened,
496 * here. */
497 err = wacom_send_and_wait(wacom, serio, REQUEST_MODEL_AND_ROM_VERSION,
498 "model and version");
499 if (err)
500 return err;
501
502 if (!(wacom->res_x && wacom->res_y)) {
503 err = wacom_send_and_wait(wacom, serio,
504 REQUEST_CONFIGURATION_STRING,
505 "configuration string");
506 if (err)
507 return err;
508 }
509
510 if (!(wacom->max_x && wacom->max_y)) {
511 err = wacom_send_and_wait(wacom, serio,
512 REQUEST_MAX_COORDINATES,
513 "coordinates string");
514 if (err)
515 return err;
516 }
517
518 return wacom_send_setup_string(wacom, serio);
519}
520
521static int wacom_connect(struct serio *serio, struct serio_driver *drv)
522{
523 struct wacom *wacom;
524 struct input_dev *input_dev;
525 int err = -ENOMEM;
526
527 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
528 input_dev = input_allocate_device();
529 if (!wacom || !input_dev)
530 goto free_device;
531
532 wacom->dev = input_dev;
533 wacom->extra_z_bits = 1;
534 wacom->eraser_mask = 0x04;
535 wacom->tool = wacom->idx = 0;
536 snprintf(wacom->phys, sizeof(wacom->phys), "%s/input0", serio->phys);
537 input_dev->phys = wacom->phys;
538 input_dev->id.bustype = BUS_RS232;
539 input_dev->id.vendor = SERIO_WACOM_IV;
540 input_dev->id.product = serio->id.extra;
541 input_dev->dev.parent = &serio->dev;
542
543 input_dev->evbit[0] =
544 BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | BIT_MASK(EV_REL);
545 set_bit(ABS_MISC, input_dev->absbit);
546 set_bit(BTN_TOOL_PEN, input_dev->keybit);
547 set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
548 set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
549 set_bit(BTN_TOUCH, input_dev->keybit);
550 set_bit(BTN_STYLUS, input_dev->keybit);
551 set_bit(BTN_LEFT, input_dev->keybit);
552 set_bit(BTN_RIGHT, input_dev->keybit);
553 set_bit(BTN_MIDDLE, input_dev->keybit);
554
555 serio_set_drvdata(serio, wacom);
556
557 err = serio_open(serio, drv);
558 if (err)
559 goto free_device;
560
561 err = wacom_setup(wacom, serio);
562 if (err)
563 goto close_serio;
564
565 set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
566 if (!(wacom->flags & F_COVERS_SCREEN))
567 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
568
569 if (wacom->flags & F_HAS_STYLUS2)
570 __set_bit(BTN_STYLUS2, input_dev->keybit);
571
572 if (wacom->flags & F_HAS_SCROLLWHEEL)
573 __set_bit(REL_WHEEL, input_dev->relbit);
574
575 input_abs_set_res(wacom->dev, ABS_X, wacom->res_x);
576 input_abs_set_res(wacom->dev, ABS_Y, wacom->res_y);
577 input_set_abs_params(wacom->dev, ABS_X, 0, wacom->max_x, 0, 0);
578 input_set_abs_params(wacom->dev, ABS_Y, 0, wacom->max_y, 0, 0);
579 input_set_abs_params(wacom->dev, ABS_PRESSURE, -1,
580 (1 << (7 + wacom->extra_z_bits)) - 1, 0, 0);
581
582 err = input_register_device(wacom->dev);
583 if (err)
584 goto close_serio;
585
586 return 0;
587
588close_serio:
589 serio_close(serio);
590free_device:
591 serio_set_drvdata(serio, NULL);
592 input_free_device(input_dev);
593 kfree(wacom);
594 return err;
595}
596
597static struct serio_device_id wacom_serio_ids[] = {
598 {
599 .type = SERIO_RS232,
600 .proto = SERIO_WACOM_IV,
601 .id = SERIO_ANY,
602 .extra = SERIO_ANY,
603 },
604 { 0 }
605};
606
607MODULE_DEVICE_TABLE(serio, wacom_serio_ids);
608
609static struct serio_driver wacom_drv = {
610 .driver = {
611 .name = "wacom_serial4",
612 },
613 .description = "Wacom protocol 4 serial tablet driver",
614 .id_table = wacom_serio_ids,
615 .interrupt = wacom_interrupt,
616 .connect = wacom_connect,
617 .disconnect = wacom_disconnect,
618};
619
620module_serio_driver(wacom_drv);
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
deleted file mode 100644
index 2c613cd41dd6..000000000000
--- a/drivers/input/tablet/wacom_sys.c
+++ /dev/null
@@ -1,1497 +0,0 @@
1/*
2 * drivers/input/tablet/wacom_sys.c
3 *
4 * USB Wacom tablet support - system specific code
5 */
6
7/*
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 */
13
14#include "wacom_wac.h"
15#include "wacom.h"
16
17/* defines to get HID report descriptor */
18#define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01)
19#define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02)
20#define HID_USAGE_UNDEFINED 0x00
21#define HID_USAGE_PAGE 0x05
22#define HID_USAGE_PAGE_DIGITIZER 0x0d
23#define HID_USAGE_PAGE_DESKTOP 0x01
24#define HID_USAGE 0x09
25#define HID_USAGE_X ((HID_USAGE_PAGE_DESKTOP << 16) | 0x30)
26#define HID_USAGE_Y ((HID_USAGE_PAGE_DESKTOP << 16) | 0x31)
27#define HID_USAGE_PRESSURE ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x30)
28#define HID_USAGE_X_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3d)
29#define HID_USAGE_Y_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3e)
30#define HID_USAGE_FINGER ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x22)
31#define HID_USAGE_STYLUS ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x20)
32#define HID_USAGE_CONTACTMAX ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x55)
33#define HID_COLLECTION 0xa1
34#define HID_COLLECTION_LOGICAL 0x02
35#define HID_COLLECTION_END 0xc0
36
37struct hid_descriptor {
38 struct usb_descriptor_header header;
39 __le16 bcdHID;
40 u8 bCountryCode;
41 u8 bNumDescriptors;
42 u8 bDescriptorType;
43 __le16 wDescriptorLength;
44} __attribute__ ((packed));
45
46/* defines to get/set USB message */
47#define USB_REQ_GET_REPORT 0x01
48#define USB_REQ_SET_REPORT 0x09
49
50#define WAC_HID_FEATURE_REPORT 0x03
51#define WAC_MSG_RETRIES 5
52
53#define WAC_CMD_LED_CONTROL 0x20
54#define WAC_CMD_ICON_START 0x21
55#define WAC_CMD_ICON_XFER 0x23
56#define WAC_CMD_RETRIES 10
57
58static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id,
59 void *buf, size_t size, unsigned int retries)
60{
61 struct usb_device *dev = interface_to_usbdev(intf);
62 int retval;
63
64 do {
65 retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
66 USB_REQ_GET_REPORT,
67 USB_DIR_IN | USB_TYPE_CLASS |
68 USB_RECIP_INTERFACE,
69 (type << 8) + id,
70 intf->altsetting[0].desc.bInterfaceNumber,
71 buf, size, 100);
72 } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
73
74 return retval;
75}
76
77static int wacom_set_report(struct usb_interface *intf, u8 type, u8 id,
78 void *buf, size_t size, unsigned int retries)
79{
80 struct usb_device *dev = interface_to_usbdev(intf);
81 int retval;
82
83 do {
84 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
85 USB_REQ_SET_REPORT,
86 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
87 (type << 8) + id,
88 intf->altsetting[0].desc.bInterfaceNumber,
89 buf, size, 1000);
90 } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
91
92 return retval;
93}
94
95static void wacom_sys_irq(struct urb *urb)
96{
97 struct wacom *wacom = urb->context;
98 struct device *dev = &wacom->intf->dev;
99 int retval;
100
101 switch (urb->status) {
102 case 0:
103 /* success */
104 break;
105 case -ECONNRESET:
106 case -ENOENT:
107 case -ESHUTDOWN:
108 /* this urb is terminated, clean up */
109 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
110 __func__, urb->status);
111 return;
112 default:
113 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
114 __func__, urb->status);
115 goto exit;
116 }
117
118 wacom_wac_irq(&wacom->wacom_wac, urb->actual_length);
119
120 exit:
121 usb_mark_last_busy(wacom->usbdev);
122 retval = usb_submit_urb(urb, GFP_ATOMIC);
123 if (retval)
124 dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
125 __func__, retval);
126}
127
128static int wacom_open(struct input_dev *dev)
129{
130 struct wacom *wacom = input_get_drvdata(dev);
131 int retval = 0;
132
133 if (usb_autopm_get_interface(wacom->intf) < 0)
134 return -EIO;
135
136 mutex_lock(&wacom->lock);
137
138 if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
139 retval = -EIO;
140 goto out;
141 }
142
143 wacom->open = true;
144 wacom->intf->needs_remote_wakeup = 1;
145
146out:
147 mutex_unlock(&wacom->lock);
148 usb_autopm_put_interface(wacom->intf);
149 return retval;
150}
151
152static void wacom_close(struct input_dev *dev)
153{
154 struct wacom *wacom = input_get_drvdata(dev);
155 int autopm_error;
156
157 autopm_error = usb_autopm_get_interface(wacom->intf);
158
159 mutex_lock(&wacom->lock);
160 usb_kill_urb(wacom->irq);
161 wacom->open = false;
162 wacom->intf->needs_remote_wakeup = 0;
163 mutex_unlock(&wacom->lock);
164
165 if (!autopm_error)
166 usb_autopm_put_interface(wacom->intf);
167}
168
169/*
170 * Calculate the resolution of the X or Y axis, given appropriate HID data.
171 * This function is little more than hidinput_calc_abs_res stripped down.
172 */
173static int wacom_calc_hid_res(int logical_extents, int physical_extents,
174 unsigned char unit, unsigned char exponent)
175{
176 int prev, unit_exponent;
177
178 /* Check if the extents are sane */
179 if (logical_extents <= 0 || physical_extents <= 0)
180 return 0;
181
182 /* Get signed value of nybble-sized twos-compliment exponent */
183 unit_exponent = exponent;
184 if (unit_exponent > 7)
185 unit_exponent -= 16;
186
187 /* Convert physical_extents to millimeters */
188 if (unit == 0x11) { /* If centimeters */
189 unit_exponent += 1;
190 } else if (unit == 0x13) { /* If inches */
191 prev = physical_extents;
192 physical_extents *= 254;
193 if (physical_extents < prev)
194 return 0;
195 unit_exponent -= 1;
196 } else {
197 return 0;
198 }
199
200 /* Apply negative unit exponent */
201 for (; unit_exponent < 0; unit_exponent++) {
202 prev = logical_extents;
203 logical_extents *= 10;
204 if (logical_extents < prev)
205 return 0;
206 }
207 /* Apply positive unit exponent */
208 for (; unit_exponent > 0; unit_exponent--) {
209 prev = physical_extents;
210 physical_extents *= 10;
211 if (physical_extents < prev)
212 return 0;
213 }
214
215 /* Calculate resolution */
216 return logical_extents / physical_extents;
217}
218
219static int wacom_parse_logical_collection(unsigned char *report,
220 struct wacom_features *features)
221{
222 int length = 0;
223
224 if (features->type == BAMBOO_PT) {
225
226 /* Logical collection is only used by 3rd gen Bamboo Touch */
227 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
228 features->device_type = BTN_TOOL_FINGER;
229
230 features->x_max = features->y_max =
231 get_unaligned_le16(&report[10]);
232
233 length = 11;
234 }
235 return length;
236}
237
238static void wacom_retrieve_report_data(struct usb_interface *intf,
239 struct wacom_features *features)
240{
241 int result = 0;
242 unsigned char *rep_data;
243
244 rep_data = kmalloc(2, GFP_KERNEL);
245 if (rep_data) {
246
247 rep_data[0] = 12;
248 result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT,
249 rep_data[0], rep_data, 2,
250 WAC_MSG_RETRIES);
251
252 if (result >= 0 && rep_data[1] > 2)
253 features->touch_max = rep_data[1];
254
255 kfree(rep_data);
256 }
257}
258
259/*
260 * Interface Descriptor of wacom devices can be incomplete and
261 * inconsistent so wacom_features table is used to store stylus
262 * device's packet lengths, various maximum values, and tablet
263 * resolution based on product ID's.
264 *
265 * For devices that contain 2 interfaces, wacom_features table is
266 * inaccurate for the touch interface. Since the Interface Descriptor
267 * for touch interfaces has pretty complete data, this function exists
268 * to query tablet for this missing information instead of hard coding in
269 * an additional table.
270 *
271 * A typical Interface Descriptor for a stylus will contain a
272 * boot mouse application collection that is not of interest and this
273 * function will ignore it.
274 *
275 * It also contains a digitizer application collection that also is not
276 * of interest since any information it contains would be duplicate
277 * of what is in wacom_features. Usually it defines a report of an array
278 * of bytes that could be used as max length of the stylus packet returned.
279 * If it happens to define a Digitizer-Stylus Physical Collection then
280 * the X and Y logical values contain valid data but it is ignored.
281 *
282 * A typical Interface Descriptor for a touch interface will contain a
283 * Digitizer-Finger Physical Collection which will define both logical
284 * X/Y maximum as well as the physical size of tablet. Since touch
285 * interfaces haven't supported pressure or distance, this is enough
286 * information to override invalid values in the wacom_features table.
287 *
288 * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
289 * Collection. Instead they define a Logical Collection with a single
290 * Logical Maximum for both X and Y.
291 *
292 * Intuos5 touch interface does not contain useful data. We deal with
293 * this after returning from this function.
294 */
295static int wacom_parse_hid(struct usb_interface *intf,
296 struct hid_descriptor *hid_desc,
297 struct wacom_features *features)
298{
299 struct usb_device *dev = interface_to_usbdev(intf);
300 char limit = 0;
301 /* result has to be defined as int for some devices */
302 int result = 0, touch_max = 0;
303 int i = 0, page = 0, finger = 0, pen = 0;
304 unsigned char *report;
305
306 report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
307 if (!report)
308 return -ENOMEM;
309
310 /* retrive report descriptors */
311 do {
312 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
313 USB_REQ_GET_DESCRIPTOR,
314 USB_RECIP_INTERFACE | USB_DIR_IN,
315 HID_DEVICET_REPORT << 8,
316 intf->altsetting[0].desc.bInterfaceNumber, /* interface */
317 report,
318 hid_desc->wDescriptorLength,
319 5000); /* 5 secs */
320 } while (result < 0 && limit++ < WAC_MSG_RETRIES);
321
322 /* No need to parse the Descriptor. It isn't an error though */
323 if (result < 0)
324 goto out;
325
326 for (i = 0; i < hid_desc->wDescriptorLength; i++) {
327
328 switch (report[i]) {
329 case HID_USAGE_PAGE:
330 page = report[i + 1];
331 i++;
332 break;
333
334 case HID_USAGE:
335 switch (page << 16 | report[i + 1]) {
336 case HID_USAGE_X:
337 if (finger) {
338 features->device_type = BTN_TOOL_FINGER;
339 /* touch device at least supports one touch point */
340 touch_max = 1;
341 switch (features->type) {
342 case TABLETPC2FG:
343 features->pktlen = WACOM_PKGLEN_TPC2FG;
344 break;
345
346 case MTSCREEN:
347 case WACOM_24HDT:
348 features->pktlen = WACOM_PKGLEN_MTOUCH;
349 break;
350
351 case MTTPC:
352 case MTTPC_B:
353 features->pktlen = WACOM_PKGLEN_MTTPC;
354 break;
355
356 case BAMBOO_PT:
357 features->pktlen = WACOM_PKGLEN_BBTOUCH;
358 break;
359
360 default:
361 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
362 break;
363 }
364
365 switch (features->type) {
366 case BAMBOO_PT:
367 features->x_phy =
368 get_unaligned_le16(&report[i + 5]);
369 features->x_max =
370 get_unaligned_le16(&report[i + 8]);
371 i += 15;
372 break;
373
374 case WACOM_24HDT:
375 features->x_max =
376 get_unaligned_le16(&report[i + 3]);
377 features->x_phy =
378 get_unaligned_le16(&report[i + 8]);
379 features->unit = report[i - 1];
380 features->unitExpo = report[i - 3];
381 i += 12;
382 break;
383
384 case MTTPC_B:
385 features->x_max =
386 get_unaligned_le16(&report[i + 3]);
387 features->x_phy =
388 get_unaligned_le16(&report[i + 6]);
389 features->unit = report[i - 5];
390 features->unitExpo = report[i - 3];
391 i += 9;
392 break;
393
394 default:
395 features->x_max =
396 get_unaligned_le16(&report[i + 3]);
397 features->x_phy =
398 get_unaligned_le16(&report[i + 6]);
399 features->unit = report[i + 9];
400 features->unitExpo = report[i + 11];
401 i += 12;
402 break;
403 }
404 } else if (pen) {
405 /* penabled only accepts exact bytes of data */
406 if (features->type >= TABLETPC)
407 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
408 features->device_type = BTN_TOOL_PEN;
409 features->x_max =
410 get_unaligned_le16(&report[i + 3]);
411 i += 4;
412 }
413 break;
414
415 case HID_USAGE_Y:
416 if (finger) {
417 switch (features->type) {
418 case TABLETPC2FG:
419 case MTSCREEN:
420 case MTTPC:
421 features->y_max =
422 get_unaligned_le16(&report[i + 3]);
423 features->y_phy =
424 get_unaligned_le16(&report[i + 6]);
425 i += 7;
426 break;
427
428 case WACOM_24HDT:
429 features->y_max =
430 get_unaligned_le16(&report[i + 3]);
431 features->y_phy =
432 get_unaligned_le16(&report[i - 2]);
433 i += 7;
434 break;
435
436 case BAMBOO_PT:
437 features->y_phy =
438 get_unaligned_le16(&report[i + 3]);
439 features->y_max =
440 get_unaligned_le16(&report[i + 6]);
441 i += 12;
442 break;
443
444 case MTTPC_B:
445 features->y_max =
446 get_unaligned_le16(&report[i + 3]);
447 features->y_phy =
448 get_unaligned_le16(&report[i + 6]);
449 i += 9;
450 break;
451
452 default:
453 features->y_max =
454 features->x_max;
455 features->y_phy =
456 get_unaligned_le16(&report[i + 3]);
457 i += 4;
458 break;
459 }
460 } else if (pen) {
461 features->y_max =
462 get_unaligned_le16(&report[i + 3]);
463 i += 4;
464 }
465 break;
466
467 case HID_USAGE_FINGER:
468 finger = 1;
469 i++;
470 break;
471
472 /*
473 * Requiring Stylus Usage will ignore boot mouse
474 * X/Y values and some cases of invalid Digitizer X/Y
475 * values commonly reported.
476 */
477 case HID_USAGE_STYLUS:
478 pen = 1;
479 i++;
480 break;
481
482 case HID_USAGE_CONTACTMAX:
483 /* leave touch_max as is if predefined */
484 if (!features->touch_max)
485 wacom_retrieve_report_data(intf, features);
486 i++;
487 break;
488
489 case HID_USAGE_PRESSURE:
490 if (pen) {
491 features->pressure_max =
492 get_unaligned_le16(&report[i + 3]);
493 i += 4;
494 }
495 break;
496 }
497 break;
498
499 case HID_COLLECTION_END:
500 /* reset UsagePage and Finger */
501 finger = page = 0;
502 break;
503
504 case HID_COLLECTION:
505 i++;
506 switch (report[i]) {
507 case HID_COLLECTION_LOGICAL:
508 i += wacom_parse_logical_collection(&report[i],
509 features);
510 break;
511 }
512 break;
513 }
514 }
515
516 out:
517 if (!features->touch_max && touch_max)
518 features->touch_max = touch_max;
519 result = 0;
520 kfree(report);
521 return result;
522}
523
524static int wacom_set_device_mode(struct usb_interface *intf, int report_id, int length, int mode)
525{
526 unsigned char *rep_data;
527 int error = -ENOMEM, limit = 0;
528
529 rep_data = kzalloc(length, GFP_KERNEL);
530 if (!rep_data)
531 return error;
532
533 do {
534 rep_data[0] = report_id;
535 rep_data[1] = mode;
536
537 error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
538 report_id, rep_data, length, 1);
539 } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES);
540
541 kfree(rep_data);
542
543 return error < 0 ? error : 0;
544}
545
546/*
547 * Switch the tablet into its most-capable mode. Wacom tablets are
548 * typically configured to power-up in a mode which sends mouse-like
549 * reports to the OS. To get absolute position, pressure data, etc.
550 * from the tablet, it is necessary to switch the tablet out of this
551 * mode and into one which sends the full range of tablet data.
552 */
553static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features)
554{
555 if (features->device_type == BTN_TOOL_FINGER) {
556 if (features->type > TABLETPC) {
557 /* MT Tablet PC touch */
558 return wacom_set_device_mode(intf, 3, 4, 4);
559 }
560 else if (features->type == WACOM_24HDT || features->type == CINTIQ_HYBRID) {
561 return wacom_set_device_mode(intf, 18, 3, 2);
562 }
563 } else if (features->device_type == BTN_TOOL_PEN) {
564 if (features->type <= BAMBOO_PT && features->type != WIRELESS) {
565 return wacom_set_device_mode(intf, 2, 2, 2);
566 }
567 }
568
569 return 0;
570}
571
572static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
573 struct wacom_features *features)
574{
575 int error = 0;
576 struct usb_host_interface *interface = intf->cur_altsetting;
577 struct hid_descriptor *hid_desc;
578
579 /* default features */
580 features->device_type = BTN_TOOL_PEN;
581 features->x_fuzz = 4;
582 features->y_fuzz = 4;
583 features->pressure_fuzz = 0;
584 features->distance_fuzz = 0;
585
586 /*
587 * The wireless device HID is basic and layout conflicts with
588 * other tablets (monitor and touch interface can look like pen).
589 * Skip the query for this type and modify defaults based on
590 * interface number.
591 */
592 if (features->type == WIRELESS) {
593 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
594 features->device_type = 0;
595 } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) {
596 features->device_type = BTN_TOOL_FINGER;
597 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
598 }
599 }
600
601 /* only devices that support touch need to retrieve the info */
602 if (features->type < BAMBOO_PT) {
603 goto out;
604 }
605
606 error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc);
607 if (error) {
608 error = usb_get_extra_descriptor(&interface->endpoint[0],
609 HID_DEVICET_REPORT, &hid_desc);
610 if (error) {
611 dev_err(&intf->dev,
612 "can not retrieve extra class descriptor\n");
613 goto out;
614 }
615 }
616 error = wacom_parse_hid(intf, hid_desc, features);
617
618 out:
619 return error;
620}
621
622struct wacom_usbdev_data {
623 struct list_head list;
624 struct kref kref;
625 struct usb_device *dev;
626 struct wacom_shared shared;
627};
628
629static LIST_HEAD(wacom_udev_list);
630static DEFINE_MUTEX(wacom_udev_list_lock);
631
632static struct usb_device *wacom_get_sibling(struct usb_device *dev, int vendor, int product)
633{
634 int port1;
635 struct usb_device *sibling;
636
637 if (vendor == 0 && product == 0)
638 return dev;
639
640 if (dev->parent == NULL)
641 return NULL;
642
643 usb_hub_for_each_child(dev->parent, port1, sibling) {
644 struct usb_device_descriptor *d;
645 if (sibling == NULL)
646 continue;
647
648 d = &sibling->descriptor;
649 if (d->idVendor == vendor && d->idProduct == product)
650 return sibling;
651 }
652
653 return NULL;
654}
655
656static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev)
657{
658 struct wacom_usbdev_data *data;
659
660 list_for_each_entry(data, &wacom_udev_list, list) {
661 if (data->dev == dev) {
662 kref_get(&data->kref);
663 return data;
664 }
665 }
666
667 return NULL;
668}
669
670static int wacom_add_shared_data(struct wacom_wac *wacom,
671 struct usb_device *dev)
672{
673 struct wacom_usbdev_data *data;
674 int retval = 0;
675
676 mutex_lock(&wacom_udev_list_lock);
677
678 data = wacom_get_usbdev_data(dev);
679 if (!data) {
680 data = kzalloc(sizeof(struct wacom_usbdev_data), GFP_KERNEL);
681 if (!data) {
682 retval = -ENOMEM;
683 goto out;
684 }
685
686 kref_init(&data->kref);
687 data->dev = dev;
688 list_add_tail(&data->list, &wacom_udev_list);
689 }
690
691 wacom->shared = &data->shared;
692
693out:
694 mutex_unlock(&wacom_udev_list_lock);
695 return retval;
696}
697
698static void wacom_release_shared_data(struct kref *kref)
699{
700 struct wacom_usbdev_data *data =
701 container_of(kref, struct wacom_usbdev_data, kref);
702
703 mutex_lock(&wacom_udev_list_lock);
704 list_del(&data->list);
705 mutex_unlock(&wacom_udev_list_lock);
706
707 kfree(data);
708}
709
710static void wacom_remove_shared_data(struct wacom_wac *wacom)
711{
712 struct wacom_usbdev_data *data;
713
714 if (wacom->shared) {
715 data = container_of(wacom->shared, struct wacom_usbdev_data, shared);
716 kref_put(&data->kref, wacom_release_shared_data);
717 wacom->shared = NULL;
718 }
719}
720
721static int wacom_led_control(struct wacom *wacom)
722{
723 unsigned char *buf;
724 int retval;
725
726 buf = kzalloc(9, GFP_KERNEL);
727 if (!buf)
728 return -ENOMEM;
729
730 if (wacom->wacom_wac.features.type >= INTUOS5S &&
731 wacom->wacom_wac.features.type <= INTUOSPL) {
732 /*
733 * Touch Ring and crop mark LED luminance may take on
734 * one of four values:
735 * 0 = Low; 1 = Medium; 2 = High; 3 = Off
736 */
737 int ring_led = wacom->led.select[0] & 0x03;
738 int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
739 int crop_lum = 0;
740
741 buf[0] = WAC_CMD_LED_CONTROL;
742 buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
743 }
744 else {
745 int led = wacom->led.select[0] | 0x4;
746
747 if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
748 wacom->wacom_wac.features.type == WACOM_24HD)
749 led |= (wacom->led.select[1] << 4) | 0x40;
750
751 buf[0] = WAC_CMD_LED_CONTROL;
752 buf[1] = led;
753 buf[2] = wacom->led.llv;
754 buf[3] = wacom->led.hlv;
755 buf[4] = wacom->led.img_lum;
756 }
757
758 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
759 buf, 9, WAC_CMD_RETRIES);
760 kfree(buf);
761
762 return retval;
763}
764
765static int wacom_led_putimage(struct wacom *wacom, int button_id, const void *img)
766{
767 unsigned char *buf;
768 int i, retval;
769
770 buf = kzalloc(259, GFP_KERNEL);
771 if (!buf)
772 return -ENOMEM;
773
774 /* Send 'start' command */
775 buf[0] = WAC_CMD_ICON_START;
776 buf[1] = 1;
777 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
778 buf, 2, WAC_CMD_RETRIES);
779 if (retval < 0)
780 goto out;
781
782 buf[0] = WAC_CMD_ICON_XFER;
783 buf[1] = button_id & 0x07;
784 for (i = 0; i < 4; i++) {
785 buf[2] = i;
786 memcpy(buf + 3, img + i * 256, 256);
787
788 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_XFER,
789 buf, 259, WAC_CMD_RETRIES);
790 if (retval < 0)
791 break;
792 }
793
794 /* Send 'stop' */
795 buf[0] = WAC_CMD_ICON_START;
796 buf[1] = 0;
797 wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
798 buf, 2, WAC_CMD_RETRIES);
799
800out:
801 kfree(buf);
802 return retval;
803}
804
805static ssize_t wacom_led_select_store(struct device *dev, int set_id,
806 const char *buf, size_t count)
807{
808 struct wacom *wacom = dev_get_drvdata(dev);
809 unsigned int id;
810 int err;
811
812 err = kstrtouint(buf, 10, &id);
813 if (err)
814 return err;
815
816 mutex_lock(&wacom->lock);
817
818 wacom->led.select[set_id] = id & 0x3;
819 err = wacom_led_control(wacom);
820
821 mutex_unlock(&wacom->lock);
822
823 return err < 0 ? err : count;
824}
825
826#define DEVICE_LED_SELECT_ATTR(SET_ID) \
827static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \
828 struct device_attribute *attr, const char *buf, size_t count) \
829{ \
830 return wacom_led_select_store(dev, SET_ID, buf, count); \
831} \
832static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \
833 struct device_attribute *attr, char *buf) \
834{ \
835 struct wacom *wacom = dev_get_drvdata(dev); \
836 return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \
837} \
838static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \
839 wacom_led##SET_ID##_select_show, \
840 wacom_led##SET_ID##_select_store)
841
842DEVICE_LED_SELECT_ATTR(0);
843DEVICE_LED_SELECT_ATTR(1);
844
845static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
846 const char *buf, size_t count)
847{
848 unsigned int value;
849 int err;
850
851 err = kstrtouint(buf, 10, &value);
852 if (err)
853 return err;
854
855 mutex_lock(&wacom->lock);
856
857 *dest = value & 0x7f;
858 err = wacom_led_control(wacom);
859
860 mutex_unlock(&wacom->lock);
861
862 return err < 0 ? err : count;
863}
864
865#define DEVICE_LUMINANCE_ATTR(name, field) \
866static ssize_t wacom_##name##_luminance_store(struct device *dev, \
867 struct device_attribute *attr, const char *buf, size_t count) \
868{ \
869 struct wacom *wacom = dev_get_drvdata(dev); \
870 \
871 return wacom_luminance_store(wacom, &wacom->led.field, \
872 buf, count); \
873} \
874static DEVICE_ATTR(name##_luminance, S_IWUSR, \
875 NULL, wacom_##name##_luminance_store)
876
877DEVICE_LUMINANCE_ATTR(status0, llv);
878DEVICE_LUMINANCE_ATTR(status1, hlv);
879DEVICE_LUMINANCE_ATTR(buttons, img_lum);
880
881static ssize_t wacom_button_image_store(struct device *dev, int button_id,
882 const char *buf, size_t count)
883{
884 struct wacom *wacom = dev_get_drvdata(dev);
885 int err;
886
887 if (count != 1024)
888 return -EINVAL;
889
890 mutex_lock(&wacom->lock);
891
892 err = wacom_led_putimage(wacom, button_id, buf);
893
894 mutex_unlock(&wacom->lock);
895
896 return err < 0 ? err : count;
897}
898
899#define DEVICE_BTNIMG_ATTR(BUTTON_ID) \
900static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \
901 struct device_attribute *attr, const char *buf, size_t count) \
902{ \
903 return wacom_button_image_store(dev, BUTTON_ID, buf, count); \
904} \
905static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \
906 NULL, wacom_btnimg##BUTTON_ID##_store)
907
908DEVICE_BTNIMG_ATTR(0);
909DEVICE_BTNIMG_ATTR(1);
910DEVICE_BTNIMG_ATTR(2);
911DEVICE_BTNIMG_ATTR(3);
912DEVICE_BTNIMG_ATTR(4);
913DEVICE_BTNIMG_ATTR(5);
914DEVICE_BTNIMG_ATTR(6);
915DEVICE_BTNIMG_ATTR(7);
916
917static struct attribute *cintiq_led_attrs[] = {
918 &dev_attr_status_led0_select.attr,
919 &dev_attr_status_led1_select.attr,
920 NULL
921};
922
923static struct attribute_group cintiq_led_attr_group = {
924 .name = "wacom_led",
925 .attrs = cintiq_led_attrs,
926};
927
928static struct attribute *intuos4_led_attrs[] = {
929 &dev_attr_status0_luminance.attr,
930 &dev_attr_status1_luminance.attr,
931 &dev_attr_status_led0_select.attr,
932 &dev_attr_buttons_luminance.attr,
933 &dev_attr_button0_rawimg.attr,
934 &dev_attr_button1_rawimg.attr,
935 &dev_attr_button2_rawimg.attr,
936 &dev_attr_button3_rawimg.attr,
937 &dev_attr_button4_rawimg.attr,
938 &dev_attr_button5_rawimg.attr,
939 &dev_attr_button6_rawimg.attr,
940 &dev_attr_button7_rawimg.attr,
941 NULL
942};
943
944static struct attribute_group intuos4_led_attr_group = {
945 .name = "wacom_led",
946 .attrs = intuos4_led_attrs,
947};
948
949static struct attribute *intuos5_led_attrs[] = {
950 &dev_attr_status0_luminance.attr,
951 &dev_attr_status_led0_select.attr,
952 NULL
953};
954
955static struct attribute_group intuos5_led_attr_group = {
956 .name = "wacom_led",
957 .attrs = intuos5_led_attrs,
958};
959
960static int wacom_initialize_leds(struct wacom *wacom)
961{
962 int error;
963
964 /* Initialize default values */
965 switch (wacom->wacom_wac.features.type) {
966 case INTUOS4S:
967 case INTUOS4:
968 case INTUOS4L:
969 wacom->led.select[0] = 0;
970 wacom->led.select[1] = 0;
971 wacom->led.llv = 10;
972 wacom->led.hlv = 20;
973 wacom->led.img_lum = 10;
974 error = sysfs_create_group(&wacom->intf->dev.kobj,
975 &intuos4_led_attr_group);
976 break;
977
978 case WACOM_24HD:
979 case WACOM_21UX2:
980 wacom->led.select[0] = 0;
981 wacom->led.select[1] = 0;
982 wacom->led.llv = 0;
983 wacom->led.hlv = 0;
984 wacom->led.img_lum = 0;
985
986 error = sysfs_create_group(&wacom->intf->dev.kobj,
987 &cintiq_led_attr_group);
988 break;
989
990 case INTUOS5S:
991 case INTUOS5:
992 case INTUOS5L:
993 case INTUOSPS:
994 case INTUOSPM:
995 case INTUOSPL:
996 if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) {
997 wacom->led.select[0] = 0;
998 wacom->led.select[1] = 0;
999 wacom->led.llv = 32;
1000 wacom->led.hlv = 0;
1001 wacom->led.img_lum = 0;
1002
1003 error = sysfs_create_group(&wacom->intf->dev.kobj,
1004 &intuos5_led_attr_group);
1005 } else
1006 return 0;
1007 break;
1008
1009 default:
1010 return 0;
1011 }
1012
1013 if (error) {
1014 dev_err(&wacom->intf->dev,
1015 "cannot create sysfs group err: %d\n", error);
1016 return error;
1017 }
1018 wacom_led_control(wacom);
1019
1020 return 0;
1021}
1022
1023static void wacom_destroy_leds(struct wacom *wacom)
1024{
1025 switch (wacom->wacom_wac.features.type) {
1026 case INTUOS4S:
1027 case INTUOS4:
1028 case INTUOS4L:
1029 sysfs_remove_group(&wacom->intf->dev.kobj,
1030 &intuos4_led_attr_group);
1031 break;
1032
1033 case WACOM_24HD:
1034 case WACOM_21UX2:
1035 sysfs_remove_group(&wacom->intf->dev.kobj,
1036 &cintiq_led_attr_group);
1037 break;
1038
1039 case INTUOS5S:
1040 case INTUOS5:
1041 case INTUOS5L:
1042 case INTUOSPS:
1043 case INTUOSPM:
1044 case INTUOSPL:
1045 if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN)
1046 sysfs_remove_group(&wacom->intf->dev.kobj,
1047 &intuos5_led_attr_group);
1048 break;
1049 }
1050}
1051
1052static enum power_supply_property wacom_battery_props[] = {
1053 POWER_SUPPLY_PROP_SCOPE,
1054 POWER_SUPPLY_PROP_CAPACITY
1055};
1056
1057static int wacom_battery_get_property(struct power_supply *psy,
1058 enum power_supply_property psp,
1059 union power_supply_propval *val)
1060{
1061 struct wacom *wacom = container_of(psy, struct wacom, battery);
1062 int ret = 0;
1063
1064 switch (psp) {
1065 case POWER_SUPPLY_PROP_SCOPE:
1066 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1067 break;
1068 case POWER_SUPPLY_PROP_CAPACITY:
1069 val->intval =
1070 wacom->wacom_wac.battery_capacity * 100 / 31;
1071 break;
1072 default:
1073 ret = -EINVAL;
1074 break;
1075 }
1076
1077 return ret;
1078}
1079
1080static int wacom_initialize_battery(struct wacom *wacom)
1081{
1082 int error = 0;
1083
1084 if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR) {
1085 wacom->battery.properties = wacom_battery_props;
1086 wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
1087 wacom->battery.get_property = wacom_battery_get_property;
1088 wacom->battery.name = "wacom_battery";
1089 wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1090 wacom->battery.use_for_apm = 0;
1091
1092 error = power_supply_register(&wacom->usbdev->dev,
1093 &wacom->battery);
1094
1095 if (!error)
1096 power_supply_powers(&wacom->battery,
1097 &wacom->usbdev->dev);
1098 }
1099
1100 return error;
1101}
1102
1103static void wacom_destroy_battery(struct wacom *wacom)
1104{
1105 if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR &&
1106 wacom->battery.dev) {
1107 power_supply_unregister(&wacom->battery);
1108 wacom->battery.dev = NULL;
1109 }
1110}
1111
1112static int wacom_register_input(struct wacom *wacom)
1113{
1114 struct input_dev *input_dev;
1115 struct usb_interface *intf = wacom->intf;
1116 struct usb_device *dev = interface_to_usbdev(intf);
1117 struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1118 int error;
1119
1120 input_dev = input_allocate_device();
1121 if (!input_dev) {
1122 error = -ENOMEM;
1123 goto fail1;
1124 }
1125
1126 input_dev->name = wacom_wac->name;
1127 input_dev->dev.parent = &intf->dev;
1128 input_dev->open = wacom_open;
1129 input_dev->close = wacom_close;
1130 usb_to_input_id(dev, &input_dev->id);
1131 input_set_drvdata(input_dev, wacom);
1132
1133 wacom_wac->input = input_dev;
1134 error = wacom_setup_input_capabilities(input_dev, wacom_wac);
1135 if (error)
1136 goto fail1;
1137
1138 error = input_register_device(input_dev);
1139 if (error)
1140 goto fail2;
1141
1142 return 0;
1143
1144fail2:
1145 input_free_device(input_dev);
1146 wacom_wac->input = NULL;
1147fail1:
1148 return error;
1149}
1150
1151static void wacom_wireless_work(struct work_struct *work)
1152{
1153 struct wacom *wacom = container_of(work, struct wacom, work);
1154 struct usb_device *usbdev = wacom->usbdev;
1155 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1156 struct wacom *wacom1, *wacom2;
1157 struct wacom_wac *wacom_wac1, *wacom_wac2;
1158 int error;
1159
1160 /*
1161 * Regardless if this is a disconnect or a new tablet,
1162 * remove any existing input and battery devices.
1163 */
1164
1165 wacom_destroy_battery(wacom);
1166
1167 /* Stylus interface */
1168 wacom1 = usb_get_intfdata(usbdev->config->interface[1]);
1169 wacom_wac1 = &(wacom1->wacom_wac);
1170 if (wacom_wac1->input)
1171 input_unregister_device(wacom_wac1->input);
1172 wacom_wac1->input = NULL;
1173
1174 /* Touch interface */
1175 wacom2 = usb_get_intfdata(usbdev->config->interface[2]);
1176 wacom_wac2 = &(wacom2->wacom_wac);
1177 if (wacom_wac2->input)
1178 input_unregister_device(wacom_wac2->input);
1179 wacom_wac2->input = NULL;
1180
1181 if (wacom_wac->pid == 0) {
1182 dev_info(&wacom->intf->dev, "wireless tablet disconnected\n");
1183 } else {
1184 const struct usb_device_id *id = wacom_ids;
1185
1186 dev_info(&wacom->intf->dev,
1187 "wireless tablet connected with PID %x\n",
1188 wacom_wac->pid);
1189
1190 while (id->match_flags) {
1191 if (id->idVendor == USB_VENDOR_ID_WACOM &&
1192 id->idProduct == wacom_wac->pid)
1193 break;
1194 id++;
1195 }
1196
1197 if (!id->match_flags) {
1198 dev_info(&wacom->intf->dev,
1199 "ignoring unknown PID.\n");
1200 return;
1201 }
1202
1203 /* Stylus interface */
1204 wacom_wac1->features =
1205 *((struct wacom_features *)id->driver_info);
1206 wacom_wac1->features.device_type = BTN_TOOL_PEN;
1207 snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen",
1208 wacom_wac1->features.name);
1209 wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max;
1210 wacom_wac1->shared->type = wacom_wac1->features.type;
1211 error = wacom_register_input(wacom1);
1212 if (error)
1213 goto fail;
1214
1215 /* Touch interface */
1216 if (wacom_wac1->features.touch_max ||
1217 wacom_wac1->features.type == INTUOSHT) {
1218 wacom_wac2->features =
1219 *((struct wacom_features *)id->driver_info);
1220 wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
1221 wacom_wac2->features.device_type = BTN_TOOL_FINGER;
1222 wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
1223 if (wacom_wac2->features.touch_max)
1224 snprintf(wacom_wac2->name, WACOM_NAME_MAX,
1225 "%s (WL) Finger",wacom_wac2->features.name);
1226 else
1227 snprintf(wacom_wac2->name, WACOM_NAME_MAX,
1228 "%s (WL) Pad",wacom_wac2->features.name);
1229 error = wacom_register_input(wacom2);
1230 if (error)
1231 goto fail;
1232
1233 if (wacom_wac1->features.type == INTUOSHT &&
1234 wacom_wac1->features.touch_max)
1235 wacom_wac->shared->touch_input = wacom_wac2->input;
1236 }
1237
1238 error = wacom_initialize_battery(wacom);
1239 if (error)
1240 goto fail;
1241 }
1242
1243 return;
1244
1245fail:
1246 if (wacom_wac2->input) {
1247 input_unregister_device(wacom_wac2->input);
1248 wacom_wac2->input = NULL;
1249 }
1250
1251 if (wacom_wac1->input) {
1252 input_unregister_device(wacom_wac1->input);
1253 wacom_wac1->input = NULL;
1254 }
1255 return;
1256}
1257
1258/*
1259 * Not all devices report physical dimensions from HID.
1260 * Compute the default from hardcoded logical dimension
1261 * and resolution before driver overwrites them.
1262 */
1263static void wacom_set_default_phy(struct wacom_features *features)
1264{
1265 if (features->x_resolution) {
1266 features->x_phy = (features->x_max * 100) /
1267 features->x_resolution;
1268 features->y_phy = (features->y_max * 100) /
1269 features->y_resolution;
1270 }
1271}
1272
1273static void wacom_calculate_res(struct wacom_features *features)
1274{
1275 features->x_resolution = wacom_calc_hid_res(features->x_max,
1276 features->x_phy,
1277 features->unit,
1278 features->unitExpo);
1279 features->y_resolution = wacom_calc_hid_res(features->y_max,
1280 features->y_phy,
1281 features->unit,
1282 features->unitExpo);
1283}
1284
1285static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
1286{
1287 struct usb_device *dev = interface_to_usbdev(intf);
1288 struct usb_endpoint_descriptor *endpoint;
1289 struct wacom *wacom;
1290 struct wacom_wac *wacom_wac;
1291 struct wacom_features *features;
1292 int error;
1293
1294 if (!id->driver_info)
1295 return -EINVAL;
1296
1297 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
1298 if (!wacom)
1299 return -ENOMEM;
1300
1301 wacom_wac = &wacom->wacom_wac;
1302 wacom_wac->features = *((struct wacom_features *)id->driver_info);
1303 features = &wacom_wac->features;
1304 if (features->pktlen > WACOM_PKGLEN_MAX) {
1305 error = -EINVAL;
1306 goto fail1;
1307 }
1308
1309 wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX,
1310 GFP_KERNEL, &wacom->data_dma);
1311 if (!wacom_wac->data) {
1312 error = -ENOMEM;
1313 goto fail1;
1314 }
1315
1316 wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
1317 if (!wacom->irq) {
1318 error = -ENOMEM;
1319 goto fail2;
1320 }
1321
1322 wacom->usbdev = dev;
1323 wacom->intf = intf;
1324 mutex_init(&wacom->lock);
1325 INIT_WORK(&wacom->work, wacom_wireless_work);
1326 usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
1327 strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
1328
1329 endpoint = &intf->cur_altsetting->endpoint[0].desc;
1330
1331 /* set the default size in case we do not get them from hid */
1332 wacom_set_default_phy(features);
1333
1334 /* Retrieve the physical and logical size for touch devices */
1335 error = wacom_retrieve_hid_descriptor(intf, features);
1336 if (error)
1337 goto fail3;
1338
1339 /*
1340 * Intuos5 has no useful data about its touch interface in its
1341 * HID descriptor. If this is the touch interface (wMaxPacketSize
1342 * of WACOM_PKGLEN_BBTOUCH3), override the table values.
1343 */
1344 if (features->type >= INTUOS5S && features->type <= INTUOSHT) {
1345 if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
1346 features->device_type = BTN_TOOL_FINGER;
1347 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
1348
1349 features->x_max = 4096;
1350 features->y_max = 4096;
1351 } else {
1352 features->device_type = BTN_TOOL_PEN;
1353 }
1354 }
1355
1356 wacom_setup_device_quirks(features);
1357
1358 /* set unit to "100th of a mm" for devices not reported by HID */
1359 if (!features->unit) {
1360 features->unit = 0x11;
1361 features->unitExpo = 16 - 3;
1362 }
1363 wacom_calculate_res(features);
1364
1365 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
1366
1367 if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
1368 struct usb_device *other_dev;
1369
1370 /* Append the device type to the name */
1371 if (features->device_type != BTN_TOOL_FINGER)
1372 strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
1373 else if (features->touch_max)
1374 strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX);
1375 else
1376 strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX);
1377
1378 other_dev = wacom_get_sibling(dev, features->oVid, features->oPid);
1379 if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL)
1380 other_dev = dev;
1381 error = wacom_add_shared_data(wacom_wac, other_dev);
1382 if (error)
1383 goto fail3;
1384 }
1385
1386 usb_fill_int_urb(wacom->irq, dev,
1387 usb_rcvintpipe(dev, endpoint->bEndpointAddress),
1388 wacom_wac->data, features->pktlen,
1389 wacom_sys_irq, wacom, endpoint->bInterval);
1390 wacom->irq->transfer_dma = wacom->data_dma;
1391 wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1392
1393 error = wacom_initialize_leds(wacom);
1394 if (error)
1395 goto fail4;
1396
1397 if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
1398 error = wacom_register_input(wacom);
1399 if (error)
1400 goto fail5;
1401 }
1402
1403 /* Note that if query fails it is not a hard failure */
1404 wacom_query_tablet_data(intf, features);
1405
1406 usb_set_intfdata(intf, wacom);
1407
1408 if (features->quirks & WACOM_QUIRK_MONITOR) {
1409 if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
1410 error = -EIO;
1411 goto fail5;
1412 }
1413 }
1414
1415 if (wacom_wac->features.type == INTUOSHT && wacom_wac->features.touch_max) {
1416 if (wacom_wac->features.device_type == BTN_TOOL_FINGER)
1417 wacom_wac->shared->touch_input = wacom_wac->input;
1418 }
1419
1420 return 0;
1421
1422 fail5: wacom_destroy_leds(wacom);
1423 fail4: wacom_remove_shared_data(wacom_wac);
1424 fail3: usb_free_urb(wacom->irq);
1425 fail2: usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma);
1426 fail1: kfree(wacom);
1427 return error;
1428}
1429
1430static void wacom_disconnect(struct usb_interface *intf)
1431{
1432 struct wacom *wacom = usb_get_intfdata(intf);
1433
1434 usb_set_intfdata(intf, NULL);
1435
1436 usb_kill_urb(wacom->irq);
1437 cancel_work_sync(&wacom->work);
1438 if (wacom->wacom_wac.input)
1439 input_unregister_device(wacom->wacom_wac.input);
1440 wacom_destroy_battery(wacom);
1441 wacom_destroy_leds(wacom);
1442 usb_free_urb(wacom->irq);
1443 usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
1444 wacom->wacom_wac.data, wacom->data_dma);
1445 wacom_remove_shared_data(&wacom->wacom_wac);
1446 kfree(wacom);
1447}
1448
1449static int wacom_suspend(struct usb_interface *intf, pm_message_t message)
1450{
1451 struct wacom *wacom = usb_get_intfdata(intf);
1452
1453 mutex_lock(&wacom->lock);
1454 usb_kill_urb(wacom->irq);
1455 mutex_unlock(&wacom->lock);
1456
1457 return 0;
1458}
1459
1460static int wacom_resume(struct usb_interface *intf)
1461{
1462 struct wacom *wacom = usb_get_intfdata(intf);
1463 struct wacom_features *features = &wacom->wacom_wac.features;
1464 int rv = 0;
1465
1466 mutex_lock(&wacom->lock);
1467
1468 /* switch to wacom mode first */
1469 wacom_query_tablet_data(intf, features);
1470 wacom_led_control(wacom);
1471
1472 if ((wacom->open || (features->quirks & WACOM_QUIRK_MONITOR)) &&
1473 usb_submit_urb(wacom->irq, GFP_NOIO) < 0)
1474 rv = -EIO;
1475
1476 mutex_unlock(&wacom->lock);
1477
1478 return rv;
1479}
1480
1481static int wacom_reset_resume(struct usb_interface *intf)
1482{
1483 return wacom_resume(intf);
1484}
1485
1486static struct usb_driver wacom_driver = {
1487 .name = "wacom",
1488 .id_table = wacom_ids,
1489 .probe = wacom_probe,
1490 .disconnect = wacom_disconnect,
1491 .suspend = wacom_suspend,
1492 .resume = wacom_resume,
1493 .reset_resume = wacom_reset_resume,
1494 .supports_autosuspend = 1,
1495};
1496
1497module_usb_driver(wacom_driver);
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
deleted file mode 100644
index e73cf2c71f35..000000000000
--- a/drivers/input/tablet/wacom_wac.c
+++ /dev/null
@@ -1,2485 +0,0 @@
1/*
2 * drivers/input/tablet/wacom_wac.c
3 *
4 * USB Wacom tablet support - Wacom specific code
5 *
6 */
7
8/*
9 * 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 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 */
14
15#include "wacom_wac.h"
16#include "wacom.h"
17#include <linux/input/mt.h>
18#include <linux/hid.h>
19
20/* resolution for penabled devices */
21#define WACOM_PL_RES 20
22#define WACOM_PENPRTN_RES 40
23#define WACOM_VOLITO_RES 50
24#define WACOM_GRAPHIRE_RES 80
25#define WACOM_INTUOS_RES 100
26#define WACOM_INTUOS3_RES 200
27
28/* Scale factor relating reported contact size to logical contact area.
29 * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo
30 */
31#define WACOM_CONTACT_AREA_SCALE 2607
32
33static int wacom_penpartner_irq(struct wacom_wac *wacom)
34{
35 unsigned char *data = wacom->data;
36 struct input_dev *input = wacom->input;
37
38 switch (data[0]) {
39 case 1:
40 if (data[5] & 0x80) {
41 wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
42 wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID;
43 input_report_key(input, wacom->tool[0], 1);
44 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
45 input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
46 input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
47 input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
48 input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -127));
49 input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
50 } else {
51 input_report_key(input, wacom->tool[0], 0);
52 input_report_abs(input, ABS_MISC, 0); /* report tool id */
53 input_report_abs(input, ABS_PRESSURE, -1);
54 input_report_key(input, BTN_TOUCH, 0);
55 }
56 break;
57
58 case 2:
59 input_report_key(input, BTN_TOOL_PEN, 1);
60 input_report_abs(input, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */
61 input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
62 input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
63 input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
64 input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20));
65 input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
66 break;
67
68 default:
69 dev_dbg(input->dev.parent,
70 "%s: received unknown report #%d\n", __func__, data[0]);
71 return 0;
72 }
73
74 return 1;
75}
76
77static int wacom_pl_irq(struct wacom_wac *wacom)
78{
79 struct wacom_features *features = &wacom->features;
80 unsigned char *data = wacom->data;
81 struct input_dev *input = wacom->input;
82 int prox, pressure;
83
84 if (data[0] != WACOM_REPORT_PENABLED) {
85 dev_dbg(input->dev.parent,
86 "%s: received unknown report #%d\n", __func__, data[0]);
87 return 0;
88 }
89
90 prox = data[1] & 0x40;
91
92 if (prox) {
93 wacom->id[0] = ERASER_DEVICE_ID;
94 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
95 if (features->pressure_max > 255)
96 pressure = (pressure << 1) | ((data[4] >> 6) & 1);
97 pressure += (features->pressure_max + 1) / 2;
98
99 /*
100 * if going from out of proximity into proximity select between the eraser
101 * and the pen based on the state of the stylus2 button, choose eraser if
102 * pressed else choose pen. if not a proximity change from out to in, send
103 * an out of proximity for previous tool then a in for new tool.
104 */
105 if (!wacom->tool[0]) {
106 /* Eraser bit set for DTF */
107 if (data[1] & 0x10)
108 wacom->tool[1] = BTN_TOOL_RUBBER;
109 else
110 /* Going into proximity select tool */
111 wacom->tool[1] = (data[4] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
112 } else {
113 /* was entered with stylus2 pressed */
114 if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
115 /* report out proximity for previous tool */
116 input_report_key(input, wacom->tool[1], 0);
117 input_sync(input);
118 wacom->tool[1] = BTN_TOOL_PEN;
119 return 0;
120 }
121 }
122 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
123 /* Unknown tool selected default to pen tool */
124 wacom->tool[1] = BTN_TOOL_PEN;
125 wacom->id[0] = STYLUS_DEVICE_ID;
126 }
127 input_report_key(input, wacom->tool[1], prox); /* report in proximity for tool */
128 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
129 input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
130 input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
131 input_report_abs(input, ABS_PRESSURE, pressure);
132
133 input_report_key(input, BTN_TOUCH, data[4] & 0x08);
134 input_report_key(input, BTN_STYLUS, data[4] & 0x10);
135 /* Only allow the stylus2 button to be reported for the pen tool. */
136 input_report_key(input, BTN_STYLUS2, (wacom->tool[1] == BTN_TOOL_PEN) && (data[4] & 0x20));
137 } else {
138 /* report proximity-out of a (valid) tool */
139 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
140 /* Unknown tool selected default to pen tool */
141 wacom->tool[1] = BTN_TOOL_PEN;
142 }
143 input_report_key(input, wacom->tool[1], prox);
144 }
145
146 wacom->tool[0] = prox; /* Save proximity state */
147 return 1;
148}
149
150static int wacom_ptu_irq(struct wacom_wac *wacom)
151{
152 unsigned char *data = wacom->data;
153 struct input_dev *input = wacom->input;
154
155 if (data[0] != WACOM_REPORT_PENABLED) {
156 dev_dbg(input->dev.parent,
157 "%s: received unknown report #%d\n", __func__, data[0]);
158 return 0;
159 }
160
161 if (data[1] & 0x04) {
162 input_report_key(input, BTN_TOOL_RUBBER, data[1] & 0x20);
163 input_report_key(input, BTN_TOUCH, data[1] & 0x08);
164 wacom->id[0] = ERASER_DEVICE_ID;
165 } else {
166 input_report_key(input, BTN_TOOL_PEN, data[1] & 0x20);
167 input_report_key(input, BTN_TOUCH, data[1] & 0x01);
168 wacom->id[0] = STYLUS_DEVICE_ID;
169 }
170 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
171 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
172 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
173 input_report_abs(input, ABS_PRESSURE, le16_to_cpup((__le16 *)&data[6]));
174 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
175 input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
176 return 1;
177}
178
179static int wacom_dtu_irq(struct wacom_wac *wacom)
180{
181 unsigned char *data = wacom->data;
182 struct input_dev *input = wacom->input;
183 int prox = data[1] & 0x20;
184
185 dev_dbg(input->dev.parent,
186 "%s: received report #%d", __func__, data[0]);
187
188 if (prox) {
189 /* Going into proximity select tool */
190 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
191 if (wacom->tool[0] == BTN_TOOL_PEN)
192 wacom->id[0] = STYLUS_DEVICE_ID;
193 else
194 wacom->id[0] = ERASER_DEVICE_ID;
195 }
196 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
197 input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
198 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
199 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
200 input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]);
201 input_report_key(input, BTN_TOUCH, data[1] & 0x05);
202 if (!prox) /* out-prox */
203 wacom->id[0] = 0;
204 input_report_key(input, wacom->tool[0], prox);
205 input_report_abs(input, ABS_MISC, wacom->id[0]);
206 return 1;
207}
208
209static int wacom_dtus_irq(struct wacom_wac *wacom)
210{
211 char *data = wacom->data;
212 struct input_dev *input = wacom->input;
213 unsigned short prox, pressure = 0;
214
215 if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
216 dev_dbg(input->dev.parent,
217 "%s: received unknown report #%d", __func__, data[0]);
218 return 0;
219 } else if (data[0] == WACOM_REPORT_DTUSPAD) {
220 input_report_key(input, BTN_0, (data[1] & 0x01));
221 input_report_key(input, BTN_1, (data[1] & 0x02));
222 input_report_key(input, BTN_2, (data[1] & 0x04));
223 input_report_key(input, BTN_3, (data[1] & 0x08));
224 input_report_abs(input, ABS_MISC,
225 data[1] & 0x0f ? PAD_DEVICE_ID : 0);
226 /*
227 * Serial number is required when expresskeys are
228 * reported through pen interface.
229 */
230 input_event(input, EV_MSC, MSC_SERIAL, 0xf0);
231 return 1;
232 } else {
233 prox = data[1] & 0x80;
234 if (prox) {
235 switch ((data[1] >> 3) & 3) {
236 case 1: /* Rubber */
237 wacom->tool[0] = BTN_TOOL_RUBBER;
238 wacom->id[0] = ERASER_DEVICE_ID;
239 break;
240
241 case 2: /* Pen */
242 wacom->tool[0] = BTN_TOOL_PEN;
243 wacom->id[0] = STYLUS_DEVICE_ID;
244 break;
245 }
246 }
247
248 input_report_key(input, BTN_STYLUS, data[1] & 0x20);
249 input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
250 input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
251 input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
252 pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
253 input_report_abs(input, ABS_PRESSURE, pressure);
254 input_report_key(input, BTN_TOUCH, pressure > 10);
255
256 if (!prox) /* out-prox */
257 wacom->id[0] = 0;
258 input_report_key(input, wacom->tool[0], prox);
259 input_report_abs(input, ABS_MISC, wacom->id[0]);
260 input_event(input, EV_MSC, MSC_SERIAL, 1);
261 return 1;
262 }
263}
264
265static int wacom_graphire_irq(struct wacom_wac *wacom)
266{
267 struct wacom_features *features = &wacom->features;
268 unsigned char *data = wacom->data;
269 struct input_dev *input = wacom->input;
270 int prox;
271 int rw = 0;
272 int retval = 0;
273
274 if (data[0] != WACOM_REPORT_PENABLED) {
275 dev_dbg(input->dev.parent,
276 "%s: received unknown report #%d\n", __func__, data[0]);
277 goto exit;
278 }
279
280 prox = data[1] & 0x80;
281 if (prox || wacom->id[0]) {
282 if (prox) {
283 switch ((data[1] >> 5) & 3) {
284
285 case 0: /* Pen */
286 wacom->tool[0] = BTN_TOOL_PEN;
287 wacom->id[0] = STYLUS_DEVICE_ID;
288 break;
289
290 case 1: /* Rubber */
291 wacom->tool[0] = BTN_TOOL_RUBBER;
292 wacom->id[0] = ERASER_DEVICE_ID;
293 break;
294
295 case 2: /* Mouse with wheel */
296 input_report_key(input, BTN_MIDDLE, data[1] & 0x04);
297 /* fall through */
298
299 case 3: /* Mouse without wheel */
300 wacom->tool[0] = BTN_TOOL_MOUSE;
301 wacom->id[0] = CURSOR_DEVICE_ID;
302 break;
303 }
304 }
305 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
306 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
307 if (wacom->tool[0] != BTN_TOOL_MOUSE) {
308 input_report_abs(input, ABS_PRESSURE, data[6] | ((data[7] & 0x03) << 8));
309 input_report_key(input, BTN_TOUCH, data[1] & 0x01);
310 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
311 input_report_key(input, BTN_STYLUS2, data[1] & 0x04);
312 } else {
313 input_report_key(input, BTN_LEFT, data[1] & 0x01);
314 input_report_key(input, BTN_RIGHT, data[1] & 0x02);
315 if (features->type == WACOM_G4 ||
316 features->type == WACOM_MO) {
317 input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f);
318 rw = (data[7] & 0x04) - (data[7] & 0x03);
319 } else {
320 input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f);
321 rw = -(signed char)data[6];
322 }
323 input_report_rel(input, REL_WHEEL, rw);
324 }
325
326 if (!prox)
327 wacom->id[0] = 0;
328 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
329 input_report_key(input, wacom->tool[0], prox);
330 input_event(input, EV_MSC, MSC_SERIAL, 1);
331 input_sync(input); /* sync last event */
332 }
333
334 /* send pad data */
335 switch (features->type) {
336 case WACOM_G4:
337 prox = data[7] & 0xf8;
338 if (prox || wacom->id[1]) {
339 wacom->id[1] = PAD_DEVICE_ID;
340 input_report_key(input, BTN_BACK, (data[7] & 0x40));
341 input_report_key(input, BTN_FORWARD, (data[7] & 0x80));
342 rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
343 input_report_rel(input, REL_WHEEL, rw);
344 if (!prox)
345 wacom->id[1] = 0;
346 input_report_abs(input, ABS_MISC, wacom->id[1]);
347 input_event(input, EV_MSC, MSC_SERIAL, 0xf0);
348 retval = 1;
349 }
350 break;
351
352 case WACOM_MO:
353 prox = (data[7] & 0xf8) || data[8];
354 if (prox || wacom->id[1]) {
355 wacom->id[1] = PAD_DEVICE_ID;
356 input_report_key(input, BTN_BACK, (data[7] & 0x08));
357 input_report_key(input, BTN_LEFT, (data[7] & 0x20));
358 input_report_key(input, BTN_FORWARD, (data[7] & 0x10));
359 input_report_key(input, BTN_RIGHT, (data[7] & 0x40));
360 input_report_abs(input, ABS_WHEEL, (data[8] & 0x7f));
361 if (!prox)
362 wacom->id[1] = 0;
363 input_report_abs(input, ABS_MISC, wacom->id[1]);
364 input_event(input, EV_MSC, MSC_SERIAL, 0xf0);
365 retval = 1;
366 }
367 break;
368 }
369exit:
370 return retval;
371}
372
373static int wacom_intuos_inout(struct wacom_wac *wacom)
374{
375 struct wacom_features *features = &wacom->features;
376 unsigned char *data = wacom->data;
377 struct input_dev *input = wacom->input;
378 int idx = 0;
379
380 /* tool number */
381 if (features->type == INTUOS)
382 idx = data[1] & 0x01;
383
384 /* Enter report */
385 if ((data[1] & 0xfc) == 0xc0) {
386 if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
387 wacom->shared->stylus_in_proximity = true;
388
389 /* serial number of the tool */
390 wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
391 (data[4] << 20) + (data[5] << 12) +
392 (data[6] << 4) + (data[7] >> 4);
393
394 wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) |
395 ((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12);
396
397 switch (wacom->id[idx]) {
398 case 0x812: /* Inking pen */
399 case 0x801: /* Intuos3 Inking pen */
400 case 0x120802: /* Intuos4/5 Inking Pen */
401 case 0x012:
402 wacom->tool[idx] = BTN_TOOL_PENCIL;
403 break;
404
405 case 0x822: /* Pen */
406 case 0x842:
407 case 0x852:
408 case 0x823: /* Intuos3 Grip Pen */
409 case 0x813: /* Intuos3 Classic Pen */
410 case 0x885: /* Intuos3 Marker Pen */
411 case 0x802: /* Intuos4/5 13HD/24HD General Pen */
412 case 0x804: /* Intuos4/5 13HD/24HD Marker Pen */
413 case 0x022:
414 case 0x100804: /* Intuos4/5 13HD/24HD Art Pen */
415 case 0x140802: /* Intuos4/5 13HD/24HD Classic Pen */
416 case 0x160802: /* Cintiq 13HD Pro Pen */
417 case 0x180802: /* DTH2242 Pen */
418 case 0x100802: /* Intuos4/5 13HD/24HD General Pen */
419 wacom->tool[idx] = BTN_TOOL_PEN;
420 break;
421
422 case 0x832: /* Stroke pen */
423 case 0x032:
424 wacom->tool[idx] = BTN_TOOL_BRUSH;
425 break;
426
427 case 0x007: /* Mouse 4D and 2D */
428 case 0x09c:
429 case 0x094:
430 case 0x017: /* Intuos3 2D Mouse */
431 case 0x806: /* Intuos4 Mouse */
432 wacom->tool[idx] = BTN_TOOL_MOUSE;
433 break;
434
435 case 0x096: /* Lens cursor */
436 case 0x097: /* Intuos3 Lens cursor */
437 case 0x006: /* Intuos4 Lens cursor */
438 wacom->tool[idx] = BTN_TOOL_LENS;
439 break;
440
441 case 0x82a: /* Eraser */
442 case 0x85a:
443 case 0x91a:
444 case 0xd1a:
445 case 0x0fa:
446 case 0x82b: /* Intuos3 Grip Pen Eraser */
447 case 0x81b: /* Intuos3 Classic Pen Eraser */
448 case 0x91b: /* Intuos3 Airbrush Eraser */
449 case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */
450 case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */
451 case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
452 case 0x14080a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */
453 case 0x10090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
454 case 0x10080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
455 case 0x16080a: /* Cintiq 13HD Pro Pen Eraser */
456 case 0x18080a: /* DTH2242 Eraser */
457 case 0x10080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
458 wacom->tool[idx] = BTN_TOOL_RUBBER;
459 break;
460
461 case 0xd12:
462 case 0x912:
463 case 0x112:
464 case 0x913: /* Intuos3 Airbrush */
465 case 0x902: /* Intuos4/5 13HD/24HD Airbrush */
466 case 0x100902: /* Intuos4/5 13HD/24HD Airbrush */
467 wacom->tool[idx] = BTN_TOOL_AIRBRUSH;
468 break;
469
470 default: /* Unknown tool */
471 wacom->tool[idx] = BTN_TOOL_PEN;
472 break;
473 }
474 return 1;
475 }
476
477 /* older I4 styli don't work with new Cintiqs */
478 if (!((wacom->id[idx] >> 20) & 0x01) &&
479 (features->type == WACOM_21UX2))
480 return 1;
481
482 /* Range Report */
483 if ((data[1] & 0xfe) == 0x20) {
484 input_report_key(input, BTN_TOUCH, 0);
485 input_report_abs(input, ABS_PRESSURE, 0);
486 input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
487 if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
488 wacom->shared->stylus_in_proximity = true;
489 }
490
491 /* Exit report */
492 if ((data[1] & 0xfe) == 0x80) {
493 if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
494 wacom->shared->stylus_in_proximity = false;
495
496 /*
497 * Reset all states otherwise we lose the initial states
498 * when in-prox next time
499 */
500 input_report_abs(input, ABS_X, 0);
501 input_report_abs(input, ABS_Y, 0);
502 input_report_abs(input, ABS_DISTANCE, 0);
503 input_report_abs(input, ABS_TILT_X, 0);
504 input_report_abs(input, ABS_TILT_Y, 0);
505 if (wacom->tool[idx] >= BTN_TOOL_MOUSE) {
506 input_report_key(input, BTN_LEFT, 0);
507 input_report_key(input, BTN_MIDDLE, 0);
508 input_report_key(input, BTN_RIGHT, 0);
509 input_report_key(input, BTN_SIDE, 0);
510 input_report_key(input, BTN_EXTRA, 0);
511 input_report_abs(input, ABS_THROTTLE, 0);
512 input_report_abs(input, ABS_RZ, 0);
513 } else {
514 input_report_abs(input, ABS_PRESSURE, 0);
515 input_report_key(input, BTN_STYLUS, 0);
516 input_report_key(input, BTN_STYLUS2, 0);
517 input_report_key(input, BTN_TOUCH, 0);
518 input_report_abs(input, ABS_WHEEL, 0);
519 if (features->type >= INTUOS3S)
520 input_report_abs(input, ABS_Z, 0);
521 }
522 input_report_key(input, wacom->tool[idx], 0);
523 input_report_abs(input, ABS_MISC, 0); /* reset tool id */
524 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
525 wacom->id[idx] = 0;
526 return 2;
527 }
528 return 0;
529}
530
531static void wacom_intuos_general(struct wacom_wac *wacom)
532{
533 struct wacom_features *features = &wacom->features;
534 unsigned char *data = wacom->data;
535 struct input_dev *input = wacom->input;
536 unsigned int t;
537
538 /* general pen packet */
539 if ((data[1] & 0xb8) == 0xa0) {
540 t = (data[6] << 2) | ((data[7] >> 6) & 3);
541 if (features->type >= INTUOS4S && features->type <= CINTIQ_HYBRID) {
542 t = (t << 1) | (data[1] & 1);
543 }
544 input_report_abs(input, ABS_PRESSURE, t);
545 input_report_abs(input, ABS_TILT_X,
546 ((data[7] << 1) & 0x7e) | (data[8] >> 7));
547 input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f);
548 input_report_key(input, BTN_STYLUS, data[1] & 2);
549 input_report_key(input, BTN_STYLUS2, data[1] & 4);
550 input_report_key(input, BTN_TOUCH, t > 10);
551 }
552
553 /* airbrush second packet */
554 if ((data[1] & 0xbc) == 0xb4) {
555 input_report_abs(input, ABS_WHEEL,
556 (data[6] << 2) | ((data[7] >> 6) & 3));
557 input_report_abs(input, ABS_TILT_X,
558 ((data[7] << 1) & 0x7e) | (data[8] >> 7));
559 input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f);
560 }
561}
562
563static int wacom_intuos_irq(struct wacom_wac *wacom)
564{
565 struct wacom_features *features = &wacom->features;
566 unsigned char *data = wacom->data;
567 struct input_dev *input = wacom->input;
568 unsigned int t;
569 int idx = 0, result;
570
571 if (data[0] != WACOM_REPORT_PENABLED &&
572 data[0] != WACOM_REPORT_INTUOSREAD &&
573 data[0] != WACOM_REPORT_INTUOSWRITE &&
574 data[0] != WACOM_REPORT_INTUOSPAD &&
575 data[0] != WACOM_REPORT_INTUOS5PAD) {
576 dev_dbg(input->dev.parent,
577 "%s: received unknown report #%d\n", __func__, data[0]);
578 return 0;
579 }
580
581 /* tool number */
582 if (features->type == INTUOS)
583 idx = data[1] & 0x01;
584
585 /* pad packets. Works as a second tool and is always in prox */
586 if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD) {
587 if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
588 input_report_key(input, BTN_0, (data[2] & 0x01));
589 input_report_key(input, BTN_1, (data[3] & 0x01));
590 input_report_key(input, BTN_2, (data[3] & 0x02));
591 input_report_key(input, BTN_3, (data[3] & 0x04));
592 input_report_key(input, BTN_4, (data[3] & 0x08));
593 input_report_key(input, BTN_5, (data[3] & 0x10));
594 input_report_key(input, BTN_6, (data[3] & 0x20));
595 if (data[1] & 0x80) {
596 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
597 } else {
598 /* Out of proximity, clear wheel value. */
599 input_report_abs(input, ABS_WHEEL, 0);
600 }
601 if (features->type != INTUOS4S) {
602 input_report_key(input, BTN_7, (data[3] & 0x40));
603 input_report_key(input, BTN_8, (data[3] & 0x80));
604 }
605 if (data[1] | (data[2] & 0x01) | data[3]) {
606 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
607 } else {
608 input_report_abs(input, ABS_MISC, 0);
609 }
610 } else if (features->type == DTK) {
611 input_report_key(input, BTN_0, (data[6] & 0x01));
612 input_report_key(input, BTN_1, (data[6] & 0x02));
613 input_report_key(input, BTN_2, (data[6] & 0x04));
614 input_report_key(input, BTN_3, (data[6] & 0x08));
615 input_report_key(input, BTN_4, (data[6] & 0x10));
616 input_report_key(input, BTN_5, (data[6] & 0x20));
617 if (data[6] & 0x3f) {
618 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
619 } else {
620 input_report_abs(input, ABS_MISC, 0);
621 }
622 } else if (features->type == WACOM_13HD) {
623 input_report_key(input, BTN_0, (data[3] & 0x01));
624 input_report_key(input, BTN_1, (data[4] & 0x01));
625 input_report_key(input, BTN_2, (data[4] & 0x02));
626 input_report_key(input, BTN_3, (data[4] & 0x04));
627 input_report_key(input, BTN_4, (data[4] & 0x08));
628 input_report_key(input, BTN_5, (data[4] & 0x10));
629 input_report_key(input, BTN_6, (data[4] & 0x20));
630 input_report_key(input, BTN_7, (data[4] & 0x40));
631 input_report_key(input, BTN_8, (data[4] & 0x80));
632 if ((data[3] & 0x01) | data[4]) {
633 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
634 } else {
635 input_report_abs(input, ABS_MISC, 0);
636 }
637 } else if (features->type == WACOM_24HD) {
638 input_report_key(input, BTN_0, (data[6] & 0x01));
639 input_report_key(input, BTN_1, (data[6] & 0x02));
640 input_report_key(input, BTN_2, (data[6] & 0x04));
641 input_report_key(input, BTN_3, (data[6] & 0x08));
642 input_report_key(input, BTN_4, (data[6] & 0x10));
643 input_report_key(input, BTN_5, (data[6] & 0x20));
644 input_report_key(input, BTN_6, (data[6] & 0x40));
645 input_report_key(input, BTN_7, (data[6] & 0x80));
646 input_report_key(input, BTN_8, (data[8] & 0x01));
647 input_report_key(input, BTN_9, (data[8] & 0x02));
648 input_report_key(input, BTN_A, (data[8] & 0x04));
649 input_report_key(input, BTN_B, (data[8] & 0x08));
650 input_report_key(input, BTN_C, (data[8] & 0x10));
651 input_report_key(input, BTN_X, (data[8] & 0x20));
652 input_report_key(input, BTN_Y, (data[8] & 0x40));
653 input_report_key(input, BTN_Z, (data[8] & 0x80));
654
655 /*
656 * Three "buttons" are available on the 24HD which are
657 * physically implemented as a touchstrip. Each button
658 * is approximately 3 bits wide with a 2 bit spacing.
659 * The raw touchstrip bits are stored at:
660 * ((data[3] & 0x1f) << 8) | data[4])
661 */
662 input_report_key(input, KEY_PROG1, data[4] & 0x07);
663 input_report_key(input, KEY_PROG2, data[4] & 0xE0);
664 input_report_key(input, KEY_PROG3, data[3] & 0x1C);
665
666 if (data[1] & 0x80) {
667 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
668 } else {
669 /* Out of proximity, clear wheel value. */
670 input_report_abs(input, ABS_WHEEL, 0);
671 }
672
673 if (data[2] & 0x80) {
674 input_report_abs(input, ABS_THROTTLE, (data[2] & 0x7f));
675 } else {
676 /* Out of proximity, clear second wheel value. */
677 input_report_abs(input, ABS_THROTTLE, 0);
678 }
679
680 if (data[1] | data[2] | (data[3] & 0x1f) | data[4] | data[6] | data[8]) {
681 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
682 } else {
683 input_report_abs(input, ABS_MISC, 0);
684 }
685 } else if (features->type == CINTIQ_HYBRID) {
686 /*
687 * Do not send hardware buttons under Android. They
688 * are already sent to the system through GPIO (and
689 * have different meaning).
690 */
691 input_report_key(input, BTN_1, (data[4] & 0x01));
692 input_report_key(input, BTN_2, (data[4] & 0x02));
693 input_report_key(input, BTN_3, (data[4] & 0x04));
694 input_report_key(input, BTN_4, (data[4] & 0x08));
695
696 input_report_key(input, BTN_5, (data[4] & 0x10)); /* Right */
697 input_report_key(input, BTN_6, (data[4] & 0x20)); /* Up */
698 input_report_key(input, BTN_7, (data[4] & 0x40)); /* Left */
699 input_report_key(input, BTN_8, (data[4] & 0x80)); /* Down */
700 input_report_key(input, BTN_0, (data[3] & 0x01)); /* Center */
701 } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
702 int i;
703
704 /* Touch ring mode switch has no capacitive sensor */
705 input_report_key(input, BTN_0, (data[3] & 0x01));
706
707 /*
708 * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
709 * addition to the mechanical switch. Switch data is
710 * stored in data[4], capacitive data in data[5].
711 */
712 for (i = 0; i < 8; i++)
713 input_report_key(input, BTN_1 + i, data[4] & (1 << i));
714
715 if (data[2] & 0x80) {
716 input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f));
717 } else {
718 /* Out of proximity, clear wheel value. */
719 input_report_abs(input, ABS_WHEEL, 0);
720 }
721
722 if (data[2] | (data[3] & 0x01) | data[4] | data[5]) {
723 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
724 } else {
725 input_report_abs(input, ABS_MISC, 0);
726 }
727 } else {
728 if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
729 input_report_key(input, BTN_0, (data[5] & 0x01));
730 input_report_key(input, BTN_1, (data[6] & 0x01));
731 input_report_key(input, BTN_2, (data[6] & 0x02));
732 input_report_key(input, BTN_3, (data[6] & 0x04));
733 input_report_key(input, BTN_4, (data[6] & 0x08));
734 input_report_key(input, BTN_5, (data[6] & 0x10));
735 input_report_key(input, BTN_6, (data[6] & 0x20));
736 input_report_key(input, BTN_7, (data[6] & 0x40));
737 input_report_key(input, BTN_8, (data[6] & 0x80));
738 input_report_key(input, BTN_9, (data[7] & 0x01));
739 input_report_key(input, BTN_A, (data[8] & 0x01));
740 input_report_key(input, BTN_B, (data[8] & 0x02));
741 input_report_key(input, BTN_C, (data[8] & 0x04));
742 input_report_key(input, BTN_X, (data[8] & 0x08));
743 input_report_key(input, BTN_Y, (data[8] & 0x10));
744 input_report_key(input, BTN_Z, (data[8] & 0x20));
745 input_report_key(input, BTN_BASE, (data[8] & 0x40));
746 input_report_key(input, BTN_BASE2, (data[8] & 0x80));
747
748 if (features->type == WACOM_22HD) {
749 input_report_key(input, KEY_PROG1, data[9] & 0x01);
750 input_report_key(input, KEY_PROG2, data[9] & 0x02);
751 input_report_key(input, KEY_PROG3, data[9] & 0x04);
752 }
753 } else {
754 input_report_key(input, BTN_0, (data[5] & 0x01));
755 input_report_key(input, BTN_1, (data[5] & 0x02));
756 input_report_key(input, BTN_2, (data[5] & 0x04));
757 input_report_key(input, BTN_3, (data[5] & 0x08));
758 input_report_key(input, BTN_4, (data[6] & 0x01));
759 input_report_key(input, BTN_5, (data[6] & 0x02));
760 input_report_key(input, BTN_6, (data[6] & 0x04));
761 input_report_key(input, BTN_7, (data[6] & 0x08));
762 input_report_key(input, BTN_8, (data[5] & 0x10));
763 input_report_key(input, BTN_9, (data[6] & 0x10));
764 }
765 input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]);
766 input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]);
767
768 if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) |
769 data[2] | (data[3] & 0x1f) | data[4] | data[8] |
770 (data[7] & 0x01)) {
771 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
772 } else {
773 input_report_abs(input, ABS_MISC, 0);
774 }
775 }
776 input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
777 return 1;
778 }
779
780 /* process in/out prox events */
781 result = wacom_intuos_inout(wacom);
782 if (result)
783 return result - 1;
784
785 /* don't proceed if we don't know the ID */
786 if (!wacom->id[idx])
787 return 0;
788
789 /* Only large Intuos support Lense Cursor */
790 if (wacom->tool[idx] == BTN_TOOL_LENS &&
791 (features->type == INTUOS3 ||
792 features->type == INTUOS3S ||
793 features->type == INTUOS4 ||
794 features->type == INTUOS4S ||
795 features->type == INTUOS5 ||
796 features->type == INTUOS5S ||
797 features->type == INTUOSPM ||
798 features->type == INTUOSPS)) {
799
800 return 0;
801 }
802
803 /* Cintiq doesn't send data when RDY bit isn't set */
804 if (features->type == CINTIQ && !(data[1] & 0x40))
805 return 0;
806
807 if (features->type >= INTUOS3S) {
808 input_report_abs(input, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
809 input_report_abs(input, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
810 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
811 } else {
812 input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2]));
813 input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4]));
814 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
815 }
816
817 /* process general packets */
818 wacom_intuos_general(wacom);
819
820 /* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */
821 if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0 || (data[1] & 0xbc) == 0xac) {
822
823 if (data[1] & 0x02) {
824 /* Rotation packet */
825 if (features->type >= INTUOS3S) {
826 /* I3 marker pen rotation */
827 t = (data[6] << 3) | ((data[7] >> 5) & 7);
828 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
829 ((t-1) / 2 + 450)) : (450 - t / 2) ;
830 input_report_abs(input, ABS_Z, t);
831 } else {
832 /* 4D mouse rotation packet */
833 t = (data[6] << 3) | ((data[7] >> 5) & 7);
834 input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
835 ((t - 1) / 2) : -t / 2);
836 }
837
838 } else if (!(data[1] & 0x10) && features->type < INTUOS3S) {
839 /* 4D mouse packet */
840 input_report_key(input, BTN_LEFT, data[8] & 0x01);
841 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
842 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
843
844 input_report_key(input, BTN_SIDE, data[8] & 0x20);
845 input_report_key(input, BTN_EXTRA, data[8] & 0x10);
846 t = (data[6] << 2) | ((data[7] >> 6) & 3);
847 input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
848
849 } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
850 /* I4 mouse */
851 if (features->type >= INTUOS4S && features->type <= INTUOSPL) {
852 input_report_key(input, BTN_LEFT, data[6] & 0x01);
853 input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
854 input_report_key(input, BTN_RIGHT, data[6] & 0x04);
855 input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
856 - ((data[7] & 0x40) >> 6));
857 input_report_key(input, BTN_SIDE, data[6] & 0x08);
858 input_report_key(input, BTN_EXTRA, data[6] & 0x10);
859
860 input_report_abs(input, ABS_TILT_X,
861 ((data[7] << 1) & 0x7e) | (data[8] >> 7));
862 input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f);
863 } else {
864 /* 2D mouse packet */
865 input_report_key(input, BTN_LEFT, data[8] & 0x04);
866 input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
867 input_report_key(input, BTN_RIGHT, data[8] & 0x10);
868 input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
869 - ((data[8] & 0x02) >> 1));
870
871 /* I3 2D mouse side buttons */
872 if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
873 input_report_key(input, BTN_SIDE, data[8] & 0x40);
874 input_report_key(input, BTN_EXTRA, data[8] & 0x20);
875 }
876 }
877 } else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
878 features->type == INTUOS4L || features->type == INTUOS5L ||
879 features->type == INTUOSPL) &&
880 wacom->tool[idx] == BTN_TOOL_LENS) {
881 /* Lens cursor packets */
882 input_report_key(input, BTN_LEFT, data[8] & 0x01);
883 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
884 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
885 input_report_key(input, BTN_SIDE, data[8] & 0x10);
886 input_report_key(input, BTN_EXTRA, data[8] & 0x08);
887 }
888 }
889
890 input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
891 input_report_key(input, wacom->tool[idx], 1);
892 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
893 return 1;
894}
895
896static int int_dist(int x1, int y1, int x2, int y2)
897{
898 int x = x2 - x1;
899 int y = y2 - y1;
900
901 return int_sqrt(x*x + y*y);
902}
903
904static int wacom_24hdt_irq(struct wacom_wac *wacom)
905{
906 struct input_dev *input = wacom->input;
907 unsigned char *data = wacom->data;
908 int i;
909 int current_num_contacts = data[61];
910 int contacts_to_send = 0;
911
912 /*
913 * First packet resets the counter since only the first
914 * packet in series will have non-zero current_num_contacts.
915 */
916 if (current_num_contacts)
917 wacom->num_contacts_left = current_num_contacts;
918
919 /* There are at most 4 contacts per packet */
920 contacts_to_send = min(4, wacom->num_contacts_left);
921
922 for (i = 0; i < contacts_to_send; i++) {
923 int offset = (WACOM_BYTES_PER_24HDT_PACKET * i) + 1;
924 bool touch = data[offset] & 0x1 && !wacom->shared->stylus_in_proximity;
925 int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
926
927 if (slot < 0)
928 continue;
929 input_mt_slot(input, slot);
930 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
931
932 if (touch) {
933 int t_x = get_unaligned_le16(&data[offset + 2]);
934 int c_x = get_unaligned_le16(&data[offset + 4]);
935 int t_y = get_unaligned_le16(&data[offset + 6]);
936 int c_y = get_unaligned_le16(&data[offset + 8]);
937 int w = get_unaligned_le16(&data[offset + 10]);
938 int h = get_unaligned_le16(&data[offset + 12]);
939
940 input_report_abs(input, ABS_MT_POSITION_X, t_x);
941 input_report_abs(input, ABS_MT_POSITION_Y, t_y);
942 input_report_abs(input, ABS_MT_TOUCH_MAJOR, min(w,h));
943 input_report_abs(input, ABS_MT_WIDTH_MAJOR, min(w, h) + int_dist(t_x, t_y, c_x, c_y));
944 input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
945 input_report_abs(input, ABS_MT_ORIENTATION, w > h);
946 }
947 }
948 input_mt_report_pointer_emulation(input, true);
949
950 wacom->num_contacts_left -= contacts_to_send;
951 if (wacom->num_contacts_left <= 0)
952 wacom->num_contacts_left = 0;
953
954 return 1;
955}
956
957static int wacom_mt_touch(struct wacom_wac *wacom)
958{
959 struct input_dev *input = wacom->input;
960 unsigned char *data = wacom->data;
961 int i;
962 int current_num_contacts = data[2];
963 int contacts_to_send = 0;
964 int x_offset = 0;
965
966 /* MTTPC does not support Height and Width */
967 if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
968 x_offset = -4;
969
970 /*
971 * First packet resets the counter since only the first
972 * packet in series will have non-zero current_num_contacts.
973 */
974 if (current_num_contacts)
975 wacom->num_contacts_left = current_num_contacts;
976
977 /* There are at most 5 contacts per packet */
978 contacts_to_send = min(5, wacom->num_contacts_left);
979
980 for (i = 0; i < contacts_to_send; i++) {
981 int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
982 bool touch = data[offset] & 0x1;
983 int id = get_unaligned_le16(&data[offset + 1]);
984 int slot = input_mt_get_slot_by_key(input, id);
985
986 if (slot < 0)
987 continue;
988
989 input_mt_slot(input, slot);
990 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
991 if (touch) {
992 int x = get_unaligned_le16(&data[offset + x_offset + 7]);
993 int y = get_unaligned_le16(&data[offset + x_offset + 9]);
994 input_report_abs(input, ABS_MT_POSITION_X, x);
995 input_report_abs(input, ABS_MT_POSITION_Y, y);
996 }
997 }
998 input_mt_report_pointer_emulation(input, true);
999
1000 wacom->num_contacts_left -= contacts_to_send;
1001 if (wacom->num_contacts_left < 0)
1002 wacom->num_contacts_left = 0;
1003
1004 return 1;
1005}
1006
1007static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
1008{
1009 struct input_dev *input = wacom->input;
1010 unsigned char *data = wacom->data;
1011 int contact_with_no_pen_down_count = 0;
1012 int i;
1013
1014 for (i = 0; i < 2; i++) {
1015 int p = data[1] & (1 << i);
1016 bool touch = p && !wacom->shared->stylus_in_proximity;
1017
1018 input_mt_slot(input, i);
1019 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1020 if (touch) {
1021 int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff;
1022 int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff;
1023
1024 input_report_abs(input, ABS_MT_POSITION_X, x);
1025 input_report_abs(input, ABS_MT_POSITION_Y, y);
1026 contact_with_no_pen_down_count++;
1027 }
1028 }
1029 input_mt_report_pointer_emulation(input, true);
1030
1031 /* keep touch state for pen event */
1032 wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
1033
1034 return 1;
1035}
1036
1037static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
1038{
1039 unsigned char *data = wacom->data;
1040 struct input_dev *input = wacom->input;
1041 bool prox;
1042 int x = 0, y = 0;
1043
1044 if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG)
1045 return 0;
1046
1047 if (!wacom->shared->stylus_in_proximity) {
1048 if (len == WACOM_PKGLEN_TPC1FG) {
1049 prox = data[0] & 0x01;
1050 x = get_unaligned_le16(&data[1]);
1051 y = get_unaligned_le16(&data[3]);
1052 } else if (len == WACOM_PKGLEN_TPC1FG_B) {
1053 prox = data[2] & 0x01;
1054 x = get_unaligned_le16(&data[3]);
1055 y = get_unaligned_le16(&data[5]);
1056 } else {
1057 prox = data[1] & 0x01;
1058 x = le16_to_cpup((__le16 *)&data[2]);
1059 y = le16_to_cpup((__le16 *)&data[4]);
1060 }
1061 } else
1062 /* force touch out when pen is in prox */
1063 prox = 0;
1064
1065 if (prox) {
1066 input_report_abs(input, ABS_X, x);
1067 input_report_abs(input, ABS_Y, y);
1068 }
1069 input_report_key(input, BTN_TOUCH, prox);
1070
1071 /* keep touch state for pen events */
1072 wacom->shared->touch_down = prox;
1073
1074 return 1;
1075}
1076
1077static int wacom_tpc_pen(struct wacom_wac *wacom)
1078{
1079 unsigned char *data = wacom->data;
1080 struct input_dev *input = wacom->input;
1081 bool prox = data[1] & 0x20;
1082
1083 if (!wacom->shared->stylus_in_proximity) /* first in prox */
1084 /* Going into proximity select tool */
1085 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
1086
1087 /* keep pen state for touch events */
1088 wacom->shared->stylus_in_proximity = prox;
1089
1090 /* send pen events only when touch is up or forced out */
1091 if (!wacom->shared->touch_down) {
1092 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
1093 input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
1094 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
1095 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
1096 input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x03) << 8) | data[6]);
1097 input_report_key(input, BTN_TOUCH, data[1] & 0x05);
1098 input_report_key(input, wacom->tool[0], prox);
1099 return 1;
1100 }
1101
1102 return 0;
1103}
1104
1105static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
1106{
1107 unsigned char *data = wacom->data;
1108
1109 dev_dbg(wacom->input->dev.parent,
1110 "%s: received report #%d\n", __func__, data[0]);
1111
1112 switch (len) {
1113 case WACOM_PKGLEN_TPC1FG:
1114 return wacom_tpc_single_touch(wacom, len);
1115
1116 case WACOM_PKGLEN_TPC2FG:
1117 return wacom_tpc_mt_touch(wacom);
1118
1119 case WACOM_PKGLEN_PENABLED:
1120 return wacom_tpc_pen(wacom);
1121
1122 default:
1123 switch (data[0]) {
1124 case WACOM_REPORT_TPC1FG:
1125 case WACOM_REPORT_TPCHID:
1126 case WACOM_REPORT_TPCST:
1127 case WACOM_REPORT_TPC1FGE:
1128 return wacom_tpc_single_touch(wacom, len);
1129
1130 case WACOM_REPORT_TPCMT:
1131 case WACOM_REPORT_TPCMT2:
1132 return wacom_mt_touch(wacom);
1133
1134 case WACOM_REPORT_PENABLED:
1135 return wacom_tpc_pen(wacom);
1136 }
1137 }
1138
1139 return 0;
1140}
1141
1142static int wacom_bpt_touch(struct wacom_wac *wacom)
1143{
1144 struct wacom_features *features = &wacom->features;
1145 struct input_dev *input = wacom->input;
1146 unsigned char *data = wacom->data;
1147 int i;
1148
1149 if (data[0] != 0x02)
1150 return 0;
1151
1152 for (i = 0; i < 2; i++) {
1153 int offset = (data[1] & 0x80) ? (8 * i) : (9 * i);
1154 bool touch = data[offset + 3] & 0x80;
1155
1156 /*
1157 * Touch events need to be disabled while stylus is
1158 * in proximity because user's hand is resting on touchpad
1159 * and sending unwanted events. User expects tablet buttons
1160 * to continue working though.
1161 */
1162 touch = touch && !wacom->shared->stylus_in_proximity;
1163
1164 input_mt_slot(input, i);
1165 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1166 if (touch) {
1167 int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff;
1168 int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff;
1169 if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
1170 x <<= 5;
1171 y <<= 5;
1172 }
1173 input_report_abs(input, ABS_MT_POSITION_X, x);
1174 input_report_abs(input, ABS_MT_POSITION_Y, y);
1175 }
1176 }
1177
1178 input_mt_report_pointer_emulation(input, true);
1179
1180 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
1181 input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
1182 input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
1183 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
1184
1185 input_sync(input);
1186
1187 return 0;
1188}
1189
1190static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
1191{
1192 struct wacom_features *features = &wacom->features;
1193 struct input_dev *input = wacom->input;
1194 bool touch = data[1] & 0x80;
1195 int slot = input_mt_get_slot_by_key(input, data[0]);
1196
1197 if (slot < 0)
1198 return;
1199
1200 touch = touch && !wacom->shared->stylus_in_proximity;
1201
1202 input_mt_slot(input, slot);
1203 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1204
1205 if (touch) {
1206 int x = (data[2] << 4) | (data[4] >> 4);
1207 int y = (data[3] << 4) | (data[4] & 0x0f);
1208 int width, height;
1209
1210 if (features->type >= INTUOSPS && features->type <= INTUOSPL) {
1211 width = data[5] * 100;
1212 height = data[6] * 100;
1213 } else {
1214 /*
1215 * "a" is a scaled-down area which we assume is
1216 * roughly circular and which can be described as:
1217 * a=(pi*r^2)/C.
1218 */
1219 int a = data[5];
1220 int x_res = input_abs_get_res(input, ABS_MT_POSITION_X);
1221 int y_res = input_abs_get_res(input, ABS_MT_POSITION_Y);
1222 width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE);
1223 height = width * y_res / x_res;
1224 }
1225
1226 input_report_abs(input, ABS_MT_POSITION_X, x);
1227 input_report_abs(input, ABS_MT_POSITION_Y, y);
1228 input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
1229 input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
1230 }
1231}
1232
1233static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
1234{
1235 struct input_dev *input = wacom->input;
1236 struct wacom_features *features = &wacom->features;
1237
1238 if (features->type == INTUOSHT) {
1239 input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0);
1240 input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0);
1241 } else {
1242 input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
1243 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
1244 }
1245 input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
1246 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
1247}
1248
1249static int wacom_bpt3_touch(struct wacom_wac *wacom)
1250{
1251 struct input_dev *input = wacom->input;
1252 unsigned char *data = wacom->data;
1253 int count = data[1] & 0x07;
1254 int i;
1255
1256 if (data[0] != 0x02)
1257 return 0;
1258
1259 /* data has up to 7 fixed sized 8-byte messages starting at data[2] */
1260 for (i = 0; i < count; i++) {
1261 int offset = (8 * i) + 2;
1262 int msg_id = data[offset];
1263
1264 if (msg_id >= 2 && msg_id <= 17)
1265 wacom_bpt3_touch_msg(wacom, data + offset);
1266 else if (msg_id == 128)
1267 wacom_bpt3_button_msg(wacom, data + offset);
1268
1269 }
1270 input_mt_report_pointer_emulation(input, true);
1271
1272 input_sync(input);
1273
1274 return 0;
1275}
1276
1277static int wacom_bpt_pen(struct wacom_wac *wacom)
1278{
1279 struct wacom_features *features = &wacom->features;
1280 struct input_dev *input = wacom->input;
1281 unsigned char *data = wacom->data;
1282 int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
1283
1284 if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_USB)
1285 return 0;
1286
1287 if (data[0] == WACOM_REPORT_USB) {
1288 if (features->type == INTUOSHT && features->touch_max) {
1289 input_report_switch(wacom->shared->touch_input,
1290 SW_MUTE_DEVICE, data[8] & 0x40);
1291 input_sync(wacom->shared->touch_input);
1292 }
1293 return 0;
1294 }
1295
1296 prox = (data[1] & 0x20) == 0x20;
1297
1298 /*
1299 * All reports shared between PEN and RUBBER tool must be
1300 * forced to a known starting value (zero) when transitioning to
1301 * out-of-prox.
1302 *
1303 * If not reset then, to userspace, it will look like lost events
1304 * if new tool comes in-prox with same values as previous tool sent.
1305 *
1306 * Hardware does report zero in most out-of-prox cases but not all.
1307 */
1308 if (prox) {
1309 if (!wacom->shared->stylus_in_proximity) {
1310 if (data[1] & 0x08) {
1311 wacom->tool[0] = BTN_TOOL_RUBBER;
1312 wacom->id[0] = ERASER_DEVICE_ID;
1313 } else {
1314 wacom->tool[0] = BTN_TOOL_PEN;
1315 wacom->id[0] = STYLUS_DEVICE_ID;
1316 }
1317 wacom->shared->stylus_in_proximity = true;
1318 }
1319 x = le16_to_cpup((__le16 *)&data[2]);
1320 y = le16_to_cpup((__le16 *)&data[4]);
1321 p = le16_to_cpup((__le16 *)&data[6]);
1322 /*
1323 * Convert distance from out prox to distance from tablet.
1324 * distance will be greater than distance_max once
1325 * touching and applying pressure; do not report negative
1326 * distance.
1327 */
1328 if (data[8] <= features->distance_max)
1329 d = features->distance_max - data[8];
1330
1331 pen = data[1] & 0x01;
1332 btn1 = data[1] & 0x02;
1333 btn2 = data[1] & 0x04;
1334 }
1335
1336 input_report_key(input, BTN_TOUCH, pen);
1337 input_report_key(input, BTN_STYLUS, btn1);
1338 input_report_key(input, BTN_STYLUS2, btn2);
1339
1340 input_report_abs(input, ABS_X, x);
1341 input_report_abs(input, ABS_Y, y);
1342 input_report_abs(input, ABS_PRESSURE, p);
1343 input_report_abs(input, ABS_DISTANCE, d);
1344
1345 if (!prox) {
1346 wacom->id[0] = 0;
1347 wacom->shared->stylus_in_proximity = false;
1348 }
1349
1350 input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */
1351 input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */
1352
1353 return 1;
1354}
1355
1356static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
1357{
1358 if (len == WACOM_PKGLEN_BBTOUCH)
1359 return wacom_bpt_touch(wacom);
1360 else if (len == WACOM_PKGLEN_BBTOUCH3)
1361 return wacom_bpt3_touch(wacom);
1362 else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN)
1363 return wacom_bpt_pen(wacom);
1364
1365 return 0;
1366}
1367
1368static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
1369{
1370 unsigned char *data = wacom->data;
1371 int connected;
1372
1373 if (len != WACOM_PKGLEN_WIRELESS || data[0] != WACOM_REPORT_WL)
1374 return 0;
1375
1376 connected = data[1] & 0x01;
1377 if (connected) {
1378 int pid, battery;
1379
1380 if ((wacom->shared->type == INTUOSHT) &&
1381 wacom->shared->touch_max) {
1382 input_report_switch(wacom->shared->touch_input,
1383 SW_MUTE_DEVICE, data[5] & 0x40);
1384 input_sync(wacom->shared->touch_input);
1385 }
1386
1387 pid = get_unaligned_be16(&data[6]);
1388 battery = data[5] & 0x3f;
1389 if (wacom->pid != pid) {
1390 wacom->pid = pid;
1391 wacom_schedule_work(wacom);
1392 }
1393 wacom->battery_capacity = battery;
1394 } else if (wacom->pid != 0) {
1395 /* disconnected while previously connected */
1396 wacom->pid = 0;
1397 wacom_schedule_work(wacom);
1398 wacom->battery_capacity = 0;
1399 }
1400
1401 return 0;
1402}
1403
1404void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
1405{
1406 bool sync;
1407
1408 switch (wacom_wac->features.type) {
1409 case PENPARTNER:
1410 sync = wacom_penpartner_irq(wacom_wac);
1411 break;
1412
1413 case PL:
1414 sync = wacom_pl_irq(wacom_wac);
1415 break;
1416
1417 case WACOM_G4:
1418 case GRAPHIRE:
1419 case WACOM_MO:
1420 sync = wacom_graphire_irq(wacom_wac);
1421 break;
1422
1423 case PTU:
1424 sync = wacom_ptu_irq(wacom_wac);
1425 break;
1426
1427 case DTU:
1428 sync = wacom_dtu_irq(wacom_wac);
1429 break;
1430
1431 case DTUS:
1432 sync = wacom_dtus_irq(wacom_wac);
1433 break;
1434
1435 case INTUOS:
1436 case INTUOS3S:
1437 case INTUOS3:
1438 case INTUOS3L:
1439 case INTUOS4S:
1440 case INTUOS4:
1441 case INTUOS4L:
1442 case CINTIQ:
1443 case WACOM_BEE:
1444 case WACOM_13HD:
1445 case WACOM_21UX2:
1446 case WACOM_22HD:
1447 case WACOM_24HD:
1448 case DTK:
1449 case CINTIQ_HYBRID:
1450 sync = wacom_intuos_irq(wacom_wac);
1451 break;
1452
1453 case WACOM_24HDT:
1454 sync = wacom_24hdt_irq(wacom_wac);
1455 break;
1456
1457 case INTUOS5S:
1458 case INTUOS5:
1459 case INTUOS5L:
1460 case INTUOSPS:
1461 case INTUOSPM:
1462 case INTUOSPL:
1463 if (len == WACOM_PKGLEN_BBTOUCH3)
1464 sync = wacom_bpt3_touch(wacom_wac);
1465 else
1466 sync = wacom_intuos_irq(wacom_wac);
1467 break;
1468
1469 case TABLETPC:
1470 case TABLETPCE:
1471 case TABLETPC2FG:
1472 case MTSCREEN:
1473 case MTTPC:
1474 case MTTPC_B:
1475 sync = wacom_tpc_irq(wacom_wac, len);
1476 break;
1477
1478 case BAMBOO_PT:
1479 case INTUOSHT:
1480 sync = wacom_bpt_irq(wacom_wac, len);
1481 break;
1482
1483 case WIRELESS:
1484 sync = wacom_wireless_irq(wacom_wac, len);
1485 break;
1486
1487 default:
1488 sync = false;
1489 break;
1490 }
1491
1492 if (sync)
1493 input_sync(wacom_wac->input);
1494}
1495
1496static void wacom_setup_cintiq(struct wacom_wac *wacom_wac)
1497{
1498 struct input_dev *input_dev = wacom_wac->input;
1499
1500 input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
1501
1502 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1503 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
1504 __set_bit(BTN_TOOL_BRUSH, input_dev->keybit);
1505 __set_bit(BTN_TOOL_PENCIL, input_dev->keybit);
1506 __set_bit(BTN_TOOL_AIRBRUSH, input_dev->keybit);
1507 __set_bit(BTN_STYLUS, input_dev->keybit);
1508 __set_bit(BTN_STYLUS2, input_dev->keybit);
1509
1510 input_set_abs_params(input_dev, ABS_DISTANCE,
1511 0, wacom_wac->features.distance_max, 0, 0);
1512 input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
1513 input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0);
1514 input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0);
1515}
1516
1517static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
1518{
1519 struct input_dev *input_dev = wacom_wac->input;
1520
1521 input_set_capability(input_dev, EV_REL, REL_WHEEL);
1522
1523 wacom_setup_cintiq(wacom_wac);
1524
1525 __set_bit(BTN_LEFT, input_dev->keybit);
1526 __set_bit(BTN_RIGHT, input_dev->keybit);
1527 __set_bit(BTN_MIDDLE, input_dev->keybit);
1528 __set_bit(BTN_SIDE, input_dev->keybit);
1529 __set_bit(BTN_EXTRA, input_dev->keybit);
1530 __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
1531 __set_bit(BTN_TOOL_LENS, input_dev->keybit);
1532
1533 input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
1534 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
1535}
1536
1537void wacom_setup_device_quirks(struct wacom_features *features)
1538{
1539
1540 /* touch device found but size is not defined. use default */
1541 if (features->device_type == BTN_TOOL_FINGER && !features->x_max) {
1542 features->x_max = 1023;
1543 features->y_max = 1023;
1544 }
1545
1546 /* these device have multiple inputs */
1547 if (features->type >= WIRELESS ||
1548 (features->type >= INTUOS5S && features->type <= INTUOSHT) ||
1549 (features->oVid && features->oPid))
1550 features->quirks |= WACOM_QUIRK_MULTI_INPUT;
1551
1552 /* quirk for bamboo touch with 2 low res touches */
1553 if (features->type == BAMBOO_PT &&
1554 features->pktlen == WACOM_PKGLEN_BBTOUCH) {
1555 features->x_max <<= 5;
1556 features->y_max <<= 5;
1557 features->x_fuzz <<= 5;
1558 features->y_fuzz <<= 5;
1559 features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
1560 }
1561
1562 if (features->type == WIRELESS) {
1563
1564 /* monitor never has input and pen/touch have delayed create */
1565 features->quirks |= WACOM_QUIRK_NO_INPUT;
1566
1567 /* must be monitor interface if no device_type set */
1568 if (!features->device_type)
1569 features->quirks |= WACOM_QUIRK_MONITOR;
1570 }
1571}
1572
1573static void wacom_abs_set_axis(struct input_dev *input_dev,
1574 struct wacom_wac *wacom_wac)
1575{
1576 struct wacom_features *features = &wacom_wac->features;
1577
1578 if (features->device_type == BTN_TOOL_PEN) {
1579 input_set_abs_params(input_dev, ABS_X, features->x_min,
1580 features->x_max, features->x_fuzz, 0);
1581 input_set_abs_params(input_dev, ABS_Y, features->y_min,
1582 features->y_max, features->y_fuzz, 0);
1583 input_set_abs_params(input_dev, ABS_PRESSURE, 0,
1584 features->pressure_max, features->pressure_fuzz, 0);
1585
1586 /* penabled devices have fixed resolution for each model */
1587 input_abs_set_res(input_dev, ABS_X, features->x_resolution);
1588 input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
1589 } else {
1590 if (features->touch_max == 1) {
1591 input_set_abs_params(input_dev, ABS_X, 0,
1592 features->x_max, features->x_fuzz, 0);
1593 input_set_abs_params(input_dev, ABS_Y, 0,
1594 features->y_max, features->y_fuzz, 0);
1595 input_abs_set_res(input_dev, ABS_X,
1596 features->x_resolution);
1597 input_abs_set_res(input_dev, ABS_Y,
1598 features->y_resolution);
1599 }
1600
1601 if (features->touch_max > 1) {
1602 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
1603 features->x_max, features->x_fuzz, 0);
1604 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
1605 features->y_max, features->y_fuzz, 0);
1606 input_abs_set_res(input_dev, ABS_MT_POSITION_X,
1607 features->x_resolution);
1608 input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
1609 features->y_resolution);
1610 }
1611 }
1612}
1613
1614int wacom_setup_input_capabilities(struct input_dev *input_dev,
1615 struct wacom_wac *wacom_wac)
1616{
1617 struct wacom_features *features = &wacom_wac->features;
1618 int i;
1619
1620 input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
1621
1622 __set_bit(BTN_TOUCH, input_dev->keybit);
1623 __set_bit(ABS_MISC, input_dev->absbit);
1624
1625 wacom_abs_set_axis(input_dev, wacom_wac);
1626
1627 switch (features->type) {
1628 case WACOM_MO:
1629 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
1630 /* fall through */
1631
1632 case WACOM_G4:
1633 input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
1634
1635 __set_bit(BTN_BACK, input_dev->keybit);
1636 __set_bit(BTN_FORWARD, input_dev->keybit);
1637 /* fall through */
1638
1639 case GRAPHIRE:
1640 input_set_capability(input_dev, EV_REL, REL_WHEEL);
1641
1642 __set_bit(BTN_LEFT, input_dev->keybit);
1643 __set_bit(BTN_RIGHT, input_dev->keybit);
1644 __set_bit(BTN_MIDDLE, input_dev->keybit);
1645
1646 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1647 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
1648 __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
1649 __set_bit(BTN_STYLUS, input_dev->keybit);
1650 __set_bit(BTN_STYLUS2, input_dev->keybit);
1651
1652 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1653 break;
1654
1655 case WACOM_24HD:
1656 __set_bit(BTN_A, input_dev->keybit);
1657 __set_bit(BTN_B, input_dev->keybit);
1658 __set_bit(BTN_C, input_dev->keybit);
1659 __set_bit(BTN_X, input_dev->keybit);
1660 __set_bit(BTN_Y, input_dev->keybit);
1661 __set_bit(BTN_Z, input_dev->keybit);
1662
1663 for (i = 6; i < 10; i++)
1664 __set_bit(BTN_0 + i, input_dev->keybit);
1665
1666 __set_bit(KEY_PROG1, input_dev->keybit);
1667 __set_bit(KEY_PROG2, input_dev->keybit);
1668 __set_bit(KEY_PROG3, input_dev->keybit);
1669
1670 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1671 input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
1672 /* fall through */
1673
1674 case DTK:
1675 for (i = 0; i < 6; i++)
1676 __set_bit(BTN_0 + i, input_dev->keybit);
1677
1678 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1679
1680 wacom_setup_cintiq(wacom_wac);
1681 break;
1682
1683 case WACOM_22HD:
1684 __set_bit(KEY_PROG1, input_dev->keybit);
1685 __set_bit(KEY_PROG2, input_dev->keybit);
1686 __set_bit(KEY_PROG3, input_dev->keybit);
1687 /* fall through */
1688
1689 case WACOM_21UX2:
1690 __set_bit(BTN_A, input_dev->keybit);
1691 __set_bit(BTN_B, input_dev->keybit);
1692 __set_bit(BTN_C, input_dev->keybit);
1693 __set_bit(BTN_X, input_dev->keybit);
1694 __set_bit(BTN_Y, input_dev->keybit);
1695 __set_bit(BTN_Z, input_dev->keybit);
1696 __set_bit(BTN_BASE, input_dev->keybit);
1697 __set_bit(BTN_BASE2, input_dev->keybit);
1698 /* fall through */
1699
1700 case WACOM_BEE:
1701 __set_bit(BTN_8, input_dev->keybit);
1702 __set_bit(BTN_9, input_dev->keybit);
1703 /* fall through */
1704
1705 case CINTIQ:
1706 for (i = 0; i < 8; i++)
1707 __set_bit(BTN_0 + i, input_dev->keybit);
1708
1709 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
1710 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
1711 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1712
1713 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1714
1715 wacom_setup_cintiq(wacom_wac);
1716 break;
1717
1718 case WACOM_13HD:
1719 for (i = 0; i < 9; i++)
1720 __set_bit(BTN_0 + i, input_dev->keybit);
1721
1722 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1723 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1724 wacom_setup_cintiq(wacom_wac);
1725 break;
1726
1727 case INTUOS3:
1728 case INTUOS3L:
1729 __set_bit(BTN_4, input_dev->keybit);
1730 __set_bit(BTN_5, input_dev->keybit);
1731 __set_bit(BTN_6, input_dev->keybit);
1732 __set_bit(BTN_7, input_dev->keybit);
1733
1734 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
1735 /* fall through */
1736
1737 case INTUOS3S:
1738 __set_bit(BTN_0, input_dev->keybit);
1739 __set_bit(BTN_1, input_dev->keybit);
1740 __set_bit(BTN_2, input_dev->keybit);
1741 __set_bit(BTN_3, input_dev->keybit);
1742
1743 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
1744 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1745 /* fall through */
1746
1747 case INTUOS:
1748 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1749
1750 wacom_setup_intuos(wacom_wac);
1751 break;
1752
1753 case INTUOS5:
1754 case INTUOS5L:
1755 case INTUOSPM:
1756 case INTUOSPL:
1757 if (features->device_type == BTN_TOOL_PEN) {
1758 __set_bit(BTN_7, input_dev->keybit);
1759 __set_bit(BTN_8, input_dev->keybit);
1760 }
1761 /* fall through */
1762
1763 case INTUOS5S:
1764 case INTUOSPS:
1765 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1766
1767 if (features->device_type == BTN_TOOL_PEN) {
1768 for (i = 0; i < 7; i++)
1769 __set_bit(BTN_0 + i, input_dev->keybit);
1770
1771 input_set_abs_params(input_dev, ABS_DISTANCE, 0,
1772 features->distance_max,
1773 0, 0);
1774
1775 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1776
1777 wacom_setup_intuos(wacom_wac);
1778 } else if (features->device_type == BTN_TOOL_FINGER) {
1779 __clear_bit(ABS_MISC, input_dev->absbit);
1780
1781 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
1782 0, features->x_max, 0, 0);
1783 input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
1784 0, features->y_max, 0, 0);
1785 input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
1786 }
1787 break;
1788
1789 case INTUOS4:
1790 case INTUOS4L:
1791 __set_bit(BTN_7, input_dev->keybit);
1792 __set_bit(BTN_8, input_dev->keybit);
1793 /* fall through */
1794
1795 case INTUOS4S:
1796 for (i = 0; i < 7; i++)
1797 __set_bit(BTN_0 + i, input_dev->keybit);
1798
1799 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1800 wacom_setup_intuos(wacom_wac);
1801
1802 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1803 break;
1804
1805 case WACOM_24HDT:
1806 if (features->device_type == BTN_TOOL_FINGER) {
1807 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
1808 input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
1809 input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
1810 input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
1811 }
1812 /* fall through */
1813
1814 case MTSCREEN:
1815 case MTTPC:
1816 case MTTPC_B:
1817 case TABLETPC2FG:
1818 if (features->device_type == BTN_TOOL_FINGER && features->touch_max > 1)
1819 input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
1820 /* fall through */
1821
1822 case TABLETPC:
1823 case TABLETPCE:
1824 __clear_bit(ABS_MISC, input_dev->absbit);
1825
1826 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1827
1828 if (features->device_type != BTN_TOOL_PEN)
1829 break; /* no need to process stylus stuff */
1830
1831 /* fall through */
1832
1833 case DTUS:
1834 case PL:
1835 case DTU:
1836 if (features->type == DTUS) {
1837 input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
1838 for (i = 0; i < 4; i++)
1839 __set_bit(BTN_0 + i, input_dev->keybit);
1840 }
1841 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
1842 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1843 __set_bit(BTN_STYLUS, input_dev->keybit);
1844 __set_bit(BTN_STYLUS2, input_dev->keybit);
1845
1846 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1847 break;
1848
1849 case PTU:
1850 __set_bit(BTN_STYLUS2, input_dev->keybit);
1851 /* fall through */
1852
1853 case PENPARTNER:
1854 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
1855 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1856 __set_bit(BTN_STYLUS, input_dev->keybit);
1857
1858 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1859 break;
1860
1861 case INTUOSHT:
1862 if (features->touch_max &&
1863 features->device_type == BTN_TOOL_FINGER) {
1864 input_dev->evbit[0] |= BIT_MASK(EV_SW);
1865 __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
1866 }
1867 /* fall through */
1868
1869 case BAMBOO_PT:
1870 __clear_bit(ABS_MISC, input_dev->absbit);
1871
1872 if (features->device_type == BTN_TOOL_FINGER) {
1873
1874 __set_bit(BTN_LEFT, input_dev->keybit);
1875 __set_bit(BTN_FORWARD, input_dev->keybit);
1876 __set_bit(BTN_BACK, input_dev->keybit);
1877 __set_bit(BTN_RIGHT, input_dev->keybit);
1878
1879 if (features->touch_max) {
1880 if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
1881 input_set_abs_params(input_dev,
1882 ABS_MT_TOUCH_MAJOR,
1883 0, features->x_max, 0, 0);
1884 input_set_abs_params(input_dev,
1885 ABS_MT_TOUCH_MINOR,
1886 0, features->y_max, 0, 0);
1887 }
1888 input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
1889 } else {
1890 /* buttons/keys only interface */
1891 __clear_bit(ABS_X, input_dev->absbit);
1892 __clear_bit(ABS_Y, input_dev->absbit);
1893 __clear_bit(BTN_TOUCH, input_dev->keybit);
1894 }
1895 } else if (features->device_type == BTN_TOOL_PEN) {
1896 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1897 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1898 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
1899 __set_bit(BTN_STYLUS, input_dev->keybit);
1900 __set_bit(BTN_STYLUS2, input_dev->keybit);
1901 input_set_abs_params(input_dev, ABS_DISTANCE, 0,
1902 features->distance_max,
1903 0, 0);
1904 }
1905 break;
1906
1907 case CINTIQ_HYBRID:
1908 __set_bit(BTN_1, input_dev->keybit);
1909 __set_bit(BTN_2, input_dev->keybit);
1910 __set_bit(BTN_3, input_dev->keybit);
1911 __set_bit(BTN_4, input_dev->keybit);
1912
1913 __set_bit(BTN_5, input_dev->keybit);
1914 __set_bit(BTN_6, input_dev->keybit);
1915 __set_bit(BTN_7, input_dev->keybit);
1916 __set_bit(BTN_8, input_dev->keybit);
1917 __set_bit(BTN_0, input_dev->keybit);
1918
1919 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
1920 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
1921
1922 wacom_setup_cintiq(wacom_wac);
1923 break;
1924 }
1925 return 0;
1926}
1927
1928static const struct wacom_features wacom_features_0x00 =
1929 { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255,
1930 0, PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
1931static const struct wacom_features wacom_features_0x10 =
1932 { "Wacom Graphire", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511,
1933 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1934static const struct wacom_features wacom_features_0x11 =
1935 { "Wacom Graphire2 4x5", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511,
1936 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1937static const struct wacom_features wacom_features_0x12 =
1938 { "Wacom Graphire2 5x7", WACOM_PKGLEN_GRAPHIRE, 13918, 10206, 511,
1939 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1940static const struct wacom_features wacom_features_0x13 =
1941 { "Wacom Graphire3", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511,
1942 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1943static const struct wacom_features wacom_features_0x14 =
1944 { "Wacom Graphire3 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511,
1945 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1946static const struct wacom_features wacom_features_0x15 =
1947 { "Wacom Graphire4 4x5", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511,
1948 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1949static const struct wacom_features wacom_features_0x16 =
1950 { "Wacom Graphire4 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511,
1951 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1952static const struct wacom_features wacom_features_0x17 =
1953 { "Wacom BambooFun 4x5", WACOM_PKGLEN_BBFUN, 14760, 9225, 511,
1954 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1955static const struct wacom_features wacom_features_0x18 =
1956 { "Wacom BambooFun 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 511,
1957 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1958static const struct wacom_features wacom_features_0x19 =
1959 { "Wacom Bamboo1 Medium", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511,
1960 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
1961static const struct wacom_features wacom_features_0x60 =
1962 { "Wacom Volito", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511,
1963 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
1964static const struct wacom_features wacom_features_0x61 =
1965 { "Wacom PenStation2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 255,
1966 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
1967static const struct wacom_features wacom_features_0x62 =
1968 { "Wacom Volito2 4x5", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511,
1969 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
1970static const struct wacom_features wacom_features_0x63 =
1971 { "Wacom Volito2 2x3", WACOM_PKGLEN_GRAPHIRE, 3248, 2320, 511,
1972 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
1973static const struct wacom_features wacom_features_0x64 =
1974 { "Wacom PenPartner2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 511,
1975 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
1976static const struct wacom_features wacom_features_0x65 =
1977 { "Wacom Bamboo", WACOM_PKGLEN_BBFUN, 14760, 9225, 511,
1978 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1979static const struct wacom_features wacom_features_0x69 =
1980 { "Wacom Bamboo1", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511,
1981 63, GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
1982static const struct wacom_features wacom_features_0x6A =
1983 { "Wacom Bamboo1 4x6", WACOM_PKGLEN_GRAPHIRE, 14760, 9225, 1023,
1984 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1985static const struct wacom_features wacom_features_0x6B =
1986 { "Wacom Bamboo1 5x8", WACOM_PKGLEN_GRAPHIRE, 21648, 13530, 1023,
1987 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1988static const struct wacom_features wacom_features_0x20 =
1989 { "Wacom Intuos 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023,
1990 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1991static const struct wacom_features wacom_features_0x21 =
1992 { "Wacom Intuos 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023,
1993 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1994static const struct wacom_features wacom_features_0x22 =
1995 { "Wacom Intuos 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023,
1996 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
1997static const struct wacom_features wacom_features_0x23 =
1998 { "Wacom Intuos 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023,
1999 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2000static const struct wacom_features wacom_features_0x24 =
2001 { "Wacom Intuos 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023,
2002 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2003static const struct wacom_features wacom_features_0x30 =
2004 { "Wacom PL400", WACOM_PKGLEN_GRAPHIRE, 5408, 4056, 255,
2005 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2006static const struct wacom_features wacom_features_0x31 =
2007 { "Wacom PL500", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 255,
2008 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2009static const struct wacom_features wacom_features_0x32 =
2010 { "Wacom PL600", WACOM_PKGLEN_GRAPHIRE, 6126, 4604, 255,
2011 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2012static const struct wacom_features wacom_features_0x33 =
2013 { "Wacom PL600SX", WACOM_PKGLEN_GRAPHIRE, 6260, 5016, 255,
2014 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2015static const struct wacom_features wacom_features_0x34 =
2016 { "Wacom PL550", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 511,
2017 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2018static const struct wacom_features wacom_features_0x35 =
2019 { "Wacom PL800", WACOM_PKGLEN_GRAPHIRE, 7220, 5780, 511,
2020 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2021static const struct wacom_features wacom_features_0x37 =
2022 { "Wacom PL700", WACOM_PKGLEN_GRAPHIRE, 6758, 5406, 511,
2023 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2024static const struct wacom_features wacom_features_0x38 =
2025 { "Wacom PL510", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511,
2026 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2027static const struct wacom_features wacom_features_0x39 =
2028 { "Wacom DTU710", WACOM_PKGLEN_GRAPHIRE, 34080, 27660, 511,
2029 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2030static const struct wacom_features wacom_features_0xC4 =
2031 { "Wacom DTF521", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511,
2032 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2033static const struct wacom_features wacom_features_0xC0 =
2034 { "Wacom DTF720", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511,
2035 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2036static const struct wacom_features wacom_features_0xC2 =
2037 { "Wacom DTF720a", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511,
2038 0, PL, WACOM_PL_RES, WACOM_PL_RES };
2039static const struct wacom_features wacom_features_0x03 =
2040 { "Wacom Cintiq Partner", WACOM_PKGLEN_GRAPHIRE, 20480, 15360, 511,
2041 0, PTU, WACOM_PL_RES, WACOM_PL_RES };
2042static const struct wacom_features wacom_features_0x41 =
2043 { "Wacom Intuos2 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023,
2044 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2045static const struct wacom_features wacom_features_0x42 =
2046 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023,
2047 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2048static const struct wacom_features wacom_features_0x43 =
2049 { "Wacom Intuos2 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023,
2050 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2051static const struct wacom_features wacom_features_0x44 =
2052 { "Wacom Intuos2 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023,
2053 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2054static const struct wacom_features wacom_features_0x45 =
2055 { "Wacom Intuos2 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023,
2056 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2057static const struct wacom_features wacom_features_0xB0 =
2058 { "Wacom Intuos3 4x5", WACOM_PKGLEN_INTUOS, 25400, 20320, 1023,
2059 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2060static const struct wacom_features wacom_features_0xB1 =
2061 { "Wacom Intuos3 6x8", WACOM_PKGLEN_INTUOS, 40640, 30480, 1023,
2062 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2063static const struct wacom_features wacom_features_0xB2 =
2064 { "Wacom Intuos3 9x12", WACOM_PKGLEN_INTUOS, 60960, 45720, 1023,
2065 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2066static const struct wacom_features wacom_features_0xB3 =
2067 { "Wacom Intuos3 12x12", WACOM_PKGLEN_INTUOS, 60960, 60960, 1023,
2068 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2069static const struct wacom_features wacom_features_0xB4 =
2070 { "Wacom Intuos3 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 1023,
2071 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2072static const struct wacom_features wacom_features_0xB5 =
2073 { "Wacom Intuos3 6x11", WACOM_PKGLEN_INTUOS, 54204, 31750, 1023,
2074 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2075static const struct wacom_features wacom_features_0xB7 =
2076 { "Wacom Intuos3 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 1023,
2077 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2078static const struct wacom_features wacom_features_0xB8 =
2079 { "Wacom Intuos4 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
2080 63, INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2081static const struct wacom_features wacom_features_0xB9 =
2082 { "Wacom Intuos4 6x9", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
2083 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2084static const struct wacom_features wacom_features_0xBA =
2085 { "Wacom Intuos4 8x13", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
2086 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2087static const struct wacom_features wacom_features_0xBB =
2088 { "Wacom Intuos4 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 2047,
2089 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2090static const struct wacom_features wacom_features_0xBC =
2091 { "Wacom Intuos4 WL", WACOM_PKGLEN_INTUOS, 40640, 25400, 2047,
2092 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2093static const struct wacom_features wacom_features_0x26 =
2094 { "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
2095 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2096 .touch_max = 16 };
2097static const struct wacom_features wacom_features_0x27 =
2098 { "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
2099 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2100 .touch_max = 16 };
2101static const struct wacom_features wacom_features_0x28 =
2102 { "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
2103 63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2104 .touch_max = 16 };
2105static const struct wacom_features wacom_features_0x29 =
2106 { "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
2107 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2108static const struct wacom_features wacom_features_0x2A =
2109 { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
2110 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2111static const struct wacom_features wacom_features_0x314 =
2112 { "Wacom Intuos Pro S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
2113 63, INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2114 .touch_max = 16 };
2115static const struct wacom_features wacom_features_0x315 =
2116 { "Wacom Intuos Pro M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
2117 63, INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2118 .touch_max = 16 };
2119static const struct wacom_features wacom_features_0x317 =
2120 { "Wacom Intuos Pro L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
2121 63, INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2122 .touch_max = 16 };
2123static const struct wacom_features wacom_features_0xF4 =
2124 { "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104280, 65400, 2047,
2125 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 };
2126static const struct wacom_features wacom_features_0xF8 =
2127 { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104280, 65400, 2047, /* Pen */
2128 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200,
2129 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };
2130static const struct wacom_features wacom_features_0xF6 =
2131 { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
2132 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 };
2133static const struct wacom_features wacom_features_0x3F =
2134 { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023,
2135 63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2136static const struct wacom_features wacom_features_0xC5 =
2137 { "Wacom Cintiq 20WSX", WACOM_PKGLEN_INTUOS, 86680, 54180, 1023,
2138 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2139static const struct wacom_features wacom_features_0xC6 =
2140 { "Wacom Cintiq 12WX", WACOM_PKGLEN_INTUOS, 53020, 33440, 1023,
2141 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2142static const struct wacom_features wacom_features_0x304 =
2143 { "Wacom Cintiq 13HD", WACOM_PKGLEN_INTUOS, 59352, 33648, 1023,
2144 63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 };
2145static const struct wacom_features wacom_features_0xC7 =
2146 { "Wacom DTU1931", WACOM_PKGLEN_GRAPHIRE, 37832, 30305, 511,
2147 0, PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2148static const struct wacom_features wacom_features_0xCE =
2149 { "Wacom DTU2231", WACOM_PKGLEN_GRAPHIRE, 47864, 27011, 511,
2150 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2151static const struct wacom_features wacom_features_0xF0 =
2152 { "Wacom DTU1631", WACOM_PKGLEN_GRAPHIRE, 34623, 19553, 511,
2153 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2154static const struct wacom_features wacom_features_0xFB =
2155 { "Wacom DTU1031", WACOM_PKGLEN_DTUS, 22096, 13960, 511,
2156 0, DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2157static const struct wacom_features wacom_features_0x57 =
2158 { "Wacom DTK2241", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047,
2159 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 };
2160static const struct wacom_features wacom_features_0x59 = /* Pen */
2161 { "Wacom DTH2242", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047,
2162 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200,
2163 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D };
2164static const struct wacom_features wacom_features_0x5D = /* Touch */
2165 { "Wacom DTH2242", .type = WACOM_24HDT,
2166 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10 };
2167static const struct wacom_features wacom_features_0xCC =
2168 { "Wacom Cintiq 21UX2", WACOM_PKGLEN_INTUOS, 87000, 65400, 2047,
2169 63, WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 };
2170static const struct wacom_features wacom_features_0xFA =
2171 { "Wacom Cintiq 22HD", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047,
2172 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 };
2173static const struct wacom_features wacom_features_0x5B =
2174 { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047,
2175 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200,
2176 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };
2177static const struct wacom_features wacom_features_0x5E =
2178 { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
2179 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 };
2180static const struct wacom_features wacom_features_0x90 =
2181 { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2182 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2183static const struct wacom_features wacom_features_0x93 =
2184 { "Wacom ISDv4 93", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2185 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2186static const struct wacom_features wacom_features_0x97 =
2187 { "Wacom ISDv4 97", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 511,
2188 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2189static const struct wacom_features wacom_features_0x9A =
2190 { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2191 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2192static const struct wacom_features wacom_features_0x9F =
2193 { "Wacom ISDv4 9F", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2194 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2195static const struct wacom_features wacom_features_0xE2 =
2196 { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255,
2197 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2198 .touch_max = 2 };
2199static const struct wacom_features wacom_features_0xE3 =
2200 { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255,
2201 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2202 .touch_max = 2 };
2203static const struct wacom_features wacom_features_0xE5 =
2204 { "Wacom ISDv4 E5", WACOM_PKGLEN_MTOUCH, 26202, 16325, 255,
2205 0, MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2206static const struct wacom_features wacom_features_0xE6 =
2207 { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255,
2208 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2209 .touch_max = 2 };
2210static const struct wacom_features wacom_features_0xEC =
2211 { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255,
2212 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2213static const struct wacom_features wacom_features_0xED =
2214 { "Wacom ISDv4 ED", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2215 0, TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2216static const struct wacom_features wacom_features_0xEF =
2217 { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2218 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2219static const struct wacom_features wacom_features_0x100 =
2220 { "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
2221 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2222static const struct wacom_features wacom_features_0x101 =
2223 { "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
2224 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2225static const struct wacom_features wacom_features_0x10D =
2226 { "Wacom ISDv4 10D", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
2227 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2228static const struct wacom_features wacom_features_0x10E =
2229 { "Wacom ISDv4 10E", WACOM_PKGLEN_MTTPC, 27760, 15694, 255,
2230 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2231static const struct wacom_features wacom_features_0x10F =
2232 { "Wacom ISDv4 10F", WACOM_PKGLEN_MTTPC, 27760, 15694, 255,
2233 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2234static const struct wacom_features wacom_features_0x116 =
2235 { "Wacom ISDv4 116", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
2236 0, TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2237static const struct wacom_features wacom_features_0x4001 =
2238 { "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
2239 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2240static const struct wacom_features wacom_features_0x4004 =
2241 { "Wacom ISDv4 4004", WACOM_PKGLEN_MTTPC, 11060, 6220, 255,
2242 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2243static const struct wacom_features wacom_features_0x5000 =
2244 { "Wacom ISDv4 5000", WACOM_PKGLEN_MTTPC, 27848, 15752, 1023,
2245 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2246static const struct wacom_features wacom_features_0x5002 =
2247 { "Wacom ISDv4 5002", WACOM_PKGLEN_MTTPC, 29576, 16724, 1023,
2248 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2249static const struct wacom_features wacom_features_0x47 =
2250 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023,
2251 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2252static const struct wacom_features wacom_features_0x84 =
2253 { "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0,
2254 0, WIRELESS, 0, 0, .touch_max = 16 };
2255static const struct wacom_features wacom_features_0xD0 =
2256 { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2257 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2258 .touch_max = 2 };
2259static const struct wacom_features wacom_features_0xD1 =
2260 { "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2261 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2262 .touch_max = 2 };
2263static const struct wacom_features wacom_features_0xD2 =
2264 { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2265 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2266 .touch_max = 2 };
2267static const struct wacom_features wacom_features_0xD3 =
2268 { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023,
2269 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2270 .touch_max = 2 };
2271static const struct wacom_features wacom_features_0xD4 =
2272 { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2273 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2274static const struct wacom_features wacom_features_0xD5 =
2275 { "Wacom Bamboo Pen 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023,
2276 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2277static const struct wacom_features wacom_features_0xD6 =
2278 { "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2279 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2280 .touch_max = 2 };
2281static const struct wacom_features wacom_features_0xD7 =
2282 { "Wacom BambooPT 2FG Small", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2283 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2284 .touch_max = 2 };
2285static const struct wacom_features wacom_features_0xD8 =
2286 { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023,
2287 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2288 .touch_max = 2 };
2289static const struct wacom_features wacom_features_0xDA =
2290 { "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
2291 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2292 .touch_max = 2 };
2293static const struct wacom_features wacom_features_0xDB =
2294 { "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023,
2295 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2296 .touch_max = 2 };
2297static const struct wacom_features wacom_features_0xDD =
2298 { "Wacom Bamboo Connect", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023,
2299 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2300static const struct wacom_features wacom_features_0xDE =
2301 { "Wacom Bamboo 16FG 4x5", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023,
2302 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2303 .touch_max = 16 };
2304static const struct wacom_features wacom_features_0xDF =
2305 { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN, 21648, 13700, 1023,
2306 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2307 .touch_max = 16 };
2308static const struct wacom_features wacom_features_0x300 =
2309 { "Wacom Bamboo One S", WACOM_PKGLEN_BBPEN, 14720, 9225, 1023,
2310 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2311static const struct wacom_features wacom_features_0x301 =
2312 { "Wacom Bamboo One M", WACOM_PKGLEN_BBPEN, 21648, 13530, 1023,
2313 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2314static const struct wacom_features wacom_features_0x302 =
2315 { "Wacom Intuos PT S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023,
2316 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2317 .touch_max = 16 };
2318static const struct wacom_features wacom_features_0x303 =
2319 { "Wacom Intuos PT M", WACOM_PKGLEN_BBPEN, 21600, 13500, 1023,
2320 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2321 .touch_max = 16 };
2322static const struct wacom_features wacom_features_0x30E =
2323 { "Wacom Intuos S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023,
2324 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2325static const struct wacom_features wacom_features_0x6004 =
2326 { "ISD-V4", WACOM_PKGLEN_GRAPHIRE, 12800, 8000, 255,
2327 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2328static const struct wacom_features wacom_features_0x0307 =
2329 { "Wacom ISDv5 307", WACOM_PKGLEN_INTUOS, 59352, 33648, 2047,
2330 63, CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200,
2331 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 };
2332static const struct wacom_features wacom_features_0x0309 =
2333 { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */
2334 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10 };
2335
2336#define USB_DEVICE_WACOM(prod) \
2337 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
2338 .driver_info = (kernel_ulong_t)&wacom_features_##prod
2339
2340#define USB_DEVICE_DETAILED(prod, class, sub, proto) \
2341 USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_WACOM, prod, class, \
2342 sub, proto), \
2343 .driver_info = (kernel_ulong_t)&wacom_features_##prod
2344
2345#define USB_DEVICE_LENOVO(prod) \
2346 USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \
2347 .driver_info = (kernel_ulong_t)&wacom_features_##prod
2348
2349const struct usb_device_id wacom_ids[] = {
2350 { USB_DEVICE_WACOM(0x00) },
2351 { USB_DEVICE_WACOM(0x10) },
2352 { USB_DEVICE_WACOM(0x11) },
2353 { USB_DEVICE_WACOM(0x12) },
2354 { USB_DEVICE_WACOM(0x13) },
2355 { USB_DEVICE_WACOM(0x14) },
2356 { USB_DEVICE_WACOM(0x15) },
2357 { USB_DEVICE_WACOM(0x16) },
2358 { USB_DEVICE_WACOM(0x17) },
2359 { USB_DEVICE_WACOM(0x18) },
2360 { USB_DEVICE_WACOM(0x19) },
2361 { USB_DEVICE_WACOM(0x60) },
2362 { USB_DEVICE_WACOM(0x61) },
2363 { USB_DEVICE_WACOM(0x62) },
2364 { USB_DEVICE_WACOM(0x63) },
2365 { USB_DEVICE_WACOM(0x64) },
2366 { USB_DEVICE_WACOM(0x65) },
2367 { USB_DEVICE_WACOM(0x69) },
2368 { USB_DEVICE_WACOM(0x6A) },
2369 { USB_DEVICE_WACOM(0x6B) },
2370 { USB_DEVICE_WACOM(0x20) },
2371 { USB_DEVICE_WACOM(0x21) },
2372 { USB_DEVICE_WACOM(0x22) },
2373 { USB_DEVICE_WACOM(0x23) },
2374 { USB_DEVICE_WACOM(0x24) },
2375 { USB_DEVICE_WACOM(0x30) },
2376 { USB_DEVICE_WACOM(0x31) },
2377 { USB_DEVICE_WACOM(0x32) },
2378 { USB_DEVICE_WACOM(0x33) },
2379 { USB_DEVICE_WACOM(0x34) },
2380 { USB_DEVICE_WACOM(0x35) },
2381 { USB_DEVICE_WACOM(0x37) },
2382 { USB_DEVICE_WACOM(0x38) },
2383 { USB_DEVICE_WACOM(0x39) },
2384 { USB_DEVICE_WACOM(0xC4) },
2385 { USB_DEVICE_WACOM(0xC0) },
2386 { USB_DEVICE_WACOM(0xC2) },
2387 { USB_DEVICE_WACOM(0x03) },
2388 { USB_DEVICE_WACOM(0x41) },
2389 { USB_DEVICE_WACOM(0x42) },
2390 { USB_DEVICE_WACOM(0x43) },
2391 { USB_DEVICE_WACOM(0x44) },
2392 { USB_DEVICE_WACOM(0x45) },
2393 { USB_DEVICE_WACOM(0x57) },
2394 { USB_DEVICE_WACOM(0x59) },
2395 { USB_DEVICE_DETAILED(0x5D, USB_CLASS_HID, 0, 0) },
2396 { USB_DEVICE_WACOM(0x5B) },
2397 { USB_DEVICE_DETAILED(0x5E, USB_CLASS_HID, 0, 0) },
2398 { USB_DEVICE_WACOM(0xB0) },
2399 { USB_DEVICE_WACOM(0xB1) },
2400 { USB_DEVICE_WACOM(0xB2) },
2401 { USB_DEVICE_WACOM(0xB3) },
2402 { USB_DEVICE_WACOM(0xB4) },
2403 { USB_DEVICE_WACOM(0xB5) },
2404 { USB_DEVICE_WACOM(0xB7) },
2405 { USB_DEVICE_WACOM(0xB8) },
2406 { USB_DEVICE_WACOM(0xB9) },
2407 { USB_DEVICE_WACOM(0xBA) },
2408 { USB_DEVICE_WACOM(0xBB) },
2409 { USB_DEVICE_WACOM(0xBC) },
2410 { USB_DEVICE_WACOM(0x26) },
2411 { USB_DEVICE_WACOM(0x27) },
2412 { USB_DEVICE_WACOM(0x28) },
2413 { USB_DEVICE_WACOM(0x29) },
2414 { USB_DEVICE_WACOM(0x2A) },
2415 { USB_DEVICE_WACOM(0x3F) },
2416 { USB_DEVICE_WACOM(0xC5) },
2417 { USB_DEVICE_WACOM(0xC6) },
2418 { USB_DEVICE_WACOM(0xC7) },
2419 /*
2420 * DTU-2231 has two interfaces on the same configuration,
2421 * only one is used.
2422 */
2423 { USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID,
2424 USB_INTERFACE_SUBCLASS_BOOT,
2425 USB_INTERFACE_PROTOCOL_MOUSE) },
2426 { USB_DEVICE_WACOM(0x84) },
2427 { USB_DEVICE_WACOM(0xD0) },
2428 { USB_DEVICE_WACOM(0xD1) },
2429 { USB_DEVICE_WACOM(0xD2) },
2430 { USB_DEVICE_WACOM(0xD3) },
2431 { USB_DEVICE_WACOM(0xD4) },
2432 { USB_DEVICE_WACOM(0xD5) },
2433 { USB_DEVICE_WACOM(0xD6) },
2434 { USB_DEVICE_WACOM(0xD7) },
2435 { USB_DEVICE_WACOM(0xD8) },
2436 { USB_DEVICE_WACOM(0xDA) },
2437 { USB_DEVICE_WACOM(0xDB) },
2438 { USB_DEVICE_WACOM(0xDD) },
2439 { USB_DEVICE_WACOM(0xDE) },
2440 { USB_DEVICE_WACOM(0xDF) },
2441 { USB_DEVICE_WACOM(0xF0) },
2442 { USB_DEVICE_WACOM(0xCC) },
2443 { USB_DEVICE_WACOM(0x90) },
2444 { USB_DEVICE_WACOM(0x93) },
2445 { USB_DEVICE_WACOM(0x97) },
2446 { USB_DEVICE_WACOM(0x9A) },
2447 { USB_DEVICE_WACOM(0x9F) },
2448 { USB_DEVICE_WACOM(0xE2) },
2449 { USB_DEVICE_WACOM(0xE3) },
2450 { USB_DEVICE_WACOM(0xE5) },
2451 { USB_DEVICE_WACOM(0xE6) },
2452 { USB_DEVICE_WACOM(0xEC) },
2453 { USB_DEVICE_WACOM(0xED) },
2454 { USB_DEVICE_WACOM(0xEF) },
2455 { USB_DEVICE_WACOM(0x100) },
2456 { USB_DEVICE_WACOM(0x101) },
2457 { USB_DEVICE_WACOM(0x10D) },
2458 { USB_DEVICE_WACOM(0x10E) },
2459 { USB_DEVICE_WACOM(0x10F) },
2460 { USB_DEVICE_WACOM(0x116) },
2461 { USB_DEVICE_WACOM(0x300) },
2462 { USB_DEVICE_WACOM(0x301) },
2463 { USB_DEVICE_DETAILED(0x302, USB_CLASS_HID, 0, 0) },
2464 { USB_DEVICE_DETAILED(0x303, USB_CLASS_HID, 0, 0) },
2465 { USB_DEVICE_DETAILED(0x30E, USB_CLASS_HID, 0, 0) },
2466 { USB_DEVICE_WACOM(0x304) },
2467 { USB_DEVICE_DETAILED(0x314, USB_CLASS_HID, 0, 0) },
2468 { USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) },
2469 { USB_DEVICE_DETAILED(0x317, USB_CLASS_HID, 0, 0) },
2470 { USB_DEVICE_WACOM(0x4001) },
2471 { USB_DEVICE_WACOM(0x4004) },
2472 { USB_DEVICE_WACOM(0x5000) },
2473 { USB_DEVICE_WACOM(0x5002) },
2474 { USB_DEVICE_WACOM(0x47) },
2475 { USB_DEVICE_WACOM(0xF4) },
2476 { USB_DEVICE_WACOM(0xF8) },
2477 { USB_DEVICE_DETAILED(0xF6, USB_CLASS_HID, 0, 0) },
2478 { USB_DEVICE_WACOM(0xFA) },
2479 { USB_DEVICE_WACOM(0xFB) },
2480 { USB_DEVICE_WACOM(0x0307) },
2481 { USB_DEVICE_DETAILED(0x0309, USB_CLASS_HID, 0, 0) },
2482 { USB_DEVICE_LENOVO(0x6004) },
2483 { }
2484};
2485MODULE_DEVICE_TABLE(usb, wacom_ids);
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
deleted file mode 100644
index b2c9a9c1b551..000000000000
--- a/drivers/input/tablet/wacom_wac.h
+++ /dev/null
@@ -1,165 +0,0 @@
1/*
2 * drivers/input/tablet/wacom_wac.h
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 */
9#ifndef WACOM_WAC_H
10#define WACOM_WAC_H
11
12#include <linux/types.h>
13
14/* maximum packet length for USB devices */
15#define WACOM_PKGLEN_MAX 68
16
17#define WACOM_NAME_MAX 64
18
19/* packet length for individual models */
20#define WACOM_PKGLEN_PENPRTN 7
21#define WACOM_PKGLEN_GRAPHIRE 8
22#define WACOM_PKGLEN_BBFUN 9
23#define WACOM_PKGLEN_INTUOS 10
24#define WACOM_PKGLEN_TPC1FG 5
25#define WACOM_PKGLEN_TPC1FG_B 10
26#define WACOM_PKGLEN_TPC2FG 14
27#define WACOM_PKGLEN_BBTOUCH 20
28#define WACOM_PKGLEN_BBTOUCH3 64
29#define WACOM_PKGLEN_BBPEN 10
30#define WACOM_PKGLEN_WIRELESS 32
31#define WACOM_PKGLEN_MTOUCH 62
32#define WACOM_PKGLEN_MTTPC 40
33#define WACOM_PKGLEN_DTUS 68
34#define WACOM_PKGLEN_PENABLED 8
35
36/* wacom data size per MT contact */
37#define WACOM_BYTES_PER_MT_PACKET 11
38#define WACOM_BYTES_PER_24HDT_PACKET 14
39
40/* device IDs */
41#define STYLUS_DEVICE_ID 0x02
42#define TOUCH_DEVICE_ID 0x03
43#define CURSOR_DEVICE_ID 0x06
44#define ERASER_DEVICE_ID 0x0A
45#define PAD_DEVICE_ID 0x0F
46
47/* wacom data packet report IDs */
48#define WACOM_REPORT_PENABLED 2
49#define WACOM_REPORT_INTUOSREAD 5
50#define WACOM_REPORT_INTUOSWRITE 6
51#define WACOM_REPORT_INTUOSPAD 12
52#define WACOM_REPORT_INTUOS5PAD 3
53#define WACOM_REPORT_DTUSPAD 21
54#define WACOM_REPORT_TPC1FG 6
55#define WACOM_REPORT_TPC2FG 13
56#define WACOM_REPORT_TPCMT 13
57#define WACOM_REPORT_TPCMT2 3
58#define WACOM_REPORT_TPCHID 15
59#define WACOM_REPORT_TPCST 16
60#define WACOM_REPORT_DTUS 17
61#define WACOM_REPORT_TPC1FGE 18
62#define WACOM_REPORT_24HDT 1
63#define WACOM_REPORT_WL 128
64#define WACOM_REPORT_USB 192
65
66/* device quirks */
67#define WACOM_QUIRK_MULTI_INPUT 0x0001
68#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002
69#define WACOM_QUIRK_NO_INPUT 0x0004
70#define WACOM_QUIRK_MONITOR 0x0008
71
72enum {
73 PENPARTNER = 0,
74 GRAPHIRE,
75 WACOM_G4,
76 PTU,
77 PL,
78 DTU,
79 DTUS,
80 INTUOS,
81 INTUOS3S,
82 INTUOS3,
83 INTUOS3L,
84 INTUOS4S,
85 INTUOS4,
86 INTUOS4L,
87 INTUOS5S,
88 INTUOS5,
89 INTUOS5L,
90 INTUOSPS,
91 INTUOSPM,
92 INTUOSPL,
93 INTUOSHT,
94 WACOM_21UX2,
95 WACOM_22HD,
96 DTK,
97 WACOM_24HD,
98 CINTIQ_HYBRID,
99 CINTIQ,
100 WACOM_BEE,
101 WACOM_13HD,
102 WACOM_MO,
103 WIRELESS,
104 BAMBOO_PT,
105 WACOM_24HDT,
106 TABLETPC, /* add new TPC below */
107 TABLETPCE,
108 TABLETPC2FG,
109 MTSCREEN,
110 MTTPC,
111 MTTPC_B,
112 MAX_TYPE
113};
114
115struct wacom_features {
116 const char *name;
117 int pktlen;
118 int x_max;
119 int y_max;
120 int pressure_max;
121 int distance_max;
122 int type;
123 int x_resolution;
124 int y_resolution;
125 int x_min;
126 int y_min;
127 int device_type;
128 int x_phy;
129 int y_phy;
130 unsigned char unit;
131 unsigned char unitExpo;
132 int x_fuzz;
133 int y_fuzz;
134 int pressure_fuzz;
135 int distance_fuzz;
136 unsigned quirks;
137 unsigned touch_max;
138 int oVid;
139 int oPid;
140};
141
142struct wacom_shared {
143 bool stylus_in_proximity;
144 bool touch_down;
145 /* for wireless device to access USB interfaces */
146 unsigned touch_max;
147 int type;
148 struct input_dev *touch_input;
149};
150
151struct wacom_wac {
152 char name[WACOM_NAME_MAX];
153 unsigned char *data;
154 int tool[2];
155 int id[2];
156 __u32 serial[2];
157 struct wacom_features features;
158 struct wacom_shared *shared;
159 struct input_dev *input;
160 int pid;
161 int battery_capacity;
162 int num_contacts_left;
163};
164
165#endif
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index e5987d393b44..6bb9a7dd23b6 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -471,6 +471,18 @@ config TOUCHSCREEN_HP7XX
471 To compile this driver as a module, choose M here: the 471 To compile this driver as a module, choose M here: the
472 module will be called jornada720_ts. 472 module will be called jornada720_ts.
473 473
474config TOUCHSCREEN_IPAQ_MICRO
475 tristate "HP iPAQ Atmel Micro ASIC touchscreen"
476 depends on MFD_IPAQ_MICRO
477 help
478 Say Y here to enable support for the touchscreen attached to
479 the Atmel Micro peripheral controller on iPAQ h3100/h3600/h3700
480
481 If unsure, say N.
482
483 To compile this driver as a module, choose M here: the
484 module will be called ipaq-micro-ts.
485
474config TOUCHSCREEN_HTCPEN 486config TOUCHSCREEN_HTCPEN
475 tristate "HTC Shift X9500 touchscreen" 487 tristate "HTC Shift X9500 touchscreen"
476 depends on ISA 488 depends on ISA
@@ -555,18 +567,6 @@ config TOUCHSCREEN_TI_AM335X_TSC
555 To compile this driver as a module, choose M here: the 567 To compile this driver as a module, choose M here: the
556 module will be called ti_am335x_tsc. 568 module will be called ti_am335x_tsc.
557 569
558config TOUCHSCREEN_ATMEL_TSADCC
559 tristate "Atmel Touchscreen Interface"
560 depends on ARCH_AT91
561 help
562 Say Y here if you have a 4-wire touchscreen connected to the
563 ADC Controller on your Atmel SoC.
564
565 If unsure, say N.
566
567 To compile this driver as a module, choose M here: the
568 module will be called atmel_tsadcc.
569
570config TOUCHSCREEN_UCB1400 570config TOUCHSCREEN_UCB1400
571 tristate "Philips UCB1400 touchscreen" 571 tristate "Philips UCB1400 touchscreen"
572 depends on AC97_BUS 572 depends on AC97_BUS
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 4d479fb0a768..4be94fce41af 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -14,7 +14,6 @@ obj-$(CONFIG_TOUCHSCREEN_AD7879_I2C) += ad7879-i2c.o
14obj-$(CONFIG_TOUCHSCREEN_AD7879_SPI) += ad7879-spi.o 14obj-$(CONFIG_TOUCHSCREEN_AD7879_SPI) += ad7879-spi.o
15obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o 15obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o
16obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o 16obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o
17obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o
18obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o 17obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o
19obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o 18obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o
20obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o 19obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o
@@ -47,6 +46,7 @@ obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o
47obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o 46obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o
48obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o 47obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o
49obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o 48obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o
49obj-$(CONFIG_TOUCHSCREEN_IPAQ_MICRO) += ipaq-micro-ts.o
50obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o 50obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o
51obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o 51obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o
52obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o 52obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index da201b8e37dc..e57ba52bf484 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -1302,8 +1302,10 @@ static int ads7846_probe(struct spi_device *spi)
1302 pdata = dev_get_platdata(&spi->dev); 1302 pdata = dev_get_platdata(&spi->dev);
1303 if (!pdata) { 1303 if (!pdata) {
1304 pdata = ads7846_probe_dt(&spi->dev); 1304 pdata = ads7846_probe_dt(&spi->dev);
1305 if (IS_ERR(pdata)) 1305 if (IS_ERR(pdata)) {
1306 return PTR_ERR(pdata); 1306 err = PTR_ERR(pdata);
1307 goto err_free_mem;
1308 }
1307 } 1309 }
1308 1310
1309 ts->model = pdata->model ? : 7846; 1311 ts->model = pdata->model ? : 7846;
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 6e0b4a2120d3..03b85711cb70 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -2,6 +2,7 @@
2 * Atmel maXTouch Touchscreen driver 2 * Atmel maXTouch Touchscreen driver
3 * 3 *
4 * Copyright (C) 2010 Samsung Electronics Co.Ltd 4 * Copyright (C) 2010 Samsung Electronics Co.Ltd
5 * Copyright (C) 2011-2014 Atmel Corporation
5 * Copyright (C) 2012 Google, Inc. 6 * Copyright (C) 2012 Google, Inc.
6 * 7 *
7 * Author: Joonyoung Shim <jy0922.shim@samsung.com> 8 * Author: Joonyoung Shim <jy0922.shim@samsung.com>
@@ -22,6 +23,7 @@
22#include <linux/i2c/atmel_mxt_ts.h> 23#include <linux/i2c/atmel_mxt_ts.h>
23#include <linux/input/mt.h> 24#include <linux/input/mt.h>
24#include <linux/interrupt.h> 25#include <linux/interrupt.h>
26#include <linux/of.h>
25#include <linux/slab.h> 27#include <linux/slab.h>
26 28
27/* Version */ 29/* Version */
@@ -29,8 +31,10 @@
29#define MXT_VER_21 21 31#define MXT_VER_21 21
30#define MXT_VER_22 22 32#define MXT_VER_22 22
31 33
32/* Firmware */ 34/* Firmware files */
33#define MXT_FW_NAME "maxtouch.fw" 35#define MXT_FW_NAME "maxtouch.fw"
36#define MXT_CFG_NAME "maxtouch.cfg"
37#define MXT_CFG_MAGIC "OBP_RAW V1"
34 38
35/* Registers */ 39/* Registers */
36#define MXT_INFO 0x00 40#define MXT_INFO 0x00
@@ -44,6 +48,8 @@
44#define MXT_OBJECT_START 0x07 48#define MXT_OBJECT_START 0x07
45 49
46#define MXT_OBJECT_SIZE 6 50#define MXT_OBJECT_SIZE 6
51#define MXT_INFO_CHECKSUM_SIZE 3
52#define MXT_MAX_BLOCK_WRITE 256
47 53
48/* Object types */ 54/* Object types */
49#define MXT_DEBUG_DIAGNOSTIC_T37 37 55#define MXT_DEBUG_DIAGNOSTIC_T37 37
@@ -74,6 +80,9 @@
74#define MXT_SPT_MESSAGECOUNT_T44 44 80#define MXT_SPT_MESSAGECOUNT_T44 44
75#define MXT_SPT_CTECONFIG_T46 46 81#define MXT_SPT_CTECONFIG_T46 46
76 82
83/* MXT_GEN_MESSAGE_T5 object */
84#define MXT_RPTID_NOMSG 0xff
85
77/* MXT_GEN_COMMAND_T6 field */ 86/* MXT_GEN_COMMAND_T6 field */
78#define MXT_COMMAND_RESET 0 87#define MXT_COMMAND_RESET 0
79#define MXT_COMMAND_BACKUPNV 1 88#define MXT_COMMAND_BACKUPNV 1
@@ -83,11 +92,20 @@
83 92
84/* Define for T6 status byte */ 93/* Define for T6 status byte */
85#define MXT_T6_STATUS_RESET (1 << 7) 94#define MXT_T6_STATUS_RESET (1 << 7)
95#define MXT_T6_STATUS_OFL (1 << 6)
96#define MXT_T6_STATUS_SIGERR (1 << 5)
97#define MXT_T6_STATUS_CAL (1 << 4)
98#define MXT_T6_STATUS_CFGERR (1 << 3)
99#define MXT_T6_STATUS_COMSERR (1 << 2)
86 100
87/* MXT_GEN_POWER_T7 field */ 101/* MXT_GEN_POWER_T7 field */
88#define MXT_POWER_IDLEACQINT 0 102struct t7_config {
89#define MXT_POWER_ACTVACQINT 1 103 u8 idle;
90#define MXT_POWER_ACTV2IDLETO 2 104 u8 active;
105} __packed;
106
107#define MXT_POWER_CFG_RUN 0
108#define MXT_POWER_CFG_DEEPSLEEP 1
91 109
92/* MXT_GEN_ACQUIRE_T8 field */ 110/* MXT_GEN_ACQUIRE_T8 field */
93#define MXT_ACQUIRE_CHRGTIME 0 111#define MXT_ACQUIRE_CHRGTIME 0
@@ -99,7 +117,6 @@
99#define MXT_ACQUIRE_ATCHCALSTHR 7 117#define MXT_ACQUIRE_ATCHCALSTHR 7
100 118
101/* MXT_TOUCH_MULTI_T9 field */ 119/* MXT_TOUCH_MULTI_T9 field */
102#define MXT_TOUCH_CTRL 0
103#define MXT_T9_ORIENT 9 120#define MXT_T9_ORIENT 9
104#define MXT_T9_RANGE 18 121#define MXT_T9_RANGE 18
105 122
@@ -217,11 +234,6 @@ struct mxt_object {
217 u8 num_report_ids; 234 u8 num_report_ids;
218} __packed; 235} __packed;
219 236
220struct mxt_message {
221 u8 reportid;
222 u8 message[7];
223};
224
225/* Each client has this additional data */ 237/* Each client has this additional data */
226struct mxt_data { 238struct mxt_data {
227 struct i2c_client *client; 239 struct i2c_client *client;
@@ -234,15 +246,28 @@ struct mxt_data {
234 unsigned int max_x; 246 unsigned int max_x;
235 unsigned int max_y; 247 unsigned int max_y;
236 bool in_bootloader; 248 bool in_bootloader;
249 u16 mem_size;
250 u8 max_reportid;
237 u32 config_crc; 251 u32 config_crc;
252 u32 info_crc;
238 u8 bootloader_addr; 253 u8 bootloader_addr;
254 u8 *msg_buf;
255 u8 t6_status;
256 bool update_input;
257 u8 last_message_count;
258 u8 num_touchids;
259 struct t7_config t7_cfg;
239 260
240 /* Cached parameters from object table */ 261 /* Cached parameters from object table */
262 u16 T5_address;
263 u8 T5_msg_size;
241 u8 T6_reportid; 264 u8 T6_reportid;
242 u16 T6_address; 265 u16 T6_address;
266 u16 T7_address;
243 u8 T9_reportid_min; 267 u8 T9_reportid_min;
244 u8 T9_reportid_max; 268 u8 T9_reportid_max;
245 u8 T19_reportid; 269 u8 T19_reportid;
270 u16 T44_address;
246 271
247 /* for fw update in bootloader */ 272 /* for fw update in bootloader */
248 struct completion bl_completion; 273 struct completion bl_completion;
@@ -297,42 +322,10 @@ static bool mxt_object_readable(unsigned int type)
297 } 322 }
298} 323}
299 324
300static bool mxt_object_writable(unsigned int type) 325static void mxt_dump_message(struct mxt_data *data, u8 *message)
301{
302 switch (type) {
303 case MXT_GEN_COMMAND_T6:
304 case MXT_GEN_POWER_T7:
305 case MXT_GEN_ACQUIRE_T8:
306 case MXT_TOUCH_MULTI_T9:
307 case MXT_TOUCH_KEYARRAY_T15:
308 case MXT_TOUCH_PROXIMITY_T23:
309 case MXT_TOUCH_PROXKEY_T52:
310 case MXT_PROCI_GRIPFACE_T20:
311 case MXT_PROCG_NOISE_T22:
312 case MXT_PROCI_ONETOUCH_T24:
313 case MXT_PROCI_TWOTOUCH_T27:
314 case MXT_PROCI_GRIP_T40:
315 case MXT_PROCI_PALM_T41:
316 case MXT_PROCI_TOUCHSUPPRESSION_T42:
317 case MXT_PROCI_STYLUS_T47:
318 case MXT_PROCG_NOISESUPPRESSION_T48:
319 case MXT_SPT_COMMSCONFIG_T18:
320 case MXT_SPT_GPIOPWM_T19:
321 case MXT_SPT_SELFTEST_T25:
322 case MXT_SPT_CTECONFIG_T28:
323 case MXT_SPT_DIGITIZER_T43:
324 case MXT_SPT_CTECONFIG_T46:
325 return true;
326 default:
327 return false;
328 }
329}
330
331static void mxt_dump_message(struct device *dev,
332 struct mxt_message *message)
333{ 326{
334 dev_dbg(dev, "reportid: %u\tmessage: %*ph\n", 327 dev_dbg(&data->client->dev, "message: %*ph\n",
335 message->reportid, 7, message->message); 328 data->T5_msg_size, message);
336} 329}
337 330
338static int mxt_wait_for_completion(struct mxt_data *data, 331static int mxt_wait_for_completion(struct mxt_data *data,
@@ -401,7 +394,7 @@ static int mxt_bootloader_write(struct mxt_data *data,
401 return ret; 394 return ret;
402} 395}
403 396
404static int mxt_lookup_bootloader_address(struct mxt_data *data) 397static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry)
405{ 398{
406 u8 appmode = data->client->addr; 399 u8 appmode = data->client->addr;
407 u8 bootloader; 400 u8 bootloader;
@@ -409,6 +402,12 @@ static int mxt_lookup_bootloader_address(struct mxt_data *data)
409 switch (appmode) { 402 switch (appmode) {
410 case 0x4a: 403 case 0x4a:
411 case 0x4b: 404 case 0x4b:
405 /* Chips after 1664S use different scheme */
406 if (retry || data->info.family_id >= 0xa2) {
407 bootloader = appmode - 0x24;
408 break;
409 }
410 /* Fall through for normal case */
412 case 0x4c: 411 case 0x4c:
413 case 0x4d: 412 case 0x4d:
414 case 0x5a: 413 case 0x5a:
@@ -426,6 +425,30 @@ static int mxt_lookup_bootloader_address(struct mxt_data *data)
426 return 0; 425 return 0;
427} 426}
428 427
428static int mxt_probe_bootloader(struct mxt_data *data, bool retry)
429{
430 struct device *dev = &data->client->dev;
431 int ret;
432 u8 val;
433 bool crc_failure;
434
435 ret = mxt_lookup_bootloader_address(data, retry);
436 if (ret)
437 return ret;
438
439 ret = mxt_bootloader_read(data, &val, 1);
440 if (ret)
441 return ret;
442
443 /* Check app crc fail mode */
444 crc_failure = (val & ~MXT_BOOT_STATUS_MASK) == MXT_APP_CRC_FAIL;
445
446 dev_err(dev, "Detected bootloader, status:%02X%s\n",
447 val, crc_failure ? ", APP_CRC_FAIL" : "");
448
449 return 0;
450}
451
429static u8 mxt_get_bootloader_version(struct mxt_data *data, u8 val) 452static u8 mxt_get_bootloader_version(struct mxt_data *data, u8 val)
430{ 453{
431 struct device *dev = &data->client->dev; 454 struct device *dev = &data->client->dev;
@@ -447,14 +470,15 @@ static u8 mxt_get_bootloader_version(struct mxt_data *data, u8 val)
447 } 470 }
448} 471}
449 472
450static int mxt_check_bootloader(struct mxt_data *data, unsigned int state) 473static int mxt_check_bootloader(struct mxt_data *data, unsigned int state,
474 bool wait)
451{ 475{
452 struct device *dev = &data->client->dev; 476 struct device *dev = &data->client->dev;
453 u8 val; 477 u8 val;
454 int ret; 478 int ret;
455 479
456recheck: 480recheck:
457 if (state != MXT_WAITING_BOOTLOAD_CMD) { 481 if (wait) {
458 /* 482 /*
459 * In application update mode, the interrupt 483 * In application update mode, the interrupt
460 * line signals state transitions. We must wait for the 484 * line signals state transitions. We must wait for the
@@ -485,6 +509,7 @@ recheck:
485 switch (state) { 509 switch (state) {
486 case MXT_WAITING_BOOTLOAD_CMD: 510 case MXT_WAITING_BOOTLOAD_CMD:
487 case MXT_WAITING_FRAME_DATA: 511 case MXT_WAITING_FRAME_DATA:
512 case MXT_APP_CRC_FAIL:
488 val &= ~MXT_BOOT_STATUS_MASK; 513 val &= ~MXT_BOOT_STATUS_MASK;
489 break; 514 break;
490 case MXT_FRAME_CRC_PASS: 515 case MXT_FRAME_CRC_PASS:
@@ -508,13 +533,18 @@ recheck:
508 return 0; 533 return 0;
509} 534}
510 535
511static int mxt_unlock_bootloader(struct mxt_data *data) 536static int mxt_send_bootloader_cmd(struct mxt_data *data, bool unlock)
512{ 537{
513 int ret; 538 int ret;
514 u8 buf[2]; 539 u8 buf[2];
515 540
516 buf[0] = MXT_UNLOCK_CMD_LSB; 541 if (unlock) {
517 buf[1] = MXT_UNLOCK_CMD_MSB; 542 buf[0] = MXT_UNLOCK_CMD_LSB;
543 buf[1] = MXT_UNLOCK_CMD_MSB;
544 } else {
545 buf[0] = 0x01;
546 buf[1] = 0x01;
547 }
518 548
519 ret = mxt_bootloader_write(data, buf, 2); 549 ret = mxt_bootloader_write(data, buf, 2);
520 if (ret) 550 if (ret)
@@ -605,40 +635,44 @@ mxt_get_object(struct mxt_data *data, u8 type)
605 return object; 635 return object;
606 } 636 }
607 637
608 dev_err(&data->client->dev, "Invalid object type T%u\n", type); 638 dev_warn(&data->client->dev, "Invalid object type T%u\n", type);
609 return NULL; 639 return NULL;
610} 640}
611 641
612static int mxt_read_message(struct mxt_data *data, 642static void mxt_proc_t6_messages(struct mxt_data *data, u8 *msg)
613 struct mxt_message *message)
614{ 643{
615 struct mxt_object *object; 644 struct device *dev = &data->client->dev;
616 u16 reg; 645 u8 status = msg[1];
617 646 u32 crc = msg[2] | (msg[3] << 8) | (msg[4] << 16);
618 object = mxt_get_object(data, MXT_GEN_MESSAGE_T5);
619 if (!object)
620 return -EINVAL;
621
622 reg = object->start_address;
623 return __mxt_read_reg(data->client, reg,
624 sizeof(struct mxt_message), message);
625}
626 647
627static int mxt_write_object(struct mxt_data *data, 648 complete(&data->crc_completion);
628 u8 type, u8 offset, u8 val)
629{
630 struct mxt_object *object;
631 u16 reg;
632 649
633 object = mxt_get_object(data, type); 650 if (crc != data->config_crc) {
634 if (!object || offset >= mxt_obj_size(object)) 651 data->config_crc = crc;
635 return -EINVAL; 652 dev_dbg(dev, "T6 Config Checksum: 0x%06X\n", crc);
653 }
636 654
637 reg = object->start_address; 655 /* Detect reset */
638 return mxt_write_reg(data->client, reg + offset, val); 656 if (status & MXT_T6_STATUS_RESET)
657 complete(&data->reset_completion);
658
659 /* Output debug if status has changed */
660 if (status != data->t6_status)
661 dev_dbg(dev, "T6 Status 0x%02X%s%s%s%s%s%s%s\n",
662 status,
663 status == 0 ? " OK" : "",
664 status & MXT_T6_STATUS_RESET ? " RESET" : "",
665 status & MXT_T6_STATUS_OFL ? " OFL" : "",
666 status & MXT_T6_STATUS_SIGERR ? " SIGERR" : "",
667 status & MXT_T6_STATUS_CAL ? " CAL" : "",
668 status & MXT_T6_STATUS_CFGERR ? " CFGERR" : "",
669 status & MXT_T6_STATUS_COMSERR ? " COMSERR" : "");
670
671 /* Save current status */
672 data->t6_status = status;
639} 673}
640 674
641static void mxt_input_button(struct mxt_data *data, struct mxt_message *message) 675static void mxt_input_button(struct mxt_data *data, u8 *message)
642{ 676{
643 struct input_dev *input = data->input_dev; 677 struct input_dev *input = data->input_dev;
644 const struct mxt_platform_data *pdata = data->pdata; 678 const struct mxt_platform_data *pdata = data->pdata;
@@ -649,30 +683,33 @@ static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
649 for (i = 0; i < pdata->t19_num_keys; i++) { 683 for (i = 0; i < pdata->t19_num_keys; i++) {
650 if (pdata->t19_keymap[i] == KEY_RESERVED) 684 if (pdata->t19_keymap[i] == KEY_RESERVED)
651 continue; 685 continue;
652 button = !(message->message[0] & (1 << i)); 686 button = !(message[1] & (1 << i));
653 input_report_key(input, pdata->t19_keymap[i], button); 687 input_report_key(input, pdata->t19_keymap[i], button);
654 } 688 }
655} 689}
656 690
657static void mxt_input_sync(struct input_dev *input_dev) 691static void mxt_input_sync(struct mxt_data *data)
658{ 692{
659 input_mt_report_pointer_emulation(input_dev, false); 693 input_mt_report_pointer_emulation(data->input_dev,
660 input_sync(input_dev); 694 data->pdata->t19_num_keys);
695 input_sync(data->input_dev);
661} 696}
662 697
663static void mxt_input_touchevent(struct mxt_data *data, 698static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
664 struct mxt_message *message, int id)
665{ 699{
666 struct device *dev = &data->client->dev; 700 struct device *dev = &data->client->dev;
667 u8 status = message->message[0];
668 struct input_dev *input_dev = data->input_dev; 701 struct input_dev *input_dev = data->input_dev;
702 int id;
703 u8 status;
669 int x; 704 int x;
670 int y; 705 int y;
671 int area; 706 int area;
672 int amplitude; 707 int amplitude;
673 708
674 x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf); 709 id = message[0] - data->T9_reportid_min;
675 y = (message->message[2] << 4) | ((message->message[3] & 0xf)); 710 status = message[1];
711 x = (message[2] << 4) | ((message[4] >> 4) & 0xf);
712 y = (message[3] << 4) | ((message[4] & 0xf));
676 713
677 /* Handle 10/12 bit switching */ 714 /* Handle 10/12 bit switching */
678 if (data->max_x < 1024) 715 if (data->max_x < 1024)
@@ -680,8 +717,8 @@ static void mxt_input_touchevent(struct mxt_data *data,
680 if (data->max_y < 1024) 717 if (data->max_y < 1024)
681 y >>= 2; 718 y >>= 2;
682 719
683 area = message->message[4]; 720 area = message[5];
684 amplitude = message->message[5]; 721 amplitude = message[6];
685 722
686 dev_dbg(dev, 723 dev_dbg(dev,
687 "[%u] %c%c%c%c%c%c%c%c x: %5u y: %5u area: %3u amp: %3u\n", 724 "[%u] %c%c%c%c%c%c%c%c x: %5u y: %5u area: %3u amp: %3u\n",
@@ -707,7 +744,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
707 if (status & MXT_T9_RELEASE) { 744 if (status & MXT_T9_RELEASE) {
708 input_mt_report_slot_state(input_dev, 745 input_mt_report_slot_state(input_dev,
709 MT_TOOL_FINGER, 0); 746 MT_TOOL_FINGER, 0);
710 mxt_input_sync(input_dev); 747 mxt_input_sync(data);
711 } 748 }
712 749
713 /* Touch active */ 750 /* Touch active */
@@ -720,64 +757,179 @@ static void mxt_input_touchevent(struct mxt_data *data,
720 /* Touch no longer active, close out slot */ 757 /* Touch no longer active, close out slot */
721 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 0); 758 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 0);
722 } 759 }
760
761 data->update_input = true;
762}
763
764static int mxt_proc_message(struct mxt_data *data, u8 *message)
765{
766 u8 report_id = message[0];
767
768 if (report_id == MXT_RPTID_NOMSG)
769 return 0;
770
771 if (report_id == data->T6_reportid) {
772 mxt_proc_t6_messages(data, message);
773 } else if (!data->input_dev) {
774 /*
775 * Do not report events if input device
776 * is not yet registered.
777 */
778 mxt_dump_message(data, message);
779 } else if (report_id >= data->T9_reportid_min
780 && report_id <= data->T9_reportid_max) {
781 mxt_proc_t9_message(data, message);
782 } else if (report_id == data->T19_reportid) {
783 mxt_input_button(data, message);
784 data->update_input = true;
785 } else {
786 mxt_dump_message(data, message);
787 }
788
789 return 1;
723} 790}
724 791
725static u16 mxt_extract_T6_csum(const u8 *csum) 792static int mxt_read_and_process_messages(struct mxt_data *data, u8 count)
726{ 793{
727 return csum[0] | (csum[1] << 8) | (csum[2] << 16); 794 struct device *dev = &data->client->dev;
795 int ret;
796 int i;
797 u8 num_valid = 0;
798
799 /* Safety check for msg_buf */
800 if (count > data->max_reportid)
801 return -EINVAL;
802
803 /* Process remaining messages if necessary */
804 ret = __mxt_read_reg(data->client, data->T5_address,
805 data->T5_msg_size * count, data->msg_buf);
806 if (ret) {
807 dev_err(dev, "Failed to read %u messages (%d)\n", count, ret);
808 return ret;
809 }
810
811 for (i = 0; i < count; i++) {
812 ret = mxt_proc_message(data,
813 data->msg_buf + data->T5_msg_size * i);
814
815 if (ret == 1)
816 num_valid++;
817 }
818
819 /* return number of messages read */
820 return num_valid;
728} 821}
729 822
730static bool mxt_is_T9_message(struct mxt_data *data, struct mxt_message *msg) 823static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
731{ 824{
732 u8 id = msg->reportid; 825 struct device *dev = &data->client->dev;
733 return (id >= data->T9_reportid_min && id <= data->T9_reportid_max); 826 int ret;
827 u8 count, num_left;
828
829 /* Read T44 and T5 together */
830 ret = __mxt_read_reg(data->client, data->T44_address,
831 data->T5_msg_size + 1, data->msg_buf);
832 if (ret) {
833 dev_err(dev, "Failed to read T44 and T5 (%d)\n", ret);
834 return IRQ_NONE;
835 }
836
837 count = data->msg_buf[0];
838
839 if (count == 0) {
840 dev_warn(dev, "Interrupt triggered but zero messages\n");
841 return IRQ_NONE;
842 } else if (count > data->max_reportid) {
843 dev_err(dev, "T44 count %d exceeded max report id\n", count);
844 count = data->max_reportid;
845 }
846
847 /* Process first message */
848 ret = mxt_proc_message(data, data->msg_buf + 1);
849 if (ret < 0) {
850 dev_warn(dev, "Unexpected invalid message\n");
851 return IRQ_NONE;
852 }
853
854 num_left = count - 1;
855
856 /* Process remaining messages if necessary */
857 if (num_left) {
858 ret = mxt_read_and_process_messages(data, num_left);
859 if (ret < 0)
860 goto end;
861 else if (ret != num_left)
862 dev_warn(dev, "Unexpected invalid message\n");
863 }
864
865end:
866 if (data->update_input) {
867 mxt_input_sync(data);
868 data->update_input = false;
869 }
870
871 return IRQ_HANDLED;
734} 872}
735 873
736static irqreturn_t mxt_process_messages_until_invalid(struct mxt_data *data) 874static int mxt_process_messages_until_invalid(struct mxt_data *data)
737{ 875{
738 struct mxt_message message;
739 const u8 *payload = &message.message[0];
740 struct device *dev = &data->client->dev; 876 struct device *dev = &data->client->dev;
741 u8 reportid; 877 int count, read;
742 bool update_input = false; 878 u8 tries = 2;
743 u32 crc;
744 879
880 count = data->max_reportid;
881
882 /* Read messages until we force an invalid */
745 do { 883 do {
746 if (mxt_read_message(data, &message)) { 884 read = mxt_read_and_process_messages(data, count);
747 dev_err(dev, "Failed to read message\n"); 885 if (read < count)
748 return IRQ_NONE; 886 return 0;
749 } 887 } while (--tries);
750 888
751 reportid = message.reportid; 889 if (data->update_input) {
890 mxt_input_sync(data);
891 data->update_input = false;
892 }
752 893
753 if (reportid == data->T6_reportid) { 894 dev_err(dev, "CHG pin isn't cleared\n");
754 u8 status = payload[0]; 895 return -EBUSY;
896}
755 897
756 crc = mxt_extract_T6_csum(&payload[1]); 898static irqreturn_t mxt_process_messages(struct mxt_data *data)
757 if (crc != data->config_crc) { 899{
758 data->config_crc = crc; 900 int total_handled, num_handled;
759 complete(&data->crc_completion); 901 u8 count = data->last_message_count;
760 }
761 902
762 dev_dbg(dev, "Status: %02x Config Checksum: %06x\n", 903 if (count < 1 || count > data->max_reportid)
763 status, data->config_crc); 904 count = 1;
764
765 if (status & MXT_T6_STATUS_RESET)
766 complete(&data->reset_completion);
767 } else if (mxt_is_T9_message(data, &message)) {
768 int id = reportid - data->T9_reportid_min;
769 mxt_input_touchevent(data, &message, id);
770 update_input = true;
771 } else if (message.reportid == data->T19_reportid) {
772 mxt_input_button(data, &message);
773 update_input = true;
774 } else {
775 mxt_dump_message(dev, &message);
776 }
777 } while (reportid != 0xff);
778 905
779 if (update_input) 906 /* include final invalid message */
780 mxt_input_sync(data->input_dev); 907 total_handled = mxt_read_and_process_messages(data, count + 1);
908 if (total_handled < 0)
909 return IRQ_NONE;
910 /* if there were invalid messages, then we are done */
911 else if (total_handled <= count)
912 goto update_count;
913
914 /* keep reading two msgs until one is invalid or reportid limit */
915 do {
916 num_handled = mxt_read_and_process_messages(data, 2);
917 if (num_handled < 0)
918 return IRQ_NONE;
919
920 total_handled += num_handled;
921
922 if (num_handled < 2)
923 break;
924 } while (total_handled < data->num_touchids);
925
926update_count:
927 data->last_message_count = total_handled;
928
929 if (data->update_input) {
930 mxt_input_sync(data);
931 data->update_input = false;
932 }
781 933
782 return IRQ_HANDLED; 934 return IRQ_HANDLED;
783} 935}
@@ -792,7 +944,14 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
792 return IRQ_HANDLED; 944 return IRQ_HANDLED;
793 } 945 }
794 946
795 return mxt_process_messages_until_invalid(data); 947 if (!data->object_table)
948 return IRQ_HANDLED;
949
950 if (data->T44_address) {
951 return mxt_process_messages_t44(data);
952 } else {
953 return mxt_process_messages(data);
954 }
796} 955}
797 956
798static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset, 957static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset,
@@ -866,78 +1025,314 @@ static void mxt_update_crc(struct mxt_data *data, u8 cmd, u8 value)
866 mxt_wait_for_completion(data, &data->crc_completion, MXT_CRC_TIMEOUT); 1025 mxt_wait_for_completion(data, &data->crc_completion, MXT_CRC_TIMEOUT);
867} 1026}
868 1027
869static int mxt_check_reg_init(struct mxt_data *data) 1028static void mxt_calc_crc24(u32 *crc, u8 firstbyte, u8 secondbyte)
1029{
1030 static const unsigned int crcpoly = 0x80001B;
1031 u32 result;
1032 u32 data_word;
1033
1034 data_word = (secondbyte << 8) | firstbyte;
1035 result = ((*crc << 1) ^ data_word);
1036
1037 if (result & 0x1000000)
1038 result ^= crcpoly;
1039
1040 *crc = result;
1041}
1042
1043static u32 mxt_calculate_crc(u8 *base, off_t start_off, off_t end_off)
1044{
1045 u32 crc = 0;
1046 u8 *ptr = base + start_off;
1047 u8 *last_val = base + end_off - 1;
1048
1049 if (end_off < start_off)
1050 return -EINVAL;
1051
1052 while (ptr < last_val) {
1053 mxt_calc_crc24(&crc, *ptr, *(ptr + 1));
1054 ptr += 2;
1055 }
1056
1057 /* if len is odd, fill the last byte with 0 */
1058 if (ptr == last_val)
1059 mxt_calc_crc24(&crc, *ptr, 0);
1060
1061 /* Mask to 24-bit */
1062 crc &= 0x00FFFFFF;
1063
1064 return crc;
1065}
1066
1067/*
1068 * mxt_update_cfg - download configuration to chip
1069 *
1070 * Atmel Raw Config File Format
1071 *
1072 * The first four lines of the raw config file contain:
1073 * 1) Version
1074 * 2) Chip ID Information (first 7 bytes of device memory)
1075 * 3) Chip Information Block 24-bit CRC Checksum
1076 * 4) Chip Configuration 24-bit CRC Checksum
1077 *
1078 * The rest of the file consists of one line per object instance:
1079 * <TYPE> <INSTANCE> <SIZE> <CONTENTS>
1080 *
1081 * <TYPE> - 2-byte object type as hex
1082 * <INSTANCE> - 2-byte object instance number as hex
1083 * <SIZE> - 2-byte object size as hex
1084 * <CONTENTS> - array of <SIZE> 1-byte hex values
1085 */
1086static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
870{ 1087{
871 const struct mxt_platform_data *pdata = data->pdata;
872 struct mxt_object *object;
873 struct device *dev = &data->client->dev; 1088 struct device *dev = &data->client->dev;
874 int index = 0; 1089 struct mxt_info cfg_info;
875 int i, size; 1090 struct mxt_object *object;
876 int ret; 1091 int ret;
1092 int offset;
1093 int data_pos;
1094 int byte_offset;
1095 int i;
1096 int cfg_start_ofs;
1097 u32 info_crc, config_crc, calculated_crc;
1098 u8 *config_mem;
1099 size_t config_mem_size;
1100 unsigned int type, instance, size;
1101 u8 val;
1102 u16 reg;
877 1103
878 if (!pdata->config) { 1104 mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1);
879 dev_dbg(dev, "No cfg data defined, skipping reg init\n"); 1105
880 return 0; 1106 if (strncmp(cfg->data, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) {
1107 dev_err(dev, "Unrecognised config file\n");
1108 ret = -EINVAL;
1109 goto release;
881 } 1110 }
882 1111
883 mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1); 1112 data_pos = strlen(MXT_CFG_MAGIC);
1113
1114 /* Load information block and check */
1115 for (i = 0; i < sizeof(struct mxt_info); i++) {
1116 ret = sscanf(cfg->data + data_pos, "%hhx%n",
1117 (unsigned char *)&cfg_info + i,
1118 &offset);
1119 if (ret != 1) {
1120 dev_err(dev, "Bad format\n");
1121 ret = -EINVAL;
1122 goto release;
1123 }
884 1124
885 if (data->config_crc == pdata->config_crc) { 1125 data_pos += offset;
886 dev_info(dev, "Config CRC 0x%06X: OK\n", data->config_crc);
887 return 0;
888 } 1126 }
889 1127
890 dev_info(dev, "Config CRC 0x%06X: does not match 0x%06X\n", 1128 if (cfg_info.family_id != data->info.family_id) {
891 data->config_crc, pdata->config_crc); 1129 dev_err(dev, "Family ID mismatch!\n");
1130 ret = -EINVAL;
1131 goto release;
1132 }
892 1133
893 for (i = 0; i < data->info.object_num; i++) { 1134 if (cfg_info.variant_id != data->info.variant_id) {
894 object = data->object_table + i; 1135 dev_err(dev, "Variant ID mismatch!\n");
1136 ret = -EINVAL;
1137 goto release;
1138 }
1139
1140 /* Read CRCs */
1141 ret = sscanf(cfg->data + data_pos, "%x%n", &info_crc, &offset);
1142 if (ret != 1) {
1143 dev_err(dev, "Bad format: failed to parse Info CRC\n");
1144 ret = -EINVAL;
1145 goto release;
1146 }
1147 data_pos += offset;
895 1148
896 if (!mxt_object_writable(object->type)) 1149 ret = sscanf(cfg->data + data_pos, "%x%n", &config_crc, &offset);
1150 if (ret != 1) {
1151 dev_err(dev, "Bad format: failed to parse Config CRC\n");
1152 ret = -EINVAL;
1153 goto release;
1154 }
1155 data_pos += offset;
1156
1157 /*
1158 * The Info Block CRC is calculated over mxt_info and the object
1159 * table. If it does not match then we are trying to load the
1160 * configuration from a different chip or firmware version, so
1161 * the configuration CRC is invalid anyway.
1162 */
1163 if (info_crc == data->info_crc) {
1164 if (config_crc == 0 || data->config_crc == 0) {
1165 dev_info(dev, "CRC zero, attempting to apply config\n");
1166 } else if (config_crc == data->config_crc) {
1167 dev_dbg(dev, "Config CRC 0x%06X: OK\n",
1168 data->config_crc);
1169 ret = 0;
1170 goto release;
1171 } else {
1172 dev_info(dev, "Config CRC 0x%06X: does not match file 0x%06X\n",
1173 data->config_crc, config_crc);
1174 }
1175 } else {
1176 dev_warn(dev,
1177 "Warning: Info CRC error - device=0x%06X file=0x%06X\n",
1178 data->info_crc, info_crc);
1179 }
1180
1181 /* Malloc memory to store configuration */
1182 cfg_start_ofs = MXT_OBJECT_START +
1183 data->info.object_num * sizeof(struct mxt_object) +
1184 MXT_INFO_CHECKSUM_SIZE;
1185 config_mem_size = data->mem_size - cfg_start_ofs;
1186 config_mem = kzalloc(config_mem_size, GFP_KERNEL);
1187 if (!config_mem) {
1188 dev_err(dev, "Failed to allocate memory\n");
1189 ret = -ENOMEM;
1190 goto release;
1191 }
1192
1193 while (data_pos < cfg->size) {
1194 /* Read type, instance, length */
1195 ret = sscanf(cfg->data + data_pos, "%x %x %x%n",
1196 &type, &instance, &size, &offset);
1197 if (ret == 0) {
1198 /* EOF */
1199 break;
1200 } else if (ret != 3) {
1201 dev_err(dev, "Bad format: failed to parse object\n");
1202 ret = -EINVAL;
1203 goto release_mem;
1204 }
1205 data_pos += offset;
1206
1207 object = mxt_get_object(data, type);
1208 if (!object) {
1209 /* Skip object */
1210 for (i = 0; i < size; i++) {
1211 ret = sscanf(cfg->data + data_pos, "%hhx%n",
1212 &val,
1213 &offset);
1214 data_pos += offset;
1215 }
897 continue; 1216 continue;
1217 }
898 1218
899 size = mxt_obj_size(object) * mxt_obj_instances(object); 1219 if (size > mxt_obj_size(object)) {
900 if (index + size > pdata->config_length) { 1220 /*
901 dev_err(dev, "Not enough config data!\n"); 1221 * Either we are in fallback mode due to wrong
902 return -EINVAL; 1222 * config or config from a later fw version,
1223 * or the file is corrupt or hand-edited.
1224 */
1225 dev_warn(dev, "Discarding %zu byte(s) in T%u\n",
1226 size - mxt_obj_size(object), type);
1227 } else if (mxt_obj_size(object) > size) {
1228 /*
1229 * If firmware is upgraded, new bytes may be added to
1230 * end of objects. It is generally forward compatible
1231 * to zero these bytes - previous behaviour will be
1232 * retained. However this does invalidate the CRC and
1233 * will force fallback mode until the configuration is
1234 * updated. We warn here but do nothing else - the
1235 * malloc has zeroed the entire configuration.
1236 */
1237 dev_warn(dev, "Zeroing %zu byte(s) in T%d\n",
1238 mxt_obj_size(object) - size, type);
903 } 1239 }
904 1240
905 ret = __mxt_write_reg(data->client, object->start_address, 1241 if (instance >= mxt_obj_instances(object)) {
906 size, &pdata->config[index]); 1242 dev_err(dev, "Object instances exceeded!\n");
907 if (ret) 1243 ret = -EINVAL;
908 return ret; 1244 goto release_mem;
909 index += size; 1245 }
1246
1247 reg = object->start_address + mxt_obj_size(object) * instance;
1248
1249 for (i = 0; i < size; i++) {
1250 ret = sscanf(cfg->data + data_pos, "%hhx%n",
1251 &val,
1252 &offset);
1253 if (ret != 1) {
1254 dev_err(dev, "Bad format in T%d\n", type);
1255 ret = -EINVAL;
1256 goto release_mem;
1257 }
1258 data_pos += offset;
1259
1260 if (i > mxt_obj_size(object))
1261 continue;
1262
1263 byte_offset = reg + i - cfg_start_ofs;
1264
1265 if ((byte_offset >= 0)
1266 && (byte_offset <= config_mem_size)) {
1267 *(config_mem + byte_offset) = val;
1268 } else {
1269 dev_err(dev, "Bad object: reg:%d, T%d, ofs=%d\n",
1270 reg, object->type, byte_offset);
1271 ret = -EINVAL;
1272 goto release_mem;
1273 }
1274 }
1275 }
1276
1277 /* Calculate crc of the received configs (not the raw config file) */
1278 if (data->T7_address < cfg_start_ofs) {
1279 dev_err(dev, "Bad T7 address, T7addr = %x, config offset %x\n",
1280 data->T7_address, cfg_start_ofs);
1281 ret = 0;
1282 goto release_mem;
1283 }
1284
1285 calculated_crc = mxt_calculate_crc(config_mem,
1286 data->T7_address - cfg_start_ofs,
1287 config_mem_size);
1288
1289 if (config_crc > 0 && (config_crc != calculated_crc))
1290 dev_warn(dev, "Config CRC error, calculated=%06X, file=%06X\n",
1291 calculated_crc, config_crc);
1292
1293 /* Write configuration as blocks */
1294 byte_offset = 0;
1295 while (byte_offset < config_mem_size) {
1296 size = config_mem_size - byte_offset;
1297
1298 if (size > MXT_MAX_BLOCK_WRITE)
1299 size = MXT_MAX_BLOCK_WRITE;
1300
1301 ret = __mxt_write_reg(data->client,
1302 cfg_start_ofs + byte_offset,
1303 size, config_mem + byte_offset);
1304 if (ret != 0) {
1305 dev_err(dev, "Config write error, ret=%d\n", ret);
1306 goto release_mem;
1307 }
1308
1309 byte_offset += size;
910 } 1310 }
911 1311
912 mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE); 1312 mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE);
913 1313
914 ret = mxt_soft_reset(data); 1314 ret = mxt_soft_reset(data);
915 if (ret) 1315 if (ret)
916 return ret; 1316 goto release_mem;
917 1317
918 dev_info(dev, "Config successfully updated\n"); 1318 dev_info(dev, "Config successfully updated\n");
919 1319
920 return 0; 1320release_mem:
1321 kfree(config_mem);
1322release:
1323 release_firmware(cfg);
1324 return ret;
921} 1325}
922 1326
923static int mxt_make_highchg(struct mxt_data *data) 1327static int mxt_acquire_irq(struct mxt_data *data)
924{ 1328{
925 struct device *dev = &data->client->dev;
926 struct mxt_message message;
927 int count = 10;
928 int error; 1329 int error;
929 1330
930 /* Read dummy message to make high CHG pin */ 1331 enable_irq(data->irq);
931 do {
932 error = mxt_read_message(data, &message);
933 if (error)
934 return error;
935 } while (message.reportid != 0xff && --count);
936 1332
937 if (!count) { 1333 error = mxt_process_messages_until_invalid(data);
938 dev_err(dev, "CHG pin isn't cleared\n"); 1334 if (error)
939 return -EBUSY; 1335 return error;
940 }
941 1336
942 return 0; 1337 return 0;
943} 1338}
@@ -956,24 +1351,55 @@ static int mxt_get_info(struct mxt_data *data)
956 return 0; 1351 return 0;
957} 1352}
958 1353
1354static void mxt_free_object_table(struct mxt_data *data)
1355{
1356 input_unregister_device(data->input_dev);
1357 data->input_dev = NULL;
1358
1359 kfree(data->object_table);
1360 data->object_table = NULL;
1361 kfree(data->msg_buf);
1362 data->msg_buf = NULL;
1363 data->T5_address = 0;
1364 data->T5_msg_size = 0;
1365 data->T6_reportid = 0;
1366 data->T7_address = 0;
1367 data->T9_reportid_min = 0;
1368 data->T9_reportid_max = 0;
1369 data->T19_reportid = 0;
1370 data->T44_address = 0;
1371 data->max_reportid = 0;
1372}
1373
959static int mxt_get_object_table(struct mxt_data *data) 1374static int mxt_get_object_table(struct mxt_data *data)
960{ 1375{
961 struct i2c_client *client = data->client; 1376 struct i2c_client *client = data->client;
962 size_t table_size; 1377 size_t table_size;
1378 struct mxt_object *object_table;
963 int error; 1379 int error;
964 int i; 1380 int i;
965 u8 reportid; 1381 u8 reportid;
1382 u16 end_address;
966 1383
967 table_size = data->info.object_num * sizeof(struct mxt_object); 1384 table_size = data->info.object_num * sizeof(struct mxt_object);
1385 object_table = kzalloc(table_size, GFP_KERNEL);
1386 if (!object_table) {
1387 dev_err(&data->client->dev, "Failed to allocate memory\n");
1388 return -ENOMEM;
1389 }
1390
968 error = __mxt_read_reg(client, MXT_OBJECT_START, table_size, 1391 error = __mxt_read_reg(client, MXT_OBJECT_START, table_size,
969 data->object_table); 1392 object_table);
970 if (error) 1393 if (error) {
1394 kfree(object_table);
971 return error; 1395 return error;
1396 }
972 1397
973 /* Valid Report IDs start counting from 1 */ 1398 /* Valid Report IDs start counting from 1 */
974 reportid = 1; 1399 reportid = 1;
1400 data->mem_size = 0;
975 for (i = 0; i < data->info.object_num; i++) { 1401 for (i = 0; i < data->info.object_num; i++) {
976 struct mxt_object *object = data->object_table + i; 1402 struct mxt_object *object = object_table + i;
977 u8 min_id, max_id; 1403 u8 min_id, max_id;
978 1404
979 le16_to_cpus(&object->start_address); 1405 le16_to_cpus(&object->start_address);
@@ -995,31 +1421,71 @@ static int mxt_get_object_table(struct mxt_data *data)
995 min_id, max_id); 1421 min_id, max_id);
996 1422
997 switch (object->type) { 1423 switch (object->type) {
1424 case MXT_GEN_MESSAGE_T5:
1425 if (data->info.family_id == 0x80) {
1426 /*
1427 * On mXT224 read and discard unused CRC byte
1428 * otherwise DMA reads are misaligned
1429 */
1430 data->T5_msg_size = mxt_obj_size(object);
1431 } else {
1432 /* CRC not enabled, so skip last byte */
1433 data->T5_msg_size = mxt_obj_size(object) - 1;
1434 }
1435 data->T5_address = object->start_address;
998 case MXT_GEN_COMMAND_T6: 1436 case MXT_GEN_COMMAND_T6:
999 data->T6_reportid = min_id; 1437 data->T6_reportid = min_id;
1000 data->T6_address = object->start_address; 1438 data->T6_address = object->start_address;
1001 break; 1439 break;
1440 case MXT_GEN_POWER_T7:
1441 data->T7_address = object->start_address;
1442 break;
1002 case MXT_TOUCH_MULTI_T9: 1443 case MXT_TOUCH_MULTI_T9:
1003 data->T9_reportid_min = min_id; 1444 data->T9_reportid_min = min_id;
1004 data->T9_reportid_max = max_id; 1445 data->T9_reportid_max = max_id;
1446 data->num_touchids = object->num_report_ids
1447 * mxt_obj_instances(object);
1448 break;
1449 case MXT_SPT_MESSAGECOUNT_T44:
1450 data->T44_address = object->start_address;
1005 break; 1451 break;
1006 case MXT_SPT_GPIOPWM_T19: 1452 case MXT_SPT_GPIOPWM_T19:
1007 data->T19_reportid = min_id; 1453 data->T19_reportid = min_id;
1008 break; 1454 break;
1009 } 1455 }
1456
1457 end_address = object->start_address
1458 + mxt_obj_size(object) * mxt_obj_instances(object) - 1;
1459
1460 if (end_address >= data->mem_size)
1461 data->mem_size = end_address + 1;
1462 }
1463
1464 /* Store maximum reportid */
1465 data->max_reportid = reportid;
1466
1467 /* If T44 exists, T5 position has to be directly after */
1468 if (data->T44_address && (data->T5_address != data->T44_address + 1)) {
1469 dev_err(&client->dev, "Invalid T44 position\n");
1470 error = -EINVAL;
1471 goto free_object_table;
1472 }
1473
1474 data->msg_buf = kcalloc(data->max_reportid,
1475 data->T5_msg_size, GFP_KERNEL);
1476 if (!data->msg_buf) {
1477 dev_err(&client->dev, "Failed to allocate message buffer\n");
1478 error = -ENOMEM;
1479 goto free_object_table;
1010 } 1480 }
1011 1481
1482 data->object_table = object_table;
1483
1012 return 0; 1484 return 0;
1013}
1014 1485
1015static void mxt_free_object_table(struct mxt_data *data) 1486free_object_table:
1016{ 1487 mxt_free_object_table(data);
1017 kfree(data->object_table); 1488 return error;
1018 data->object_table = NULL;
1019 data->T6_reportid = 0;
1020 data->T9_reportid_min = 0;
1021 data->T9_reportid_max = 0;
1022 data->T19_reportid = 0;
1023} 1489}
1024 1490
1025static int mxt_read_t9_resolution(struct mxt_data *data) 1491static int mxt_read_t9_resolution(struct mxt_data *data)
@@ -1070,55 +1536,255 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
1070 return 0; 1536 return 0;
1071} 1537}
1072 1538
1539static int mxt_input_open(struct input_dev *dev);
1540static void mxt_input_close(struct input_dev *dev);
1541
1542static int mxt_initialize_t9_input_device(struct mxt_data *data)
1543{
1544 struct device *dev = &data->client->dev;
1545 const struct mxt_platform_data *pdata = data->pdata;
1546 struct input_dev *input_dev;
1547 int error;
1548 unsigned int num_mt_slots;
1549 unsigned int mt_flags = 0;
1550 int i;
1551
1552 error = mxt_read_t9_resolution(data);
1553 if (error)
1554 dev_warn(dev, "Failed to initialize T9 resolution\n");
1555
1556 input_dev = input_allocate_device();
1557 if (!input_dev) {
1558 dev_err(dev, "Failed to allocate memory\n");
1559 return -ENOMEM;
1560 }
1561
1562 input_dev->name = "Atmel maXTouch Touchscreen";
1563 input_dev->phys = data->phys;
1564 input_dev->id.bustype = BUS_I2C;
1565 input_dev->dev.parent = dev;
1566 input_dev->open = mxt_input_open;
1567 input_dev->close = mxt_input_close;
1568
1569 __set_bit(EV_ABS, input_dev->evbit);
1570 __set_bit(EV_KEY, input_dev->evbit);
1571 __set_bit(BTN_TOUCH, input_dev->keybit);
1572
1573 if (pdata->t19_num_keys) {
1574 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
1575
1576 for (i = 0; i < pdata->t19_num_keys; i++)
1577 if (pdata->t19_keymap[i] != KEY_RESERVED)
1578 input_set_capability(input_dev, EV_KEY,
1579 pdata->t19_keymap[i]);
1580
1581 mt_flags |= INPUT_MT_POINTER;
1582
1583 input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
1584 input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
1585 input_abs_set_res(input_dev, ABS_MT_POSITION_X,
1586 MXT_PIXELS_PER_MM);
1587 input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
1588 MXT_PIXELS_PER_MM);
1589
1590 input_dev->name = "Atmel maXTouch Touchpad";
1591 }
1592
1593 /* For single touch */
1594 input_set_abs_params(input_dev, ABS_X,
1595 0, data->max_x, 0, 0);
1596 input_set_abs_params(input_dev, ABS_Y,
1597 0, data->max_y, 0, 0);
1598 input_set_abs_params(input_dev, ABS_PRESSURE,
1599 0, 255, 0, 0);
1600
1601 /* For multi touch */
1602 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
1603 error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags);
1604 if (error) {
1605 dev_err(dev, "Error %d initialising slots\n", error);
1606 goto err_free_mem;
1607 }
1608
1609 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
1610 0, MXT_MAX_AREA, 0, 0);
1611 input_set_abs_params(input_dev, ABS_MT_POSITION_X,
1612 0, data->max_x, 0, 0);
1613 input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
1614 0, data->max_y, 0, 0);
1615 input_set_abs_params(input_dev, ABS_MT_PRESSURE,
1616 0, 255, 0, 0);
1617
1618 input_set_drvdata(input_dev, data);
1619
1620 error = input_register_device(input_dev);
1621 if (error) {
1622 dev_err(dev, "Error %d registering input device\n", error);
1623 goto err_free_mem;
1624 }
1625
1626 data->input_dev = input_dev;
1627
1628 return 0;
1629
1630err_free_mem:
1631 input_free_device(input_dev);
1632 return error;
1633}
1634
1635static int mxt_configure_objects(struct mxt_data *data,
1636 const struct firmware *cfg);
1637
1638static void mxt_config_cb(const struct firmware *cfg, void *ctx)
1639{
1640 mxt_configure_objects(ctx, cfg);
1641}
1642
1073static int mxt_initialize(struct mxt_data *data) 1643static int mxt_initialize(struct mxt_data *data)
1074{ 1644{
1075 struct i2c_client *client = data->client; 1645 struct i2c_client *client = data->client;
1076 struct mxt_info *info = &data->info;
1077 int error; 1646 int error;
1647 bool alt_bootloader_addr = false;
1648 bool retry = false;
1078 1649
1650retry_info:
1079 error = mxt_get_info(data); 1651 error = mxt_get_info(data);
1080 if (error) 1652 if (error) {
1081 return error; 1653retry_bootloader:
1654 error = mxt_probe_bootloader(data, alt_bootloader_addr);
1655 if (error) {
1656 if (alt_bootloader_addr) {
1657 /* Chip is not in appmode or bootloader mode */
1658 return error;
1659 }
1082 1660
1083 data->object_table = kcalloc(info->object_num, 1661 dev_info(&client->dev, "Trying alternate bootloader address\n");
1084 sizeof(struct mxt_object), 1662 alt_bootloader_addr = true;
1085 GFP_KERNEL); 1663 goto retry_bootloader;
1086 if (!data->object_table) { 1664 } else {
1087 dev_err(&client->dev, "Failed to allocate memory\n"); 1665 if (retry) {
1088 return -ENOMEM; 1666 dev_err(&client->dev, "Could not recover from bootloader mode\n");
1667 /*
1668 * We can reflash from this state, so do not
1669 * abort init
1670 */
1671 data->in_bootloader = true;
1672 return 0;
1673 }
1674
1675 /* Attempt to exit bootloader into app mode */
1676 mxt_send_bootloader_cmd(data, false);
1677 msleep(MXT_FW_RESET_TIME);
1678 retry = true;
1679 goto retry_info;
1680 }
1089 } 1681 }
1090 1682
1091 /* Get object table information */ 1683 /* Get object table information */
1092 error = mxt_get_object_table(data); 1684 error = mxt_get_object_table(data);
1093 if (error) { 1685 if (error) {
1094 dev_err(&client->dev, "Error %d reading object table\n", error); 1686 dev_err(&client->dev, "Error %d reading object table\n", error);
1095 goto err_free_object_table; 1687 return error;
1096 } 1688 }
1097 1689
1098 /* Check register init values */ 1690 mxt_acquire_irq(data);
1099 error = mxt_check_reg_init(data); 1691 if (error)
1100 if (error) {
1101 dev_err(&client->dev, "Error %d initializing configuration\n",
1102 error);
1103 goto err_free_object_table; 1692 goto err_free_object_table;
1693
1694 request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME,
1695 &data->client->dev, GFP_KERNEL, data,
1696 mxt_config_cb);
1697
1698 return 0;
1699
1700err_free_object_table:
1701 mxt_free_object_table(data);
1702 return error;
1703}
1704
1705static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep)
1706{
1707 struct device *dev = &data->client->dev;
1708 int error;
1709 struct t7_config *new_config;
1710 struct t7_config deepsleep = { .active = 0, .idle = 0 };
1711
1712 if (sleep == MXT_POWER_CFG_DEEPSLEEP)
1713 new_config = &deepsleep;
1714 else
1715 new_config = &data->t7_cfg;
1716
1717 error = __mxt_write_reg(data->client, data->T7_address,
1718 sizeof(data->t7_cfg), new_config);
1719 if (error)
1720 return error;
1721
1722 dev_dbg(dev, "Set T7 ACTV:%d IDLE:%d\n",
1723 new_config->active, new_config->idle);
1724
1725 return 0;
1726}
1727
1728static int mxt_init_t7_power_cfg(struct mxt_data *data)
1729{
1730 struct device *dev = &data->client->dev;
1731 int error;
1732 bool retry = false;
1733
1734recheck:
1735 error = __mxt_read_reg(data->client, data->T7_address,
1736 sizeof(data->t7_cfg), &data->t7_cfg);
1737 if (error)
1738 return error;
1739
1740 if (data->t7_cfg.active == 0 || data->t7_cfg.idle == 0) {
1741 if (!retry) {
1742 dev_dbg(dev, "T7 cfg zero, resetting\n");
1743 mxt_soft_reset(data);
1744 retry = true;
1745 goto recheck;
1746 } else {
1747 dev_dbg(dev, "T7 cfg zero after reset, overriding\n");
1748 data->t7_cfg.active = 20;
1749 data->t7_cfg.idle = 100;
1750 return mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
1751 }
1104 } 1752 }
1105 1753
1106 error = mxt_read_t9_resolution(data); 1754 dev_dbg(dev, "Initialized power cfg: ACTV %d, IDLE %d\n",
1755 data->t7_cfg.active, data->t7_cfg.idle);
1756 return 0;
1757}
1758
1759static int mxt_configure_objects(struct mxt_data *data,
1760 const struct firmware *cfg)
1761{
1762 struct device *dev = &data->client->dev;
1763 struct mxt_info *info = &data->info;
1764 int error;
1765
1766 if (cfg) {
1767 error = mxt_update_cfg(data, cfg);
1768 if (error)
1769 dev_warn(dev, "Error %d updating config\n", error);
1770 }
1771
1772 error = mxt_init_t7_power_cfg(data);
1107 if (error) { 1773 if (error) {
1108 dev_err(&client->dev, "Failed to initialize T9 resolution\n"); 1774 dev_err(dev, "Failed to initialize power cfg\n");
1109 goto err_free_object_table; 1775 return error;
1110 } 1776 }
1111 1777
1112 dev_info(&client->dev, 1778 error = mxt_initialize_t9_input_device(data);
1779 if (error)
1780 return error;
1781
1782 dev_info(dev,
1113 "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n", 1783 "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n",
1114 info->family_id, info->variant_id, info->version >> 4, 1784 info->family_id, info->variant_id, info->version >> 4,
1115 info->version & 0xf, info->build, info->object_num); 1785 info->version & 0xf, info->build, info->object_num);
1116 1786
1117 return 0; 1787 return 0;
1118
1119err_free_object_table:
1120 mxt_free_object_table(data);
1121 return error;
1122} 1788}
1123 1789
1124/* Firmware Version is returned as Major.Minor.Build */ 1790/* Firmware Version is returned as Major.Minor.Build */
@@ -1246,30 +1912,45 @@ static int mxt_load_fw(struct device *dev, const char *fn)
1246 if (ret) 1912 if (ret)
1247 goto release_firmware; 1913 goto release_firmware;
1248 1914
1249 ret = mxt_lookup_bootloader_address(data); 1915 if (!data->in_bootloader) {
1250 if (ret) 1916 /* Change to the bootloader mode */
1251 goto release_firmware; 1917 data->in_bootloader = true;
1252 1918
1253 /* Change to the bootloader mode */ 1919 ret = mxt_t6_command(data, MXT_COMMAND_RESET,
1254 data->in_bootloader = true; 1920 MXT_BOOT_VALUE, false);
1921 if (ret)
1922 goto release_firmware;
1255 1923
1256 ret = mxt_t6_command(data, MXT_COMMAND_RESET, MXT_BOOT_VALUE, false); 1924 msleep(MXT_RESET_TIME);
1257 if (ret)
1258 goto release_firmware;
1259 1925
1260 msleep(MXT_RESET_TIME); 1926 /* Do not need to scan since we know family ID */
1927 ret = mxt_lookup_bootloader_address(data, 0);
1928 if (ret)
1929 goto release_firmware;
1930 } else {
1931 enable_irq(data->irq);
1932 }
1261 1933
1934 mxt_free_object_table(data);
1262 reinit_completion(&data->bl_completion); 1935 reinit_completion(&data->bl_completion);
1263 1936
1264 ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD); 1937 ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD, false);
1265 if (ret) 1938 if (ret) {
1266 goto disable_irq; 1939 /* Bootloader may still be unlocked from previous attempt */
1940 ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, false);
1941 if (ret)
1942 goto disable_irq;
1943 } else {
1944 dev_info(dev, "Unlocking bootloader\n");
1267 1945
1268 /* Unlock bootloader */ 1946 /* Unlock bootloader */
1269 mxt_unlock_bootloader(data); 1947 ret = mxt_send_bootloader_cmd(data, true);
1948 if (ret)
1949 goto disable_irq;
1950 }
1270 1951
1271 while (pos < fw->size) { 1952 while (pos < fw->size) {
1272 ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA); 1953 ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true);
1273 if (ret) 1954 if (ret)
1274 goto disable_irq; 1955 goto disable_irq;
1275 1956
@@ -1283,7 +1964,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)
1283 if (ret) 1964 if (ret)
1284 goto disable_irq; 1965 goto disable_irq;
1285 1966
1286 ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS); 1967 ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true);
1287 if (ret) { 1968 if (ret) {
1288 retry++; 1969 retry++;
1289 1970
@@ -1343,13 +2024,7 @@ static ssize_t mxt_update_fw_store(struct device *dev,
1343 } else { 2024 } else {
1344 dev_info(dev, "The firmware update succeeded\n"); 2025 dev_info(dev, "The firmware update succeeded\n");
1345 2026
1346 mxt_free_object_table(data); 2027 error = mxt_initialize(data);
1347
1348 mxt_initialize(data);
1349
1350 enable_irq(data->irq);
1351
1352 error = mxt_make_highchg(data);
1353 if (error) 2028 if (error)
1354 return error; 2029 return error;
1355 } 2030 }
@@ -1376,16 +2051,15 @@ static const struct attribute_group mxt_attr_group = {
1376 2051
1377static void mxt_start(struct mxt_data *data) 2052static void mxt_start(struct mxt_data *data)
1378{ 2053{
1379 /* Touch enable */ 2054 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
1380 mxt_write_object(data, 2055
1381 MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83); 2056 /* Recalibrate since chip has been in deep sleep */
2057 mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false);
1382} 2058}
1383 2059
1384static void mxt_stop(struct mxt_data *data) 2060static void mxt_stop(struct mxt_data *data)
1385{ 2061{
1386 /* Touch disable */ 2062 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP);
1387 mxt_write_object(data,
1388 MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0);
1389} 2063}
1390 2064
1391static int mxt_input_open(struct input_dev *dev) 2065static int mxt_input_open(struct input_dev *dev)
@@ -1404,138 +2078,112 @@ static void mxt_input_close(struct input_dev *dev)
1404 mxt_stop(data); 2078 mxt_stop(data);
1405} 2079}
1406 2080
1407static int mxt_probe(struct i2c_client *client, 2081#ifdef CONFIG_OF
1408 const struct i2c_device_id *id) 2082static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
2083{
2084 struct mxt_platform_data *pdata;
2085 u32 *keymap;
2086 u32 keycode;
2087 int proplen, i, ret;
2088
2089 if (!client->dev.of_node)
2090 return ERR_PTR(-ENODEV);
2091
2092 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
2093 if (!pdata)
2094 return ERR_PTR(-ENOMEM);
2095
2096 if (of_find_property(client->dev.of_node, "linux,gpio-keymap",
2097 &proplen)) {
2098 pdata->t19_num_keys = proplen / sizeof(u32);
2099
2100 keymap = devm_kzalloc(&client->dev,
2101 pdata->t19_num_keys * sizeof(keymap[0]),
2102 GFP_KERNEL);
2103 if (!keymap)
2104 return ERR_PTR(-ENOMEM);
2105
2106 for (i = 0; i < pdata->t19_num_keys; i++) {
2107 ret = of_property_read_u32_index(client->dev.of_node,
2108 "linux,gpio-keymap", i, &keycode);
2109 if (ret)
2110 keycode = KEY_RESERVED;
2111
2112 keymap[i] = keycode;
2113 }
2114
2115 pdata->t19_keymap = keymap;
2116 }
2117
2118 return pdata;
2119}
2120#else
2121static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
2122{
2123 dev_dbg(&client->dev, "No platform data specified\n");
2124 return ERR_PTR(-EINVAL);
2125}
2126#endif
2127
2128static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
1409{ 2129{
1410 const struct mxt_platform_data *pdata = dev_get_platdata(&client->dev);
1411 struct mxt_data *data; 2130 struct mxt_data *data;
1412 struct input_dev *input_dev; 2131 const struct mxt_platform_data *pdata;
1413 int error; 2132 int error;
1414 unsigned int num_mt_slots;
1415 unsigned int mt_flags = 0;
1416 int i;
1417 2133
1418 if (!pdata) 2134 pdata = dev_get_platdata(&client->dev);
1419 return -EINVAL; 2135 if (!pdata) {
2136 pdata = mxt_parse_dt(client);
2137 if (IS_ERR(pdata))
2138 return PTR_ERR(pdata);
2139 }
1420 2140
1421 data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL); 2141 data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
1422 input_dev = input_allocate_device(); 2142 if (!data) {
1423 if (!data || !input_dev) {
1424 dev_err(&client->dev, "Failed to allocate memory\n"); 2143 dev_err(&client->dev, "Failed to allocate memory\n");
1425 error = -ENOMEM; 2144 return -ENOMEM;
1426 goto err_free_mem;
1427 } 2145 }
1428 2146
1429 input_dev->name = "Atmel maXTouch Touchscreen";
1430 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", 2147 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
1431 client->adapter->nr, client->addr); 2148 client->adapter->nr, client->addr);
1432 2149
1433 input_dev->phys = data->phys;
1434
1435 input_dev->id.bustype = BUS_I2C;
1436 input_dev->dev.parent = &client->dev;
1437 input_dev->open = mxt_input_open;
1438 input_dev->close = mxt_input_close;
1439
1440 data->client = client; 2150 data->client = client;
1441 data->input_dev = input_dev;
1442 data->pdata = pdata; 2151 data->pdata = pdata;
1443 data->irq = client->irq; 2152 data->irq = client->irq;
2153 i2c_set_clientdata(client, data);
1444 2154
1445 init_completion(&data->bl_completion); 2155 init_completion(&data->bl_completion);
1446 init_completion(&data->reset_completion); 2156 init_completion(&data->reset_completion);
1447 init_completion(&data->crc_completion); 2157 init_completion(&data->crc_completion);
1448 2158
1449 error = mxt_initialize(data);
1450 if (error)
1451 goto err_free_mem;
1452
1453 __set_bit(EV_ABS, input_dev->evbit);
1454 __set_bit(EV_KEY, input_dev->evbit);
1455 __set_bit(BTN_TOUCH, input_dev->keybit);
1456
1457 if (pdata->t19_num_keys) {
1458 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
1459
1460 for (i = 0; i < pdata->t19_num_keys; i++)
1461 if (pdata->t19_keymap[i] != KEY_RESERVED)
1462 input_set_capability(input_dev, EV_KEY,
1463 pdata->t19_keymap[i]);
1464
1465 mt_flags |= INPUT_MT_POINTER;
1466
1467 input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
1468 input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
1469 input_abs_set_res(input_dev, ABS_MT_POSITION_X,
1470 MXT_PIXELS_PER_MM);
1471 input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
1472 MXT_PIXELS_PER_MM);
1473
1474 input_dev->name = "Atmel maXTouch Touchpad";
1475 }
1476
1477 /* For single touch */
1478 input_set_abs_params(input_dev, ABS_X,
1479 0, data->max_x, 0, 0);
1480 input_set_abs_params(input_dev, ABS_Y,
1481 0, data->max_y, 0, 0);
1482 input_set_abs_params(input_dev, ABS_PRESSURE,
1483 0, 255, 0, 0);
1484
1485 /* For multi touch */
1486 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
1487 error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags);
1488 if (error)
1489 goto err_free_object;
1490 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
1491 0, MXT_MAX_AREA, 0, 0);
1492 input_set_abs_params(input_dev, ABS_MT_POSITION_X,
1493 0, data->max_x, 0, 0);
1494 input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
1495 0, data->max_y, 0, 0);
1496 input_set_abs_params(input_dev, ABS_MT_PRESSURE,
1497 0, 255, 0, 0);
1498
1499 input_set_drvdata(input_dev, data);
1500 i2c_set_clientdata(client, data);
1501
1502 error = request_threaded_irq(client->irq, NULL, mxt_interrupt, 2159 error = request_threaded_irq(client->irq, NULL, mxt_interrupt,
1503 pdata->irqflags | IRQF_ONESHOT, 2160 pdata->irqflags | IRQF_ONESHOT,
1504 client->name, data); 2161 client->name, data);
1505 if (error) { 2162 if (error) {
1506 dev_err(&client->dev, "Failed to register interrupt\n"); 2163 dev_err(&client->dev, "Failed to register interrupt\n");
1507 goto err_free_object; 2164 goto err_free_mem;
1508 } 2165 }
1509 2166
1510 error = mxt_make_highchg(data); 2167 disable_irq(client->irq);
1511 if (error)
1512 goto err_free_irq;
1513 2168
1514 error = input_register_device(input_dev); 2169 error = mxt_initialize(data);
1515 if (error) { 2170 if (error)
1516 dev_err(&client->dev, "Error %d registering input device\n",
1517 error);
1518 goto err_free_irq; 2171 goto err_free_irq;
1519 }
1520 2172
1521 error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group); 2173 error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);
1522 if (error) { 2174 if (error) {
1523 dev_err(&client->dev, "Failure %d creating sysfs group\n", 2175 dev_err(&client->dev, "Failure %d creating sysfs group\n",
1524 error); 2176 error);
1525 goto err_unregister_device; 2177 goto err_free_object;
1526 } 2178 }
1527 2179
1528 return 0; 2180 return 0;
1529 2181
1530err_unregister_device: 2182err_free_object:
1531 input_unregister_device(input_dev); 2183 mxt_free_object_table(data);
1532 input_dev = NULL;
1533err_free_irq: 2184err_free_irq:
1534 free_irq(client->irq, data); 2185 free_irq(client->irq, data);
1535err_free_object:
1536 kfree(data->object_table);
1537err_free_mem: 2186err_free_mem:
1538 input_free_device(input_dev);
1539 kfree(data); 2187 kfree(data);
1540 return error; 2188 return error;
1541} 2189}
@@ -1547,7 +2195,7 @@ static int mxt_remove(struct i2c_client *client)
1547 sysfs_remove_group(&client->dev.kobj, &mxt_attr_group); 2195 sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
1548 free_irq(data->irq, data); 2196 free_irq(data->irq, data);
1549 input_unregister_device(data->input_dev); 2197 input_unregister_device(data->input_dev);
1550 kfree(data->object_table); 2198 mxt_free_object_table(data);
1551 kfree(data); 2199 kfree(data);
1552 2200
1553 return 0; 2201 return 0;
@@ -1576,8 +2224,6 @@ static int mxt_resume(struct device *dev)
1576 struct mxt_data *data = i2c_get_clientdata(client); 2224 struct mxt_data *data = i2c_get_clientdata(client);
1577 struct input_dev *input_dev = data->input_dev; 2225 struct input_dev *input_dev = data->input_dev;
1578 2226
1579 mxt_soft_reset(data);
1580
1581 mutex_lock(&input_dev->mutex); 2227 mutex_lock(&input_dev->mutex);
1582 2228
1583 if (input_dev->users) 2229 if (input_dev->users)
@@ -1591,6 +2237,12 @@ static int mxt_resume(struct device *dev)
1591 2237
1592static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume); 2238static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume);
1593 2239
2240static const struct of_device_id mxt_of_match[] = {
2241 { .compatible = "atmel,maxtouch", },
2242 {},
2243};
2244MODULE_DEVICE_TABLE(of, mxt_of_match);
2245
1594static const struct i2c_device_id mxt_id[] = { 2246static const struct i2c_device_id mxt_id[] = {
1595 { "qt602240_ts", 0 }, 2247 { "qt602240_ts", 0 },
1596 { "atmel_mxt_ts", 0 }, 2248 { "atmel_mxt_ts", 0 },
@@ -1604,6 +2256,7 @@ static struct i2c_driver mxt_driver = {
1604 .driver = { 2256 .driver = {
1605 .name = "atmel_mxt_ts", 2257 .name = "atmel_mxt_ts",
1606 .owner = THIS_MODULE, 2258 .owner = THIS_MODULE,
2259 .of_match_table = of_match_ptr(mxt_of_match),
1607 .pm = &mxt_pm_ops, 2260 .pm = &mxt_pm_ops,
1608 }, 2261 },
1609 .probe = mxt_probe, 2262 .probe = mxt_probe,
diff --git a/drivers/input/touchscreen/atmel_tsadcc.c b/drivers/input/touchscreen/atmel_tsadcc.c
deleted file mode 100644
index a7c9d6967d1e..000000000000
--- a/drivers/input/touchscreen/atmel_tsadcc.c
+++ /dev/null
@@ -1,358 +0,0 @@
1/*
2 * Atmel Touch Screen Driver
3 *
4 * Copyright (c) 2008 ATMEL
5 * Copyright (c) 2008 Dan Liang
6 * Copyright (c) 2008 TimeSys Corporation
7 * Copyright (c) 2008 Justin Waters
8 *
9 * Based on touchscreen code from Atmel Corporation.
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 version 2 as
13 * published by the Free Software Foundation.
14 */
15#include <linux/err.h>
16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/input.h>
19#include <linux/slab.h>
20#include <linux/interrupt.h>
21#include <linux/clk.h>
22#include <linux/platform_device.h>
23#include <linux/io.h>
24#include <linux/platform_data/atmel.h>
25#include <mach/cpu.h>
26
27/* Register definitions based on AT91SAM9RL64 preliminary draft datasheet */
28
29#define ATMEL_TSADCC_CR 0x00 /* Control register */
30#define ATMEL_TSADCC_SWRST (1 << 0) /* Software Reset*/
31#define ATMEL_TSADCC_START (1 << 1) /* Start conversion */
32
33#define ATMEL_TSADCC_MR 0x04 /* Mode register */
34#define ATMEL_TSADCC_TSAMOD (3 << 0) /* ADC mode */
35#define ATMEL_TSADCC_TSAMOD_ADC_ONLY_MODE (0x0) /* ADC Mode */
36#define ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE (0x1) /* Touch Screen Only Mode */
37#define ATMEL_TSADCC_LOWRES (1 << 4) /* Resolution selection */
38#define ATMEL_TSADCC_SLEEP (1 << 5) /* Sleep mode */
39#define ATMEL_TSADCC_PENDET (1 << 6) /* Pen Detect selection */
40#define ATMEL_TSADCC_PRES (1 << 7) /* Pressure Measurement Selection */
41#define ATMEL_TSADCC_PRESCAL (0x3f << 8) /* Prescalar Rate Selection */
42#define ATMEL_TSADCC_EPRESCAL (0xff << 8) /* Prescalar Rate Selection (Extended) */
43#define ATMEL_TSADCC_STARTUP (0x7f << 16) /* Start Up time */
44#define ATMEL_TSADCC_SHTIM (0xf << 24) /* Sample & Hold time */
45#define ATMEL_TSADCC_PENDBC (0xf << 28) /* Pen Detect debouncing time */
46
47#define ATMEL_TSADCC_TRGR 0x08 /* Trigger register */
48#define ATMEL_TSADCC_TRGMOD (7 << 0) /* Trigger mode */
49#define ATMEL_TSADCC_TRGMOD_NONE (0 << 0)
50#define ATMEL_TSADCC_TRGMOD_EXT_RISING (1 << 0)
51#define ATMEL_TSADCC_TRGMOD_EXT_FALLING (2 << 0)
52#define ATMEL_TSADCC_TRGMOD_EXT_ANY (3 << 0)
53#define ATMEL_TSADCC_TRGMOD_PENDET (4 << 0)
54#define ATMEL_TSADCC_TRGMOD_PERIOD (5 << 0)
55#define ATMEL_TSADCC_TRGMOD_CONTINUOUS (6 << 0)
56#define ATMEL_TSADCC_TRGPER (0xffff << 16) /* Trigger period */
57
58#define ATMEL_TSADCC_TSR 0x0C /* Touch Screen register */
59#define ATMEL_TSADCC_TSFREQ (0xf << 0) /* TS Frequency in Interleaved mode */
60#define ATMEL_TSADCC_TSSHTIM (0xf << 24) /* Sample & Hold time */
61
62#define ATMEL_TSADCC_CHER 0x10 /* Channel Enable register */
63#define ATMEL_TSADCC_CHDR 0x14 /* Channel Disable register */
64#define ATMEL_TSADCC_CHSR 0x18 /* Channel Status register */
65#define ATMEL_TSADCC_CH(n) (1 << (n)) /* Channel number */
66
67#define ATMEL_TSADCC_SR 0x1C /* Status register */
68#define ATMEL_TSADCC_EOC(n) (1 << ((n)+0)) /* End of conversion for channel N */
69#define ATMEL_TSADCC_OVRE(n) (1 << ((n)+8)) /* Overrun error for channel N */
70#define ATMEL_TSADCC_DRDY (1 << 16) /* Data Ready */
71#define ATMEL_TSADCC_GOVRE (1 << 17) /* General Overrun Error */
72#define ATMEL_TSADCC_ENDRX (1 << 18) /* End of RX Buffer */
73#define ATMEL_TSADCC_RXBUFF (1 << 19) /* TX Buffer full */
74#define ATMEL_TSADCC_PENCNT (1 << 20) /* Pen contact */
75#define ATMEL_TSADCC_NOCNT (1 << 21) /* No contact */
76
77#define ATMEL_TSADCC_LCDR 0x20 /* Last Converted Data register */
78#define ATMEL_TSADCC_DATA (0x3ff << 0) /* Channel data */
79
80#define ATMEL_TSADCC_IER 0x24 /* Interrupt Enable register */
81#define ATMEL_TSADCC_IDR 0x28 /* Interrupt Disable register */
82#define ATMEL_TSADCC_IMR 0x2C /* Interrupt Mask register */
83#define ATMEL_TSADCC_CDR0 0x30 /* Channel Data 0 */
84#define ATMEL_TSADCC_CDR1 0x34 /* Channel Data 1 */
85#define ATMEL_TSADCC_CDR2 0x38 /* Channel Data 2 */
86#define ATMEL_TSADCC_CDR3 0x3C /* Channel Data 3 */
87#define ATMEL_TSADCC_CDR4 0x40 /* Channel Data 4 */
88#define ATMEL_TSADCC_CDR5 0x44 /* Channel Data 5 */
89
90#define ATMEL_TSADCC_XPOS 0x50
91#define ATMEL_TSADCC_Z1DAT 0x54
92#define ATMEL_TSADCC_Z2DAT 0x58
93
94#define PRESCALER_VAL(x) ((x) >> 8)
95
96#define ADC_DEFAULT_CLOCK 100000
97
98struct atmel_tsadcc {
99 struct input_dev *input;
100 char phys[32];
101 struct clk *clk;
102 int irq;
103 unsigned int prev_absx;
104 unsigned int prev_absy;
105 unsigned char bufferedmeasure;
106};
107
108static void __iomem *tsc_base;
109
110#define atmel_tsadcc_read(reg) __raw_readl(tsc_base + (reg))
111#define atmel_tsadcc_write(reg, val) __raw_writel((val), tsc_base + (reg))
112
113static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev)
114{
115 struct atmel_tsadcc *ts_dev = (struct atmel_tsadcc *)dev;
116 struct input_dev *input_dev = ts_dev->input;
117
118 unsigned int status;
119 unsigned int reg;
120
121 status = atmel_tsadcc_read(ATMEL_TSADCC_SR);
122 status &= atmel_tsadcc_read(ATMEL_TSADCC_IMR);
123
124 if (status & ATMEL_TSADCC_NOCNT) {
125 /* Contact lost */
126 reg = atmel_tsadcc_read(ATMEL_TSADCC_MR) | ATMEL_TSADCC_PENDBC;
127
128 atmel_tsadcc_write(ATMEL_TSADCC_MR, reg);
129 atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE);
130 atmel_tsadcc_write(ATMEL_TSADCC_IDR,
131 ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT);
132 atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT);
133
134 input_report_key(input_dev, BTN_TOUCH, 0);
135 ts_dev->bufferedmeasure = 0;
136 input_sync(input_dev);
137
138 } else if (status & ATMEL_TSADCC_PENCNT) {
139 /* Pen detected */
140 reg = atmel_tsadcc_read(ATMEL_TSADCC_MR);
141 reg &= ~ATMEL_TSADCC_PENDBC;
142
143 atmel_tsadcc_write(ATMEL_TSADCC_IDR, ATMEL_TSADCC_PENCNT);
144 atmel_tsadcc_write(ATMEL_TSADCC_MR, reg);
145 atmel_tsadcc_write(ATMEL_TSADCC_IER,
146 ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT);
147 atmel_tsadcc_write(ATMEL_TSADCC_TRGR,
148 ATMEL_TSADCC_TRGMOD_PERIOD | (0x0FFF << 16));
149
150 } else if (status & ATMEL_TSADCC_EOC(3)) {
151 /* Conversion finished */
152
153 if (ts_dev->bufferedmeasure) {
154 /* Last measurement is always discarded, since it can
155 * be erroneous.
156 * Always report previous measurement */
157 input_report_abs(input_dev, ABS_X, ts_dev->prev_absx);
158 input_report_abs(input_dev, ABS_Y, ts_dev->prev_absy);
159 input_report_key(input_dev, BTN_TOUCH, 1);
160 input_sync(input_dev);
161 } else
162 ts_dev->bufferedmeasure = 1;
163
164 /* Now make new measurement */
165 ts_dev->prev_absx = atmel_tsadcc_read(ATMEL_TSADCC_CDR3) << 10;
166 ts_dev->prev_absx /= atmel_tsadcc_read(ATMEL_TSADCC_CDR2);
167
168 ts_dev->prev_absy = atmel_tsadcc_read(ATMEL_TSADCC_CDR1) << 10;
169 ts_dev->prev_absy /= atmel_tsadcc_read(ATMEL_TSADCC_CDR0);
170 }
171
172 return IRQ_HANDLED;
173}
174
175/*
176 * The functions for inserting/removing us as a module.
177 */
178
179static int atmel_tsadcc_probe(struct platform_device *pdev)
180{
181 struct atmel_tsadcc *ts_dev;
182 struct input_dev *input_dev;
183 struct resource *res;
184 struct at91_tsadcc_data *pdata = dev_get_platdata(&pdev->dev);
185 int err;
186 unsigned int prsc;
187 unsigned int reg;
188
189 if (!pdata)
190 return -EINVAL;
191
192 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
193 if (!res) {
194 dev_err(&pdev->dev, "no mmio resource defined.\n");
195 return -ENXIO;
196 }
197
198 /* Allocate memory for device */
199 ts_dev = kzalloc(sizeof(struct atmel_tsadcc), GFP_KERNEL);
200 if (!ts_dev) {
201 dev_err(&pdev->dev, "failed to allocate memory.\n");
202 return -ENOMEM;
203 }
204 platform_set_drvdata(pdev, ts_dev);
205
206 input_dev = input_allocate_device();
207 if (!input_dev) {
208 dev_err(&pdev->dev, "failed to allocate input device.\n");
209 err = -EBUSY;
210 goto err_free_mem;
211 }
212
213 ts_dev->irq = platform_get_irq(pdev, 0);
214 if (ts_dev->irq < 0) {
215 dev_err(&pdev->dev, "no irq ID is designated.\n");
216 err = -ENODEV;
217 goto err_free_dev;
218 }
219
220 if (!request_mem_region(res->start, resource_size(res),
221 "atmel tsadcc regs")) {
222 dev_err(&pdev->dev, "resources is unavailable.\n");
223 err = -EBUSY;
224 goto err_free_dev;
225 }
226
227 tsc_base = ioremap(res->start, resource_size(res));
228 if (!tsc_base) {
229 dev_err(&pdev->dev, "failed to map registers.\n");
230 err = -ENOMEM;
231 goto err_release_mem;
232 }
233
234 err = request_irq(ts_dev->irq, atmel_tsadcc_interrupt, 0,
235 pdev->dev.driver->name, ts_dev);
236 if (err) {
237 dev_err(&pdev->dev, "failed to allocate irq.\n");
238 goto err_unmap_regs;
239 }
240
241 ts_dev->clk = clk_get(&pdev->dev, "tsc_clk");
242 if (IS_ERR(ts_dev->clk)) {
243 dev_err(&pdev->dev, "failed to get ts_clk\n");
244 err = PTR_ERR(ts_dev->clk);
245 goto err_free_irq;
246 }
247
248 ts_dev->input = input_dev;
249 ts_dev->bufferedmeasure = 0;
250
251 snprintf(ts_dev->phys, sizeof(ts_dev->phys),
252 "%s/input0", dev_name(&pdev->dev));
253
254 input_dev->name = "atmel touch screen controller";
255 input_dev->phys = ts_dev->phys;
256 input_dev->dev.parent = &pdev->dev;
257
258 __set_bit(EV_ABS, input_dev->evbit);
259 input_set_abs_params(input_dev, ABS_X, 0, 0x3FF, 0, 0);
260 input_set_abs_params(input_dev, ABS_Y, 0, 0x3FF, 0, 0);
261
262 input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
263
264 /* clk_enable() always returns 0, no need to check it */
265 clk_enable(ts_dev->clk);
266
267 prsc = clk_get_rate(ts_dev->clk);
268 dev_info(&pdev->dev, "Master clock is set at: %d Hz\n", prsc);
269
270 if (!pdata->adc_clock)
271 pdata->adc_clock = ADC_DEFAULT_CLOCK;
272
273 prsc = (prsc / (2 * pdata->adc_clock)) - 1;
274
275 /* saturate if this value is too high */
276 if (cpu_is_at91sam9rl()) {
277 if (prsc > PRESCALER_VAL(ATMEL_TSADCC_PRESCAL))
278 prsc = PRESCALER_VAL(ATMEL_TSADCC_PRESCAL);
279 } else {
280 if (prsc > PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL))
281 prsc = PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL);
282 }
283
284 dev_info(&pdev->dev, "Prescaler is set at: %d\n", prsc);
285
286 reg = ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE |
287 ((0x00 << 5) & ATMEL_TSADCC_SLEEP) | /* Normal Mode */
288 ((0x01 << 6) & ATMEL_TSADCC_PENDET) | /* Enable Pen Detect */
289 (prsc << 8) |
290 ((0x26 << 16) & ATMEL_TSADCC_STARTUP) |
291 ((pdata->pendet_debounce << 28) & ATMEL_TSADCC_PENDBC);
292
293 atmel_tsadcc_write(ATMEL_TSADCC_CR, ATMEL_TSADCC_SWRST);
294 atmel_tsadcc_write(ATMEL_TSADCC_MR, reg);
295 atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE);
296 atmel_tsadcc_write(ATMEL_TSADCC_TSR,
297 (pdata->ts_sample_hold_time << 24) & ATMEL_TSADCC_TSSHTIM);
298
299 atmel_tsadcc_read(ATMEL_TSADCC_SR);
300 atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT);
301
302 /* All went ok, so register to the input system */
303 err = input_register_device(input_dev);
304 if (err)
305 goto err_fail;
306
307 return 0;
308
309err_fail:
310 clk_disable(ts_dev->clk);
311 clk_put(ts_dev->clk);
312err_free_irq:
313 free_irq(ts_dev->irq, ts_dev);
314err_unmap_regs:
315 iounmap(tsc_base);
316err_release_mem:
317 release_mem_region(res->start, resource_size(res));
318err_free_dev:
319 input_free_device(input_dev);
320err_free_mem:
321 kfree(ts_dev);
322 return err;
323}
324
325static int atmel_tsadcc_remove(struct platform_device *pdev)
326{
327 struct atmel_tsadcc *ts_dev = platform_get_drvdata(pdev);
328 struct resource *res;
329
330 free_irq(ts_dev->irq, ts_dev);
331
332 input_unregister_device(ts_dev->input);
333
334 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
335 iounmap(tsc_base);
336 release_mem_region(res->start, resource_size(res));
337
338 clk_disable(ts_dev->clk);
339 clk_put(ts_dev->clk);
340
341 kfree(ts_dev);
342
343 return 0;
344}
345
346static struct platform_driver atmel_tsadcc_driver = {
347 .probe = atmel_tsadcc_probe,
348 .remove = atmel_tsadcc_remove,
349 .driver = {
350 .name = "atmel_tsadcc",
351 },
352};
353module_platform_driver(atmel_tsadcc_driver);
354
355MODULE_LICENSE("GPL");
356MODULE_DESCRIPTION("Atmel TouchScreen Driver");
357MODULE_AUTHOR("Dan Liang <dan.liang@atmel.com>");
358
diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
index d4f33992ad8c..5a6d50c004d7 100644
--- a/drivers/input/touchscreen/edt-ft5x06.c
+++ b/drivers/input/touchscreen/edt-ft5x06.c
@@ -733,8 +733,7 @@ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
733static void 733static void
734edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) 734edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
735{ 735{
736 if (tsdata->debug_dir) 736 debugfs_remove_recursive(tsdata->debug_dir);
737 debugfs_remove_recursive(tsdata->debug_dir);
738 kfree(tsdata->raw_buffer); 737 kfree(tsdata->raw_buffer);
739} 738}
740 739
diff --git a/drivers/input/touchscreen/ipaq-micro-ts.c b/drivers/input/touchscreen/ipaq-micro-ts.c
new file mode 100644
index 000000000000..62c8976e616f
--- /dev/null
+++ b/drivers/input/touchscreen/ipaq-micro-ts.c
@@ -0,0 +1,166 @@
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License version 2 as
4 * published by the Free Software Foundation.
5 *
6 * h3600 atmel micro companion support, touchscreen subdevice
7 * Author : Alessandro Gardich <gremlin@gremlin.it>
8 * Author : Dmitry Artamonow <mad_soft@inbox.ru>
9 * Author : Linus Walleij <linus.walleij@linaro.org>
10 *
11 */
12
13#include <asm/byteorder.h>
14#include <linux/module.h>
15#include <linux/init.h>
16#include <linux/interrupt.h>
17#include <linux/pm.h>
18#include <linux/delay.h>
19#include <linux/device.h>
20#include <linux/input.h>
21#include <linux/platform_device.h>
22#include <linux/slab.h>
23#include <linux/mfd/ipaq-micro.h>
24
25struct touchscreen_data {
26 struct input_dev *input;
27 struct ipaq_micro *micro;
28};
29
30static void micro_ts_receive(void *data, int len, unsigned char *msg)
31{
32 struct touchscreen_data *ts = data;
33
34 if (len == 4) {
35 input_report_abs(ts->input, ABS_X,
36 be16_to_cpup((__be16 *) &msg[2]));
37 input_report_abs(ts->input, ABS_Y,
38 be16_to_cpup((__be16 *) &msg[0]));
39 input_report_key(ts->input, BTN_TOUCH, 1);
40 input_sync(ts->input);
41 } else if (len == 0) {
42 input_report_abs(ts->input, ABS_X, 0);
43 input_report_abs(ts->input, ABS_Y, 0);
44 input_report_key(ts->input, BTN_TOUCH, 0);
45 input_sync(ts->input);
46 }
47}
48
49static void micro_ts_toggle_receive(struct touchscreen_data *ts, bool enable)
50{
51 struct ipaq_micro *micro = ts->micro;
52
53 spin_lock_irq(&micro->lock);
54
55 if (enable) {
56 micro->ts = micro_ts_receive;
57 micro->ts_data = ts;
58 } else {
59 micro->ts = NULL;
60 micro->ts_data = NULL;
61 }
62
63 spin_unlock_irq(&ts->micro->lock);
64}
65
66static int micro_ts_open(struct input_dev *input)
67{
68 struct touchscreen_data *ts = input_get_drvdata(input);
69
70 micro_ts_toggle_receive(ts, true);
71
72 return 0;
73}
74
75static void micro_ts_close(struct input_dev *input)
76{
77 struct touchscreen_data *ts = input_get_drvdata(input);
78
79 micro_ts_toggle_receive(ts, false);
80}
81
82static int micro_ts_probe(struct platform_device *pdev)
83{
84 struct ipaq_micro *micro = dev_get_drvdata(pdev->dev.parent);
85 struct touchscreen_data *ts;
86 int error;
87
88 ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL);
89 if (!ts)
90 return -ENOMEM;
91
92 ts->micro = micro;
93
94 ts->input = devm_input_allocate_device(&pdev->dev);
95 if (!ts->input) {
96 dev_err(&pdev->dev, "failed to allocate input device\n");
97 return -ENOMEM;
98 }
99
100 ts->input->name = "ipaq micro ts";
101 ts->input->open = micro_ts_open;
102 ts->input->close = micro_ts_close;
103
104 input_set_drvdata(ts->input, ts);
105
106 input_set_capability(ts->input, EV_KEY, BTN_TOUCH);
107 input_set_capability(ts->input, EV_ABS, ABS_X);
108 input_set_capability(ts->input, EV_ABS, ABS_Y);
109 input_set_abs_params(ts->input, ABS_X, 0, 1023, 0, 0);
110 input_set_abs_params(ts->input, ABS_Y, 0, 1023, 0, 0);
111
112 error = input_register_device(ts->input);
113 if (error) {
114 dev_err(&pdev->dev, "error registering touch input\n");
115 return error;
116 }
117
118 platform_set_drvdata(pdev, ts);
119
120 dev_info(&pdev->dev, "iPAQ micro touchscreen\n");
121
122 return 0;
123}
124
125#ifdef CONFIG_PM_SLEEP
126static int micro_ts_suspend(struct device *dev)
127{
128 struct touchscreen_data *ts = dev_get_drvdata(dev);
129
130 micro_ts_toggle_receive(ts, false);
131
132 return 0;
133}
134
135static int micro_ts_resume(struct device *dev)
136{
137 struct touchscreen_data *ts = dev_get_drvdata(dev);
138 struct input_dev *input = ts->input;
139
140 mutex_lock(&input->mutex);
141
142 if (input->users)
143 micro_ts_toggle_receive(ts, true);
144
145 mutex_unlock(&input->mutex);
146
147 return 0;
148}
149#endif
150
151static const struct dev_pm_ops micro_ts_dev_pm_ops = {
152 SET_SYSTEM_SLEEP_PM_OPS(micro_ts_suspend, micro_ts_resume)
153};
154
155static struct platform_driver micro_ts_device_driver = {
156 .driver = {
157 .name = "ipaq-micro-ts",
158 .pm = &micro_ts_dev_pm_ops,
159 },
160 .probe = micro_ts_probe,
161};
162module_platform_driver(micro_ts_device_driver);
163
164MODULE_LICENSE("GPL");
165MODULE_DESCRIPTION("driver for iPAQ Atmel micro touchscreen");
166MODULE_ALIAS("platform:ipaq-micro-ts");
diff --git a/drivers/input/touchscreen/jornada720_ts.c b/drivers/input/touchscreen/jornada720_ts.c
index 7324c5c0fb86..651ec71a5c68 100644
--- a/drivers/input/touchscreen/jornada720_ts.c
+++ b/drivers/input/touchscreen/jornada720_ts.c
@@ -36,22 +36,21 @@ struct jornada_ts {
36 36
37static void jornada720_ts_collect_data(struct jornada_ts *jornada_ts) 37static void jornada720_ts_collect_data(struct jornada_ts *jornada_ts)
38{ 38{
39 /* 3 low word X samples */
40 jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY);
41 jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY);
42 jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY);
39 43
40 /* 3 low word X samples */ 44 /* 3 low word Y samples */
41 jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY); 45 jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY);
42 jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY); 46 jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY);
43 jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY); 47 jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY);
44 48
45 /* 3 low word Y samples */ 49 /* combined x samples bits */
46 jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY); 50 jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY);
47 jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY);
48 jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY);
49 51
50 /* combined x samples bits */ 52 /* combined y samples bits */
51 jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY); 53 jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY);
52
53 /* combined y samples bits */
54 jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY);
55} 54}
56 55
57static int jornada720_ts_average(int coords[4]) 56static int jornada720_ts_average(int coords[4])
@@ -104,13 +103,13 @@ static int jornada720_ts_probe(struct platform_device *pdev)
104 struct input_dev *input_dev; 103 struct input_dev *input_dev;
105 int error; 104 int error;
106 105
107 jornada_ts = kzalloc(sizeof(struct jornada_ts), GFP_KERNEL); 106 jornada_ts = devm_kzalloc(&pdev->dev, sizeof(*jornada_ts), GFP_KERNEL);
108 input_dev = input_allocate_device(); 107 if (!jornada_ts)
108 return -ENOMEM;
109 109
110 if (!jornada_ts || !input_dev) { 110 input_dev = devm_input_allocate_device(&pdev->dev);
111 error = -ENOMEM; 111 if (!input_dev)
112 goto fail1; 112 return -ENOMEM;
113 }
114 113
115 platform_set_drvdata(pdev, jornada_ts); 114 platform_set_drvdata(pdev, jornada_ts);
116 115
@@ -126,36 +125,18 @@ static int jornada720_ts_probe(struct platform_device *pdev)
126 input_set_abs_params(input_dev, ABS_X, 270, 3900, 0, 0); 125 input_set_abs_params(input_dev, ABS_X, 270, 3900, 0, 0);
127 input_set_abs_params(input_dev, ABS_Y, 180, 3700, 0, 0); 126 input_set_abs_params(input_dev, ABS_Y, 180, 3700, 0, 0);
128 127
129 error = request_irq(IRQ_GPIO9, 128 error = devm_request_irq(&pdev->dev, IRQ_GPIO9,
130 jornada720_ts_interrupt, 129 jornada720_ts_interrupt,
131 IRQF_TRIGGER_RISING, 130 IRQF_TRIGGER_RISING,
132 "HP7XX Touchscreen driver", pdev); 131 "HP7XX Touchscreen driver", pdev);
133 if (error) { 132 if (error) {
134 printk(KERN_INFO "HP7XX TS : Unable to acquire irq!\n"); 133 dev_err(&pdev->dev, "HP7XX TS : Unable to acquire irq!\n");
135 goto fail1; 134 return error;
136 } 135 }
137 136
138 error = input_register_device(jornada_ts->dev); 137 error = input_register_device(jornada_ts->dev);
139 if (error) 138 if (error)
140 goto fail2; 139 return error;
141
142 return 0;
143
144 fail2:
145 free_irq(IRQ_GPIO9, pdev);
146 fail1:
147 input_free_device(input_dev);
148 kfree(jornada_ts);
149 return error;
150}
151
152static int jornada720_ts_remove(struct platform_device *pdev)
153{
154 struct jornada_ts *jornada_ts = platform_get_drvdata(pdev);
155
156 free_irq(IRQ_GPIO9, pdev);
157 input_unregister_device(jornada_ts->dev);
158 kfree(jornada_ts);
159 140
160 return 0; 141 return 0;
161} 142}
@@ -165,7 +146,6 @@ MODULE_ALIAS("platform:jornada_ts");
165 146
166static struct platform_driver jornada720_ts_driver = { 147static struct platform_driver jornada720_ts_driver = {
167 .probe = jornada720_ts_probe, 148 .probe = jornada720_ts_probe,
168 .remove = jornada720_ts_remove,
169 .driver = { 149 .driver = {
170 .name = "jornada_ts", 150 .name = "jornada_ts",
171 .owner = THIS_MODULE, 151 .owner = THIS_MODULE,
diff --git a/drivers/input/touchscreen/mcs5000_ts.c b/drivers/input/touchscreen/mcs5000_ts.c
index 00510a9836b3..8b47e1fecb25 100644
--- a/drivers/input/touchscreen/mcs5000_ts.c
+++ b/drivers/input/touchscreen/mcs5000_ts.c
@@ -248,8 +248,7 @@ static int mcs5000_ts_probe(struct i2c_client *client,
248 return 0; 248 return 0;
249} 249}
250 250
251#ifdef CONFIG_PM 251static int __maybe_unused mcs5000_ts_suspend(struct device *dev)
252static int mcs5000_ts_suspend(struct device *dev)
253{ 252{
254 struct i2c_client *client = to_i2c_client(dev); 253 struct i2c_client *client = to_i2c_client(dev);
255 254
@@ -259,7 +258,7 @@ static int mcs5000_ts_suspend(struct device *dev)
259 return 0; 258 return 0;
260} 259}
261 260
262static int mcs5000_ts_resume(struct device *dev) 261static int __maybe_unused mcs5000_ts_resume(struct device *dev)
263{ 262{
264 struct i2c_client *client = to_i2c_client(dev); 263 struct i2c_client *client = to_i2c_client(dev);
265 struct mcs5000_ts_data *data = i2c_get_clientdata(client); 264 struct mcs5000_ts_data *data = i2c_get_clientdata(client);
@@ -269,7 +268,6 @@ static int mcs5000_ts_resume(struct device *dev)
269 268
270 return 0; 269 return 0;
271} 270}
272#endif
273 271
274static SIMPLE_DEV_PM_OPS(mcs5000_ts_pm, mcs5000_ts_suspend, mcs5000_ts_resume); 272static SIMPLE_DEV_PM_OPS(mcs5000_ts_pm, mcs5000_ts_suspend, mcs5000_ts_resume);
275 273
diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c
index 19c6c0fdc94b..fc49c75317d1 100644
--- a/drivers/input/touchscreen/pixcir_i2c_ts.c
+++ b/drivers/input/touchscreen/pixcir_i2c_ts.c
@@ -23,22 +23,51 @@
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/i2c.h> 24#include <linux/i2c.h>
25#include <linux/input.h> 25#include <linux/input.h>
26#include <linux/input/mt.h>
26#include <linux/input/pixcir_ts.h> 27#include <linux/input/pixcir_ts.h>
27#include <linux/gpio.h> 28#include <linux/gpio.h>
29#include <linux/of.h>
30#include <linux/of_gpio.h>
31#include <linux/of_device.h>
32
33#define PIXCIR_MAX_SLOTS 5 /* Max fingers supported by driver */
28 34
29struct pixcir_i2c_ts_data { 35struct pixcir_i2c_ts_data {
30 struct i2c_client *client; 36 struct i2c_client *client;
31 struct input_dev *input; 37 struct input_dev *input;
32 const struct pixcir_ts_platform_data *chip; 38 const struct pixcir_ts_platform_data *pdata;
33 bool running; 39 bool running;
40 int max_fingers; /* Max fingers supported in this instance */
41};
42
43struct pixcir_touch {
44 int x;
45 int y;
46 int id;
47};
48
49struct pixcir_report_data {
50 int num_touches;
51 struct pixcir_touch touches[PIXCIR_MAX_SLOTS];
34}; 52};
35 53
36static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data) 54static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata,
55 struct pixcir_report_data *report)
37{ 56{
38 struct pixcir_i2c_ts_data *tsdata = data; 57 u8 rdbuf[2 + PIXCIR_MAX_SLOTS * 5];
39 u8 rdbuf[10], wrbuf[1] = { 0 }; 58 u8 wrbuf[1] = { 0 };
59 u8 *bufptr;
40 u8 touch; 60 u8 touch;
41 int ret; 61 int ret, i;
62 int readsize;
63 const struct pixcir_i2c_chip_data *chip = &tsdata->pdata->chip;
64
65 memset(report, 0, sizeof(struct pixcir_report_data));
66
67 i = chip->has_hw_ids ? 1 : 0;
68 readsize = 2 + tsdata->max_fingers * (4 + i);
69 if (readsize > sizeof(rdbuf))
70 readsize = sizeof(rdbuf);
42 71
43 ret = i2c_master_send(tsdata->client, wrbuf, sizeof(wrbuf)); 72 ret = i2c_master_send(tsdata->client, wrbuf, sizeof(wrbuf));
44 if (ret != sizeof(wrbuf)) { 73 if (ret != sizeof(wrbuf)) {
@@ -48,7 +77,7 @@ static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data)
48 return; 77 return;
49 } 78 }
50 79
51 ret = i2c_master_recv(tsdata->client, rdbuf, sizeof(rdbuf)); 80 ret = i2c_master_recv(tsdata->client, rdbuf, readsize);
52 if (ret != sizeof(rdbuf)) { 81 if (ret != sizeof(rdbuf)) {
53 dev_err(&tsdata->client->dev, 82 dev_err(&tsdata->client->dev,
54 "%s: i2c_master_recv failed(), ret=%d\n", 83 "%s: i2c_master_recv failed(), ret=%d\n",
@@ -56,45 +85,103 @@ static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data)
56 return; 85 return;
57 } 86 }
58 87
59 touch = rdbuf[0]; 88 touch = rdbuf[0] & 0x7;
60 if (touch) { 89 if (touch > tsdata->max_fingers)
61 u16 posx1 = (rdbuf[3] << 8) | rdbuf[2]; 90 touch = tsdata->max_fingers;
62 u16 posy1 = (rdbuf[5] << 8) | rdbuf[4]; 91
63 u16 posx2 = (rdbuf[7] << 8) | rdbuf[6]; 92 report->num_touches = touch;
64 u16 posy2 = (rdbuf[9] << 8) | rdbuf[8]; 93 bufptr = &rdbuf[2];
65 94
66 input_report_key(tsdata->input, BTN_TOUCH, 1); 95 for (i = 0; i < touch; i++) {
67 input_report_abs(tsdata->input, ABS_X, posx1); 96 report->touches[i].x = (bufptr[1] << 8) | bufptr[0];
68 input_report_abs(tsdata->input, ABS_Y, posy1); 97 report->touches[i].y = (bufptr[3] << 8) | bufptr[2];
69 98
70 input_report_abs(tsdata->input, ABS_MT_POSITION_X, posx1); 99 if (chip->has_hw_ids) {
71 input_report_abs(tsdata->input, ABS_MT_POSITION_Y, posy1); 100 report->touches[i].id = bufptr[4];
72 input_mt_sync(tsdata->input); 101 bufptr = bufptr + 5;
73 102 } else {
74 if (touch == 2) { 103 bufptr = bufptr + 4;
75 input_report_abs(tsdata->input, 104 }
76 ABS_MT_POSITION_X, posx2); 105 }
77 input_report_abs(tsdata->input, 106}
78 ABS_MT_POSITION_Y, posy2); 107
79 input_mt_sync(tsdata->input); 108static void pixcir_ts_report(struct pixcir_i2c_ts_data *ts,
109 struct pixcir_report_data *report)
110{
111 struct input_mt_pos pos[PIXCIR_MAX_SLOTS];
112 int slots[PIXCIR_MAX_SLOTS];
113 struct pixcir_touch *touch;
114 int n, i, slot;
115 struct device *dev = &ts->client->dev;
116 const struct pixcir_i2c_chip_data *chip = &ts->pdata->chip;
117
118 n = report->num_touches;
119 if (n > PIXCIR_MAX_SLOTS)
120 n = PIXCIR_MAX_SLOTS;
121
122 if (!chip->has_hw_ids) {
123 for (i = 0; i < n; i++) {
124 touch = &report->touches[i];
125 pos[i].x = touch->x;
126 pos[i].y = touch->y;
127 }
128
129 input_mt_assign_slots(ts->input, slots, pos, n);
130 }
131
132 for (i = 0; i < n; i++) {
133 touch = &report->touches[i];
134
135 if (chip->has_hw_ids) {
136 slot = input_mt_get_slot_by_key(ts->input, touch->id);
137 if (slot < 0) {
138 dev_dbg(dev, "no free slot for id 0x%x\n",
139 touch->id);
140 continue;
141 }
142 } else {
143 slot = slots[i];
80 } 144 }
81 } else { 145
82 input_report_key(tsdata->input, BTN_TOUCH, 0); 146 input_mt_slot(ts->input, slot);
147 input_mt_report_slot_state(ts->input,
148 MT_TOOL_FINGER, true);
149
150 input_event(ts->input, EV_ABS, ABS_MT_POSITION_X, touch->x);
151 input_event(ts->input, EV_ABS, ABS_MT_POSITION_Y, touch->y);
152
153 dev_dbg(dev, "%d: slot %d, x %d, y %d\n",
154 i, slot, touch->x, touch->y);
83 } 155 }
84 156
85 input_sync(tsdata->input); 157 input_mt_sync_frame(ts->input);
158 input_sync(ts->input);
86} 159}
87 160
88static irqreturn_t pixcir_ts_isr(int irq, void *dev_id) 161static irqreturn_t pixcir_ts_isr(int irq, void *dev_id)
89{ 162{
90 struct pixcir_i2c_ts_data *tsdata = dev_id; 163 struct pixcir_i2c_ts_data *tsdata = dev_id;
91 const struct pixcir_ts_platform_data *pdata = tsdata->chip; 164 const struct pixcir_ts_platform_data *pdata = tsdata->pdata;
165 struct pixcir_report_data report;
92 166
93 while (tsdata->running) { 167 while (tsdata->running) {
94 pixcir_ts_poscheck(tsdata); 168 /* parse packet */
95 169 pixcir_ts_parse(tsdata, &report);
96 if (gpio_get_value(pdata->gpio_attb)) 170
171 /* report it */
172 pixcir_ts_report(tsdata, &report);
173
174 if (gpio_get_value(pdata->gpio_attb)) {
175 if (report.num_touches) {
176 /*
177 * Last report with no finger up?
178 * Do it now then.
179 */
180 input_mt_sync_frame(tsdata->input);
181 input_sync(tsdata->input);
182 }
97 break; 183 break;
184 }
98 185
99 msleep(20); 186 msleep(20);
100 } 187 }
@@ -323,16 +410,69 @@ unlock:
323static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, 410static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
324 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); 411 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume);
325 412
413#ifdef CONFIG_OF
414static const struct of_device_id pixcir_of_match[];
415
416static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
417{
418 struct pixcir_ts_platform_data *pdata;
419 struct device_node *np = dev->of_node;
420 const struct of_device_id *match;
421
422 match = of_match_device(of_match_ptr(pixcir_of_match), dev);
423 if (!match)
424 return ERR_PTR(-EINVAL);
425
426 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
427 if (!pdata)
428 return ERR_PTR(-ENOMEM);
429
430 pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data;
431
432 pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
433 /* gpio_attb validity is checked in probe */
434
435 if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) {
436 dev_err(dev, "Failed to get touchscreen-size-x property\n");
437 return ERR_PTR(-EINVAL);
438 }
439 pdata->x_max -= 1;
440
441 if (of_property_read_u32(np, "touchscreen-size-y", &pdata->y_max)) {
442 dev_err(dev, "Failed to get touchscreen-size-y property\n");
443 return ERR_PTR(-EINVAL);
444 }
445 pdata->y_max -= 1;
446
447 dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
448 pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb);
449
450 return pdata;
451}
452#else
453static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
454{
455 return ERR_PTR(-EINVAL);
456}
457#endif
458
326static int pixcir_i2c_ts_probe(struct i2c_client *client, 459static int pixcir_i2c_ts_probe(struct i2c_client *client,
327 const struct i2c_device_id *id) 460 const struct i2c_device_id *id)
328{ 461{
329 const struct pixcir_ts_platform_data *pdata = 462 const struct pixcir_ts_platform_data *pdata =
330 dev_get_platdata(&client->dev); 463 dev_get_platdata(&client->dev);
331 struct device *dev = &client->dev; 464 struct device *dev = &client->dev;
465 struct device_node *np = dev->of_node;
332 struct pixcir_i2c_ts_data *tsdata; 466 struct pixcir_i2c_ts_data *tsdata;
333 struct input_dev *input; 467 struct input_dev *input;
334 int error; 468 int error;
335 469
470 if (np && !pdata) {
471 pdata = pixcir_parse_dt(dev);
472 if (IS_ERR(pdata))
473 return PTR_ERR(pdata);
474 }
475
336 if (!pdata) { 476 if (!pdata) {
337 dev_err(&client->dev, "platform data not defined\n"); 477 dev_err(&client->dev, "platform data not defined\n");
338 return -EINVAL; 478 return -EINVAL;
@@ -343,6 +483,11 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
343 return -EINVAL; 483 return -EINVAL;
344 } 484 }
345 485
486 if (!pdata->chip.max_fingers) {
487 dev_err(dev, "Invalid max_fingers in pdata\n");
488 return -EINVAL;
489 }
490
346 tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL); 491 tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL);
347 if (!tsdata) 492 if (!tsdata)
348 return -ENOMEM; 493 return -ENOMEM;
@@ -355,7 +500,7 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
355 500
356 tsdata->client = client; 501 tsdata->client = client;
357 tsdata->input = input; 502 tsdata->input = input;
358 tsdata->chip = pdata; 503 tsdata->pdata = pdata;
359 504
360 input->name = client->name; 505 input->name = client->name;
361 input->id.bustype = BUS_I2C; 506 input->id.bustype = BUS_I2C;
@@ -371,6 +516,20 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
371 input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0); 516 input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0);
372 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0); 517 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0);
373 518
519 tsdata->max_fingers = tsdata->pdata->chip.max_fingers;
520 if (tsdata->max_fingers > PIXCIR_MAX_SLOTS) {
521 tsdata->max_fingers = PIXCIR_MAX_SLOTS;
522 dev_info(dev, "Limiting maximum fingers to %d\n",
523 tsdata->max_fingers);
524 }
525
526 error = input_mt_init_slots(input, tsdata->max_fingers,
527 INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
528 if (error) {
529 dev_err(dev, "Error initializing Multi-Touch slots\n");
530 return error;
531 }
532
374 input_set_drvdata(input, tsdata); 533 input_set_drvdata(input, tsdata);
375 534
376 error = devm_gpio_request_one(dev, pdata->gpio_attb, 535 error = devm_gpio_request_one(dev, pdata->gpio_attb,
@@ -419,15 +578,36 @@ static int pixcir_i2c_ts_remove(struct i2c_client *client)
419 578
420static const struct i2c_device_id pixcir_i2c_ts_id[] = { 579static const struct i2c_device_id pixcir_i2c_ts_id[] = {
421 { "pixcir_ts", 0 }, 580 { "pixcir_ts", 0 },
581 { "pixcir_tangoc", 0 },
422 { } 582 { }
423}; 583};
424MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id); 584MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id);
425 585
586#ifdef CONFIG_OF
587static const struct pixcir_i2c_chip_data pixcir_ts_data = {
588 .max_fingers = 2,
589 /* no hw id support */
590};
591
592static const struct pixcir_i2c_chip_data pixcir_tangoc_data = {
593 .max_fingers = 5,
594 .has_hw_ids = true,
595};
596
597static const struct of_device_id pixcir_of_match[] = {
598 { .compatible = "pixcir,pixcir_ts", .data = &pixcir_ts_data },
599 { .compatible = "pixcir,pixcir_tangoc", .data = &pixcir_tangoc_data },
600 { }
601};
602MODULE_DEVICE_TABLE(of, pixcir_of_match);
603#endif
604
426static struct i2c_driver pixcir_i2c_ts_driver = { 605static struct i2c_driver pixcir_i2c_ts_driver = {
427 .driver = { 606 .driver = {
428 .owner = THIS_MODULE, 607 .owner = THIS_MODULE,
429 .name = "pixcir_ts", 608 .name = "pixcir_ts",
430 .pm = &pixcir_dev_pm_ops, 609 .pm = &pixcir_dev_pm_ops,
610 .of_match_table = of_match_ptr(pixcir_of_match),
431 }, 611 },
432 .probe = pixcir_i2c_ts_probe, 612 .probe = pixcir_i2c_ts_probe,
433 .remove = pixcir_i2c_ts_remove, 613 .remove = pixcir_i2c_ts_remove,
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index 19cb247dbb86..5a69ded9b53c 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -264,7 +264,7 @@ static int s3c2410ts_probe(struct platform_device *pdev)
264 return -ENOENT; 264 return -ENOENT;
265 } 265 }
266 266
267 clk_enable(ts.clock); 267 clk_prepare_enable(ts.clock);
268 dev_dbg(dev, "got and enabled clocks\n"); 268 dev_dbg(dev, "got and enabled clocks\n");
269 269
270 ts.irq_tc = ret = platform_get_irq(pdev, 0); 270 ts.irq_tc = ret = platform_get_irq(pdev, 0);
@@ -369,7 +369,7 @@ static int s3c2410ts_remove(struct platform_device *pdev)
369 free_irq(ts.irq_tc, ts.input); 369 free_irq(ts.irq_tc, ts.input);
370 del_timer_sync(&touch_timer); 370 del_timer_sync(&touch_timer);
371 371
372 clk_disable(ts.clock); 372 clk_disable_unprepare(ts.clock);
373 clk_put(ts.clock); 373 clk_put(ts.clock);
374 374
375 input_unregister_device(ts.input); 375 input_unregister_device(ts.input);
diff --git a/drivers/input/touchscreen/zforce_ts.c b/drivers/input/touchscreen/zforce_ts.c
index feea85b52fa8..8ba48f5eff7b 100644
--- a/drivers/input/touchscreen/zforce_ts.c
+++ b/drivers/input/touchscreen/zforce_ts.c
@@ -29,6 +29,8 @@
29#include <linux/sysfs.h> 29#include <linux/sysfs.h>
30#include <linux/input/mt.h> 30#include <linux/input/mt.h>
31#include <linux/platform_data/zforce_ts.h> 31#include <linux/platform_data/zforce_ts.h>
32#include <linux/regulator/consumer.h>
33#include <linux/delay.h>
32#include <linux/of.h> 34#include <linux/of.h>
33#include <linux/of_gpio.h> 35#include <linux/of_gpio.h>
34 36
@@ -117,6 +119,8 @@ struct zforce_ts {
117 const struct zforce_ts_platdata *pdata; 119 const struct zforce_ts_platdata *pdata;
118 char phys[32]; 120 char phys[32];
119 121
122 struct regulator *reg_vdd;
123
120 bool suspending; 124 bool suspending;
121 bool suspended; 125 bool suspended;
122 bool boot_complete; 126 bool boot_complete;
@@ -690,6 +694,11 @@ static void zforce_reset(void *data)
690 struct zforce_ts *ts = data; 694 struct zforce_ts *ts = data;
691 695
692 gpio_set_value(ts->pdata->gpio_rst, 0); 696 gpio_set_value(ts->pdata->gpio_rst, 0);
697
698 udelay(10);
699
700 if (!IS_ERR(ts->reg_vdd))
701 regulator_disable(ts->reg_vdd);
693} 702}
694 703
695static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev) 704static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev)
@@ -765,10 +774,32 @@ static int zforce_probe(struct i2c_client *client,
765 return ret; 774 return ret;
766 } 775 }
767 776
777 ts->reg_vdd = devm_regulator_get_optional(&client->dev, "vdd");
778 if (IS_ERR(ts->reg_vdd)) {
779 ret = PTR_ERR(ts->reg_vdd);
780 if (ret == -EPROBE_DEFER)
781 return ret;
782 } else {
783 ret = regulator_enable(ts->reg_vdd);
784 if (ret)
785 return ret;
786
787 /*
788 * according to datasheet add 100us grace time after regular
789 * regulator enable delay.
790 */
791 udelay(100);
792 }
793
768 ret = devm_add_action(&client->dev, zforce_reset, ts); 794 ret = devm_add_action(&client->dev, zforce_reset, ts);
769 if (ret) { 795 if (ret) {
770 dev_err(&client->dev, "failed to register reset action, %d\n", 796 dev_err(&client->dev, "failed to register reset action, %d\n",
771 ret); 797 ret);
798
799 /* hereafter the regulator will be disabled by the action */
800 if (!IS_ERR(ts->reg_vdd))
801 regulator_disable(ts->reg_vdd);
802
772 return ret; 803 return ret;
773 } 804 }
774 805