1 // SPDX-License-Identifier: GPL-2.0
3 * ST1232 Touchscreen Controller Driver
5 * Copyright (C) 2010 Renesas Solutions Corp.
6 * Tony SIM <chinyeow.sim.xt@renesas.com>
9 * - android.git.kernel.org: projects/kernel/common.git: synaptics_i2c_rmi.c
10 * Copyright (C) 2007 Google, Inc.
13 #include <linux/delay.h>
14 #include <linux/gpio/consumer.h>
15 #include <linux/i2c.h>
16 #include <linux/input.h>
17 #include <linux/input/mt.h>
18 #include <linux/input/touchscreen.h>
19 #include <linux/interrupt.h>
20 #include <linux/module.h>
22 #include <linux/pm_qos.h>
23 #include <linux/slab.h>
24 #include <linux/types.h>
26 #define ST1232_TS_NAME "st1232-ts"
27 #define ST1633_TS_NAME "st1633-ts"
29 #define REG_XY_RESOLUTION 0x04
30 #define REG_XY_COORDINATES 0x12
31 #define ST_TS_MAX_FINGERS 10
39 struct st1232_ts_data
{
40 struct i2c_client
*client
;
41 struct input_dev
*input_dev
;
42 struct touchscreen_properties prop
;
43 struct dev_pm_qos_request low_latency_req
;
44 struct gpio_desc
*reset_gpio
;
45 const struct st_chip_info
*chip_info
;
50 static int st1232_ts_read_data(struct st1232_ts_data
*ts
, u8 reg
)
52 struct i2c_client
*client
= ts
->client
;
53 struct i2c_msg msg
[] = {
61 .flags
= I2C_M_RD
| I2C_M_DMA_SAFE
,
62 .len
= ts
->read_buf_len
,
68 ret
= i2c_transfer(client
->adapter
, msg
, ARRAY_SIZE(msg
));
69 if (ret
!= ARRAY_SIZE(msg
))
70 return ret
< 0 ? ret
: -EIO
;
75 static int st1232_ts_read_resolution(struct st1232_ts_data
*ts
, u16
*max_x
,
81 /* select resolution register */
82 error
= st1232_ts_read_data(ts
, REG_XY_RESOLUTION
);
88 *max_x
= ((buf
[0] & 0x0070) << 4) | buf
[1];
89 *max_y
= ((buf
[0] & 0x0007) << 8) | buf
[2];
94 static int st1232_ts_parse_and_report(struct st1232_ts_data
*ts
)
96 struct input_dev
*input
= ts
->input_dev
;
97 struct input_mt_pos pos
[ST_TS_MAX_FINGERS
];
98 u8 z
[ST_TS_MAX_FINGERS
];
99 int slots
[ST_TS_MAX_FINGERS
];
103 for (i
= 0; i
< ts
->chip_info
->max_fingers
; i
++) {
104 u8
*buf
= &ts
->read_buf
[i
* 4];
106 if (buf
[0] & BIT(7)) {
107 unsigned int x
= ((buf
[0] & 0x70) << 4) | buf
[1];
108 unsigned int y
= ((buf
[0] & 0x07) << 8) | buf
[2];
110 touchscreen_set_mt_pos(&pos
[n_contacts
],
113 /* st1232 includes a z-axis / touch strength */
114 if (ts
->chip_info
->have_z
)
115 z
[n_contacts
] = ts
->read_buf
[i
+ 6];
121 input_mt_assign_slots(input
, slots
, pos
, n_contacts
, 0);
122 for (i
= 0; i
< n_contacts
; i
++) {
123 input_mt_slot(input
, slots
[i
]);
124 input_mt_report_slot_state(input
, MT_TOOL_FINGER
, true);
125 input_report_abs(input
, ABS_MT_POSITION_X
, pos
[i
].x
);
126 input_report_abs(input
, ABS_MT_POSITION_Y
, pos
[i
].y
);
127 if (ts
->chip_info
->have_z
)
128 input_report_abs(input
, ABS_MT_TOUCH_MAJOR
, z
[i
]);
131 input_mt_sync_frame(input
);
137 static irqreturn_t
st1232_ts_irq_handler(int irq
, void *dev_id
)
139 struct st1232_ts_data
*ts
= dev_id
;
143 error
= st1232_ts_read_data(ts
, REG_XY_COORDINATES
);
147 count
= st1232_ts_parse_and_report(ts
);
149 if (ts
->low_latency_req
.dev
) {
150 dev_pm_qos_remove_request(&ts
->low_latency_req
);
151 ts
->low_latency_req
.dev
= NULL
;
153 } else if (!ts
->low_latency_req
.dev
) {
154 /* First contact, request 100 us latency. */
155 dev_pm_qos_add_ancestor_request(&ts
->client
->dev
,
156 &ts
->low_latency_req
,
157 DEV_PM_QOS_RESUME_LATENCY
, 100);
164 static void st1232_ts_power(struct st1232_ts_data
*ts
, bool poweron
)
167 gpiod_set_value_cansleep(ts
->reset_gpio
, !poweron
);
170 static void st1232_ts_power_off(void *data
)
172 st1232_ts_power(data
, false);
175 static const struct st_chip_info st1232_chip_info
= {
181 static const struct st_chip_info st1633_chip_info
= {
187 static int st1232_ts_probe(struct i2c_client
*client
,
188 const struct i2c_device_id
*id
)
190 const struct st_chip_info
*match
;
191 struct st1232_ts_data
*ts
;
192 struct input_dev
*input_dev
;
196 match
= device_get_match_data(&client
->dev
);
198 match
= (const void *)id
->driver_data
;
200 dev_err(&client
->dev
, "unknown device model\n");
204 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
205 dev_err(&client
->dev
, "need I2C_FUNC_I2C\n");
210 dev_err(&client
->dev
, "no IRQ?\n");
214 ts
= devm_kzalloc(&client
->dev
, sizeof(*ts
), GFP_KERNEL
);
218 ts
->chip_info
= match
;
220 /* allocate a buffer according to the number of registers to read */
221 ts
->read_buf_len
= ts
->chip_info
->max_fingers
* 4;
222 ts
->read_buf
= devm_kzalloc(&client
->dev
, ts
->read_buf_len
, GFP_KERNEL
);
226 input_dev
= devm_input_allocate_device(&client
->dev
);
231 ts
->input_dev
= input_dev
;
233 ts
->reset_gpio
= devm_gpiod_get_optional(&client
->dev
, NULL
,
235 if (IS_ERR(ts
->reset_gpio
)) {
236 error
= PTR_ERR(ts
->reset_gpio
);
237 dev_err(&client
->dev
, "Unable to request GPIO pin: %d.\n",
242 st1232_ts_power(ts
, true);
244 error
= devm_add_action_or_reset(&client
->dev
, st1232_ts_power_off
, ts
);
246 dev_err(&client
->dev
,
247 "Failed to install power off action: %d\n", error
);
251 input_dev
->name
= "st1232-touchscreen";
252 input_dev
->id
.bustype
= BUS_I2C
;
254 /* Read resolution from the chip */
255 error
= st1232_ts_read_resolution(ts
, &max_x
, &max_y
);
257 dev_err(&client
->dev
,
258 "Failed to read resolution: %d\n", error
);
262 if (ts
->chip_info
->have_z
)
263 input_set_abs_params(input_dev
, ABS_MT_TOUCH_MAJOR
, 0,
264 ts
->chip_info
->max_area
, 0, 0);
266 input_set_abs_params(input_dev
, ABS_MT_POSITION_X
,
268 input_set_abs_params(input_dev
, ABS_MT_POSITION_Y
,
271 touchscreen_parse_properties(input_dev
, true, &ts
->prop
);
273 error
= input_mt_init_slots(input_dev
, ts
->chip_info
->max_fingers
,
274 INPUT_MT_DIRECT
| INPUT_MT_TRACK
|
275 INPUT_MT_DROP_UNUSED
);
277 dev_err(&client
->dev
, "failed to initialize MT slots\n");
281 error
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
282 NULL
, st1232_ts_irq_handler
,
286 dev_err(&client
->dev
, "Failed to register interrupt\n");
290 error
= input_register_device(ts
->input_dev
);
292 dev_err(&client
->dev
, "Unable to register %s input device\n",
297 i2c_set_clientdata(client
, ts
);
302 static int __maybe_unused
st1232_ts_suspend(struct device
*dev
)
304 struct i2c_client
*client
= to_i2c_client(dev
);
305 struct st1232_ts_data
*ts
= i2c_get_clientdata(client
);
307 disable_irq(client
->irq
);
309 if (!device_may_wakeup(&client
->dev
))
310 st1232_ts_power(ts
, false);
315 static int __maybe_unused
st1232_ts_resume(struct device
*dev
)
317 struct i2c_client
*client
= to_i2c_client(dev
);
318 struct st1232_ts_data
*ts
= i2c_get_clientdata(client
);
320 if (!device_may_wakeup(&client
->dev
))
321 st1232_ts_power(ts
, true);
323 enable_irq(client
->irq
);
328 static SIMPLE_DEV_PM_OPS(st1232_ts_pm_ops
,
329 st1232_ts_suspend
, st1232_ts_resume
);
331 static const struct i2c_device_id st1232_ts_id
[] = {
332 { ST1232_TS_NAME
, (unsigned long)&st1232_chip_info
},
333 { ST1633_TS_NAME
, (unsigned long)&st1633_chip_info
},
336 MODULE_DEVICE_TABLE(i2c
, st1232_ts_id
);
338 static const struct of_device_id st1232_ts_dt_ids
[] = {
339 { .compatible
= "sitronix,st1232", .data
= &st1232_chip_info
},
340 { .compatible
= "sitronix,st1633", .data
= &st1633_chip_info
},
343 MODULE_DEVICE_TABLE(of
, st1232_ts_dt_ids
);
345 static struct i2c_driver st1232_ts_driver
= {
346 .probe
= st1232_ts_probe
,
347 .id_table
= st1232_ts_id
,
349 .name
= ST1232_TS_NAME
,
350 .of_match_table
= st1232_ts_dt_ids
,
351 .pm
= &st1232_ts_pm_ops
,
355 module_i2c_driver(st1232_ts_driver
);
357 MODULE_AUTHOR("Tony SIM <chinyeow.sim.xt@renesas.com>");
358 MODULE_AUTHOR("Martin Kepplinger <martin.kepplinger@ginzinger.com>");
359 MODULE_DESCRIPTION("SITRONIX ST1232 Touchscreen Controller Driver");
360 MODULE_LICENSE("GPL v2");