2 * Driver for AUO in-cell touchscreens
4 * Copyright (c) 2011 Heiko Stuebner <heiko@sntech.de>
6 * loosely based on auo_touch.c from Dell Streak vendor-kernel
8 * Copyright (c) 2008 QUALCOMM Incorporated.
9 * Copyright (c) 2008 QUALCOMM USA, INC.
12 * This software is licensed under the terms of the GNU General Public
13 * License version 2, as published by the Free Software Foundation, and
14 * may be copied, distributed, and modified under those terms.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/interrupt.h>
26 #include <linux/slab.h>
27 #include <linux/input.h>
28 #include <linux/jiffies.h>
29 #include <linux/i2c.h>
30 #include <linux/mutex.h>
31 #include <linux/delay.h>
32 #include <linux/gpio.h>
33 #include <linux/input/auo-pixcir-ts.h>
35 #include <linux/of_gpio.h>
38 * Coordinate calculation:
39 * X1 = X1_LSB + X1_MSB*256
40 * Y1 = Y1_LSB + Y1_MSB*256
41 * X2 = X2_LSB + X2_MSB*256
42 * Y2 = Y2_LSB + Y2_MSB*256
44 #define AUO_PIXCIR_REG_X1_LSB 0x00
45 #define AUO_PIXCIR_REG_X1_MSB 0x01
46 #define AUO_PIXCIR_REG_Y1_LSB 0x02
47 #define AUO_PIXCIR_REG_Y1_MSB 0x03
48 #define AUO_PIXCIR_REG_X2_LSB 0x04
49 #define AUO_PIXCIR_REG_X2_MSB 0x05
50 #define AUO_PIXCIR_REG_Y2_LSB 0x06
51 #define AUO_PIXCIR_REG_Y2_MSB 0x07
53 #define AUO_PIXCIR_REG_STRENGTH 0x0d
54 #define AUO_PIXCIR_REG_STRENGTH_X1_LSB 0x0e
55 #define AUO_PIXCIR_REG_STRENGTH_X1_MSB 0x0f
57 #define AUO_PIXCIR_REG_RAW_DATA_X 0x2b
58 #define AUO_PIXCIR_REG_RAW_DATA_Y 0x4f
60 #define AUO_PIXCIR_REG_X_SENSITIVITY 0x6f
61 #define AUO_PIXCIR_REG_Y_SENSITIVITY 0x70
62 #define AUO_PIXCIR_REG_INT_SETTING 0x71
63 #define AUO_PIXCIR_REG_INT_WIDTH 0x72
64 #define AUO_PIXCIR_REG_POWER_MODE 0x73
66 #define AUO_PIXCIR_REG_VERSION 0x77
67 #define AUO_PIXCIR_REG_CALIBRATE 0x78
69 #define AUO_PIXCIR_REG_TOUCHAREA_X1 0x1e
70 #define AUO_PIXCIR_REG_TOUCHAREA_Y1 0x1f
71 #define AUO_PIXCIR_REG_TOUCHAREA_X2 0x20
72 #define AUO_PIXCIR_REG_TOUCHAREA_Y2 0x21
74 #define AUO_PIXCIR_REG_EEPROM_CALIB_X 0x42
75 #define AUO_PIXCIR_REG_EEPROM_CALIB_Y 0xad
77 #define AUO_PIXCIR_INT_TPNUM_MASK 0xe0
78 #define AUO_PIXCIR_INT_TPNUM_SHIFT 5
79 #define AUO_PIXCIR_INT_RELEASE (1 << 4)
80 #define AUO_PIXCIR_INT_ENABLE (1 << 3)
81 #define AUO_PIXCIR_INT_POL_HIGH (1 << 2)
82 #define AUO_PIXCIR_INT_MODE_MASK 0x03
86 * active: scan speed 60Hz
87 * sleep: scan speed 10Hz can be auto-activated, wakeup on 1st touch
88 * deep sleep: scan speed 1Hz can only be entered or left manually.
90 #define AUO_PIXCIR_POWER_ACTIVE 0x00
91 #define AUO_PIXCIR_POWER_SLEEP 0x01
92 #define AUO_PIXCIR_POWER_DEEP_SLEEP 0x02
93 #define AUO_PIXCIR_POWER_MASK 0x03
95 #define AUO_PIXCIR_POWER_ALLOW_SLEEP (1 << 2)
96 #define AUO_PIXCIR_POWER_IDLE_TIME(ms) ((ms & 0xf) << 4)
98 #define AUO_PIXCIR_CALIBRATE 0x03
100 #define AUO_PIXCIR_EEPROM_CALIB_X_LEN 62
101 #define AUO_PIXCIR_EEPROM_CALIB_Y_LEN 36
103 #define AUO_PIXCIR_RAW_DATA_X_LEN 18
104 #define AUO_PIXCIR_RAW_DATA_Y_LEN 11
106 #define AUO_PIXCIR_STRENGTH_ENABLE (1 << 0)
108 /* Touchscreen absolute values */
109 #define AUO_PIXCIR_REPORT_POINTS 2
110 #define AUO_PIXCIR_MAX_AREA 0xff
111 #define AUO_PIXCIR_PENUP_TIMEOUT_MS 10
113 struct auo_pixcir_ts
{
114 struct i2c_client
*client
;
115 struct input_dev
*input
;
116 const struct auo_pixcir_ts_platdata
*pdata
;
119 /* special handling for touch_indicate interupt mode */
122 wait_queue_head_t wait
;
134 static int auo_pixcir_collect_data(struct auo_pixcir_ts
*ts
,
135 struct auo_point_t
*point
)
137 struct i2c_client
*client
= ts
->client
;
138 const struct auo_pixcir_ts_platdata
*pdata
= ts
->pdata
;
139 uint8_t raw_coord
[8];
143 /* touch coordinates */
144 ret
= i2c_smbus_read_i2c_block_data(client
, AUO_PIXCIR_REG_X1_LSB
,
147 dev_err(&client
->dev
, "failed to read coordinate, %d\n", ret
);
152 ret
= i2c_smbus_read_i2c_block_data(client
, AUO_PIXCIR_REG_TOUCHAREA_X1
,
155 dev_err(&client
->dev
, "could not read touch area, %d\n", ret
);
159 for (i
= 0; i
< AUO_PIXCIR_REPORT_POINTS
; i
++) {
161 raw_coord
[4 * i
+ 1] << 8 | raw_coord
[4 * i
];
163 raw_coord
[4 * i
+ 3] << 8 | raw_coord
[4 * i
+ 2];
165 if (point
[i
].coord_x
> pdata
->x_max
||
166 point
[i
].coord_y
> pdata
->y_max
) {
167 dev_warn(&client
->dev
, "coordinates (%d,%d) invalid\n",
168 point
[i
].coord_x
, point
[i
].coord_y
);
169 point
[i
].coord_x
= point
[i
].coord_y
= 0;
172 /* determine touch major, minor and orientation */
173 point
[i
].area_major
= max(raw_area
[2 * i
], raw_area
[2 * i
+ 1]);
174 point
[i
].area_minor
= min(raw_area
[2 * i
], raw_area
[2 * i
+ 1]);
175 point
[i
].orientation
= raw_area
[2 * i
] > raw_area
[2 * i
+ 1];
181 static irqreturn_t
auo_pixcir_interrupt(int irq
, void *dev_id
)
183 struct auo_pixcir_ts
*ts
= dev_id
;
184 const struct auo_pixcir_ts_platdata
*pdata
= ts
->pdata
;
185 struct auo_point_t point
[AUO_PIXCIR_REPORT_POINTS
];
191 while (!ts
->stopped
) {
193 /* check for up event in touch touch_ind_mode */
194 if (ts
->touch_ind_mode
) {
195 if (gpio_get_value(pdata
->gpio_int
) == 0) {
196 input_mt_sync(ts
->input
);
197 input_report_key(ts
->input
, BTN_TOUCH
, 0);
198 input_sync(ts
->input
);
203 ret
= auo_pixcir_collect_data(ts
, point
);
205 /* we want to loop only in touch_ind_mode */
206 if (!ts
->touch_ind_mode
)
209 wait_event_timeout(ts
->wait
, ts
->stopped
,
210 msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS
));
214 for (i
= 0; i
< AUO_PIXCIR_REPORT_POINTS
; i
++) {
215 if (point
[i
].coord_x
> 0 || point
[i
].coord_y
> 0) {
216 input_report_abs(ts
->input
, ABS_MT_POSITION_X
,
218 input_report_abs(ts
->input
, ABS_MT_POSITION_Y
,
220 input_report_abs(ts
->input
, ABS_MT_TOUCH_MAJOR
,
221 point
[i
].area_major
);
222 input_report_abs(ts
->input
, ABS_MT_TOUCH_MINOR
,
223 point
[i
].area_minor
);
224 input_report_abs(ts
->input
, ABS_MT_ORIENTATION
,
225 point
[i
].orientation
);
226 input_mt_sync(ts
->input
);
228 /* use first finger as source for singletouch */
232 /* number of touch points could also be queried
233 * via i2c but would require an additional call
239 input_report_key(ts
->input
, BTN_TOUCH
, fingers
> 0);
242 input_report_abs(ts
->input
, ABS_X
, point
[abs
].coord_x
);
243 input_report_abs(ts
->input
, ABS_Y
, point
[abs
].coord_y
);
246 input_sync(ts
->input
);
248 /* we want to loop only in touch_ind_mode */
249 if (!ts
->touch_ind_mode
)
252 wait_event_timeout(ts
->wait
, ts
->stopped
,
253 msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS
));
260 * Set the power mode of the device.
262 * - AUO_PIXCIR_POWER_ACTIVE
263 * - AUO_PIXCIR_POWER_SLEEP - automatically left on first touch
264 * - AUO_PIXCIR_POWER_DEEP_SLEEP
266 static int auo_pixcir_power_mode(struct auo_pixcir_ts
*ts
, int mode
)
268 struct i2c_client
*client
= ts
->client
;
271 ret
= i2c_smbus_read_byte_data(client
, AUO_PIXCIR_REG_POWER_MODE
);
273 dev_err(&client
->dev
, "unable to read reg %Xh, %d\n",
274 AUO_PIXCIR_REG_POWER_MODE
, ret
);
278 ret
&= ~AUO_PIXCIR_POWER_MASK
;
281 ret
= i2c_smbus_write_byte_data(client
, AUO_PIXCIR_REG_POWER_MODE
, ret
);
283 dev_err(&client
->dev
, "unable to write reg %Xh, %d\n",
284 AUO_PIXCIR_REG_POWER_MODE
, ret
);
291 static int auo_pixcir_int_config(struct auo_pixcir_ts
*ts
,
294 struct i2c_client
*client
= ts
->client
;
295 const struct auo_pixcir_ts_platdata
*pdata
= ts
->pdata
;
298 ret
= i2c_smbus_read_byte_data(client
, AUO_PIXCIR_REG_INT_SETTING
);
300 dev_err(&client
->dev
, "unable to read reg %Xh, %d\n",
301 AUO_PIXCIR_REG_INT_SETTING
, ret
);
305 ret
&= ~AUO_PIXCIR_INT_MODE_MASK
;
307 ret
|= AUO_PIXCIR_INT_POL_HIGH
; /* always use high for interrupts */
309 ret
= i2c_smbus_write_byte_data(client
, AUO_PIXCIR_REG_INT_SETTING
,
312 dev_err(&client
->dev
, "unable to write reg %Xh, %d\n",
313 AUO_PIXCIR_REG_INT_SETTING
, ret
);
317 ts
->touch_ind_mode
= pdata
->int_setting
== AUO_PIXCIR_INT_TOUCH_IND
;
322 /* control the generation of interrupts on the device side */
323 static int auo_pixcir_int_toggle(struct auo_pixcir_ts
*ts
, bool enable
)
325 struct i2c_client
*client
= ts
->client
;
328 ret
= i2c_smbus_read_byte_data(client
, AUO_PIXCIR_REG_INT_SETTING
);
330 dev_err(&client
->dev
, "unable to read reg %Xh, %d\n",
331 AUO_PIXCIR_REG_INT_SETTING
, ret
);
336 ret
|= AUO_PIXCIR_INT_ENABLE
;
338 ret
&= ~AUO_PIXCIR_INT_ENABLE
;
340 ret
= i2c_smbus_write_byte_data(client
, AUO_PIXCIR_REG_INT_SETTING
,
343 dev_err(&client
->dev
, "unable to write reg %Xh, %d\n",
344 AUO_PIXCIR_REG_INT_SETTING
, ret
);
351 static int auo_pixcir_start(struct auo_pixcir_ts
*ts
)
353 struct i2c_client
*client
= ts
->client
;
356 ret
= auo_pixcir_power_mode(ts
, AUO_PIXCIR_POWER_ACTIVE
);
358 dev_err(&client
->dev
, "could not set power mode, %d\n",
365 enable_irq(client
->irq
);
367 ret
= auo_pixcir_int_toggle(ts
, 1);
369 dev_err(&client
->dev
, "could not enable interrupt, %d\n",
371 disable_irq(client
->irq
);
378 static int auo_pixcir_stop(struct auo_pixcir_ts
*ts
)
380 struct i2c_client
*client
= ts
->client
;
383 ret
= auo_pixcir_int_toggle(ts
, 0);
385 dev_err(&client
->dev
, "could not disable interrupt, %d\n",
390 /* disable receiving of interrupts */
391 disable_irq(client
->irq
);
396 return auo_pixcir_power_mode(ts
, AUO_PIXCIR_POWER_DEEP_SLEEP
);
399 static int auo_pixcir_input_open(struct input_dev
*dev
)
401 struct auo_pixcir_ts
*ts
= input_get_drvdata(dev
);
403 return auo_pixcir_start(ts
);
406 static void auo_pixcir_input_close(struct input_dev
*dev
)
408 struct auo_pixcir_ts
*ts
= input_get_drvdata(dev
);
415 static int __maybe_unused
auo_pixcir_suspend(struct device
*dev
)
417 struct i2c_client
*client
= to_i2c_client(dev
);
418 struct auo_pixcir_ts
*ts
= i2c_get_clientdata(client
);
419 struct input_dev
*input
= ts
->input
;
422 mutex_lock(&input
->mutex
);
424 /* when configured as wakeup source, device should always wake system
425 * therefore start device if necessary
427 if (device_may_wakeup(&client
->dev
)) {
428 /* need to start device if not open, to be wakeup source */
430 ret
= auo_pixcir_start(ts
);
435 enable_irq_wake(client
->irq
);
436 ret
= auo_pixcir_power_mode(ts
, AUO_PIXCIR_POWER_SLEEP
);
437 } else if (input
->users
) {
438 ret
= auo_pixcir_stop(ts
);
442 mutex_unlock(&input
->mutex
);
447 static int __maybe_unused
auo_pixcir_resume(struct device
*dev
)
449 struct i2c_client
*client
= to_i2c_client(dev
);
450 struct auo_pixcir_ts
*ts
= i2c_get_clientdata(client
);
451 struct input_dev
*input
= ts
->input
;
454 mutex_lock(&input
->mutex
);
456 if (device_may_wakeup(&client
->dev
)) {
457 disable_irq_wake(client
->irq
);
459 /* need to stop device if it was not open on suspend */
461 ret
= auo_pixcir_stop(ts
);
466 /* device wakes automatically from SLEEP */
467 } else if (input
->users
) {
468 ret
= auo_pixcir_start(ts
);
472 mutex_unlock(&input
->mutex
);
477 static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops
,
478 auo_pixcir_suspend
, auo_pixcir_resume
);
481 static struct auo_pixcir_ts_platdata
*auo_pixcir_parse_dt(struct device
*dev
)
483 struct auo_pixcir_ts_platdata
*pdata
;
484 struct device_node
*np
= dev
->of_node
;
487 return ERR_PTR(-ENOENT
);
489 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
491 dev_err(dev
, "failed to allocate platform data\n");
492 return ERR_PTR(-ENOMEM
);
495 pdata
->gpio_int
= of_get_gpio(np
, 0);
496 if (!gpio_is_valid(pdata
->gpio_int
)) {
497 dev_err(dev
, "failed to get interrupt gpio\n");
498 return ERR_PTR(-EINVAL
);
501 pdata
->gpio_rst
= of_get_gpio(np
, 1);
502 if (!gpio_is_valid(pdata
->gpio_rst
)) {
503 dev_err(dev
, "failed to get reset gpio\n");
504 return ERR_PTR(-EINVAL
);
507 if (of_property_read_u32(np
, "x-size", &pdata
->x_max
)) {
508 dev_err(dev
, "failed to get x-size property\n");
509 return ERR_PTR(-EINVAL
);
512 if (of_property_read_u32(np
, "y-size", &pdata
->y_max
)) {
513 dev_err(dev
, "failed to get y-size property\n");
514 return ERR_PTR(-EINVAL
);
517 /* default to asserting the interrupt when the screen is touched */
518 pdata
->int_setting
= AUO_PIXCIR_INT_TOUCH_IND
;
523 static struct auo_pixcir_ts_platdata
*auo_pixcir_parse_dt(struct device
*dev
)
525 return ERR_PTR(-EINVAL
);
529 static void auo_pixcir_reset(void *data
)
531 struct auo_pixcir_ts
*ts
= data
;
533 gpio_set_value(ts
->pdata
->gpio_rst
, 0);
536 static int auo_pixcir_probe(struct i2c_client
*client
,
537 const struct i2c_device_id
*id
)
539 const struct auo_pixcir_ts_platdata
*pdata
;
540 struct auo_pixcir_ts
*ts
;
541 struct input_dev
*input_dev
;
545 pdata
= dev_get_platdata(&client
->dev
);
547 pdata
= auo_pixcir_parse_dt(&client
->dev
);
549 return PTR_ERR(pdata
);
552 ts
= devm_kzalloc(&client
->dev
,
553 sizeof(struct auo_pixcir_ts
), GFP_KERNEL
);
557 input_dev
= devm_input_allocate_device(&client
->dev
);
559 dev_err(&client
->dev
, "could not allocate input device\n");
565 ts
->input
= input_dev
;
566 ts
->touch_ind_mode
= 0;
568 init_waitqueue_head(&ts
->wait
);
570 snprintf(ts
->phys
, sizeof(ts
->phys
),
571 "%s/input0", dev_name(&client
->dev
));
573 input_dev
->name
= "AUO-Pixcir touchscreen";
574 input_dev
->phys
= ts
->phys
;
575 input_dev
->id
.bustype
= BUS_I2C
;
577 input_dev
->open
= auo_pixcir_input_open
;
578 input_dev
->close
= auo_pixcir_input_close
;
580 __set_bit(EV_ABS
, input_dev
->evbit
);
581 __set_bit(EV_KEY
, input_dev
->evbit
);
583 __set_bit(BTN_TOUCH
, input_dev
->keybit
);
585 /* For single touch */
586 input_set_abs_params(input_dev
, ABS_X
, 0, pdata
->x_max
, 0, 0);
587 input_set_abs_params(input_dev
, ABS_Y
, 0, pdata
->y_max
, 0, 0);
589 /* For multi touch */
590 input_set_abs_params(input_dev
, ABS_MT_POSITION_X
, 0,
592 input_set_abs_params(input_dev
, ABS_MT_POSITION_Y
, 0,
594 input_set_abs_params(input_dev
, ABS_MT_TOUCH_MAJOR
, 0,
595 AUO_PIXCIR_MAX_AREA
, 0, 0);
596 input_set_abs_params(input_dev
, ABS_MT_TOUCH_MINOR
, 0,
597 AUO_PIXCIR_MAX_AREA
, 0, 0);
598 input_set_abs_params(input_dev
, ABS_MT_ORIENTATION
, 0, 1, 0, 0);
600 input_set_drvdata(ts
->input
, ts
);
602 error
= devm_gpio_request_one(&client
->dev
, pdata
->gpio_int
,
603 GPIOF_DIR_IN
, "auo_pixcir_ts_int");
605 dev_err(&client
->dev
, "request of gpio %d failed, %d\n",
606 pdata
->gpio_int
, error
);
610 error
= devm_gpio_request_one(&client
->dev
, pdata
->gpio_rst
,
611 GPIOF_DIR_OUT
| GPIOF_INIT_HIGH
,
612 "auo_pixcir_ts_rst");
614 dev_err(&client
->dev
, "request of gpio %d failed, %d\n",
615 pdata
->gpio_rst
, error
);
619 error
= devm_add_action(&client
->dev
, auo_pixcir_reset
, ts
);
621 auo_pixcir_reset(ts
);
622 dev_err(&client
->dev
, "failed to register reset action, %d\n",
629 version
= i2c_smbus_read_byte_data(client
, AUO_PIXCIR_REG_VERSION
);
635 dev_info(&client
->dev
, "firmware version 0x%X\n", version
);
637 error
= auo_pixcir_int_config(ts
, pdata
->int_setting
);
641 error
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
642 NULL
, auo_pixcir_interrupt
,
643 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
644 input_dev
->name
, ts
);
646 dev_err(&client
->dev
, "irq %d requested failed, %d\n",
651 /* stop device and put it into deep sleep until it is opened */
652 error
= auo_pixcir_stop(ts
);
656 error
= input_register_device(input_dev
);
658 dev_err(&client
->dev
, "could not register input device, %d\n",
663 i2c_set_clientdata(client
, ts
);
668 static const struct i2c_device_id auo_pixcir_idtable
[] = {
669 { "auo_pixcir_ts", 0 },
672 MODULE_DEVICE_TABLE(i2c
, auo_pixcir_idtable
);
675 static const struct of_device_id auo_pixcir_ts_dt_idtable
[] = {
676 { .compatible
= "auo,auo_pixcir_ts" },
679 MODULE_DEVICE_TABLE(of
, auo_pixcir_ts_dt_idtable
);
682 static struct i2c_driver auo_pixcir_driver
= {
684 .name
= "auo_pixcir_ts",
685 .pm
= &auo_pixcir_pm_ops
,
686 .of_match_table
= of_match_ptr(auo_pixcir_ts_dt_idtable
),
688 .probe
= auo_pixcir_probe
,
689 .id_table
= auo_pixcir_idtable
,
692 module_i2c_driver(auo_pixcir_driver
);
694 MODULE_DESCRIPTION("AUO-PIXCIR touchscreen driver");
695 MODULE_LICENSE("GPL v2");
696 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");