1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Driver for ELAN eKTF2127 i2c touchscreen controller
4 *
5 * For this driver the layout of the Chipone icn8318 i2c
6 * touchscreencontroller is used.
7 *
8 * Author:
9 * Michel Verlaan <michel.verl@gmail.com>
10 * Siebren Vroegindeweij <siebren.vroegindeweij@hotmail.com>
11 *
12 * Original chipone_icn8318 driver:
13 * Hans de Goede <hdegoede@redhat.com>
14 */
15
16 #include <linux/bits.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/interrupt.h>
19 #include <linux/i2c.h>
20 #include <linux/input.h>
21 #include <linux/input/mt.h>
22 #include <linux/input/touchscreen.h>
23 #include <linux/module.h>
24 #include <linux/of.h>
25 #include <linux/delay.h>
26
27 /* Packet header defines (first byte of data send / received) */
28 #define EKTF2127_NOISE 0x40
29 #define EKTF2127_RESPONSE 0x52
30 #define EKTF2127_REQUEST 0x53
31 #define EKTF2127_HELLO 0x55
32 #define EKTF2127_REPORT2 0x5a
33 #define EKTF2127_REPORT 0x5d
34 #define EKTF2127_CALIB_DONE 0x66
35
36 /* Register defines (second byte of data send / received) */
37 #define EKTF2127_ENV_NOISY 0x41
38 #define EKTF2127_HEIGHT 0x60
39 #define EKTF2127_WIDTH 0x63
40
41 /* 2 bytes header + 5 * 3 bytes coordinates + 3 bytes pressure info + footer */
42 #define EKTF2127_TOUCH_REPORT_SIZE 21
43 #define EKTF2127_MAX_TOUCHES 5
44
45 struct ektf2127_ts {
46 struct i2c_client *client;
47 struct input_dev *input;
48 struct gpio_desc *power_gpios;
49 struct touchscreen_properties prop;
50 int status_shift;
51 };
52
53 struct ektf2127_i2c_chip_data {
54 int status_shift;
55 };
56
ektf2127_parse_coordinates(const u8 * buf,unsigned int touch_count,struct input_mt_pos * touches)57 static void ektf2127_parse_coordinates(const u8 *buf, unsigned int touch_count,
58 struct input_mt_pos *touches)
59 {
60 int index = 0;
61 int i;
62
63 for (i = 0; i < touch_count; i++) {
64 index = 2 + i * 3;
65
66 touches[i].x = (buf[index] & 0x0f);
67 touches[i].x <<= 8;
68 touches[i].x |= buf[index + 2];
69
70 touches[i].y = (buf[index] & 0xf0);
71 touches[i].y <<= 4;
72 touches[i].y |= buf[index + 1];
73 }
74 }
75
ektf2127_report_event(struct ektf2127_ts * ts,const u8 * buf)76 static void ektf2127_report_event(struct ektf2127_ts *ts, const u8 *buf)
77 {
78 struct input_mt_pos touches[EKTF2127_MAX_TOUCHES];
79 int slots[EKTF2127_MAX_TOUCHES];
80 unsigned int touch_count, i;
81
82 touch_count = buf[1] & 0x07;
83 if (touch_count > EKTF2127_MAX_TOUCHES) {
84 dev_err(&ts->client->dev,
85 "Too many touches %d > %d\n",
86 touch_count, EKTF2127_MAX_TOUCHES);
87 touch_count = EKTF2127_MAX_TOUCHES;
88 }
89
90 ektf2127_parse_coordinates(buf, touch_count, touches);
91 input_mt_assign_slots(ts->input, slots, touches,
92 touch_count, 0);
93
94 for (i = 0; i < touch_count; i++) {
95 input_mt_slot(ts->input, slots[i]);
96 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, true);
97 touchscreen_report_pos(ts->input, &ts->prop,
98 touches[i].x, touches[i].y, true);
99 }
100
101 input_mt_sync_frame(ts->input);
102 input_sync(ts->input);
103 }
104
ektf2127_report2_contact(struct ektf2127_ts * ts,int slot,const u8 * buf,bool active)105 static void ektf2127_report2_contact(struct ektf2127_ts *ts, int slot,
106 const u8 *buf, bool active)
107 {
108 input_mt_slot(ts->input, slot);
109 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, active);
110
111 if (active) {
112 int x = (buf[0] & 0xf0) << 4 | buf[1];
113 int y = (buf[0] & 0x0f) << 8 | buf[2];
114
115 touchscreen_report_pos(ts->input, &ts->prop, x, y, true);
116 }
117 }
118
ektf2127_report2_event(struct ektf2127_ts * ts,const u8 * buf)119 static void ektf2127_report2_event(struct ektf2127_ts *ts, const u8 *buf)
120 {
121 ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & BIT(ts->status_shift)));
122 ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & BIT(ts->status_shift + 1)));
123
124 input_mt_sync_frame(ts->input);
125 input_sync(ts->input);
126 }
127
ektf2127_irq(int irq,void * dev_id)128 static irqreturn_t ektf2127_irq(int irq, void *dev_id)
129 {
130 struct ektf2127_ts *ts = dev_id;
131 struct device *dev = &ts->client->dev;
132 char buf[EKTF2127_TOUCH_REPORT_SIZE];
133 int ret;
134
135 ret = i2c_master_recv(ts->client, buf, EKTF2127_TOUCH_REPORT_SIZE);
136 if (ret != EKTF2127_TOUCH_REPORT_SIZE) {
137 dev_err(dev, "Error reading touch data: %d\n", ret);
138 goto out;
139 }
140
141 switch (buf[0]) {
142 case EKTF2127_REPORT:
143 ektf2127_report_event(ts, buf);
144 break;
145
146 case EKTF2127_REPORT2:
147 ektf2127_report2_event(ts, buf);
148 break;
149
150 case EKTF2127_NOISE:
151 if (buf[1] == EKTF2127_ENV_NOISY)
152 dev_dbg(dev, "Environment is electrically noisy\n");
153 break;
154
155 case EKTF2127_HELLO:
156 case EKTF2127_CALIB_DONE:
157 break;
158
159 default:
160 dev_err(dev, "Unexpected packet header byte %#02x\n", buf[0]);
161 break;
162 }
163
164 out:
165 return IRQ_HANDLED;
166 }
167
ektf2127_start(struct input_dev * dev)168 static int ektf2127_start(struct input_dev *dev)
169 {
170 struct ektf2127_ts *ts = input_get_drvdata(dev);
171
172 enable_irq(ts->client->irq);
173 gpiod_set_value_cansleep(ts->power_gpios, 1);
174
175 return 0;
176 }
177
ektf2127_stop(struct input_dev * dev)178 static void ektf2127_stop(struct input_dev *dev)
179 {
180 struct ektf2127_ts *ts = input_get_drvdata(dev);
181
182 disable_irq(ts->client->irq);
183 gpiod_set_value_cansleep(ts->power_gpios, 0);
184 }
185
ektf2127_suspend(struct device * dev)186 static int ektf2127_suspend(struct device *dev)
187 {
188 struct ektf2127_ts *ts = i2c_get_clientdata(to_i2c_client(dev));
189
190 mutex_lock(&ts->input->mutex);
191 if (input_device_enabled(ts->input))
192 ektf2127_stop(ts->input);
193 mutex_unlock(&ts->input->mutex);
194
195 return 0;
196 }
197
ektf2127_resume(struct device * dev)198 static int ektf2127_resume(struct device *dev)
199 {
200 struct ektf2127_ts *ts = i2c_get_clientdata(to_i2c_client(dev));
201
202 mutex_lock(&ts->input->mutex);
203 if (input_device_enabled(ts->input))
204 ektf2127_start(ts->input);
205 mutex_unlock(&ts->input->mutex);
206
207 return 0;
208 }
209
210 static DEFINE_SIMPLE_DEV_PM_OPS(ektf2127_pm_ops, ektf2127_suspend,
211 ektf2127_resume);
212
ektf2127_query_dimension(struct i2c_client * client,bool width)213 static int ektf2127_query_dimension(struct i2c_client *client, bool width)
214 {
215 struct device *dev = &client->dev;
216 const char *what = width ? "width" : "height";
217 u8 what_code = width ? EKTF2127_WIDTH : EKTF2127_HEIGHT;
218 u8 buf[4];
219 int ret;
220 int error;
221
222 /* Request dimension */
223 buf[0] = EKTF2127_REQUEST;
224 buf[1] = width ? EKTF2127_WIDTH : EKTF2127_HEIGHT;
225 buf[2] = 0x00;
226 buf[3] = 0x00;
227 ret = i2c_master_send(client, buf, sizeof(buf));
228 if (ret != sizeof(buf)) {
229 error = ret < 0 ? ret : -EIO;
230 dev_err(dev, "Failed to request %s: %d\n", what, error);
231 return error;
232 }
233
234 msleep(20);
235
236 /* Read response */
237 ret = i2c_master_recv(client, buf, sizeof(buf));
238 if (ret != sizeof(buf)) {
239 error = ret < 0 ? ret : -EIO;
240 dev_err(dev, "Failed to receive %s data: %d\n", what, error);
241 return error;
242 }
243
244 if (buf[0] != EKTF2127_RESPONSE || buf[1] != what_code) {
245 dev_err(dev, "Unexpected %s data: %#02x %#02x\n",
246 what, buf[0], buf[1]);
247 return -EIO;
248 }
249
250 return (((buf[3] & 0xf0) << 4) | buf[2]) - 1;
251 }
252
ektf2127_probe(struct i2c_client * client)253 static int ektf2127_probe(struct i2c_client *client)
254 {
255 struct device *dev = &client->dev;
256 const struct ektf2127_i2c_chip_data *chip_data;
257 struct ektf2127_ts *ts;
258 struct input_dev *input;
259 u8 buf[4];
260 int max_x, max_y;
261 int error;
262
263 if (!client->irq) {
264 dev_err(dev, "Error no irq specified\n");
265 return -EINVAL;
266 }
267
268 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
269 if (!ts)
270 return -ENOMEM;
271
272 /* This requests the gpio *and* turns on the touchscreen controller */
273 ts->power_gpios = devm_gpiod_get(dev, "power", GPIOD_OUT_HIGH);
274 if (IS_ERR(ts->power_gpios))
275 return dev_err_probe(dev, PTR_ERR(ts->power_gpios), "Error getting power gpio\n");
276
277 input = devm_input_allocate_device(dev);
278 if (!input)
279 return -ENOMEM;
280
281 input->name = client->name;
282 input->id.bustype = BUS_I2C;
283 input->open = ektf2127_start;
284 input->close = ektf2127_stop;
285
286 ts->client = client;
287
288 /* Read hello (ignore result, depends on initial power state) */
289 msleep(20);
290 i2c_master_recv(ts->client, buf, sizeof(buf));
291
292 /* Read resolution from chip */
293 max_x = ektf2127_query_dimension(client, true);
294 if (max_x < 0)
295 return max_x;
296
297 max_y = ektf2127_query_dimension(client, false);
298 if (max_y < 0)
299 return max_y;
300
301 input_set_abs_params(input, ABS_MT_POSITION_X, 0, max_x, 0, 0);
302 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, max_y, 0, 0);
303 touchscreen_parse_properties(input, true, &ts->prop);
304
305 error = input_mt_init_slots(input, EKTF2127_MAX_TOUCHES,
306 INPUT_MT_DIRECT |
307 INPUT_MT_DROP_UNUSED |
308 INPUT_MT_TRACK);
309 if (error)
310 return error;
311
312 ts->input = input;
313
314 chip_data = i2c_get_match_data(client);
315 if (!chip_data)
316 return dev_err_probe(&client->dev, -EINVAL, "missing chip data\n");
317
318 ts->status_shift = chip_data->status_shift;
319
320 input_set_drvdata(input, ts);
321
322 error = devm_request_threaded_irq(dev, client->irq,
323 NULL, ektf2127_irq,
324 IRQF_ONESHOT, client->name, ts);
325 if (error) {
326 dev_err(dev, "Error requesting irq: %d\n", error);
327 return error;
328 }
329
330 /* Stop device till opened */
331 ektf2127_stop(ts->input);
332
333 error = input_register_device(input);
334 if (error)
335 return error;
336
337 i2c_set_clientdata(client, ts);
338
339 return 0;
340 }
341
342 static const struct ektf2127_i2c_chip_data ektf2127_data = {
343 .status_shift = 1,
344 };
345
346 static const struct ektf2127_i2c_chip_data ektf2232_data = {
347 .status_shift = 0,
348 };
349
350 #ifdef CONFIG_OF
351 static const struct of_device_id ektf2127_of_match[] = {
352 { .compatible = "elan,ektf2127", .data = &ektf2127_data},
353 { .compatible = "elan,ektf2132", .data = &ektf2127_data},
354 { .compatible = "elan,ektf2232", .data = &ektf2232_data},
355 {}
356 };
357 MODULE_DEVICE_TABLE(of, ektf2127_of_match);
358 #endif
359
360 static const struct i2c_device_id ektf2127_i2c_id[] = {
361 { .name = "ektf2127", .driver_data = (long)&ektf2127_data },
362 { .name = "ektf2132", .driver_data = (long)&ektf2127_data },
363 { .name = "ektf2232", .driver_data = (long)&ektf2232_data },
364 {}
365 };
366 MODULE_DEVICE_TABLE(i2c, ektf2127_i2c_id);
367
368 static struct i2c_driver ektf2127_driver = {
369 .driver = {
370 .name = "elan_ektf2127",
371 .pm = pm_sleep_ptr(&ektf2127_pm_ops),
372 .of_match_table = of_match_ptr(ektf2127_of_match),
373 },
374 .probe = ektf2127_probe,
375 .id_table = ektf2127_i2c_id,
376 };
377 module_i2c_driver(ektf2127_driver);
378
379 MODULE_DESCRIPTION("ELAN eKTF2127/eKTF2132 I2C Touchscreen Driver");
380 MODULE_AUTHOR("Michel Verlaan, Siebren Vroegindeweij");
381 MODULE_LICENSE("GPL");
382