xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/zinitix.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #include <linux/delay.h>
4*4882a593Smuzhiyun #include <linux/i2c.h>
5*4882a593Smuzhiyun #include <linux/input.h>
6*4882a593Smuzhiyun #include <linux/input/mt.h>
7*4882a593Smuzhiyun #include <linux/input/touchscreen.h>
8*4882a593Smuzhiyun #include <linux/interrupt.h>
9*4882a593Smuzhiyun #include <linux/irq.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/of.h>
13*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
14*4882a593Smuzhiyun #include <linux/slab.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Register Map */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define BT541_SWRESET_CMD			0x0000
19*4882a593Smuzhiyun #define BT541_WAKEUP_CMD			0x0001
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define BT541_IDLE_CMD				0x0004
22*4882a593Smuzhiyun #define BT541_SLEEP_CMD				0x0005
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define BT541_CLEAR_INT_STATUS_CMD		0x0003
25*4882a593Smuzhiyun #define BT541_CALIBRATE_CMD			0x0006
26*4882a593Smuzhiyun #define BT541_SAVE_STATUS_CMD			0x0007
27*4882a593Smuzhiyun #define BT541_SAVE_CALIBRATION_CMD		0x0008
28*4882a593Smuzhiyun #define BT541_RECALL_FACTORY_CMD		0x000f
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define BT541_THRESHOLD				0x0020
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define BT541_LARGE_PALM_REJECT_AREA_TH		0x003F
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define BT541_DEBUG_REG				0x0115 /* 0~7 */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define BT541_TOUCH_MODE			0x0010
37*4882a593Smuzhiyun #define BT541_CHIP_REVISION			0x0011
38*4882a593Smuzhiyun #define BT541_FIRMWARE_VERSION			0x0012
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define ZINITIX_USB_DETECT			0x116
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define BT541_MINOR_FW_VERSION			0x0121
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define BT541_VENDOR_ID				0x001C
45*4882a593Smuzhiyun #define BT541_HW_ID				0x0014
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define BT541_DATA_VERSION_REG			0x0013
48*4882a593Smuzhiyun #define BT541_SUPPORTED_FINGER_NUM		0x0015
49*4882a593Smuzhiyun #define BT541_EEPROM_INFO			0x0018
50*4882a593Smuzhiyun #define BT541_INITIAL_TOUCH_MODE		0x0019
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define BT541_TOTAL_NUMBER_OF_X			0x0060
53*4882a593Smuzhiyun #define BT541_TOTAL_NUMBER_OF_Y			0x0061
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define BT541_DELAY_RAW_FOR_HOST		0x007f
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define BT541_BUTTON_SUPPORTED_NUM		0x00B0
58*4882a593Smuzhiyun #define BT541_BUTTON_SENSITIVITY		0x00B2
59*4882a593Smuzhiyun #define BT541_DUMMY_BUTTON_SENSITIVITY		0X00C8
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define BT541_X_RESOLUTION			0x00C0
62*4882a593Smuzhiyun #define BT541_Y_RESOLUTION			0x00C1
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define BT541_POINT_STATUS_REG			0x0080
65*4882a593Smuzhiyun #define BT541_ICON_STATUS_REG			0x00AA
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define BT541_POINT_COORD_REG			(BT541_POINT_STATUS_REG + 2)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define BT541_AFE_FREQUENCY			0x0100
70*4882a593Smuzhiyun #define BT541_DND_N_COUNT			0x0122
71*4882a593Smuzhiyun #define BT541_DND_U_COUNT			0x0135
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define BT541_RAWDATA_REG			0x0200
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define BT541_EEPROM_INFO_REG			0x0018
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define BT541_INT_ENABLE_FLAG			0x00f0
78*4882a593Smuzhiyun #define BT541_PERIODICAL_INTERRUPT_INTERVAL	0x00f1
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define BT541_BTN_WIDTH				0x016d
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define BT541_CHECKSUM_RESULT			0x012c
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define BT541_INIT_FLASH			0x01d0
85*4882a593Smuzhiyun #define BT541_WRITE_FLASH			0x01d1
86*4882a593Smuzhiyun #define BT541_READ_FLASH			0x01d2
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define ZINITIX_INTERNAL_FLAG_02		0x011e
89*4882a593Smuzhiyun #define ZINITIX_INTERNAL_FLAG_03		0x011f
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define ZINITIX_I2C_CHECKSUM_WCNT		0x016a
92*4882a593Smuzhiyun #define ZINITIX_I2C_CHECKSUM_RESULT		0x016c
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun /* Interrupt & status register flags */
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define BIT_PT_CNT_CHANGE			BIT(0)
97*4882a593Smuzhiyun #define BIT_DOWN				BIT(1)
98*4882a593Smuzhiyun #define BIT_MOVE				BIT(2)
99*4882a593Smuzhiyun #define BIT_UP					BIT(3)
100*4882a593Smuzhiyun #define BIT_PALM				BIT(4)
101*4882a593Smuzhiyun #define BIT_PALM_REJECT				BIT(5)
102*4882a593Smuzhiyun #define BIT_RESERVED_0				BIT(6)
103*4882a593Smuzhiyun #define BIT_RESERVED_1				BIT(7)
104*4882a593Smuzhiyun #define BIT_WEIGHT_CHANGE			BIT(8)
105*4882a593Smuzhiyun #define BIT_PT_NO_CHANGE			BIT(9)
106*4882a593Smuzhiyun #define BIT_REJECT				BIT(10)
107*4882a593Smuzhiyun #define BIT_PT_EXIST				BIT(11)
108*4882a593Smuzhiyun #define BIT_RESERVED_2				BIT(12)
109*4882a593Smuzhiyun #define BIT_ERROR				BIT(13)
110*4882a593Smuzhiyun #define BIT_DEBUG				BIT(14)
111*4882a593Smuzhiyun #define BIT_ICON_EVENT				BIT(15)
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define SUB_BIT_EXIST				BIT(0)
114*4882a593Smuzhiyun #define SUB_BIT_DOWN				BIT(1)
115*4882a593Smuzhiyun #define SUB_BIT_MOVE				BIT(2)
116*4882a593Smuzhiyun #define SUB_BIT_UP				BIT(3)
117*4882a593Smuzhiyun #define SUB_BIT_UPDATE				BIT(4)
118*4882a593Smuzhiyun #define SUB_BIT_WAIT				BIT(5)
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define DEFAULT_TOUCH_POINT_MODE		2
121*4882a593Smuzhiyun #define MAX_SUPPORTED_FINGER_NUM		5
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #define CHIP_ON_DELAY				15 // ms
124*4882a593Smuzhiyun #define FIRMWARE_ON_DELAY			40 // ms
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct point_coord {
127*4882a593Smuzhiyun 	__le16	x;
128*4882a593Smuzhiyun 	__le16	y;
129*4882a593Smuzhiyun 	u8	width;
130*4882a593Smuzhiyun 	u8	sub_status;
131*4882a593Smuzhiyun 	// currently unused, but needed as padding:
132*4882a593Smuzhiyun 	u8	minor_width;
133*4882a593Smuzhiyun 	u8	angle;
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun struct touch_event {
137*4882a593Smuzhiyun 	__le16	status;
138*4882a593Smuzhiyun 	u8	finger_mask;
139*4882a593Smuzhiyun 	u8	time_stamp;
140*4882a593Smuzhiyun 	struct point_coord point_coord[MAX_SUPPORTED_FINGER_NUM];
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun struct bt541_ts_data {
144*4882a593Smuzhiyun 	struct i2c_client *client;
145*4882a593Smuzhiyun 	struct input_dev *input_dev;
146*4882a593Smuzhiyun 	struct touchscreen_properties prop;
147*4882a593Smuzhiyun 	struct regulator_bulk_data supplies[2];
148*4882a593Smuzhiyun 	u32 zinitix_mode;
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
zinitix_read_data(struct i2c_client * client,u16 reg,void * values,size_t length)151*4882a593Smuzhiyun static int zinitix_read_data(struct i2c_client *client,
152*4882a593Smuzhiyun 			     u16 reg, void *values, size_t length)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	__le16 reg_le = cpu_to_le16(reg);
155*4882a593Smuzhiyun 	int ret;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	/* A single i2c_transfer() transaction does not work here. */
158*4882a593Smuzhiyun 	ret = i2c_master_send(client, (u8 *)&reg_le, sizeof(reg_le));
159*4882a593Smuzhiyun 	if (ret != sizeof(reg_le))
160*4882a593Smuzhiyun 		return ret < 0 ? ret : -EIO;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	ret = i2c_master_recv(client, (u8 *)values, length);
163*4882a593Smuzhiyun 	if (ret != length)
164*4882a593Smuzhiyun 		return ret < 0 ? ret : -EIO; ;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	return 0;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun 
zinitix_write_u16(struct i2c_client * client,u16 reg,u16 value)169*4882a593Smuzhiyun static int zinitix_write_u16(struct i2c_client *client, u16 reg, u16 value)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	__le16 packet[2] = {cpu_to_le16(reg), cpu_to_le16(value)};
172*4882a593Smuzhiyun 	int ret;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	ret = i2c_master_send(client, (u8 *)packet, sizeof(packet));
175*4882a593Smuzhiyun 	if (ret != sizeof(packet))
176*4882a593Smuzhiyun 		return ret < 0 ? ret : -EIO;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	return 0;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
zinitix_write_cmd(struct i2c_client * client,u16 reg)181*4882a593Smuzhiyun static int zinitix_write_cmd(struct i2c_client *client, u16 reg)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	__le16 reg_le = cpu_to_le16(reg);
184*4882a593Smuzhiyun 	int ret;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	ret = i2c_master_send(client, (u8 *)&reg_le, sizeof(reg_le));
187*4882a593Smuzhiyun 	if (ret != sizeof(reg_le))
188*4882a593Smuzhiyun 		return ret < 0 ? ret : -EIO;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	return 0;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
zinitix_init_touch(struct bt541_ts_data * bt541)193*4882a593Smuzhiyun static int zinitix_init_touch(struct bt541_ts_data *bt541)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	struct i2c_client *client = bt541->client;
196*4882a593Smuzhiyun 	int i;
197*4882a593Smuzhiyun 	int error;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	error = zinitix_write_cmd(client, BT541_SWRESET_CMD);
200*4882a593Smuzhiyun 	if (error) {
201*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to write reset command\n");
202*4882a593Smuzhiyun 		return error;
203*4882a593Smuzhiyun 	}
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_INT_ENABLE_FLAG, 0x0);
206*4882a593Smuzhiyun 	if (error) {
207*4882a593Smuzhiyun 		dev_err(&client->dev,
208*4882a593Smuzhiyun 			"Failed to reset interrupt enable flag\n");
209*4882a593Smuzhiyun 		return error;
210*4882a593Smuzhiyun 	}
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	/* initialize */
213*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_X_RESOLUTION,
214*4882a593Smuzhiyun 				  bt541->prop.max_x);
215*4882a593Smuzhiyun 	if (error)
216*4882a593Smuzhiyun 		return error;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_Y_RESOLUTION,
219*4882a593Smuzhiyun 				  bt541->prop.max_y);
220*4882a593Smuzhiyun 	if (error)
221*4882a593Smuzhiyun 		return error;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_SUPPORTED_FINGER_NUM,
224*4882a593Smuzhiyun 				  MAX_SUPPORTED_FINGER_NUM);
225*4882a593Smuzhiyun 	if (error)
226*4882a593Smuzhiyun 		return error;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_INITIAL_TOUCH_MODE,
229*4882a593Smuzhiyun 				  bt541->zinitix_mode);
230*4882a593Smuzhiyun 	if (error)
231*4882a593Smuzhiyun 		return error;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_TOUCH_MODE,
234*4882a593Smuzhiyun 				  bt541->zinitix_mode);
235*4882a593Smuzhiyun 	if (error)
236*4882a593Smuzhiyun 		return error;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	error = zinitix_write_u16(client, BT541_INT_ENABLE_FLAG,
239*4882a593Smuzhiyun 				  BIT_PT_CNT_CHANGE | BIT_DOWN | BIT_MOVE |
240*4882a593Smuzhiyun 					BIT_UP);
241*4882a593Smuzhiyun 	if (error)
242*4882a593Smuzhiyun 		return error;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	/* clear queue */
245*4882a593Smuzhiyun 	for (i = 0; i < 10; i++) {
246*4882a593Smuzhiyun 		zinitix_write_cmd(client, BT541_CLEAR_INT_STATUS_CMD);
247*4882a593Smuzhiyun 		udelay(10);
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	return 0;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
zinitix_init_regulators(struct bt541_ts_data * bt541)253*4882a593Smuzhiyun static int zinitix_init_regulators(struct bt541_ts_data *bt541)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	struct i2c_client *client = bt541->client;
256*4882a593Smuzhiyun 	int error;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	bt541->supplies[0].supply = "vdd";
259*4882a593Smuzhiyun 	bt541->supplies[1].supply = "vddo";
260*4882a593Smuzhiyun 	error = devm_regulator_bulk_get(&client->dev,
261*4882a593Smuzhiyun 					ARRAY_SIZE(bt541->supplies),
262*4882a593Smuzhiyun 					bt541->supplies);
263*4882a593Smuzhiyun 	if (error < 0) {
264*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to get regulators: %d\n", error);
265*4882a593Smuzhiyun 		return error;
266*4882a593Smuzhiyun 	}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	return 0;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
zinitix_send_power_on_sequence(struct bt541_ts_data * bt541)271*4882a593Smuzhiyun static int zinitix_send_power_on_sequence(struct bt541_ts_data *bt541)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	int error;
274*4882a593Smuzhiyun 	struct i2c_client *client = bt541->client;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	error = zinitix_write_u16(client, 0xc000, 0x0001);
277*4882a593Smuzhiyun 	if (error) {
278*4882a593Smuzhiyun 		dev_err(&client->dev,
279*4882a593Smuzhiyun 			"Failed to send power sequence(vendor cmd enable)\n");
280*4882a593Smuzhiyun 		return error;
281*4882a593Smuzhiyun 	}
282*4882a593Smuzhiyun 	udelay(10);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	error = zinitix_write_cmd(client, 0xc004);
285*4882a593Smuzhiyun 	if (error) {
286*4882a593Smuzhiyun 		dev_err(&client->dev,
287*4882a593Smuzhiyun 			"Failed to send power sequence (intn clear)\n");
288*4882a593Smuzhiyun 		return error;
289*4882a593Smuzhiyun 	}
290*4882a593Smuzhiyun 	udelay(10);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	error = zinitix_write_u16(client, 0xc002, 0x0001);
293*4882a593Smuzhiyun 	if (error) {
294*4882a593Smuzhiyun 		dev_err(&client->dev,
295*4882a593Smuzhiyun 			"Failed to send power sequence (nvm init)\n");
296*4882a593Smuzhiyun 		return error;
297*4882a593Smuzhiyun 	}
298*4882a593Smuzhiyun 	mdelay(2);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	error = zinitix_write_u16(client, 0xc001, 0x0001);
301*4882a593Smuzhiyun 	if (error) {
302*4882a593Smuzhiyun 		dev_err(&client->dev,
303*4882a593Smuzhiyun 			"Failed to send power sequence (program start)\n");
304*4882a593Smuzhiyun 		return error;
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun 	msleep(FIRMWARE_ON_DELAY);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	return 0;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun 
zinitix_report_finger(struct bt541_ts_data * bt541,int slot,const struct point_coord * p)311*4882a593Smuzhiyun static void zinitix_report_finger(struct bt541_ts_data *bt541, int slot,
312*4882a593Smuzhiyun 				  const struct point_coord *p)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	u16 x, y;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	if (unlikely(!(p->sub_status &
317*4882a593Smuzhiyun 		       (SUB_BIT_UP | SUB_BIT_DOWN | SUB_BIT_MOVE)))) {
318*4882a593Smuzhiyun 		dev_dbg(&bt541->client->dev, "unknown finger event %#02x\n",
319*4882a593Smuzhiyun 			p->sub_status);
320*4882a593Smuzhiyun 		return;
321*4882a593Smuzhiyun 	}
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 	x = le16_to_cpu(p->x);
324*4882a593Smuzhiyun 	y = le16_to_cpu(p->y);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	input_mt_slot(bt541->input_dev, slot);
327*4882a593Smuzhiyun 	if (input_mt_report_slot_state(bt541->input_dev, MT_TOOL_FINGER,
328*4882a593Smuzhiyun 				       !(p->sub_status & SUB_BIT_UP))) {
329*4882a593Smuzhiyun 		touchscreen_report_pos(bt541->input_dev,
330*4882a593Smuzhiyun 				       &bt541->prop, x, y, true);
331*4882a593Smuzhiyun 		input_report_abs(bt541->input_dev,
332*4882a593Smuzhiyun 				 ABS_MT_TOUCH_MAJOR, p->width);
333*4882a593Smuzhiyun 		dev_dbg(&bt541->client->dev, "finger %d %s (%u, %u)\n",
334*4882a593Smuzhiyun 			slot, p->sub_status & SUB_BIT_DOWN ? "down" : "move",
335*4882a593Smuzhiyun 			x, y);
336*4882a593Smuzhiyun 	} else {
337*4882a593Smuzhiyun 		dev_dbg(&bt541->client->dev, "finger %d up (%u, %u)\n",
338*4882a593Smuzhiyun 			slot, x, y);
339*4882a593Smuzhiyun 	}
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
zinitix_ts_irq_handler(int irq,void * bt541_handler)342*4882a593Smuzhiyun static irqreturn_t zinitix_ts_irq_handler(int irq, void *bt541_handler)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun 	struct bt541_ts_data *bt541 = bt541_handler;
345*4882a593Smuzhiyun 	struct i2c_client *client = bt541->client;
346*4882a593Smuzhiyun 	struct touch_event touch_event;
347*4882a593Smuzhiyun 	unsigned long finger_mask;
348*4882a593Smuzhiyun 	int error;
349*4882a593Smuzhiyun 	int i;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	memset(&touch_event, 0, sizeof(struct touch_event));
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 	error = zinitix_read_data(bt541->client, BT541_POINT_STATUS_REG,
354*4882a593Smuzhiyun 				  &touch_event, sizeof(struct touch_event));
355*4882a593Smuzhiyun 	if (error) {
356*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to read in touchpoint struct\n");
357*4882a593Smuzhiyun 		goto out;
358*4882a593Smuzhiyun 	}
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	finger_mask = touch_event.finger_mask;
361*4882a593Smuzhiyun 	for_each_set_bit(i, &finger_mask, MAX_SUPPORTED_FINGER_NUM) {
362*4882a593Smuzhiyun 		const struct point_coord *p = &touch_event.point_coord[i];
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 		/* Only process contacts that are actually reported */
365*4882a593Smuzhiyun 		if (p->sub_status & SUB_BIT_EXIST)
366*4882a593Smuzhiyun 			zinitix_report_finger(bt541, i, p);
367*4882a593Smuzhiyun 	}
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	input_mt_sync_frame(bt541->input_dev);
370*4882a593Smuzhiyun 	input_sync(bt541->input_dev);
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun out:
373*4882a593Smuzhiyun 	zinitix_write_cmd(bt541->client, BT541_CLEAR_INT_STATUS_CMD);
374*4882a593Smuzhiyun 	return IRQ_HANDLED;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun 
zinitix_start(struct bt541_ts_data * bt541)377*4882a593Smuzhiyun static int zinitix_start(struct bt541_ts_data *bt541)
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun 	int error;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	error = regulator_bulk_enable(ARRAY_SIZE(bt541->supplies),
382*4882a593Smuzhiyun 				      bt541->supplies);
383*4882a593Smuzhiyun 	if (error) {
384*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
385*4882a593Smuzhiyun 			"Failed to enable regulators: %d\n", error);
386*4882a593Smuzhiyun 		return error;
387*4882a593Smuzhiyun 	}
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	msleep(CHIP_ON_DELAY);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	error = zinitix_send_power_on_sequence(bt541);
392*4882a593Smuzhiyun 	if (error) {
393*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
394*4882a593Smuzhiyun 			"Error while sending power-on sequence: %d\n", error);
395*4882a593Smuzhiyun 		return error;
396*4882a593Smuzhiyun 	}
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	error = zinitix_init_touch(bt541);
399*4882a593Smuzhiyun 	if (error) {
400*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
401*4882a593Smuzhiyun 			"Error while configuring touch IC\n");
402*4882a593Smuzhiyun 		return error;
403*4882a593Smuzhiyun 	}
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	enable_irq(bt541->client->irq);
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	return 0;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun 
zinitix_stop(struct bt541_ts_data * bt541)410*4882a593Smuzhiyun static int zinitix_stop(struct bt541_ts_data *bt541)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	int error;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	disable_irq(bt541->client->irq);
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	error = regulator_bulk_disable(ARRAY_SIZE(bt541->supplies),
417*4882a593Smuzhiyun 				       bt541->supplies);
418*4882a593Smuzhiyun 	if (error) {
419*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
420*4882a593Smuzhiyun 			"Failed to disable regulators: %d\n", error);
421*4882a593Smuzhiyun 		return error;
422*4882a593Smuzhiyun 	}
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	return 0;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun 
zinitix_input_open(struct input_dev * dev)427*4882a593Smuzhiyun static int zinitix_input_open(struct input_dev *dev)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun 	struct bt541_ts_data *bt541 = input_get_drvdata(dev);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	return zinitix_start(bt541);
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun 
zinitix_input_close(struct input_dev * dev)434*4882a593Smuzhiyun static void zinitix_input_close(struct input_dev *dev)
435*4882a593Smuzhiyun {
436*4882a593Smuzhiyun 	struct bt541_ts_data *bt541 = input_get_drvdata(dev);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	zinitix_stop(bt541);
439*4882a593Smuzhiyun }
440*4882a593Smuzhiyun 
zinitix_init_input_dev(struct bt541_ts_data * bt541)441*4882a593Smuzhiyun static int zinitix_init_input_dev(struct bt541_ts_data *bt541)
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun 	struct input_dev *input_dev;
444*4882a593Smuzhiyun 	int error;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	input_dev = devm_input_allocate_device(&bt541->client->dev);
447*4882a593Smuzhiyun 	if (!input_dev) {
448*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
449*4882a593Smuzhiyun 			"Failed to allocate input device.");
450*4882a593Smuzhiyun 		return -ENOMEM;
451*4882a593Smuzhiyun 	}
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	input_set_drvdata(input_dev, bt541);
454*4882a593Smuzhiyun 	bt541->input_dev = input_dev;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	input_dev->name = "Zinitix Capacitive TouchScreen";
457*4882a593Smuzhiyun 	input_dev->phys = "input/ts";
458*4882a593Smuzhiyun 	input_dev->id.bustype = BUS_I2C;
459*4882a593Smuzhiyun 	input_dev->open = zinitix_input_open;
460*4882a593Smuzhiyun 	input_dev->close = zinitix_input_close;
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X);
463*4882a593Smuzhiyun 	input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y);
464*4882a593Smuzhiyun 	input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
465*4882a593Smuzhiyun 	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	touchscreen_parse_properties(input_dev, true, &bt541->prop);
468*4882a593Smuzhiyun 	if (!bt541->prop.max_x || !bt541->prop.max_y) {
469*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
470*4882a593Smuzhiyun 			"Touchscreen-size-x and/or touchscreen-size-y not set in dts\n");
471*4882a593Smuzhiyun 		return -EINVAL;
472*4882a593Smuzhiyun 	}
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	error = input_mt_init_slots(input_dev, MAX_SUPPORTED_FINGER_NUM,
475*4882a593Smuzhiyun 				    INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
476*4882a593Smuzhiyun 	if (error) {
477*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
478*4882a593Smuzhiyun 			"Failed to initialize MT slots: %d", error);
479*4882a593Smuzhiyun 		return error;
480*4882a593Smuzhiyun 	}
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	error = input_register_device(input_dev);
483*4882a593Smuzhiyun 	if (error) {
484*4882a593Smuzhiyun 		dev_err(&bt541->client->dev,
485*4882a593Smuzhiyun 			"Failed to register input device: %d", error);
486*4882a593Smuzhiyun 		return error;
487*4882a593Smuzhiyun 	}
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	return 0;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun 
zinitix_ts_probe(struct i2c_client * client)492*4882a593Smuzhiyun static int zinitix_ts_probe(struct i2c_client *client)
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun 	struct bt541_ts_data *bt541;
495*4882a593Smuzhiyun 	int error;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
498*4882a593Smuzhiyun 		dev_err(&client->dev,
499*4882a593Smuzhiyun 			"Failed to assert adapter's support for plain I2C.\n");
500*4882a593Smuzhiyun 		return -ENXIO;
501*4882a593Smuzhiyun 	}
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	bt541 = devm_kzalloc(&client->dev, sizeof(*bt541), GFP_KERNEL);
504*4882a593Smuzhiyun 	if (!bt541)
505*4882a593Smuzhiyun 		return -ENOMEM;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	bt541->client = client;
508*4882a593Smuzhiyun 	i2c_set_clientdata(client, bt541);
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun 	error = zinitix_init_regulators(bt541);
511*4882a593Smuzhiyun 	if (error) {
512*4882a593Smuzhiyun 		dev_err(&client->dev,
513*4882a593Smuzhiyun 			"Failed to initialize regulators: %d\n", error);
514*4882a593Smuzhiyun 		return error;
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	error = devm_request_threaded_irq(&client->dev, client->irq,
518*4882a593Smuzhiyun 					  NULL, zinitix_ts_irq_handler,
519*4882a593Smuzhiyun 					  IRQF_ONESHOT,
520*4882a593Smuzhiyun 					  client->name, bt541);
521*4882a593Smuzhiyun 	if (error) {
522*4882a593Smuzhiyun 		dev_err(&client->dev, "Failed to request IRQ: %d\n", error);
523*4882a593Smuzhiyun 		return error;
524*4882a593Smuzhiyun 	}
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	error = zinitix_init_input_dev(bt541);
527*4882a593Smuzhiyun 	if (error) {
528*4882a593Smuzhiyun 		dev_err(&client->dev,
529*4882a593Smuzhiyun 			"Failed to initialize input device: %d\n", error);
530*4882a593Smuzhiyun 		return error;
531*4882a593Smuzhiyun 	}
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	error = device_property_read_u32(&client->dev, "zinitix,mode",
534*4882a593Smuzhiyun 					 &bt541->zinitix_mode);
535*4882a593Smuzhiyun 	if (error < 0) {
536*4882a593Smuzhiyun 		/* fall back to mode 2 */
537*4882a593Smuzhiyun 		bt541->zinitix_mode = DEFAULT_TOUCH_POINT_MODE;
538*4882a593Smuzhiyun 	}
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	if (bt541->zinitix_mode != 2) {
541*4882a593Smuzhiyun 		/*
542*4882a593Smuzhiyun 		 * If there are devices that don't support mode 2, support
543*4882a593Smuzhiyun 		 * for other modes (0, 1) will be needed.
544*4882a593Smuzhiyun 		 */
545*4882a593Smuzhiyun 		dev_err(&client->dev,
546*4882a593Smuzhiyun 			"Malformed zinitix,mode property, must be 2 (supplied: %d)\n",
547*4882a593Smuzhiyun 			bt541->zinitix_mode);
548*4882a593Smuzhiyun 		return -EINVAL;
549*4882a593Smuzhiyun 	}
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	irq_set_status_flags(client->irq, IRQ_NOAUTOEN);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	return 0;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun 
zinitix_suspend(struct device * dev)556*4882a593Smuzhiyun static int __maybe_unused zinitix_suspend(struct device *dev)
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
559*4882a593Smuzhiyun 	struct bt541_ts_data *bt541 = i2c_get_clientdata(client);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	mutex_lock(&bt541->input_dev->mutex);
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 	if (bt541->input_dev->users)
564*4882a593Smuzhiyun 		zinitix_stop(bt541);
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	mutex_unlock(&bt541->input_dev->mutex);
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	return 0;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun 
zinitix_resume(struct device * dev)571*4882a593Smuzhiyun static int __maybe_unused zinitix_resume(struct device *dev)
572*4882a593Smuzhiyun {
573*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
574*4882a593Smuzhiyun 	struct bt541_ts_data *bt541 = i2c_get_clientdata(client);
575*4882a593Smuzhiyun 	int ret = 0;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	mutex_lock(&bt541->input_dev->mutex);
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	if (bt541->input_dev->users)
580*4882a593Smuzhiyun 		ret = zinitix_start(bt541);
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 	mutex_unlock(&bt541->input_dev->mutex);
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 	return ret;
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(zinitix_pm_ops, zinitix_suspend, zinitix_resume);
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun #ifdef CONFIG_OF
590*4882a593Smuzhiyun static const struct of_device_id zinitix_of_match[] = {
591*4882a593Smuzhiyun 	{ .compatible = "zinitix,bt541" },
592*4882a593Smuzhiyun 	{ }
593*4882a593Smuzhiyun };
594*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, zinitix_of_match);
595*4882a593Smuzhiyun #endif
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun static struct i2c_driver zinitix_ts_driver = {
598*4882a593Smuzhiyun 	.probe_new = zinitix_ts_probe,
599*4882a593Smuzhiyun 	.driver = {
600*4882a593Smuzhiyun 		.name = "Zinitix-TS",
601*4882a593Smuzhiyun 		.pm = &zinitix_pm_ops,
602*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(zinitix_of_match),
603*4882a593Smuzhiyun 	},
604*4882a593Smuzhiyun };
605*4882a593Smuzhiyun module_i2c_driver(zinitix_ts_driver);
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun MODULE_AUTHOR("Michael Srba <Michael.Srba@seznam.cz>");
608*4882a593Smuzhiyun MODULE_DESCRIPTION("Zinitix touchscreen driver");
609*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
610