xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/elants_i2c.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Elan Microelectronics touch panels with I2C interface
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Elan Microelectronics Corporation.
6*4882a593Smuzhiyun  * Scott Liu <scott.liu@emc.com.tw>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * This code is partly based on hid-multitouch.c:
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *  Copyright (c) 2010-2012 Stephane Chatty <chatty@enac.fr>
11*4882a593Smuzhiyun  *  Copyright (c) 2010-2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
12*4882a593Smuzhiyun  *  Copyright (c) 2010-2012 Ecole Nationale de l'Aviation Civile, France
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * This code is partly based on i2c-hid.c:
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * Copyright (c) 2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
17*4882a593Smuzhiyun  * Copyright (c) 2012 Ecole Nationale de l'Aviation Civile, France
18*4882a593Smuzhiyun  * Copyright (c) 2012 Red Hat, Inc
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include <linux/bits.h>
23*4882a593Smuzhiyun #include <linux/module.h>
24*4882a593Smuzhiyun #include <linux/input.h>
25*4882a593Smuzhiyun #include <linux/interrupt.h>
26*4882a593Smuzhiyun #include <linux/irq.h>
27*4882a593Smuzhiyun #include <linux/platform_device.h>
28*4882a593Smuzhiyun #include <linux/async.h>
29*4882a593Smuzhiyun #include <linux/i2c.h>
30*4882a593Smuzhiyun #include <linux/delay.h>
31*4882a593Smuzhiyun #include <linux/uaccess.h>
32*4882a593Smuzhiyun #include <linux/buffer_head.h>
33*4882a593Smuzhiyun #include <linux/slab.h>
34*4882a593Smuzhiyun #include <linux/firmware.h>
35*4882a593Smuzhiyun #include <linux/input/mt.h>
36*4882a593Smuzhiyun #include <linux/input/touchscreen.h>
37*4882a593Smuzhiyun #include <linux/acpi.h>
38*4882a593Smuzhiyun #include <linux/of.h>
39*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
40*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
41*4882a593Smuzhiyun #include <linux/uuid.h>
42*4882a593Smuzhiyun #include <asm/unaligned.h>
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* Device, Driver information */
45*4882a593Smuzhiyun #define DEVICE_NAME	"elants_i2c"
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Convert from rows or columns into resolution */
48*4882a593Smuzhiyun #define ELAN_TS_RESOLUTION(n, m)   (((n) - 1) * (m))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /* FW header data */
51*4882a593Smuzhiyun #define HEADER_SIZE		4
52*4882a593Smuzhiyun #define FW_HDR_TYPE		0
53*4882a593Smuzhiyun #define FW_HDR_COUNT		1
54*4882a593Smuzhiyun #define FW_HDR_LENGTH		2
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* Buffer mode Queue Header information */
57*4882a593Smuzhiyun #define QUEUE_HEADER_SINGLE	0x62
58*4882a593Smuzhiyun #define QUEUE_HEADER_NORMAL	0X63
59*4882a593Smuzhiyun #define QUEUE_HEADER_WAIT	0x64
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* Command header definition */
62*4882a593Smuzhiyun #define CMD_HEADER_WRITE	0x54
63*4882a593Smuzhiyun #define CMD_HEADER_READ		0x53
64*4882a593Smuzhiyun #define CMD_HEADER_6B_READ	0x5B
65*4882a593Smuzhiyun #define CMD_HEADER_ROM_READ	0x96
66*4882a593Smuzhiyun #define CMD_HEADER_RESP		0x52
67*4882a593Smuzhiyun #define CMD_HEADER_6B_RESP	0x9B
68*4882a593Smuzhiyun #define CMD_HEADER_ROM_RESP	0x95
69*4882a593Smuzhiyun #define CMD_HEADER_HELLO	0x55
70*4882a593Smuzhiyun #define CMD_HEADER_REK		0x66
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* FW position data */
73*4882a593Smuzhiyun #define PACKET_SIZE		55
74*4882a593Smuzhiyun #define MAX_CONTACT_NUM		10
75*4882a593Smuzhiyun #define FW_POS_HEADER		0
76*4882a593Smuzhiyun #define FW_POS_STATE		1
77*4882a593Smuzhiyun #define FW_POS_TOTAL		2
78*4882a593Smuzhiyun #define FW_POS_XY		3
79*4882a593Smuzhiyun #define FW_POS_TOOL_TYPE	33
80*4882a593Smuzhiyun #define FW_POS_CHECKSUM		34
81*4882a593Smuzhiyun #define FW_POS_WIDTH		35
82*4882a593Smuzhiyun #define FW_POS_PRESSURE		45
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define HEADER_REPORT_10_FINGER	0x62
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* Header (4 bytes) plus 3 fill 10-finger packets */
87*4882a593Smuzhiyun #define MAX_PACKET_SIZE		169
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define BOOT_TIME_DELAY_MS	50
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* FW read command, 0x53 0x?? 0x0, 0x01 */
92*4882a593Smuzhiyun #define E_ELAN_INFO_FW_VER	0x00
93*4882a593Smuzhiyun #define E_ELAN_INFO_BC_VER	0x10
94*4882a593Smuzhiyun #define E_ELAN_INFO_REK		0xD0
95*4882a593Smuzhiyun #define E_ELAN_INFO_TEST_VER	0xE0
96*4882a593Smuzhiyun #define E_ELAN_INFO_FW_ID	0xF0
97*4882a593Smuzhiyun #define E_INFO_OSR		0xD6
98*4882a593Smuzhiyun #define E_INFO_PHY_SCAN		0xD7
99*4882a593Smuzhiyun #define E_INFO_PHY_DRIVER	0xD8
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define MAX_RETRIES		3
102*4882a593Smuzhiyun #define MAX_FW_UPDATE_RETRIES	30
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define ELAN_FW_PAGESIZE	132
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* calibration timeout definition */
107*4882a593Smuzhiyun #define ELAN_CALI_TIMEOUT_MSEC	12000
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define ELAN_POWERON_DELAY_USEC	500
110*4882a593Smuzhiyun #define ELAN_RESET_DELAY_MSEC	20
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* FW boot code version */
113*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH3900x1_I2C        0x72
114*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH3900x2_I2C        0x82
115*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH3900x3_I2C        0x92
116*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312x1_I2C        0x6D
117*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312x2_I2C        0x6E
118*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312cx1_I2C       0x77
119*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312cx2_I2C       0x78
120*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312x1_I2C_USB    0x67
121*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312x2_I2C_USB    0x68
122*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312cx1_I2C_USB   0x74
123*4882a593Smuzhiyun #define BC_VER_H_BYTE_FOR_EKTH5312cx2_I2C_USB   0x75
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun enum elants_state {
126*4882a593Smuzhiyun 	ELAN_STATE_NORMAL,
127*4882a593Smuzhiyun 	ELAN_WAIT_QUEUE_HEADER,
128*4882a593Smuzhiyun 	ELAN_WAIT_RECALIBRATION,
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun enum elants_iap_mode {
132*4882a593Smuzhiyun 	ELAN_IAP_OPERATIONAL,
133*4882a593Smuzhiyun 	ELAN_IAP_RECOVERY,
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /* struct elants_data - represents state of Elan touchscreen device */
137*4882a593Smuzhiyun struct elants_data {
138*4882a593Smuzhiyun 	struct i2c_client *client;
139*4882a593Smuzhiyun 	struct input_dev *input;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	struct regulator *vcc33;
142*4882a593Smuzhiyun 	struct regulator *vccio;
143*4882a593Smuzhiyun 	struct gpio_desc *reset_gpio;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	u16 fw_version;
146*4882a593Smuzhiyun 	u8 test_version;
147*4882a593Smuzhiyun 	u8 solution_version;
148*4882a593Smuzhiyun 	u8 bc_version;
149*4882a593Smuzhiyun 	u8 iap_version;
150*4882a593Smuzhiyun 	u16 hw_version;
151*4882a593Smuzhiyun 	u8 major_res;
152*4882a593Smuzhiyun 	unsigned int x_res;	/* resolution in units/mm */
153*4882a593Smuzhiyun 	unsigned int y_res;
154*4882a593Smuzhiyun 	unsigned int x_max;
155*4882a593Smuzhiyun 	unsigned int y_max;
156*4882a593Smuzhiyun 	struct touchscreen_properties prop;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	enum elants_state state;
159*4882a593Smuzhiyun 	enum elants_iap_mode iap_mode;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	/* Guards against concurrent access to the device via sysfs */
162*4882a593Smuzhiyun 	struct mutex sysfs_mutex;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	u8 cmd_resp[HEADER_SIZE];
165*4882a593Smuzhiyun 	struct completion cmd_done;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	bool wake_irq_enabled;
168*4882a593Smuzhiyun 	bool keep_power_in_suspend;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	/* Must be last to be used for DMA operations */
171*4882a593Smuzhiyun 	u8 buf[MAX_PACKET_SIZE] ____cacheline_aligned;
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun 
elants_i2c_send(struct i2c_client * client,const void * data,size_t size)174*4882a593Smuzhiyun static int elants_i2c_send(struct i2c_client *client,
175*4882a593Smuzhiyun 			   const void *data, size_t size)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun 	int ret;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	ret = i2c_master_send(client, data, size);
180*4882a593Smuzhiyun 	if (ret == size)
181*4882a593Smuzhiyun 		return 0;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	if (ret >= 0)
184*4882a593Smuzhiyun 		ret = -EIO;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	dev_err(&client->dev, "%s failed (%*ph): %d\n",
187*4882a593Smuzhiyun 		__func__, (int)size, data, ret);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	return ret;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
elants_i2c_read(struct i2c_client * client,void * data,size_t size)192*4882a593Smuzhiyun static int elants_i2c_read(struct i2c_client *client, void *data, size_t size)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	int ret;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	ret = i2c_master_recv(client, data, size);
197*4882a593Smuzhiyun 	if (ret == size)
198*4882a593Smuzhiyun 		return 0;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	if (ret >= 0)
201*4882a593Smuzhiyun 		ret = -EIO;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	dev_err(&client->dev, "%s failed: %d\n", __func__, ret);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	return ret;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
elants_i2c_execute_command(struct i2c_client * client,const u8 * cmd,size_t cmd_size,u8 * resp,size_t resp_size,int retries,const char * cmd_name)208*4882a593Smuzhiyun static int elants_i2c_execute_command(struct i2c_client *client,
209*4882a593Smuzhiyun 				      const u8 *cmd, size_t cmd_size,
210*4882a593Smuzhiyun 				      u8 *resp, size_t resp_size,
211*4882a593Smuzhiyun 				      int retries, const char *cmd_name)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun 	struct i2c_msg msgs[2];
214*4882a593Smuzhiyun 	int ret;
215*4882a593Smuzhiyun 	u8 expected_response;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	switch (cmd[0]) {
218*4882a593Smuzhiyun 	case CMD_HEADER_READ:
219*4882a593Smuzhiyun 		expected_response = CMD_HEADER_RESP;
220*4882a593Smuzhiyun 		break;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	case CMD_HEADER_6B_READ:
223*4882a593Smuzhiyun 		expected_response = CMD_HEADER_6B_RESP;
224*4882a593Smuzhiyun 		break;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	case CMD_HEADER_ROM_READ:
227*4882a593Smuzhiyun 		expected_response = CMD_HEADER_ROM_RESP;
228*4882a593Smuzhiyun 		break;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	default:
231*4882a593Smuzhiyun 		dev_err(&client->dev, "(%s): invalid command: %*ph\n",
232*4882a593Smuzhiyun 			cmd_name, (int)cmd_size, cmd);
233*4882a593Smuzhiyun 		return -EINVAL;
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	for (;;) {
237*4882a593Smuzhiyun 		msgs[0].addr = client->addr;
238*4882a593Smuzhiyun 		msgs[0].flags = client->flags & I2C_M_TEN;
239*4882a593Smuzhiyun 		msgs[0].len = cmd_size;
240*4882a593Smuzhiyun 		msgs[0].buf = (u8 *)cmd;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 		msgs[1].addr = client->addr;
243*4882a593Smuzhiyun 		msgs[1].flags = (client->flags & I2C_M_TEN) | I2C_M_RD;
244*4882a593Smuzhiyun 		msgs[1].flags |= I2C_M_RD;
245*4882a593Smuzhiyun 		msgs[1].len = resp_size;
246*4882a593Smuzhiyun 		msgs[1].buf = resp;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 		ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
249*4882a593Smuzhiyun 		if (ret < 0) {
250*4882a593Smuzhiyun 			if (--retries > 0) {
251*4882a593Smuzhiyun 				dev_dbg(&client->dev,
252*4882a593Smuzhiyun 					"(%s) I2C transfer failed: %pe (retrying)\n",
253*4882a593Smuzhiyun 					cmd_name, ERR_PTR(ret));
254*4882a593Smuzhiyun 				continue;
255*4882a593Smuzhiyun 			}
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 			dev_err(&client->dev,
258*4882a593Smuzhiyun 				"(%s) I2C transfer failed: %pe\n",
259*4882a593Smuzhiyun 				cmd_name, ERR_PTR(ret));
260*4882a593Smuzhiyun 			return ret;
261*4882a593Smuzhiyun 		}
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 		if (ret != ARRAY_SIZE(msgs) ||
264*4882a593Smuzhiyun 		    resp[FW_HDR_TYPE] != expected_response) {
265*4882a593Smuzhiyun 			if (--retries > 0) {
266*4882a593Smuzhiyun 				dev_dbg(&client->dev,
267*4882a593Smuzhiyun 					"(%s) unexpected response: %*ph (retrying)\n",
268*4882a593Smuzhiyun 					cmd_name, ret, resp);
269*4882a593Smuzhiyun 				continue;
270*4882a593Smuzhiyun 			}
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 			dev_err(&client->dev,
273*4882a593Smuzhiyun 				"(%s) unexpected response: %*ph\n",
274*4882a593Smuzhiyun 				cmd_name, ret, resp);
275*4882a593Smuzhiyun 			return -EIO;
276*4882a593Smuzhiyun 		}
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 		return 0;
279*4882a593Smuzhiyun 	}
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun 
elants_i2c_calibrate(struct elants_data * ts)282*4882a593Smuzhiyun static int elants_i2c_calibrate(struct elants_data *ts)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
285*4882a593Smuzhiyun 	int ret, error;
286*4882a593Smuzhiyun 	static const u8 w_flashkey[] = { 0x54, 0xC0, 0xE1, 0x5A };
287*4882a593Smuzhiyun 	static const u8 rek[] = { 0x54, 0x29, 0x00, 0x01 };
288*4882a593Smuzhiyun 	static const u8 rek_resp[] = { CMD_HEADER_REK, 0x66, 0x66, 0x66 };
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	disable_irq(client->irq);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	ts->state = ELAN_WAIT_RECALIBRATION;
293*4882a593Smuzhiyun 	reinit_completion(&ts->cmd_done);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	elants_i2c_send(client, w_flashkey, sizeof(w_flashkey));
296*4882a593Smuzhiyun 	elants_i2c_send(client, rek, sizeof(rek));
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	enable_irq(client->irq);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	ret = wait_for_completion_interruptible_timeout(&ts->cmd_done,
301*4882a593Smuzhiyun 				msecs_to_jiffies(ELAN_CALI_TIMEOUT_MSEC));
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	ts->state = ELAN_STATE_NORMAL;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	if (ret <= 0) {
306*4882a593Smuzhiyun 		error = ret < 0 ? ret : -ETIMEDOUT;
307*4882a593Smuzhiyun 		dev_err(&client->dev,
308*4882a593Smuzhiyun 			"error while waiting for calibration to complete: %d\n",
309*4882a593Smuzhiyun 			error);
310*4882a593Smuzhiyun 		return error;
311*4882a593Smuzhiyun 	}
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	if (memcmp(rek_resp, ts->cmd_resp, sizeof(rek_resp))) {
314*4882a593Smuzhiyun 		dev_err(&client->dev,
315*4882a593Smuzhiyun 			"unexpected calibration response: %*ph\n",
316*4882a593Smuzhiyun 			(int)sizeof(ts->cmd_resp), ts->cmd_resp);
317*4882a593Smuzhiyun 		return -EINVAL;
318*4882a593Smuzhiyun 	}
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	return 0;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun 
elants_i2c_sw_reset(struct i2c_client * client)323*4882a593Smuzhiyun static int elants_i2c_sw_reset(struct i2c_client *client)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun 	const u8 soft_rst_cmd[] = { 0x77, 0x77, 0x77, 0x77 };
326*4882a593Smuzhiyun 	int error;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	error = elants_i2c_send(client, soft_rst_cmd,
329*4882a593Smuzhiyun 				sizeof(soft_rst_cmd));
330*4882a593Smuzhiyun 	if (error) {
331*4882a593Smuzhiyun 		dev_err(&client->dev, "software reset failed: %d\n", error);
332*4882a593Smuzhiyun 		return error;
333*4882a593Smuzhiyun 	}
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	/*
336*4882a593Smuzhiyun 	 * We should wait at least 10 msec (but no more than 40) before
337*4882a593Smuzhiyun 	 * sending fastboot or IAP command to the device.
338*4882a593Smuzhiyun 	 */
339*4882a593Smuzhiyun 	msleep(30);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	return 0;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
elants_i2c_parse_version(u8 * buf)344*4882a593Smuzhiyun static u16 elants_i2c_parse_version(u8 *buf)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 	return get_unaligned_be32(buf) >> 4;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
elants_i2c_query_hw_version(struct elants_data * ts)349*4882a593Smuzhiyun static int elants_i2c_query_hw_version(struct elants_data *ts)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
352*4882a593Smuzhiyun 	int retry_cnt = MAX_RETRIES;
353*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_FW_ID, 0x00, 0x01 };
354*4882a593Smuzhiyun 	u8 resp[HEADER_SIZE];
355*4882a593Smuzhiyun 	int error;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	while (retry_cnt--) {
358*4882a593Smuzhiyun 		error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
359*4882a593Smuzhiyun 						   resp, sizeof(resp), 1,
360*4882a593Smuzhiyun 						   "read fw id");
361*4882a593Smuzhiyun 		if (error)
362*4882a593Smuzhiyun 			return error;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 		ts->hw_version = elants_i2c_parse_version(resp);
365*4882a593Smuzhiyun 		if (ts->hw_version != 0xffff)
366*4882a593Smuzhiyun 			return 0;
367*4882a593Smuzhiyun 	}
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	dev_err(&client->dev, "Invalid fw id: %#04x\n", ts->hw_version);
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	return -EINVAL;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun 
elants_i2c_query_fw_version(struct elants_data * ts)374*4882a593Smuzhiyun static int elants_i2c_query_fw_version(struct elants_data *ts)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
377*4882a593Smuzhiyun 	int retry_cnt = MAX_RETRIES;
378*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_FW_VER, 0x00, 0x01 };
379*4882a593Smuzhiyun 	u8 resp[HEADER_SIZE];
380*4882a593Smuzhiyun 	int error;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	while (retry_cnt--) {
383*4882a593Smuzhiyun 		error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
384*4882a593Smuzhiyun 						   resp, sizeof(resp), 1,
385*4882a593Smuzhiyun 						   "read fw version");
386*4882a593Smuzhiyun 		if (error)
387*4882a593Smuzhiyun 			return error;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 		ts->fw_version = elants_i2c_parse_version(resp);
390*4882a593Smuzhiyun 		if (ts->fw_version != 0x0000 && ts->fw_version != 0xffff)
391*4882a593Smuzhiyun 			return 0;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 		dev_dbg(&client->dev, "(read fw version) resp %*phC\n",
394*4882a593Smuzhiyun 			(int)sizeof(resp), resp);
395*4882a593Smuzhiyun 	}
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	dev_err(&client->dev, "Invalid fw ver: %#04x\n", ts->fw_version);
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	return -EINVAL;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun 
elants_i2c_query_test_version(struct elants_data * ts)402*4882a593Smuzhiyun static int elants_i2c_query_test_version(struct elants_data *ts)
403*4882a593Smuzhiyun {
404*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
405*4882a593Smuzhiyun 	int error;
406*4882a593Smuzhiyun 	u16 version;
407*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_TEST_VER, 0x00, 0x01 };
408*4882a593Smuzhiyun 	u8 resp[HEADER_SIZE];
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
411*4882a593Smuzhiyun 					   resp, sizeof(resp), MAX_RETRIES,
412*4882a593Smuzhiyun 					   "read test version");
413*4882a593Smuzhiyun 	if (error) {
414*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to read test version\n");
415*4882a593Smuzhiyun 		return error;
416*4882a593Smuzhiyun 	}
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	version = elants_i2c_parse_version(resp);
419*4882a593Smuzhiyun 	ts->test_version = version >> 8;
420*4882a593Smuzhiyun 	ts->solution_version = version & 0xff;
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	return 0;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun 
elants_i2c_query_bc_version(struct elants_data * ts)425*4882a593Smuzhiyun static int elants_i2c_query_bc_version(struct elants_data *ts)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
428*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_BC_VER, 0x00, 0x01 };
429*4882a593Smuzhiyun 	u8 resp[HEADER_SIZE];
430*4882a593Smuzhiyun 	u16 version;
431*4882a593Smuzhiyun 	int error;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
434*4882a593Smuzhiyun 					   resp, sizeof(resp), 1,
435*4882a593Smuzhiyun 					   "read BC version");
436*4882a593Smuzhiyun 	if (error)
437*4882a593Smuzhiyun 		return error;
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	version = elants_i2c_parse_version(resp);
440*4882a593Smuzhiyun 	ts->bc_version = version >> 8;
441*4882a593Smuzhiyun 	ts->iap_version = version & 0xff;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	return 0;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun 
elants_i2c_query_ts_info(struct elants_data * ts)446*4882a593Smuzhiyun static int elants_i2c_query_ts_info(struct elants_data *ts)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
449*4882a593Smuzhiyun 	int error;
450*4882a593Smuzhiyun 	u8 resp[17];
451*4882a593Smuzhiyun 	u16 phy_x, phy_y, rows, cols, osr;
452*4882a593Smuzhiyun 	const u8 get_resolution_cmd[] = {
453*4882a593Smuzhiyun 		CMD_HEADER_6B_READ, 0x00, 0x00, 0x00, 0x00, 0x00
454*4882a593Smuzhiyun 	};
455*4882a593Smuzhiyun 	const u8 get_osr_cmd[] = {
456*4882a593Smuzhiyun 		CMD_HEADER_READ, E_INFO_OSR, 0x00, 0x01
457*4882a593Smuzhiyun 	};
458*4882a593Smuzhiyun 	const u8 get_physical_scan_cmd[] = {
459*4882a593Smuzhiyun 		CMD_HEADER_READ, E_INFO_PHY_SCAN, 0x00, 0x01
460*4882a593Smuzhiyun 	};
461*4882a593Smuzhiyun 	const u8 get_physical_drive_cmd[] = {
462*4882a593Smuzhiyun 		CMD_HEADER_READ, E_INFO_PHY_DRIVER, 0x00, 0x01
463*4882a593Smuzhiyun 	};
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	/* Get trace number */
466*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client,
467*4882a593Smuzhiyun 					   get_resolution_cmd,
468*4882a593Smuzhiyun 					   sizeof(get_resolution_cmd),
469*4882a593Smuzhiyun 					   resp, sizeof(resp), 1,
470*4882a593Smuzhiyun 					   "get resolution");
471*4882a593Smuzhiyun 	if (error)
472*4882a593Smuzhiyun 		return error;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	rows = resp[2] + resp[6] + resp[10];
475*4882a593Smuzhiyun 	cols = resp[3] + resp[7] + resp[11];
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	/* Get report resolution value of ABS_MT_TOUCH_MAJOR */
478*4882a593Smuzhiyun 	ts->major_res = resp[16];
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	/* Process mm_to_pixel information */
481*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client,
482*4882a593Smuzhiyun 					   get_osr_cmd, sizeof(get_osr_cmd),
483*4882a593Smuzhiyun 					   resp, sizeof(resp), 1, "get osr");
484*4882a593Smuzhiyun 	if (error)
485*4882a593Smuzhiyun 		return error;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	osr = resp[3];
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client,
490*4882a593Smuzhiyun 					   get_physical_scan_cmd,
491*4882a593Smuzhiyun 					   sizeof(get_physical_scan_cmd),
492*4882a593Smuzhiyun 					   resp, sizeof(resp), 1,
493*4882a593Smuzhiyun 					   "get physical scan");
494*4882a593Smuzhiyun 	if (error)
495*4882a593Smuzhiyun 		return error;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	phy_x = get_unaligned_be16(&resp[2]);
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client,
500*4882a593Smuzhiyun 					   get_physical_drive_cmd,
501*4882a593Smuzhiyun 					   sizeof(get_physical_drive_cmd),
502*4882a593Smuzhiyun 					   resp, sizeof(resp), 1,
503*4882a593Smuzhiyun 					   "get physical drive");
504*4882a593Smuzhiyun 	if (error)
505*4882a593Smuzhiyun 		return error;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	phy_y = get_unaligned_be16(&resp[2]);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	dev_dbg(&client->dev, "phy_x=%d, phy_y=%d\n", phy_x, phy_y);
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	if (rows == 0 || cols == 0 || osr == 0) {
512*4882a593Smuzhiyun 		dev_warn(&client->dev,
513*4882a593Smuzhiyun 			 "invalid trace number data: %d, %d, %d\n",
514*4882a593Smuzhiyun 			 rows, cols, osr);
515*4882a593Smuzhiyun 	} else {
516*4882a593Smuzhiyun 		/* translate trace number to TS resolution */
517*4882a593Smuzhiyun 		ts->x_max = ELAN_TS_RESOLUTION(rows, osr);
518*4882a593Smuzhiyun 		ts->x_res = DIV_ROUND_CLOSEST(ts->x_max, phy_x);
519*4882a593Smuzhiyun 		ts->y_max = ELAN_TS_RESOLUTION(cols, osr);
520*4882a593Smuzhiyun 		ts->y_res = DIV_ROUND_CLOSEST(ts->y_max, phy_y);
521*4882a593Smuzhiyun 	}
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	return 0;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
elants_i2c_fastboot(struct i2c_client * client)526*4882a593Smuzhiyun static int elants_i2c_fastboot(struct i2c_client *client)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun 	const u8 boot_cmd[] = { 0x4D, 0x61, 0x69, 0x6E };
529*4882a593Smuzhiyun 	int error;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	error = elants_i2c_send(client, boot_cmd, sizeof(boot_cmd));
532*4882a593Smuzhiyun 	if (error) {
533*4882a593Smuzhiyun 		dev_err(&client->dev, "boot failed: %d\n", error);
534*4882a593Smuzhiyun 		return error;
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	dev_dbg(&client->dev, "boot success -- 0x%x\n", client->addr);
538*4882a593Smuzhiyun 	return 0;
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun 
elants_i2c_initialize(struct elants_data * ts)541*4882a593Smuzhiyun static int elants_i2c_initialize(struct elants_data *ts)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
544*4882a593Smuzhiyun 	int error, error2, retry_cnt;
545*4882a593Smuzhiyun 	const u8 hello_packet[] = { 0x55, 0x55, 0x55, 0x55 };
546*4882a593Smuzhiyun 	const u8 recov_packet[] = { 0x55, 0x55, 0x80, 0x80 };
547*4882a593Smuzhiyun 	u8 buf[HEADER_SIZE];
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
550*4882a593Smuzhiyun 		error = elants_i2c_sw_reset(client);
551*4882a593Smuzhiyun 		if (error) {
552*4882a593Smuzhiyun 			/* Continue initializing if it's the last try */
553*4882a593Smuzhiyun 			if (retry_cnt < MAX_RETRIES - 1)
554*4882a593Smuzhiyun 				continue;
555*4882a593Smuzhiyun 		}
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 		error = elants_i2c_fastboot(client);
558*4882a593Smuzhiyun 		if (error) {
559*4882a593Smuzhiyun 			/* Continue initializing if it's the last try */
560*4882a593Smuzhiyun 			if (retry_cnt < MAX_RETRIES - 1)
561*4882a593Smuzhiyun 				continue;
562*4882a593Smuzhiyun 		}
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 		/* Wait for Hello packet */
565*4882a593Smuzhiyun 		msleep(BOOT_TIME_DELAY_MS);
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 		error = elants_i2c_read(client, buf, sizeof(buf));
568*4882a593Smuzhiyun 		if (error) {
569*4882a593Smuzhiyun 			dev_err(&client->dev,
570*4882a593Smuzhiyun 				"failed to read 'hello' packet: %d\n", error);
571*4882a593Smuzhiyun 		} else if (!memcmp(buf, hello_packet, sizeof(hello_packet))) {
572*4882a593Smuzhiyun 			ts->iap_mode = ELAN_IAP_OPERATIONAL;
573*4882a593Smuzhiyun 			break;
574*4882a593Smuzhiyun 		} else if (!memcmp(buf, recov_packet, sizeof(recov_packet))) {
575*4882a593Smuzhiyun 			/*
576*4882a593Smuzhiyun 			 * Setting error code will mark device
577*4882a593Smuzhiyun 			 * in recovery mode below.
578*4882a593Smuzhiyun 			 */
579*4882a593Smuzhiyun 			error = -EIO;
580*4882a593Smuzhiyun 			break;
581*4882a593Smuzhiyun 		} else {
582*4882a593Smuzhiyun 			error = -EINVAL;
583*4882a593Smuzhiyun 			dev_err(&client->dev,
584*4882a593Smuzhiyun 				"invalid 'hello' packet: %*ph\n",
585*4882a593Smuzhiyun 				(int)sizeof(buf), buf);
586*4882a593Smuzhiyun 		}
587*4882a593Smuzhiyun 	}
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	/* hw version is available even if device in recovery state */
590*4882a593Smuzhiyun 	error2 = elants_i2c_query_hw_version(ts);
591*4882a593Smuzhiyun 	if (!error2)
592*4882a593Smuzhiyun 		error2 = elants_i2c_query_bc_version(ts);
593*4882a593Smuzhiyun 	if (!error)
594*4882a593Smuzhiyun 		error = error2;
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 	if (!error)
597*4882a593Smuzhiyun 		error = elants_i2c_query_fw_version(ts);
598*4882a593Smuzhiyun 	if (!error)
599*4882a593Smuzhiyun 		error = elants_i2c_query_test_version(ts);
600*4882a593Smuzhiyun 	if (!error)
601*4882a593Smuzhiyun 		error = elants_i2c_query_ts_info(ts);
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	if (error)
604*4882a593Smuzhiyun 		ts->iap_mode = ELAN_IAP_RECOVERY;
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun 	return 0;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun /*
610*4882a593Smuzhiyun  * Firmware update interface.
611*4882a593Smuzhiyun  */
612*4882a593Smuzhiyun 
elants_i2c_fw_write_page(struct i2c_client * client,const void * page)613*4882a593Smuzhiyun static int elants_i2c_fw_write_page(struct i2c_client *client,
614*4882a593Smuzhiyun 				    const void *page)
615*4882a593Smuzhiyun {
616*4882a593Smuzhiyun 	const u8 ack_ok[] = { 0xaa, 0xaa };
617*4882a593Smuzhiyun 	u8 buf[2];
618*4882a593Smuzhiyun 	int retry;
619*4882a593Smuzhiyun 	int error;
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	for (retry = 0; retry < MAX_FW_UPDATE_RETRIES; retry++) {
622*4882a593Smuzhiyun 		error = elants_i2c_send(client, page, ELAN_FW_PAGESIZE);
623*4882a593Smuzhiyun 		if (error) {
624*4882a593Smuzhiyun 			dev_err(&client->dev,
625*4882a593Smuzhiyun 				"IAP Write Page failed: %d\n", error);
626*4882a593Smuzhiyun 			continue;
627*4882a593Smuzhiyun 		}
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 		error = elants_i2c_read(client, buf, 2);
630*4882a593Smuzhiyun 		if (error) {
631*4882a593Smuzhiyun 			dev_err(&client->dev,
632*4882a593Smuzhiyun 				"IAP Ack read failed: %d\n", error);
633*4882a593Smuzhiyun 			return error;
634*4882a593Smuzhiyun 		}
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 		if (!memcmp(buf, ack_ok, sizeof(ack_ok)))
637*4882a593Smuzhiyun 			return 0;
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 		error = -EIO;
640*4882a593Smuzhiyun 		dev_err(&client->dev,
641*4882a593Smuzhiyun 			"IAP Get Ack Error [%02x:%02x]\n",
642*4882a593Smuzhiyun 			buf[0], buf[1]);
643*4882a593Smuzhiyun 	}
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	return error;
646*4882a593Smuzhiyun }
647*4882a593Smuzhiyun 
elants_i2c_validate_remark_id(struct elants_data * ts,const struct firmware * fw)648*4882a593Smuzhiyun static int elants_i2c_validate_remark_id(struct elants_data *ts,
649*4882a593Smuzhiyun 					 const struct firmware *fw)
650*4882a593Smuzhiyun {
651*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
652*4882a593Smuzhiyun 	int error;
653*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_ROM_READ, 0x80, 0x1F, 0x00, 0x00, 0x21 };
654*4882a593Smuzhiyun 	u8 resp[6] = { 0 };
655*4882a593Smuzhiyun 	u16 ts_remark_id = 0;
656*4882a593Smuzhiyun 	u16 fw_remark_id = 0;
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	/* Compare TS Remark ID and FW Remark ID */
659*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
660*4882a593Smuzhiyun 					   resp, sizeof(resp),
661*4882a593Smuzhiyun 					   1, "read Remark ID");
662*4882a593Smuzhiyun 	if (error)
663*4882a593Smuzhiyun 		return error;
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 	ts_remark_id = get_unaligned_be16(&resp[3]);
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	fw_remark_id = get_unaligned_le16(&fw->data[fw->size - 4]);
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	if (fw_remark_id != ts_remark_id) {
670*4882a593Smuzhiyun 		dev_err(&client->dev,
671*4882a593Smuzhiyun 			"Remark ID Mismatched: ts_remark_id=0x%04x, fw_remark_id=0x%04x.\n",
672*4882a593Smuzhiyun 			ts_remark_id, fw_remark_id);
673*4882a593Smuzhiyun 		return -EINVAL;
674*4882a593Smuzhiyun 	}
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun 	return 0;
677*4882a593Smuzhiyun }
678*4882a593Smuzhiyun 
elants_i2c_should_check_remark_id(struct elants_data * ts)679*4882a593Smuzhiyun static bool elants_i2c_should_check_remark_id(struct elants_data *ts)
680*4882a593Smuzhiyun {
681*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
682*4882a593Smuzhiyun 	const u8 bootcode_version = ts->iap_version;
683*4882a593Smuzhiyun 	bool check;
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun 	/* I2C eKTH3900 and eKTH5312 are NOT support Remark ID */
686*4882a593Smuzhiyun 	if ((bootcode_version == BC_VER_H_BYTE_FOR_EKTH3900x1_I2C) ||
687*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH3900x2_I2C) ||
688*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH3900x3_I2C) ||
689*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312x1_I2C) ||
690*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312x2_I2C) ||
691*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312cx1_I2C) ||
692*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312cx2_I2C) ||
693*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312x1_I2C_USB) ||
694*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312x2_I2C_USB) ||
695*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312cx1_I2C_USB) ||
696*4882a593Smuzhiyun 	    (bootcode_version == BC_VER_H_BYTE_FOR_EKTH5312cx2_I2C_USB)) {
697*4882a593Smuzhiyun 		dev_dbg(&client->dev,
698*4882a593Smuzhiyun 			"eKTH3900/eKTH5312(0x%02x) are not support remark id\n",
699*4882a593Smuzhiyun 			bootcode_version);
700*4882a593Smuzhiyun 		check = false;
701*4882a593Smuzhiyun 	} else if (bootcode_version >= 0x60) {
702*4882a593Smuzhiyun 		check = true;
703*4882a593Smuzhiyun 	} else {
704*4882a593Smuzhiyun 		check = false;
705*4882a593Smuzhiyun 	}
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	return check;
708*4882a593Smuzhiyun }
709*4882a593Smuzhiyun 
elants_i2c_do_update_firmware(struct i2c_client * client,const struct firmware * fw,bool force)710*4882a593Smuzhiyun static int elants_i2c_do_update_firmware(struct i2c_client *client,
711*4882a593Smuzhiyun 					 const struct firmware *fw,
712*4882a593Smuzhiyun 					 bool force)
713*4882a593Smuzhiyun {
714*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
715*4882a593Smuzhiyun 	const u8 enter_iap[] = { 0x45, 0x49, 0x41, 0x50 };
716*4882a593Smuzhiyun 	const u8 enter_iap2[] = { 0x54, 0x00, 0x12, 0x34 };
717*4882a593Smuzhiyun 	const u8 iap_ack[] = { 0x55, 0xaa, 0x33, 0xcc };
718*4882a593Smuzhiyun 	const u8 close_idle[] = { 0x54, 0x2c, 0x01, 0x01 };
719*4882a593Smuzhiyun 	u8 buf[HEADER_SIZE];
720*4882a593Smuzhiyun 	u16 send_id;
721*4882a593Smuzhiyun 	int page, n_fw_pages;
722*4882a593Smuzhiyun 	int error;
723*4882a593Smuzhiyun 	bool check_remark_id = elants_i2c_should_check_remark_id(ts);
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 	/* Recovery mode detection! */
726*4882a593Smuzhiyun 	if (force) {
727*4882a593Smuzhiyun 		dev_dbg(&client->dev, "Recovery mode procedure\n");
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 		if (check_remark_id) {
730*4882a593Smuzhiyun 			error = elants_i2c_validate_remark_id(ts, fw);
731*4882a593Smuzhiyun 			if (error)
732*4882a593Smuzhiyun 				return error;
733*4882a593Smuzhiyun 		}
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 		error = elants_i2c_send(client, enter_iap2, sizeof(enter_iap2));
736*4882a593Smuzhiyun 		if (error) {
737*4882a593Smuzhiyun 			dev_err(&client->dev, "failed to enter IAP mode: %d\n",
738*4882a593Smuzhiyun 				error);
739*4882a593Smuzhiyun 			return error;
740*4882a593Smuzhiyun 		}
741*4882a593Smuzhiyun 	} else {
742*4882a593Smuzhiyun 		/* Start IAP Procedure */
743*4882a593Smuzhiyun 		dev_dbg(&client->dev, "Normal IAP procedure\n");
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 		/* Close idle mode */
746*4882a593Smuzhiyun 		error = elants_i2c_send(client, close_idle, sizeof(close_idle));
747*4882a593Smuzhiyun 		if (error)
748*4882a593Smuzhiyun 			dev_err(&client->dev, "Failed close idle: %d\n", error);
749*4882a593Smuzhiyun 		msleep(60);
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun 		elants_i2c_sw_reset(client);
752*4882a593Smuzhiyun 		msleep(20);
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 		if (check_remark_id) {
755*4882a593Smuzhiyun 			error = elants_i2c_validate_remark_id(ts, fw);
756*4882a593Smuzhiyun 			if (error)
757*4882a593Smuzhiyun 				return error;
758*4882a593Smuzhiyun 		}
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 		error = elants_i2c_send(client, enter_iap, sizeof(enter_iap));
761*4882a593Smuzhiyun 		if (error) {
762*4882a593Smuzhiyun 			dev_err(&client->dev, "failed to enter IAP mode: %d\n",
763*4882a593Smuzhiyun 				error);
764*4882a593Smuzhiyun 			return error;
765*4882a593Smuzhiyun 		}
766*4882a593Smuzhiyun 	}
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	msleep(20);
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	/* check IAP state */
771*4882a593Smuzhiyun 	error = elants_i2c_read(client, buf, 4);
772*4882a593Smuzhiyun 	if (error) {
773*4882a593Smuzhiyun 		dev_err(&client->dev,
774*4882a593Smuzhiyun 			"failed to read IAP acknowledgement: %d\n",
775*4882a593Smuzhiyun 			error);
776*4882a593Smuzhiyun 		return error;
777*4882a593Smuzhiyun 	}
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	if (memcmp(buf, iap_ack, sizeof(iap_ack))) {
780*4882a593Smuzhiyun 		dev_err(&client->dev,
781*4882a593Smuzhiyun 			"failed to enter IAP: %*ph (expected %*ph)\n",
782*4882a593Smuzhiyun 			(int)sizeof(buf), buf, (int)sizeof(iap_ack), iap_ack);
783*4882a593Smuzhiyun 		return -EIO;
784*4882a593Smuzhiyun 	}
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	dev_info(&client->dev, "successfully entered IAP mode");
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	send_id = client->addr;
789*4882a593Smuzhiyun 	error = elants_i2c_send(client, &send_id, 1);
790*4882a593Smuzhiyun 	if (error) {
791*4882a593Smuzhiyun 		dev_err(&client->dev, "sending dummy byte failed: %d\n",
792*4882a593Smuzhiyun 			error);
793*4882a593Smuzhiyun 		return error;
794*4882a593Smuzhiyun 	}
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	/* Clear the last page of Master */
797*4882a593Smuzhiyun 	error = elants_i2c_send(client, fw->data, ELAN_FW_PAGESIZE);
798*4882a593Smuzhiyun 	if (error) {
799*4882a593Smuzhiyun 		dev_err(&client->dev, "clearing of the last page failed: %d\n",
800*4882a593Smuzhiyun 			error);
801*4882a593Smuzhiyun 		return error;
802*4882a593Smuzhiyun 	}
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun 	error = elants_i2c_read(client, buf, 2);
805*4882a593Smuzhiyun 	if (error) {
806*4882a593Smuzhiyun 		dev_err(&client->dev,
807*4882a593Smuzhiyun 			"failed to read ACK for clearing the last page: %d\n",
808*4882a593Smuzhiyun 			error);
809*4882a593Smuzhiyun 		return error;
810*4882a593Smuzhiyun 	}
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	n_fw_pages = fw->size / ELAN_FW_PAGESIZE;
813*4882a593Smuzhiyun 	dev_dbg(&client->dev, "IAP Pages = %d\n", n_fw_pages);
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	for (page = 0; page < n_fw_pages; page++) {
816*4882a593Smuzhiyun 		error = elants_i2c_fw_write_page(client,
817*4882a593Smuzhiyun 					fw->data + page * ELAN_FW_PAGESIZE);
818*4882a593Smuzhiyun 		if (error) {
819*4882a593Smuzhiyun 			dev_err(&client->dev,
820*4882a593Smuzhiyun 				"failed to write FW page %d: %d\n",
821*4882a593Smuzhiyun 				page, error);
822*4882a593Smuzhiyun 			return error;
823*4882a593Smuzhiyun 		}
824*4882a593Smuzhiyun 	}
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	/* Old iap needs to wait 200ms for WDT and rest is for hello packets */
827*4882a593Smuzhiyun 	msleep(300);
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	dev_info(&client->dev, "firmware update completed\n");
830*4882a593Smuzhiyun 	return 0;
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun 
elants_i2c_fw_update(struct elants_data * ts)833*4882a593Smuzhiyun static int elants_i2c_fw_update(struct elants_data *ts)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
836*4882a593Smuzhiyun 	const struct firmware *fw;
837*4882a593Smuzhiyun 	char *fw_name;
838*4882a593Smuzhiyun 	int error;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 	fw_name = kasprintf(GFP_KERNEL, "elants_i2c_%04x.bin", ts->hw_version);
841*4882a593Smuzhiyun 	if (!fw_name)
842*4882a593Smuzhiyun 		return -ENOMEM;
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 	dev_info(&client->dev, "requesting fw name = %s\n", fw_name);
845*4882a593Smuzhiyun 	error = request_firmware(&fw, fw_name, &client->dev);
846*4882a593Smuzhiyun 	kfree(fw_name);
847*4882a593Smuzhiyun 	if (error) {
848*4882a593Smuzhiyun 		dev_err(&client->dev, "failed to request firmware: %d\n",
849*4882a593Smuzhiyun 			error);
850*4882a593Smuzhiyun 		return error;
851*4882a593Smuzhiyun 	}
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 	if (fw->size % ELAN_FW_PAGESIZE) {
854*4882a593Smuzhiyun 		dev_err(&client->dev, "invalid firmware length: %zu\n",
855*4882a593Smuzhiyun 			fw->size);
856*4882a593Smuzhiyun 		error = -EINVAL;
857*4882a593Smuzhiyun 		goto out;
858*4882a593Smuzhiyun 	}
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 	disable_irq(client->irq);
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun 	error = elants_i2c_do_update_firmware(client, fw,
863*4882a593Smuzhiyun 					ts->iap_mode == ELAN_IAP_RECOVERY);
864*4882a593Smuzhiyun 	if (error) {
865*4882a593Smuzhiyun 		dev_err(&client->dev, "firmware update failed: %d\n", error);
866*4882a593Smuzhiyun 		ts->iap_mode = ELAN_IAP_RECOVERY;
867*4882a593Smuzhiyun 		goto out_enable_irq;
868*4882a593Smuzhiyun 	}
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 	error = elants_i2c_initialize(ts);
871*4882a593Smuzhiyun 	if (error) {
872*4882a593Smuzhiyun 		dev_err(&client->dev,
873*4882a593Smuzhiyun 			"failed to initialize device after firmware update: %d\n",
874*4882a593Smuzhiyun 			error);
875*4882a593Smuzhiyun 		ts->iap_mode = ELAN_IAP_RECOVERY;
876*4882a593Smuzhiyun 		goto out_enable_irq;
877*4882a593Smuzhiyun 	}
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun 	ts->iap_mode = ELAN_IAP_OPERATIONAL;
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun out_enable_irq:
882*4882a593Smuzhiyun 	ts->state = ELAN_STATE_NORMAL;
883*4882a593Smuzhiyun 	enable_irq(client->irq);
884*4882a593Smuzhiyun 	msleep(100);
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun 	if (!error)
887*4882a593Smuzhiyun 		elants_i2c_calibrate(ts);
888*4882a593Smuzhiyun out:
889*4882a593Smuzhiyun 	release_firmware(fw);
890*4882a593Smuzhiyun 	return error;
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun /*
894*4882a593Smuzhiyun  * Event reporting.
895*4882a593Smuzhiyun  */
896*4882a593Smuzhiyun 
elants_i2c_mt_event(struct elants_data * ts,u8 * buf)897*4882a593Smuzhiyun static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
898*4882a593Smuzhiyun {
899*4882a593Smuzhiyun 	struct input_dev *input = ts->input;
900*4882a593Smuzhiyun 	unsigned int n_fingers;
901*4882a593Smuzhiyun 	unsigned int tool_type;
902*4882a593Smuzhiyun 	u16 finger_state;
903*4882a593Smuzhiyun 	int i;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	n_fingers = buf[FW_POS_STATE + 1] & 0x0f;
906*4882a593Smuzhiyun 	finger_state = ((buf[FW_POS_STATE + 1] & 0x30) << 4) |
907*4882a593Smuzhiyun 			buf[FW_POS_STATE];
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun 	dev_dbg(&ts->client->dev,
910*4882a593Smuzhiyun 		"n_fingers: %u, state: %04x\n",  n_fingers, finger_state);
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	/* Note: all fingers have the same tool type */
913*4882a593Smuzhiyun 	tool_type = buf[FW_POS_TOOL_TYPE] & BIT(0) ?
914*4882a593Smuzhiyun 			MT_TOOL_FINGER : MT_TOOL_PALM;
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	for (i = 0; i < MAX_CONTACT_NUM && n_fingers; i++) {
917*4882a593Smuzhiyun 		if (finger_state & 1) {
918*4882a593Smuzhiyun 			unsigned int x, y, p, w;
919*4882a593Smuzhiyun 			u8 *pos;
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun 			pos = &buf[FW_POS_XY + i * 3];
922*4882a593Smuzhiyun 			x = (((u16)pos[0] & 0xf0) << 4) | pos[1];
923*4882a593Smuzhiyun 			y = (((u16)pos[0] & 0x0f) << 8) | pos[2];
924*4882a593Smuzhiyun 			p = buf[FW_POS_PRESSURE + i];
925*4882a593Smuzhiyun 			w = buf[FW_POS_WIDTH + i];
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 			dev_dbg(&ts->client->dev, "i=%d x=%d y=%d p=%d w=%d\n",
928*4882a593Smuzhiyun 				i, x, y, p, w);
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun 			input_mt_slot(input, i);
931*4882a593Smuzhiyun 			input_mt_report_slot_state(input, tool_type, true);
932*4882a593Smuzhiyun 			touchscreen_report_pos(input, &ts->prop, x, y, true);
933*4882a593Smuzhiyun 			input_event(input, EV_ABS, ABS_MT_PRESSURE, p);
934*4882a593Smuzhiyun 			input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, w);
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun 			n_fingers--;
937*4882a593Smuzhiyun 		}
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun 		finger_state >>= 1;
940*4882a593Smuzhiyun 	}
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	input_mt_sync_frame(input);
943*4882a593Smuzhiyun 	input_sync(input);
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
elants_i2c_calculate_checksum(u8 * buf)946*4882a593Smuzhiyun static u8 elants_i2c_calculate_checksum(u8 *buf)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun 	u8 checksum = 0;
949*4882a593Smuzhiyun 	u8 i;
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun 	for (i = 0; i < FW_POS_CHECKSUM; i++)
952*4882a593Smuzhiyun 		checksum += buf[i];
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	return checksum;
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun 
elants_i2c_event(struct elants_data * ts,u8 * buf)957*4882a593Smuzhiyun static void elants_i2c_event(struct elants_data *ts, u8 *buf)
958*4882a593Smuzhiyun {
959*4882a593Smuzhiyun 	u8 checksum = elants_i2c_calculate_checksum(buf);
960*4882a593Smuzhiyun 
961*4882a593Smuzhiyun 	if (unlikely(buf[FW_POS_CHECKSUM] != checksum))
962*4882a593Smuzhiyun 		dev_warn(&ts->client->dev,
963*4882a593Smuzhiyun 			 "%s: invalid checksum for packet %02x: %02x vs. %02x\n",
964*4882a593Smuzhiyun 			 __func__, buf[FW_POS_HEADER],
965*4882a593Smuzhiyun 			 checksum, buf[FW_POS_CHECKSUM]);
966*4882a593Smuzhiyun 	else if (unlikely(buf[FW_POS_HEADER] != HEADER_REPORT_10_FINGER))
967*4882a593Smuzhiyun 		dev_warn(&ts->client->dev,
968*4882a593Smuzhiyun 			 "%s: unknown packet type: %02x\n",
969*4882a593Smuzhiyun 			 __func__, buf[FW_POS_HEADER]);
970*4882a593Smuzhiyun 	else
971*4882a593Smuzhiyun 		elants_i2c_mt_event(ts, buf);
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun 
elants_i2c_irq(int irq,void * _dev)974*4882a593Smuzhiyun static irqreturn_t elants_i2c_irq(int irq, void *_dev)
975*4882a593Smuzhiyun {
976*4882a593Smuzhiyun 	const u8 wait_packet[] = { 0x64, 0x64, 0x64, 0x64 };
977*4882a593Smuzhiyun 	struct elants_data *ts = _dev;
978*4882a593Smuzhiyun 	struct i2c_client *client = ts->client;
979*4882a593Smuzhiyun 	int report_count, report_len;
980*4882a593Smuzhiyun 	int i;
981*4882a593Smuzhiyun 	int len;
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun 	len = i2c_master_recv_dmasafe(client, ts->buf, sizeof(ts->buf));
984*4882a593Smuzhiyun 	if (len < 0) {
985*4882a593Smuzhiyun 		dev_err(&client->dev, "%s: failed to read data: %d\n",
986*4882a593Smuzhiyun 			__func__, len);
987*4882a593Smuzhiyun 		goto out;
988*4882a593Smuzhiyun 	}
989*4882a593Smuzhiyun 
990*4882a593Smuzhiyun 	dev_dbg(&client->dev, "%s: packet %*ph\n",
991*4882a593Smuzhiyun 		__func__, HEADER_SIZE, ts->buf);
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	switch (ts->state) {
994*4882a593Smuzhiyun 	case ELAN_WAIT_RECALIBRATION:
995*4882a593Smuzhiyun 		if (ts->buf[FW_HDR_TYPE] == CMD_HEADER_REK) {
996*4882a593Smuzhiyun 			memcpy(ts->cmd_resp, ts->buf, sizeof(ts->cmd_resp));
997*4882a593Smuzhiyun 			complete(&ts->cmd_done);
998*4882a593Smuzhiyun 			ts->state = ELAN_STATE_NORMAL;
999*4882a593Smuzhiyun 		}
1000*4882a593Smuzhiyun 		break;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	case ELAN_WAIT_QUEUE_HEADER:
1003*4882a593Smuzhiyun 		if (ts->buf[FW_HDR_TYPE] != QUEUE_HEADER_NORMAL)
1004*4882a593Smuzhiyun 			break;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 		ts->state = ELAN_STATE_NORMAL;
1007*4882a593Smuzhiyun 		fallthrough;
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	case ELAN_STATE_NORMAL:
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 		switch (ts->buf[FW_HDR_TYPE]) {
1012*4882a593Smuzhiyun 		case CMD_HEADER_HELLO:
1013*4882a593Smuzhiyun 		case CMD_HEADER_RESP:
1014*4882a593Smuzhiyun 		case CMD_HEADER_REK:
1015*4882a593Smuzhiyun 			break;
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun 		case QUEUE_HEADER_WAIT:
1018*4882a593Smuzhiyun 			if (memcmp(ts->buf, wait_packet, sizeof(wait_packet))) {
1019*4882a593Smuzhiyun 				dev_err(&client->dev,
1020*4882a593Smuzhiyun 					"invalid wait packet %*ph\n",
1021*4882a593Smuzhiyun 					HEADER_SIZE, ts->buf);
1022*4882a593Smuzhiyun 			} else {
1023*4882a593Smuzhiyun 				ts->state = ELAN_WAIT_QUEUE_HEADER;
1024*4882a593Smuzhiyun 				udelay(30);
1025*4882a593Smuzhiyun 			}
1026*4882a593Smuzhiyun 			break;
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 		case QUEUE_HEADER_SINGLE:
1029*4882a593Smuzhiyun 			elants_i2c_event(ts, &ts->buf[HEADER_SIZE]);
1030*4882a593Smuzhiyun 			break;
1031*4882a593Smuzhiyun 
1032*4882a593Smuzhiyun 		case QUEUE_HEADER_NORMAL:
1033*4882a593Smuzhiyun 			report_count = ts->buf[FW_HDR_COUNT];
1034*4882a593Smuzhiyun 			if (report_count == 0 || report_count > 3) {
1035*4882a593Smuzhiyun 				dev_err(&client->dev,
1036*4882a593Smuzhiyun 					"bad report count: %*ph\n",
1037*4882a593Smuzhiyun 					HEADER_SIZE, ts->buf);
1038*4882a593Smuzhiyun 				break;
1039*4882a593Smuzhiyun 			}
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun 			report_len = ts->buf[FW_HDR_LENGTH] / report_count;
1042*4882a593Smuzhiyun 			if (report_len != PACKET_SIZE) {
1043*4882a593Smuzhiyun 				dev_err(&client->dev,
1044*4882a593Smuzhiyun 					"mismatching report length: %*ph\n",
1045*4882a593Smuzhiyun 					HEADER_SIZE, ts->buf);
1046*4882a593Smuzhiyun 				break;
1047*4882a593Smuzhiyun 			}
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun 			for (i = 0; i < report_count; i++) {
1050*4882a593Smuzhiyun 				u8 *buf = ts->buf + HEADER_SIZE +
1051*4882a593Smuzhiyun 							i * PACKET_SIZE;
1052*4882a593Smuzhiyun 				elants_i2c_event(ts, buf);
1053*4882a593Smuzhiyun 			}
1054*4882a593Smuzhiyun 			break;
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 		default:
1057*4882a593Smuzhiyun 			dev_err(&client->dev, "unknown packet %*ph\n",
1058*4882a593Smuzhiyun 				HEADER_SIZE, ts->buf);
1059*4882a593Smuzhiyun 			break;
1060*4882a593Smuzhiyun 		}
1061*4882a593Smuzhiyun 		break;
1062*4882a593Smuzhiyun 	}
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun out:
1065*4882a593Smuzhiyun 	return IRQ_HANDLED;
1066*4882a593Smuzhiyun }
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun /*
1069*4882a593Smuzhiyun  * sysfs interface
1070*4882a593Smuzhiyun  */
calibrate_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1071*4882a593Smuzhiyun static ssize_t calibrate_store(struct device *dev,
1072*4882a593Smuzhiyun 			       struct device_attribute *attr,
1073*4882a593Smuzhiyun 			       const char *buf, size_t count)
1074*4882a593Smuzhiyun {
1075*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1076*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1077*4882a593Smuzhiyun 	int error;
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun 	error = mutex_lock_interruptible(&ts->sysfs_mutex);
1080*4882a593Smuzhiyun 	if (error)
1081*4882a593Smuzhiyun 		return error;
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	error = elants_i2c_calibrate(ts);
1084*4882a593Smuzhiyun 
1085*4882a593Smuzhiyun 	mutex_unlock(&ts->sysfs_mutex);
1086*4882a593Smuzhiyun 	return error ?: count;
1087*4882a593Smuzhiyun }
1088*4882a593Smuzhiyun 
write_update_fw(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1089*4882a593Smuzhiyun static ssize_t write_update_fw(struct device *dev,
1090*4882a593Smuzhiyun 			       struct device_attribute *attr,
1091*4882a593Smuzhiyun 			       const char *buf, size_t count)
1092*4882a593Smuzhiyun {
1093*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1094*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1095*4882a593Smuzhiyun 	int error;
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun 	error = mutex_lock_interruptible(&ts->sysfs_mutex);
1098*4882a593Smuzhiyun 	if (error)
1099*4882a593Smuzhiyun 		return error;
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun 	error = elants_i2c_fw_update(ts);
1102*4882a593Smuzhiyun 	dev_dbg(dev, "firmware update result: %d\n", error);
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun 	mutex_unlock(&ts->sysfs_mutex);
1105*4882a593Smuzhiyun 	return error ?: count;
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun 
show_iap_mode(struct device * dev,struct device_attribute * attr,char * buf)1108*4882a593Smuzhiyun static ssize_t show_iap_mode(struct device *dev,
1109*4882a593Smuzhiyun 			     struct device_attribute *attr, char *buf)
1110*4882a593Smuzhiyun {
1111*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1112*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1113*4882a593Smuzhiyun 
1114*4882a593Smuzhiyun 	return sprintf(buf, "%s\n",
1115*4882a593Smuzhiyun 		       ts->iap_mode == ELAN_IAP_OPERATIONAL ?
1116*4882a593Smuzhiyun 				"Normal" : "Recovery");
1117*4882a593Smuzhiyun }
1118*4882a593Smuzhiyun 
show_calibration_count(struct device * dev,struct device_attribute * attr,char * buf)1119*4882a593Smuzhiyun static ssize_t show_calibration_count(struct device *dev,
1120*4882a593Smuzhiyun 				      struct device_attribute *attr, char *buf)
1121*4882a593Smuzhiyun {
1122*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1123*4882a593Smuzhiyun 	const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_REK, 0x00, 0x01 };
1124*4882a593Smuzhiyun 	u8 resp[HEADER_SIZE];
1125*4882a593Smuzhiyun 	u16 rek_count;
1126*4882a593Smuzhiyun 	int error;
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun 	error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
1129*4882a593Smuzhiyun 					   resp, sizeof(resp), 1,
1130*4882a593Smuzhiyun 					   "read ReK status");
1131*4882a593Smuzhiyun 	if (error)
1132*4882a593Smuzhiyun 		return sprintf(buf, "%d\n", error);
1133*4882a593Smuzhiyun 
1134*4882a593Smuzhiyun 	rek_count = get_unaligned_be16(&resp[2]);
1135*4882a593Smuzhiyun 	return sprintf(buf, "0x%04x\n", rek_count);
1136*4882a593Smuzhiyun }
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun static DEVICE_ATTR_WO(calibrate);
1139*4882a593Smuzhiyun static DEVICE_ATTR(iap_mode, S_IRUGO, show_iap_mode, NULL);
1140*4882a593Smuzhiyun static DEVICE_ATTR(calibration_count, S_IRUGO, show_calibration_count, NULL);
1141*4882a593Smuzhiyun static DEVICE_ATTR(update_fw, S_IWUSR, NULL, write_update_fw);
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun struct elants_version_attribute {
1144*4882a593Smuzhiyun 	struct device_attribute dattr;
1145*4882a593Smuzhiyun 	size_t field_offset;
1146*4882a593Smuzhiyun 	size_t field_size;
1147*4882a593Smuzhiyun };
1148*4882a593Smuzhiyun 
1149*4882a593Smuzhiyun #define __ELANTS_FIELD_SIZE(_field)					\
1150*4882a593Smuzhiyun 	sizeof(((struct elants_data *)NULL)->_field)
1151*4882a593Smuzhiyun #define __ELANTS_VERIFY_SIZE(_field)					\
1152*4882a593Smuzhiyun 	(BUILD_BUG_ON_ZERO(__ELANTS_FIELD_SIZE(_field) > 2) +		\
1153*4882a593Smuzhiyun 	 __ELANTS_FIELD_SIZE(_field))
1154*4882a593Smuzhiyun #define ELANTS_VERSION_ATTR(_field)					\
1155*4882a593Smuzhiyun 	struct elants_version_attribute elants_ver_attr_##_field = {	\
1156*4882a593Smuzhiyun 		.dattr = __ATTR(_field, S_IRUGO,			\
1157*4882a593Smuzhiyun 				elants_version_attribute_show, NULL),	\
1158*4882a593Smuzhiyun 		.field_offset = offsetof(struct elants_data, _field),	\
1159*4882a593Smuzhiyun 		.field_size = __ELANTS_VERIFY_SIZE(_field),		\
1160*4882a593Smuzhiyun 	}
1161*4882a593Smuzhiyun 
elants_version_attribute_show(struct device * dev,struct device_attribute * dattr,char * buf)1162*4882a593Smuzhiyun static ssize_t elants_version_attribute_show(struct device *dev,
1163*4882a593Smuzhiyun 					     struct device_attribute *dattr,
1164*4882a593Smuzhiyun 					     char *buf)
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1167*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1168*4882a593Smuzhiyun 	struct elants_version_attribute *attr =
1169*4882a593Smuzhiyun 		container_of(dattr, struct elants_version_attribute, dattr);
1170*4882a593Smuzhiyun 	u8 *field = (u8 *)((char *)ts + attr->field_offset);
1171*4882a593Smuzhiyun 	unsigned int fmt_size;
1172*4882a593Smuzhiyun 	unsigned int val;
1173*4882a593Smuzhiyun 
1174*4882a593Smuzhiyun 	if (attr->field_size == 1) {
1175*4882a593Smuzhiyun 		val = *field;
1176*4882a593Smuzhiyun 		fmt_size = 2; /* 2 HEX digits */
1177*4882a593Smuzhiyun 	} else {
1178*4882a593Smuzhiyun 		val = *(u16 *)field;
1179*4882a593Smuzhiyun 		fmt_size = 4; /* 4 HEX digits */
1180*4882a593Smuzhiyun 	}
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun 	return sprintf(buf, "%0*x\n", fmt_size, val);
1183*4882a593Smuzhiyun }
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(fw_version);
1186*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(hw_version);
1187*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(test_version);
1188*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(solution_version);
1189*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(bc_version);
1190*4882a593Smuzhiyun static ELANTS_VERSION_ATTR(iap_version);
1191*4882a593Smuzhiyun 
1192*4882a593Smuzhiyun static struct attribute *elants_attributes[] = {
1193*4882a593Smuzhiyun 	&dev_attr_calibrate.attr,
1194*4882a593Smuzhiyun 	&dev_attr_update_fw.attr,
1195*4882a593Smuzhiyun 	&dev_attr_iap_mode.attr,
1196*4882a593Smuzhiyun 	&dev_attr_calibration_count.attr,
1197*4882a593Smuzhiyun 
1198*4882a593Smuzhiyun 	&elants_ver_attr_fw_version.dattr.attr,
1199*4882a593Smuzhiyun 	&elants_ver_attr_hw_version.dattr.attr,
1200*4882a593Smuzhiyun 	&elants_ver_attr_test_version.dattr.attr,
1201*4882a593Smuzhiyun 	&elants_ver_attr_solution_version.dattr.attr,
1202*4882a593Smuzhiyun 	&elants_ver_attr_bc_version.dattr.attr,
1203*4882a593Smuzhiyun 	&elants_ver_attr_iap_version.dattr.attr,
1204*4882a593Smuzhiyun 	NULL
1205*4882a593Smuzhiyun };
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun static const struct attribute_group elants_attribute_group = {
1208*4882a593Smuzhiyun 	.attrs = elants_attributes,
1209*4882a593Smuzhiyun };
1210*4882a593Smuzhiyun 
elants_i2c_power_on(struct elants_data * ts)1211*4882a593Smuzhiyun static int elants_i2c_power_on(struct elants_data *ts)
1212*4882a593Smuzhiyun {
1213*4882a593Smuzhiyun 	int error;
1214*4882a593Smuzhiyun 
1215*4882a593Smuzhiyun 	/*
1216*4882a593Smuzhiyun 	 * If we do not have reset gpio assume platform firmware
1217*4882a593Smuzhiyun 	 * controls regulators and does power them on for us.
1218*4882a593Smuzhiyun 	 */
1219*4882a593Smuzhiyun 	if (IS_ERR_OR_NULL(ts->reset_gpio))
1220*4882a593Smuzhiyun 		return 0;
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun 	gpiod_set_value_cansleep(ts->reset_gpio, 1);
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	error = regulator_enable(ts->vcc33);
1225*4882a593Smuzhiyun 	if (error) {
1226*4882a593Smuzhiyun 		dev_err(&ts->client->dev,
1227*4882a593Smuzhiyun 			"failed to enable vcc33 regulator: %d\n",
1228*4882a593Smuzhiyun 			error);
1229*4882a593Smuzhiyun 		goto release_reset_gpio;
1230*4882a593Smuzhiyun 	}
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 	error = regulator_enable(ts->vccio);
1233*4882a593Smuzhiyun 	if (error) {
1234*4882a593Smuzhiyun 		dev_err(&ts->client->dev,
1235*4882a593Smuzhiyun 			"failed to enable vccio regulator: %d\n",
1236*4882a593Smuzhiyun 			error);
1237*4882a593Smuzhiyun 		regulator_disable(ts->vcc33);
1238*4882a593Smuzhiyun 		goto release_reset_gpio;
1239*4882a593Smuzhiyun 	}
1240*4882a593Smuzhiyun 
1241*4882a593Smuzhiyun 	/*
1242*4882a593Smuzhiyun 	 * We need to wait a bit after powering on controller before
1243*4882a593Smuzhiyun 	 * we are allowed to release reset GPIO.
1244*4882a593Smuzhiyun 	 */
1245*4882a593Smuzhiyun 	udelay(ELAN_POWERON_DELAY_USEC);
1246*4882a593Smuzhiyun 
1247*4882a593Smuzhiyun release_reset_gpio:
1248*4882a593Smuzhiyun 	gpiod_set_value_cansleep(ts->reset_gpio, 0);
1249*4882a593Smuzhiyun 	if (error)
1250*4882a593Smuzhiyun 		return error;
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	msleep(ELAN_RESET_DELAY_MSEC);
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun 	return 0;
1255*4882a593Smuzhiyun }
1256*4882a593Smuzhiyun 
elants_i2c_power_off(void * _data)1257*4882a593Smuzhiyun static void elants_i2c_power_off(void *_data)
1258*4882a593Smuzhiyun {
1259*4882a593Smuzhiyun 	struct elants_data *ts = _data;
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun 	if (!IS_ERR_OR_NULL(ts->reset_gpio)) {
1262*4882a593Smuzhiyun 		/*
1263*4882a593Smuzhiyun 		 * Activate reset gpio to prevent leakage through the
1264*4882a593Smuzhiyun 		 * pin once we shut off power to the controller.
1265*4882a593Smuzhiyun 		 */
1266*4882a593Smuzhiyun 		gpiod_set_value_cansleep(ts->reset_gpio, 1);
1267*4882a593Smuzhiyun 		regulator_disable(ts->vccio);
1268*4882a593Smuzhiyun 		regulator_disable(ts->vcc33);
1269*4882a593Smuzhiyun 	}
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun #ifdef CONFIG_ACPI
1273*4882a593Smuzhiyun static const struct acpi_device_id i2c_hid_ids[] = {
1274*4882a593Smuzhiyun 	{"ACPI0C50", 0 },
1275*4882a593Smuzhiyun 	{"PNP0C50", 0 },
1276*4882a593Smuzhiyun 	{ },
1277*4882a593Smuzhiyun };
1278*4882a593Smuzhiyun 
1279*4882a593Smuzhiyun static const guid_t i2c_hid_guid =
1280*4882a593Smuzhiyun 	GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
1281*4882a593Smuzhiyun 		  0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);
1282*4882a593Smuzhiyun 
elants_acpi_is_hid_device(struct device * dev)1283*4882a593Smuzhiyun static bool elants_acpi_is_hid_device(struct device *dev)
1284*4882a593Smuzhiyun {
1285*4882a593Smuzhiyun 	acpi_handle handle = ACPI_HANDLE(dev);
1286*4882a593Smuzhiyun 	union acpi_object *obj;
1287*4882a593Smuzhiyun 
1288*4882a593Smuzhiyun 	if (acpi_match_device_ids(ACPI_COMPANION(dev), i2c_hid_ids))
1289*4882a593Smuzhiyun 		return false;
1290*4882a593Smuzhiyun 
1291*4882a593Smuzhiyun 	obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid, 1, 1, NULL, ACPI_TYPE_INTEGER);
1292*4882a593Smuzhiyun 	if (obj) {
1293*4882a593Smuzhiyun 		ACPI_FREE(obj);
1294*4882a593Smuzhiyun 		return true;
1295*4882a593Smuzhiyun 	}
1296*4882a593Smuzhiyun 
1297*4882a593Smuzhiyun 	return false;
1298*4882a593Smuzhiyun }
1299*4882a593Smuzhiyun #else
elants_acpi_is_hid_device(struct device * dev)1300*4882a593Smuzhiyun static bool elants_acpi_is_hid_device(struct device *dev)
1301*4882a593Smuzhiyun {
1302*4882a593Smuzhiyun 	return false;
1303*4882a593Smuzhiyun }
1304*4882a593Smuzhiyun #endif
1305*4882a593Smuzhiyun 
elants_i2c_probe(struct i2c_client * client,const struct i2c_device_id * id)1306*4882a593Smuzhiyun static int elants_i2c_probe(struct i2c_client *client,
1307*4882a593Smuzhiyun 			    const struct i2c_device_id *id)
1308*4882a593Smuzhiyun {
1309*4882a593Smuzhiyun 	union i2c_smbus_data dummy;
1310*4882a593Smuzhiyun 	struct elants_data *ts;
1311*4882a593Smuzhiyun 	unsigned long irqflags;
1312*4882a593Smuzhiyun 	int error;
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun 	/* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */
1315*4882a593Smuzhiyun 	if (elants_acpi_is_hid_device(&client->dev)) {
1316*4882a593Smuzhiyun 		dev_warn(&client->dev, "This device appears to be an I2C-HID device, not binding\n");
1317*4882a593Smuzhiyun 		return -ENODEV;
1318*4882a593Smuzhiyun 	}
1319*4882a593Smuzhiyun 
1320*4882a593Smuzhiyun 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1321*4882a593Smuzhiyun 		dev_err(&client->dev, "I2C check functionality error\n");
1322*4882a593Smuzhiyun 		return -ENXIO;
1323*4882a593Smuzhiyun 	}
1324*4882a593Smuzhiyun 
1325*4882a593Smuzhiyun 	ts = devm_kzalloc(&client->dev, sizeof(struct elants_data), GFP_KERNEL);
1326*4882a593Smuzhiyun 	if (!ts)
1327*4882a593Smuzhiyun 		return -ENOMEM;
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 	mutex_init(&ts->sysfs_mutex);
1330*4882a593Smuzhiyun 	init_completion(&ts->cmd_done);
1331*4882a593Smuzhiyun 
1332*4882a593Smuzhiyun 	ts->client = client;
1333*4882a593Smuzhiyun 	i2c_set_clientdata(client, ts);
1334*4882a593Smuzhiyun 
1335*4882a593Smuzhiyun 	ts->vcc33 = devm_regulator_get(&client->dev, "vcc33");
1336*4882a593Smuzhiyun 	if (IS_ERR(ts->vcc33)) {
1337*4882a593Smuzhiyun 		error = PTR_ERR(ts->vcc33);
1338*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
1339*4882a593Smuzhiyun 			dev_err(&client->dev,
1340*4882a593Smuzhiyun 				"Failed to get 'vcc33' regulator: %d\n",
1341*4882a593Smuzhiyun 				error);
1342*4882a593Smuzhiyun 		return error;
1343*4882a593Smuzhiyun 	}
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun 	ts->vccio = devm_regulator_get(&client->dev, "vccio");
1346*4882a593Smuzhiyun 	if (IS_ERR(ts->vccio)) {
1347*4882a593Smuzhiyun 		error = PTR_ERR(ts->vccio);
1348*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
1349*4882a593Smuzhiyun 			dev_err(&client->dev,
1350*4882a593Smuzhiyun 				"Failed to get 'vccio' regulator: %d\n",
1351*4882a593Smuzhiyun 				error);
1352*4882a593Smuzhiyun 		return error;
1353*4882a593Smuzhiyun 	}
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun 	ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
1356*4882a593Smuzhiyun 	if (IS_ERR(ts->reset_gpio)) {
1357*4882a593Smuzhiyun 		error = PTR_ERR(ts->reset_gpio);
1358*4882a593Smuzhiyun 
1359*4882a593Smuzhiyun 		if (error == -EPROBE_DEFER)
1360*4882a593Smuzhiyun 			return error;
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun 		if (error != -ENOENT && error != -ENOSYS) {
1363*4882a593Smuzhiyun 			dev_err(&client->dev,
1364*4882a593Smuzhiyun 				"failed to get reset gpio: %d\n",
1365*4882a593Smuzhiyun 				error);
1366*4882a593Smuzhiyun 			return error;
1367*4882a593Smuzhiyun 		}
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun 		ts->keep_power_in_suspend = true;
1370*4882a593Smuzhiyun 	}
1371*4882a593Smuzhiyun 
1372*4882a593Smuzhiyun 	error = elants_i2c_power_on(ts);
1373*4882a593Smuzhiyun 	if (error)
1374*4882a593Smuzhiyun 		return error;
1375*4882a593Smuzhiyun 
1376*4882a593Smuzhiyun 	error = devm_add_action(&client->dev, elants_i2c_power_off, ts);
1377*4882a593Smuzhiyun 	if (error) {
1378*4882a593Smuzhiyun 		dev_err(&client->dev,
1379*4882a593Smuzhiyun 			"failed to install power off action: %d\n", error);
1380*4882a593Smuzhiyun 		elants_i2c_power_off(ts);
1381*4882a593Smuzhiyun 		return error;
1382*4882a593Smuzhiyun 	}
1383*4882a593Smuzhiyun 
1384*4882a593Smuzhiyun 	/* Make sure there is something at this address */
1385*4882a593Smuzhiyun 	if (i2c_smbus_xfer(client->adapter, client->addr, 0,
1386*4882a593Smuzhiyun 			   I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &dummy) < 0) {
1387*4882a593Smuzhiyun 		dev_err(&client->dev, "nothing at this address\n");
1388*4882a593Smuzhiyun 		return -ENXIO;
1389*4882a593Smuzhiyun 	}
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun 	error = elants_i2c_initialize(ts);
1392*4882a593Smuzhiyun 	if (error) {
1393*4882a593Smuzhiyun 		dev_err(&client->dev, "failed to initialize: %d\n", error);
1394*4882a593Smuzhiyun 		return error;
1395*4882a593Smuzhiyun 	}
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 	ts->input = devm_input_allocate_device(&client->dev);
1398*4882a593Smuzhiyun 	if (!ts->input) {
1399*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to allocate input device\n");
1400*4882a593Smuzhiyun 		return -ENOMEM;
1401*4882a593Smuzhiyun 	}
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 	ts->input->name = "Elan Touchscreen";
1404*4882a593Smuzhiyun 	ts->input->id.bustype = BUS_I2C;
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun 	/* Multitouch input params setup */
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun 	input_set_abs_params(ts->input, ABS_MT_POSITION_X, 0, ts->x_max, 0, 0);
1409*4882a593Smuzhiyun 	input_set_abs_params(ts->input, ABS_MT_POSITION_Y, 0, ts->y_max, 0, 0);
1410*4882a593Smuzhiyun 	input_set_abs_params(ts->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
1411*4882a593Smuzhiyun 	input_set_abs_params(ts->input, ABS_MT_PRESSURE, 0, 255, 0, 0);
1412*4882a593Smuzhiyun 	input_set_abs_params(ts->input, ABS_MT_TOOL_TYPE,
1413*4882a593Smuzhiyun 			     0, MT_TOOL_PALM, 0, 0);
1414*4882a593Smuzhiyun 	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
1415*4882a593Smuzhiyun 	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
1416*4882a593Smuzhiyun 	if (ts->major_res > 0)
1417*4882a593Smuzhiyun 		input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res);
1418*4882a593Smuzhiyun 
1419*4882a593Smuzhiyun 	touchscreen_parse_properties(ts->input, true, &ts->prop);
1420*4882a593Smuzhiyun 
1421*4882a593Smuzhiyun 	error = input_mt_init_slots(ts->input, MAX_CONTACT_NUM,
1422*4882a593Smuzhiyun 				    INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
1423*4882a593Smuzhiyun 	if (error) {
1424*4882a593Smuzhiyun 		dev_err(&client->dev,
1425*4882a593Smuzhiyun 			"failed to initialize MT slots: %d\n", error);
1426*4882a593Smuzhiyun 		return error;
1427*4882a593Smuzhiyun 	}
1428*4882a593Smuzhiyun 
1429*4882a593Smuzhiyun 	error = input_register_device(ts->input);
1430*4882a593Smuzhiyun 	if (error) {
1431*4882a593Smuzhiyun 		dev_err(&client->dev,
1432*4882a593Smuzhiyun 			"unable to register input device: %d\n", error);
1433*4882a593Smuzhiyun 		return error;
1434*4882a593Smuzhiyun 	}
1435*4882a593Smuzhiyun 
1436*4882a593Smuzhiyun 	/*
1437*4882a593Smuzhiyun 	 * Platform code (ACPI, DTS) should normally set up interrupt
1438*4882a593Smuzhiyun 	 * for us, but in case it did not let's fall back to using falling
1439*4882a593Smuzhiyun 	 * edge to be compatible with older Chromebooks.
1440*4882a593Smuzhiyun 	 */
1441*4882a593Smuzhiyun 	irqflags = irq_get_trigger_type(client->irq);
1442*4882a593Smuzhiyun 	if (!irqflags)
1443*4882a593Smuzhiyun 		irqflags = IRQF_TRIGGER_FALLING;
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun 	error = devm_request_threaded_irq(&client->dev, client->irq,
1446*4882a593Smuzhiyun 					  NULL, elants_i2c_irq,
1447*4882a593Smuzhiyun 					  irqflags | IRQF_ONESHOT,
1448*4882a593Smuzhiyun 					  client->name, ts);
1449*4882a593Smuzhiyun 	if (error) {
1450*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to register interrupt\n");
1451*4882a593Smuzhiyun 		return error;
1452*4882a593Smuzhiyun 	}
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun 	/*
1455*4882a593Smuzhiyun 	 * Systems using device tree should set up wakeup via DTS,
1456*4882a593Smuzhiyun 	 * the rest will configure device as wakeup source by default.
1457*4882a593Smuzhiyun 	 */
1458*4882a593Smuzhiyun 	if (!client->dev.of_node)
1459*4882a593Smuzhiyun 		device_init_wakeup(&client->dev, true);
1460*4882a593Smuzhiyun 
1461*4882a593Smuzhiyun 	error = devm_device_add_group(&client->dev, &elants_attribute_group);
1462*4882a593Smuzhiyun 	if (error) {
1463*4882a593Smuzhiyun 		dev_err(&client->dev, "failed to create sysfs attributes: %d\n",
1464*4882a593Smuzhiyun 			error);
1465*4882a593Smuzhiyun 		return error;
1466*4882a593Smuzhiyun 	}
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun 	return 0;
1469*4882a593Smuzhiyun }
1470*4882a593Smuzhiyun 
elants_i2c_suspend(struct device * dev)1471*4882a593Smuzhiyun static int __maybe_unused elants_i2c_suspend(struct device *dev)
1472*4882a593Smuzhiyun {
1473*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1474*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1475*4882a593Smuzhiyun 	const u8 set_sleep_cmd[] = { 0x54, 0x50, 0x00, 0x01 };
1476*4882a593Smuzhiyun 	int retry_cnt;
1477*4882a593Smuzhiyun 	int error;
1478*4882a593Smuzhiyun 
1479*4882a593Smuzhiyun 	/* Command not support in IAP recovery mode */
1480*4882a593Smuzhiyun 	if (ts->iap_mode != ELAN_IAP_OPERATIONAL)
1481*4882a593Smuzhiyun 		return -EBUSY;
1482*4882a593Smuzhiyun 
1483*4882a593Smuzhiyun 	disable_irq(client->irq);
1484*4882a593Smuzhiyun 
1485*4882a593Smuzhiyun 	if (device_may_wakeup(dev)) {
1486*4882a593Smuzhiyun 		/*
1487*4882a593Smuzhiyun 		 * The device will automatically enter idle mode
1488*4882a593Smuzhiyun 		 * that has reduced power consumption.
1489*4882a593Smuzhiyun 		 */
1490*4882a593Smuzhiyun 		ts->wake_irq_enabled = (enable_irq_wake(client->irq) == 0);
1491*4882a593Smuzhiyun 	} else if (ts->keep_power_in_suspend) {
1492*4882a593Smuzhiyun 		for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
1493*4882a593Smuzhiyun 			error = elants_i2c_send(client, set_sleep_cmd,
1494*4882a593Smuzhiyun 						sizeof(set_sleep_cmd));
1495*4882a593Smuzhiyun 			if (!error)
1496*4882a593Smuzhiyun 				break;
1497*4882a593Smuzhiyun 
1498*4882a593Smuzhiyun 			dev_err(&client->dev,
1499*4882a593Smuzhiyun 				"suspend command failed: %d\n", error);
1500*4882a593Smuzhiyun 		}
1501*4882a593Smuzhiyun 	} else {
1502*4882a593Smuzhiyun 		elants_i2c_power_off(ts);
1503*4882a593Smuzhiyun 	}
1504*4882a593Smuzhiyun 
1505*4882a593Smuzhiyun 	return 0;
1506*4882a593Smuzhiyun }
1507*4882a593Smuzhiyun 
elants_i2c_resume(struct device * dev)1508*4882a593Smuzhiyun static int __maybe_unused elants_i2c_resume(struct device *dev)
1509*4882a593Smuzhiyun {
1510*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
1511*4882a593Smuzhiyun 	struct elants_data *ts = i2c_get_clientdata(client);
1512*4882a593Smuzhiyun 	const u8 set_active_cmd[] = { 0x54, 0x58, 0x00, 0x01 };
1513*4882a593Smuzhiyun 	int retry_cnt;
1514*4882a593Smuzhiyun 	int error;
1515*4882a593Smuzhiyun 
1516*4882a593Smuzhiyun 	if (device_may_wakeup(dev)) {
1517*4882a593Smuzhiyun 		if (ts->wake_irq_enabled)
1518*4882a593Smuzhiyun 			disable_irq_wake(client->irq);
1519*4882a593Smuzhiyun 		elants_i2c_sw_reset(client);
1520*4882a593Smuzhiyun 	} else if (ts->keep_power_in_suspend) {
1521*4882a593Smuzhiyun 		for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
1522*4882a593Smuzhiyun 			error = elants_i2c_send(client, set_active_cmd,
1523*4882a593Smuzhiyun 						sizeof(set_active_cmd));
1524*4882a593Smuzhiyun 			if (!error)
1525*4882a593Smuzhiyun 				break;
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 			dev_err(&client->dev,
1528*4882a593Smuzhiyun 				"resume command failed: %d\n", error);
1529*4882a593Smuzhiyun 		}
1530*4882a593Smuzhiyun 	} else {
1531*4882a593Smuzhiyun 		elants_i2c_power_on(ts);
1532*4882a593Smuzhiyun 		elants_i2c_initialize(ts);
1533*4882a593Smuzhiyun 	}
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun 	ts->state = ELAN_STATE_NORMAL;
1536*4882a593Smuzhiyun 	enable_irq(client->irq);
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun 	return 0;
1539*4882a593Smuzhiyun }
1540*4882a593Smuzhiyun 
1541*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(elants_i2c_pm_ops,
1542*4882a593Smuzhiyun 			 elants_i2c_suspend, elants_i2c_resume);
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun static const struct i2c_device_id elants_i2c_id[] = {
1545*4882a593Smuzhiyun 	{ DEVICE_NAME, 0 },
1546*4882a593Smuzhiyun 	{ }
1547*4882a593Smuzhiyun };
1548*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, elants_i2c_id);
1549*4882a593Smuzhiyun 
1550*4882a593Smuzhiyun #ifdef CONFIG_ACPI
1551*4882a593Smuzhiyun static const struct acpi_device_id elants_acpi_id[] = {
1552*4882a593Smuzhiyun 	{ "ELAN0001", 0 },
1553*4882a593Smuzhiyun 	{ }
1554*4882a593Smuzhiyun };
1555*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, elants_acpi_id);
1556*4882a593Smuzhiyun #endif
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun #ifdef CONFIG_OF
1559*4882a593Smuzhiyun static const struct of_device_id elants_of_match[] = {
1560*4882a593Smuzhiyun 	{ .compatible = "elan,ekth3500" },
1561*4882a593Smuzhiyun 	{ /* sentinel */ }
1562*4882a593Smuzhiyun };
1563*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, elants_of_match);
1564*4882a593Smuzhiyun #endif
1565*4882a593Smuzhiyun 
1566*4882a593Smuzhiyun static struct i2c_driver elants_i2c_driver = {
1567*4882a593Smuzhiyun 	.probe = elants_i2c_probe,
1568*4882a593Smuzhiyun 	.id_table = elants_i2c_id,
1569*4882a593Smuzhiyun 	.driver = {
1570*4882a593Smuzhiyun 		.name = DEVICE_NAME,
1571*4882a593Smuzhiyun 		.pm = &elants_i2c_pm_ops,
1572*4882a593Smuzhiyun 		.acpi_match_table = ACPI_PTR(elants_acpi_id),
1573*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(elants_of_match),
1574*4882a593Smuzhiyun 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1575*4882a593Smuzhiyun 	},
1576*4882a593Smuzhiyun };
1577*4882a593Smuzhiyun module_i2c_driver(elants_i2c_driver);
1578*4882a593Smuzhiyun 
1579*4882a593Smuzhiyun MODULE_AUTHOR("Scott Liu <scott.liu@emc.com.tw>");
1580*4882a593Smuzhiyun MODULE_DESCRIPTION("Elan I2c Touchscreen driver");
1581*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1582