1 // SPDX-License-Identifier: GPL-2.0+
3 * Driver for ChipOne icn8505 i2c touchscreen controller
5 * Copyright (c) 2015-2018 Red Hat Inc.
8 * Hans de Goede <hdegoede@redhat.com>
11 #include <asm/unaligned.h>
12 #include <linux/acpi.h>
13 #include <linux/crc32.h>
14 #include <linux/delay.h>
15 #include <linux/firmware.h>
16 #include <linux/interrupt.h>
17 #include <linux/i2c.h>
18 #include <linux/input.h>
19 #include <linux/input/mt.h>
20 #include <linux/input/touchscreen.h>
21 #include <linux/module.h>
23 /* Normal operation mode defines */
24 #define ICN8505_REG_ADDR_WIDTH 16
26 #define ICN8505_REG_POWER 0x0004
27 #define ICN8505_REG_TOUCHDATA 0x1000
28 #define ICN8505_REG_CONFIGDATA 0x8000
30 /* ICN8505_REG_POWER commands */
31 #define ICN8505_POWER_ACTIVE 0x00
32 #define ICN8505_POWER_MONITOR 0x01
33 #define ICN8505_POWER_HIBERNATE 0x02
35 * The Android driver uses these to turn on/off the charger filter, but the
36 * filter is way too aggressive making e.g. onscreen keyboards unusable.
38 #define ICN8505_POWER_ENA_CHARGER_MODE 0x55
39 #define ICN8505_POWER_DIS_CHARGER_MODE 0x66
41 #define ICN8505_MAX_TOUCHES 10
43 /* Programming mode defines */
44 #define ICN8505_PROG_I2C_ADDR 0x30
45 #define ICN8505_PROG_REG_ADDR_WIDTH 24
47 #define MAX_FW_UPLOAD_TRIES 3
49 struct icn8505_touch
{
53 u8 pressure
; /* Seems more like finger width then pressure really */
55 /* The difference between 2 and 3 is unclear */
56 #define ICN8505_EVENT_NO_DATA 1 /* No finger seen yet since wakeup */
57 #define ICN8505_EVENT_UPDATE1 2 /* New or updated coordinates */
58 #define ICN8505_EVENT_UPDATE2 3 /* New or updated coordinates */
59 #define ICN8505_EVENT_END 4 /* Finger lifted */
62 struct icn8505_touch_data
{
65 struct icn8505_touch touches
[ICN8505_MAX_TOUCHES
];
69 struct i2c_client
*client
;
70 struct input_dev
*input
;
71 struct gpio_desc
*wake_gpio
;
72 struct touchscreen_properties prop
;
73 char firmware_name
[32];
76 static int icn8505_read_xfer(struct i2c_client
*client
, u16 i2c_addr
,
77 int reg_addr
, int reg_addr_width
,
78 void *data
, int len
, bool silent
)
82 struct i2c_msg msg
[2] = {
86 .len
= reg_addr_width
/ 8,
96 for (i
= 0; i
< (reg_addr_width
/ 8); i
++)
97 buf
[i
] = (reg_addr
>> (reg_addr_width
- (i
+ 1) * 8)) & 0xff;
99 ret
= i2c_transfer(client
->adapter
, msg
, 2);
100 if (ret
!= ARRAY_SIZE(msg
)) {
104 dev_err(&client
->dev
,
105 "Error reading addr %#x reg %#x: %d\n",
106 i2c_addr
, reg_addr
, ret
);
113 static int icn8505_write_xfer(struct i2c_client
*client
, u16 i2c_addr
,
114 int reg_addr
, int reg_addr_width
,
115 const void *data
, int len
, bool silent
)
117 u8 buf
[3 + 32]; /* 3 bytes for 24 bit reg-addr + 32 bytes max len */
119 struct i2c_msg msg
= {
122 .len
= reg_addr_width
/ 8 + len
,
125 if (WARN_ON(len
> 32))
128 for (i
= 0; i
< (reg_addr_width
/ 8); i
++)
129 buf
[i
] = (reg_addr
>> (reg_addr_width
- (i
+ 1) * 8)) & 0xff;
131 memcpy(buf
+ reg_addr_width
/ 8, data
, len
);
133 ret
= i2c_transfer(client
->adapter
, &msg
, 1);
138 dev_err(&client
->dev
,
139 "Error writing addr %#x reg %#x: %d\n",
140 i2c_addr
, reg_addr
, ret
);
147 static int icn8505_read_data(struct icn8505_data
*icn8505
, int reg
,
150 return icn8505_read_xfer(icn8505
->client
, icn8505
->client
->addr
, reg
,
151 ICN8505_REG_ADDR_WIDTH
, buf
, len
, false);
154 static int icn8505_read_reg_silent(struct icn8505_data
*icn8505
, int reg
)
159 error
= icn8505_read_xfer(icn8505
->client
, icn8505
->client
->addr
, reg
,
160 ICN8505_REG_ADDR_WIDTH
, &buf
, 1, true);
167 static int icn8505_write_reg(struct icn8505_data
*icn8505
, int reg
, u8 val
)
169 return icn8505_write_xfer(icn8505
->client
, icn8505
->client
->addr
, reg
,
170 ICN8505_REG_ADDR_WIDTH
, &val
, 1, false);
173 static int icn8505_read_prog_data(struct icn8505_data
*icn8505
, int reg
,
176 return icn8505_read_xfer(icn8505
->client
, ICN8505_PROG_I2C_ADDR
, reg
,
177 ICN8505_PROG_REG_ADDR_WIDTH
, buf
, len
, false);
180 static int icn8505_write_prog_data(struct icn8505_data
*icn8505
, int reg
,
181 const void *buf
, int len
)
183 return icn8505_write_xfer(icn8505
->client
, ICN8505_PROG_I2C_ADDR
, reg
,
184 ICN8505_PROG_REG_ADDR_WIDTH
, buf
, len
, false);
187 static int icn8505_write_prog_reg(struct icn8505_data
*icn8505
, int reg
, u8 val
)
189 return icn8505_write_xfer(icn8505
->client
, ICN8505_PROG_I2C_ADDR
, reg
,
190 ICN8505_PROG_REG_ADDR_WIDTH
, &val
, 1, false);
194 * Note this function uses a number of magic register addresses and values,
195 * there are deliberately no defines for these because the algorithm is taken
196 * from the icn85xx Android driver and I do not want to make up possibly wrong
197 * names for the addresses and/or values.
199 static int icn8505_try_fw_upload(struct icn8505_data
*icn8505
,
200 const struct firmware
*fw
)
202 struct device
*dev
= &icn8505
->client
->dev
;
203 size_t offset
, count
;
208 /* Put the controller in programming mode */
209 error
= icn8505_write_prog_reg(icn8505
, 0xcc3355, 0x5a);
213 usleep_range(2000, 5000);
215 error
= icn8505_write_prog_reg(icn8505
, 0x040400, 0x01);
219 usleep_range(2000, 5000);
221 error
= icn8505_read_prog_data(icn8505
, 0x040002, buf
, 1);
225 if (buf
[0] != 0x85) {
226 dev_err(dev
, "Failed to enter programming mode\n");
230 usleep_range(1000, 5000);
232 /* Enable CRC mode */
233 error
= icn8505_write_prog_reg(icn8505
, 0x40028, 1);
237 /* Send the firmware to SRAM */
238 for (offset
= 0; offset
< fw
->size
; offset
+= count
) {
239 count
= min_t(size_t, fw
->size
- offset
, 32);
240 error
= icn8505_write_prog_data(icn8505
, offset
,
241 fw
->data
+ offset
, count
);
246 /* Disable CRC mode */
247 error
= icn8505_write_prog_reg(icn8505
, 0x40028, 0);
251 /* Get and check length and CRC */
252 error
= icn8505_read_prog_data(icn8505
, 0x40034, buf
, 2);
256 if (get_unaligned_le16(buf
) != fw
->size
) {
257 dev_warn(dev
, "Length mismatch after uploading fw\n");
261 error
= icn8505_read_prog_data(icn8505
, 0x4002c, buf
, 4);
265 crc
= crc32_be(0, fw
->data
, fw
->size
);
266 if (get_unaligned_le32(buf
) != crc
) {
267 dev_warn(dev
, "CRC mismatch after uploading fw\n");
271 /* Boot controller from SRAM */
272 error
= icn8505_write_prog_reg(icn8505
, 0x40400, 0x03);
276 usleep_range(2000, 5000);
280 static int icn8505_upload_fw(struct icn8505_data
*icn8505
)
282 struct device
*dev
= &icn8505
->client
->dev
;
283 const struct firmware
*fw
;
287 * Always load the firmware, even if we don't need it at boot, we
288 * we may need it at resume. Having loaded it once will make the
289 * firmware class code cache it at suspend/resume.
291 error
= request_firmware(&fw
, icn8505
->firmware_name
, dev
);
293 dev_err(dev
, "Firmware request error %d\n", error
);
297 /* Check if the controller is not already up and running */
298 if (icn8505_read_reg_silent(icn8505
, 0x000a) == 0x85)
301 for (i
= 1; i
<= MAX_FW_UPLOAD_TRIES
; i
++) {
302 error
= icn8505_try_fw_upload(icn8505
, fw
);
306 dev_err(dev
, "Failed to upload firmware: %d (attempt %d/%d)\n",
307 error
, i
, MAX_FW_UPLOAD_TRIES
);
308 usleep_range(2000, 5000);
312 release_firmware(fw
);
316 static bool icn8505_touch_active(u8 event
)
318 return event
== ICN8505_EVENT_UPDATE1
||
319 event
== ICN8505_EVENT_UPDATE2
;
322 static irqreturn_t
icn8505_irq(int irq
, void *dev_id
)
324 struct icn8505_data
*icn8505
= dev_id
;
325 struct device
*dev
= &icn8505
->client
->dev
;
326 struct icn8505_touch_data touch_data
;
329 error
= icn8505_read_data(icn8505
, ICN8505_REG_TOUCHDATA
,
330 &touch_data
, sizeof(touch_data
));
332 dev_err(dev
, "Error reading touch data: %d\n", error
);
336 if (touch_data
.touch_count
> ICN8505_MAX_TOUCHES
) {
337 dev_warn(dev
, "Too many touches %d > %d\n",
338 touch_data
.touch_count
, ICN8505_MAX_TOUCHES
);
339 touch_data
.touch_count
= ICN8505_MAX_TOUCHES
;
342 for (i
= 0; i
< touch_data
.touch_count
; i
++) {
343 struct icn8505_touch
*touch
= &touch_data
.touches
[i
];
344 bool act
= icn8505_touch_active(touch
->event
);
346 input_mt_slot(icn8505
->input
, touch
->slot
);
347 input_mt_report_slot_state(icn8505
->input
, MT_TOOL_FINGER
, act
);
351 touchscreen_report_pos(icn8505
->input
, &icn8505
->prop
,
352 get_unaligned_le16(touch
->x
),
353 get_unaligned_le16(touch
->y
),
357 input_mt_sync_frame(icn8505
->input
);
358 input_report_key(icn8505
->input
, KEY_LEFTMETA
,
359 touch_data
.softbutton
== 1);
360 input_sync(icn8505
->input
);
365 static int icn8505_probe_acpi(struct icn8505_data
*icn8505
, struct device
*dev
)
367 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
368 const char *subsys
= "unknown";
369 struct acpi_device
*adev
;
370 union acpi_object
*obj
;
373 adev
= ACPI_COMPANION(dev
);
377 status
= acpi_evaluate_object(adev
->handle
, "_SUB", NULL
, &buffer
);
378 if (ACPI_SUCCESS(status
)) {
379 obj
= buffer
.pointer
;
380 if (obj
->type
== ACPI_TYPE_STRING
)
381 subsys
= obj
->string
.pointer
;
383 dev_warn(dev
, "Warning ACPI _SUB did not return a string\n");
385 dev_warn(dev
, "Warning ACPI _SUB failed: %#x\n", status
);
386 buffer
.pointer
= NULL
;
389 snprintf(icn8505
->firmware_name
, sizeof(icn8505
->firmware_name
),
390 "chipone/icn8505-%s.fw", subsys
);
392 kfree(buffer
.pointer
);
396 static int icn8505_probe(struct i2c_client
*client
)
398 struct device
*dev
= &client
->dev
;
399 struct icn8505_data
*icn8505
;
400 struct input_dev
*input
;
401 __le16 resolution
[2];
405 dev_err(dev
, "No irq specified\n");
409 icn8505
= devm_kzalloc(dev
, sizeof(*icn8505
), GFP_KERNEL
);
413 input
= devm_input_allocate_device(dev
);
417 input
->name
= client
->name
;
418 input
->id
.bustype
= BUS_I2C
;
420 input_set_capability(input
, EV_ABS
, ABS_MT_POSITION_X
);
421 input_set_capability(input
, EV_ABS
, ABS_MT_POSITION_Y
);
422 input_set_capability(input
, EV_KEY
, KEY_LEFTMETA
);
424 icn8505
->client
= client
;
425 icn8505
->input
= input
;
426 input_set_drvdata(input
, icn8505
);
428 error
= icn8505_probe_acpi(icn8505
, dev
);
432 error
= icn8505_upload_fw(icn8505
);
436 error
= icn8505_read_data(icn8505
, ICN8505_REG_CONFIGDATA
,
437 resolution
, sizeof(resolution
));
439 dev_err(dev
, "Error reading resolution: %d\n", error
);
443 input_set_abs_params(input
, ABS_MT_POSITION_X
, 0,
444 le16_to_cpu(resolution
[0]) - 1, 0, 0);
445 input_set_abs_params(input
, ABS_MT_POSITION_Y
, 0,
446 le16_to_cpu(resolution
[1]) - 1, 0, 0);
448 touchscreen_parse_properties(input
, true, &icn8505
->prop
);
449 if (!input_abs_get_max(input
, ABS_MT_POSITION_X
) ||
450 !input_abs_get_max(input
, ABS_MT_POSITION_Y
)) {
451 dev_err(dev
, "Error touchscreen-size-x and/or -y missing\n");
455 error
= input_mt_init_slots(input
, ICN8505_MAX_TOUCHES
,
456 INPUT_MT_DIRECT
| INPUT_MT_DROP_UNUSED
);
460 error
= devm_request_threaded_irq(dev
, client
->irq
, NULL
, icn8505_irq
,
461 IRQF_ONESHOT
, client
->name
, icn8505
);
463 dev_err(dev
, "Error requesting irq: %d\n", error
);
467 error
= input_register_device(input
);
471 i2c_set_clientdata(client
, icn8505
);
475 static int __maybe_unused
icn8505_suspend(struct device
*dev
)
477 struct icn8505_data
*icn8505
= i2c_get_clientdata(to_i2c_client(dev
));
479 disable_irq(icn8505
->client
->irq
);
481 icn8505_write_reg(icn8505
, ICN8505_REG_POWER
, ICN8505_POWER_HIBERNATE
);
486 static int __maybe_unused
icn8505_resume(struct device
*dev
)
488 struct icn8505_data
*icn8505
= i2c_get_clientdata(to_i2c_client(dev
));
491 error
= icn8505_upload_fw(icn8505
);
495 enable_irq(icn8505
->client
->irq
);
499 static SIMPLE_DEV_PM_OPS(icn8505_pm_ops
, icn8505_suspend
, icn8505_resume
);
501 static const struct acpi_device_id icn8505_acpi_match
[] = {
505 MODULE_DEVICE_TABLE(acpi
, icn8505_acpi_match
);
507 static struct i2c_driver icn8505_driver
= {
509 .name
= "chipone_icn8505",
510 .pm
= &icn8505_pm_ops
,
511 .acpi_match_table
= icn8505_acpi_match
,
513 .probe_new
= icn8505_probe
,
516 module_i2c_driver(icn8505_driver
);
518 MODULE_DESCRIPTION("ChipOne icn8505 I2C Touchscreen Driver");
519 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
520 MODULE_LICENSE("GPL");