xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/pixcir_i2c_ts.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Driver for Pixcir I2C touchscreen controllers.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2010-2011 Pixcir, Inc.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <asm/unaligned.h>
9*4882a593Smuzhiyun #include <linux/delay.h>
10*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
11*4882a593Smuzhiyun #include <linux/i2c.h>
12*4882a593Smuzhiyun #include <linux/input.h>
13*4882a593Smuzhiyun #include <linux/input/mt.h>
14*4882a593Smuzhiyun #include <linux/input/touchscreen.h>
15*4882a593Smuzhiyun #include <linux/interrupt.h>
16*4882a593Smuzhiyun #include <linux/of_device.h>
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define PIXCIR_MAX_SLOTS       5 /* Max fingers supported by driver */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /*
23*4882a593Smuzhiyun  * Register map
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun #define PIXCIR_REG_POWER_MODE	51
26*4882a593Smuzhiyun #define PIXCIR_REG_INT_MODE	52
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Power modes:
30*4882a593Smuzhiyun  * active: max scan speed
31*4882a593Smuzhiyun  * idle: lower scan speed with automatic transition to active on touch
32*4882a593Smuzhiyun  * halt: datasheet says sleep but this is more like halt as the chip
33*4882a593Smuzhiyun  *       clocks are cut and it can only be brought out of this mode
34*4882a593Smuzhiyun  *	 using the RESET pin.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun enum pixcir_power_mode {
37*4882a593Smuzhiyun 	PIXCIR_POWER_ACTIVE,
38*4882a593Smuzhiyun 	PIXCIR_POWER_IDLE,
39*4882a593Smuzhiyun 	PIXCIR_POWER_HALT,
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define PIXCIR_POWER_MODE_MASK	0x03
43*4882a593Smuzhiyun #define PIXCIR_POWER_ALLOW_IDLE (1UL << 2)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /*
46*4882a593Smuzhiyun  * Interrupt modes:
47*4882a593Smuzhiyun  * periodical: interrupt is asserted periodicaly
48*4882a593Smuzhiyun  * diff coordinates: interrupt is asserted when coordinates change
49*4882a593Smuzhiyun  * level on touch: interrupt level asserted during touch
50*4882a593Smuzhiyun  * pulse on touch: interrupt pulse asserted during touch
51*4882a593Smuzhiyun  *
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun enum pixcir_int_mode {
54*4882a593Smuzhiyun 	PIXCIR_INT_PERIODICAL,
55*4882a593Smuzhiyun 	PIXCIR_INT_DIFF_COORD,
56*4882a593Smuzhiyun 	PIXCIR_INT_LEVEL_TOUCH,
57*4882a593Smuzhiyun 	PIXCIR_INT_PULSE_TOUCH,
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define PIXCIR_INT_MODE_MASK	0x03
61*4882a593Smuzhiyun #define PIXCIR_INT_ENABLE	(1UL << 3)
62*4882a593Smuzhiyun #define PIXCIR_INT_POL_HIGH	(1UL << 2)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /**
65*4882a593Smuzhiyun  * struct pixcir_i2c_chip_data - chip related data
66*4882a593Smuzhiyun  * @max_fingers:	Max number of fingers reported simultaneously by h/w
67*4882a593Smuzhiyun  * @has_hw_ids:		Hardware supports finger tracking IDs
68*4882a593Smuzhiyun  *
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun struct pixcir_i2c_chip_data {
71*4882a593Smuzhiyun 	u8 max_fingers;
72*4882a593Smuzhiyun 	bool has_hw_ids;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct pixcir_i2c_ts_data {
76*4882a593Smuzhiyun 	struct i2c_client *client;
77*4882a593Smuzhiyun 	struct input_dev *input;
78*4882a593Smuzhiyun 	struct gpio_desc *gpio_attb;
79*4882a593Smuzhiyun 	struct gpio_desc *gpio_reset;
80*4882a593Smuzhiyun 	struct gpio_desc *gpio_enable;
81*4882a593Smuzhiyun 	struct gpio_desc *gpio_wake;
82*4882a593Smuzhiyun 	const struct pixcir_i2c_chip_data *chip;
83*4882a593Smuzhiyun 	struct touchscreen_properties prop;
84*4882a593Smuzhiyun 	bool running;
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct pixcir_report_data {
88*4882a593Smuzhiyun 	int num_touches;
89*4882a593Smuzhiyun 	struct input_mt_pos pos[PIXCIR_MAX_SLOTS];
90*4882a593Smuzhiyun 	int ids[PIXCIR_MAX_SLOTS];
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
pixcir_ts_parse(struct pixcir_i2c_ts_data * tsdata,struct pixcir_report_data * report)93*4882a593Smuzhiyun static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata,
94*4882a593Smuzhiyun 			    struct pixcir_report_data *report)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	u8 rdbuf[2 + PIXCIR_MAX_SLOTS * 5];
97*4882a593Smuzhiyun 	u8 wrbuf[1] = { 0 };
98*4882a593Smuzhiyun 	u8 *bufptr;
99*4882a593Smuzhiyun 	u8 touch;
100*4882a593Smuzhiyun 	int ret, i;
101*4882a593Smuzhiyun 	int readsize;
102*4882a593Smuzhiyun 	const struct pixcir_i2c_chip_data *chip = tsdata->chip;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	memset(report, 0, sizeof(struct pixcir_report_data));
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	i = chip->has_hw_ids ? 1 : 0;
107*4882a593Smuzhiyun 	readsize = 2 + tsdata->chip->max_fingers * (4 + i);
108*4882a593Smuzhiyun 	if (readsize > sizeof(rdbuf))
109*4882a593Smuzhiyun 		readsize = sizeof(rdbuf);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	ret = i2c_master_send(tsdata->client, wrbuf, sizeof(wrbuf));
112*4882a593Smuzhiyun 	if (ret != sizeof(wrbuf)) {
113*4882a593Smuzhiyun 		dev_err(&tsdata->client->dev,
114*4882a593Smuzhiyun 			"%s: i2c_master_send failed(), ret=%d\n",
115*4882a593Smuzhiyun 			__func__, ret);
116*4882a593Smuzhiyun 		return;
117*4882a593Smuzhiyun 	}
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	ret = i2c_master_recv(tsdata->client, rdbuf, readsize);
120*4882a593Smuzhiyun 	if (ret != readsize) {
121*4882a593Smuzhiyun 		dev_err(&tsdata->client->dev,
122*4882a593Smuzhiyun 			"%s: i2c_master_recv failed(), ret=%d\n",
123*4882a593Smuzhiyun 			__func__, ret);
124*4882a593Smuzhiyun 		return;
125*4882a593Smuzhiyun 	}
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	touch = rdbuf[0] & 0x7;
128*4882a593Smuzhiyun 	if (touch > tsdata->chip->max_fingers)
129*4882a593Smuzhiyun 		touch = tsdata->chip->max_fingers;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	report->num_touches = touch;
132*4882a593Smuzhiyun 	bufptr = &rdbuf[2];
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	for (i = 0; i < touch; i++) {
135*4882a593Smuzhiyun 		touchscreen_set_mt_pos(&report->pos[i], &tsdata->prop,
136*4882a593Smuzhiyun 				       get_unaligned_le16(bufptr),
137*4882a593Smuzhiyun 				       get_unaligned_le16(bufptr + 2));
138*4882a593Smuzhiyun 		if (chip->has_hw_ids) {
139*4882a593Smuzhiyun 			report->ids[i] = bufptr[4];
140*4882a593Smuzhiyun 			bufptr = bufptr + 5;
141*4882a593Smuzhiyun 		} else {
142*4882a593Smuzhiyun 			bufptr = bufptr + 4;
143*4882a593Smuzhiyun 		}
144*4882a593Smuzhiyun 	}
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun 
pixcir_ts_report(struct pixcir_i2c_ts_data * ts,struct pixcir_report_data * report)147*4882a593Smuzhiyun static void pixcir_ts_report(struct pixcir_i2c_ts_data *ts,
148*4882a593Smuzhiyun 			     struct pixcir_report_data *report)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	int slots[PIXCIR_MAX_SLOTS];
151*4882a593Smuzhiyun 	int n, i, slot;
152*4882a593Smuzhiyun 	struct device *dev = &ts->client->dev;
153*4882a593Smuzhiyun 	const struct pixcir_i2c_chip_data *chip = ts->chip;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	n = report->num_touches;
156*4882a593Smuzhiyun 	if (n > PIXCIR_MAX_SLOTS)
157*4882a593Smuzhiyun 		n = PIXCIR_MAX_SLOTS;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	if (!ts->chip->has_hw_ids)
160*4882a593Smuzhiyun 		input_mt_assign_slots(ts->input, slots, report->pos, n, 0);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	for (i = 0; i < n; i++) {
163*4882a593Smuzhiyun 		if (chip->has_hw_ids) {
164*4882a593Smuzhiyun 			slot = input_mt_get_slot_by_key(ts->input,
165*4882a593Smuzhiyun 							report->ids[i]);
166*4882a593Smuzhiyun 			if (slot < 0) {
167*4882a593Smuzhiyun 				dev_dbg(dev, "no free slot for id 0x%x\n",
168*4882a593Smuzhiyun 					report->ids[i]);
169*4882a593Smuzhiyun 				continue;
170*4882a593Smuzhiyun 			}
171*4882a593Smuzhiyun 		} else {
172*4882a593Smuzhiyun 			slot = slots[i];
173*4882a593Smuzhiyun 		}
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 		input_mt_slot(ts->input, slot);
176*4882a593Smuzhiyun 		input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, true);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 		input_report_abs(ts->input, ABS_MT_POSITION_X,
179*4882a593Smuzhiyun 				 report->pos[i].x);
180*4882a593Smuzhiyun 		input_report_abs(ts->input, ABS_MT_POSITION_Y,
181*4882a593Smuzhiyun 				 report->pos[i].y);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 		dev_dbg(dev, "%d: slot %d, x %d, y %d\n",
184*4882a593Smuzhiyun 			i, slot, report->pos[i].x, report->pos[i].y);
185*4882a593Smuzhiyun 	}
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	input_mt_sync_frame(ts->input);
188*4882a593Smuzhiyun 	input_sync(ts->input);
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
pixcir_ts_isr(int irq,void * dev_id)191*4882a593Smuzhiyun static irqreturn_t pixcir_ts_isr(int irq, void *dev_id)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *tsdata = dev_id;
194*4882a593Smuzhiyun 	struct pixcir_report_data report;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	while (tsdata->running) {
197*4882a593Smuzhiyun 		/* parse packet */
198*4882a593Smuzhiyun 		pixcir_ts_parse(tsdata, &report);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 		/* report it */
201*4882a593Smuzhiyun 		pixcir_ts_report(tsdata, &report);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 		if (gpiod_get_value_cansleep(tsdata->gpio_attb)) {
204*4882a593Smuzhiyun 			if (report.num_touches) {
205*4882a593Smuzhiyun 				/*
206*4882a593Smuzhiyun 				 * Last report with no finger up?
207*4882a593Smuzhiyun 				 * Do it now then.
208*4882a593Smuzhiyun 				 */
209*4882a593Smuzhiyun 				input_mt_sync_frame(tsdata->input);
210*4882a593Smuzhiyun 				input_sync(tsdata->input);
211*4882a593Smuzhiyun 			}
212*4882a593Smuzhiyun 			break;
213*4882a593Smuzhiyun 		}
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 		msleep(20);
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	return IRQ_HANDLED;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun 
pixcir_reset(struct pixcir_i2c_ts_data * tsdata)221*4882a593Smuzhiyun static void pixcir_reset(struct pixcir_i2c_ts_data *tsdata)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun 	if (!IS_ERR_OR_NULL(tsdata->gpio_reset)) {
224*4882a593Smuzhiyun 		gpiod_set_value_cansleep(tsdata->gpio_reset, 1);
225*4882a593Smuzhiyun 		ndelay(100);	/* datasheet section 1.2.3 says 80ns min. */
226*4882a593Smuzhiyun 		gpiod_set_value_cansleep(tsdata->gpio_reset, 0);
227*4882a593Smuzhiyun 		/* wait for controller ready. 100ms guess. */
228*4882a593Smuzhiyun 		msleep(100);
229*4882a593Smuzhiyun 	}
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun 
pixcir_set_power_mode(struct pixcir_i2c_ts_data * ts,enum pixcir_power_mode mode)232*4882a593Smuzhiyun static int pixcir_set_power_mode(struct pixcir_i2c_ts_data *ts,
233*4882a593Smuzhiyun 				 enum pixcir_power_mode mode)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun 	struct device *dev = &ts->client->dev;
236*4882a593Smuzhiyun 	int ret;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	if (mode == PIXCIR_POWER_ACTIVE || mode == PIXCIR_POWER_IDLE) {
239*4882a593Smuzhiyun 		if (ts->gpio_wake)
240*4882a593Smuzhiyun 			gpiod_set_value_cansleep(ts->gpio_wake, 1);
241*4882a593Smuzhiyun 	}
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	ret = i2c_smbus_read_byte_data(ts->client, PIXCIR_REG_POWER_MODE);
244*4882a593Smuzhiyun 	if (ret < 0) {
245*4882a593Smuzhiyun 		dev_err(dev, "%s: can't read reg %d : %d\n",
246*4882a593Smuzhiyun 			__func__, PIXCIR_REG_POWER_MODE, ret);
247*4882a593Smuzhiyun 		return ret;
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	ret &= ~PIXCIR_POWER_MODE_MASK;
251*4882a593Smuzhiyun 	ret |= mode;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* Always AUTO_IDLE */
254*4882a593Smuzhiyun 	ret |= PIXCIR_POWER_ALLOW_IDLE;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	ret = i2c_smbus_write_byte_data(ts->client, PIXCIR_REG_POWER_MODE, ret);
257*4882a593Smuzhiyun 	if (ret < 0) {
258*4882a593Smuzhiyun 		dev_err(dev, "%s: can't write reg %d : %d\n",
259*4882a593Smuzhiyun 			__func__, PIXCIR_REG_POWER_MODE, ret);
260*4882a593Smuzhiyun 		return ret;
261*4882a593Smuzhiyun 	}
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	if (mode == PIXCIR_POWER_HALT) {
264*4882a593Smuzhiyun 		if (ts->gpio_wake)
265*4882a593Smuzhiyun 			gpiod_set_value_cansleep(ts->gpio_wake, 0);
266*4882a593Smuzhiyun 	}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	return 0;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /*
272*4882a593Smuzhiyun  * Set the interrupt mode for the device i.e. ATTB line behaviour
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * @polarity : 1 for active high, 0 for active low.
275*4882a593Smuzhiyun  */
pixcir_set_int_mode(struct pixcir_i2c_ts_data * ts,enum pixcir_int_mode mode,bool polarity)276*4882a593Smuzhiyun static int pixcir_set_int_mode(struct pixcir_i2c_ts_data *ts,
277*4882a593Smuzhiyun 			       enum pixcir_int_mode mode, bool polarity)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun 	struct device *dev = &ts->client->dev;
280*4882a593Smuzhiyun 	int ret;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	ret = i2c_smbus_read_byte_data(ts->client, PIXCIR_REG_INT_MODE);
283*4882a593Smuzhiyun 	if (ret < 0) {
284*4882a593Smuzhiyun 		dev_err(dev, "%s: can't read reg %d : %d\n",
285*4882a593Smuzhiyun 			__func__, PIXCIR_REG_INT_MODE, ret);
286*4882a593Smuzhiyun 		return ret;
287*4882a593Smuzhiyun 	}
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	ret &= ~PIXCIR_INT_MODE_MASK;
290*4882a593Smuzhiyun 	ret |= mode;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	if (polarity)
293*4882a593Smuzhiyun 		ret |= PIXCIR_INT_POL_HIGH;
294*4882a593Smuzhiyun 	else
295*4882a593Smuzhiyun 		ret &= ~PIXCIR_INT_POL_HIGH;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	ret = i2c_smbus_write_byte_data(ts->client, PIXCIR_REG_INT_MODE, ret);
298*4882a593Smuzhiyun 	if (ret < 0) {
299*4882a593Smuzhiyun 		dev_err(dev, "%s: can't write reg %d : %d\n",
300*4882a593Smuzhiyun 			__func__, PIXCIR_REG_INT_MODE, ret);
301*4882a593Smuzhiyun 		return ret;
302*4882a593Smuzhiyun 	}
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	return 0;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /*
308*4882a593Smuzhiyun  * Enable/disable interrupt generation
309*4882a593Smuzhiyun  */
pixcir_int_enable(struct pixcir_i2c_ts_data * ts,bool enable)310*4882a593Smuzhiyun static int pixcir_int_enable(struct pixcir_i2c_ts_data *ts, bool enable)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun 	struct device *dev = &ts->client->dev;
313*4882a593Smuzhiyun 	int ret;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	ret = i2c_smbus_read_byte_data(ts->client, PIXCIR_REG_INT_MODE);
316*4882a593Smuzhiyun 	if (ret < 0) {
317*4882a593Smuzhiyun 		dev_err(dev, "%s: can't read reg %d : %d\n",
318*4882a593Smuzhiyun 			__func__, PIXCIR_REG_INT_MODE, ret);
319*4882a593Smuzhiyun 		return ret;
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	if (enable)
323*4882a593Smuzhiyun 		ret |= PIXCIR_INT_ENABLE;
324*4882a593Smuzhiyun 	else
325*4882a593Smuzhiyun 		ret &= ~PIXCIR_INT_ENABLE;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	ret = i2c_smbus_write_byte_data(ts->client, PIXCIR_REG_INT_MODE, ret);
328*4882a593Smuzhiyun 	if (ret < 0) {
329*4882a593Smuzhiyun 		dev_err(dev, "%s: can't write reg %d : %d\n",
330*4882a593Smuzhiyun 			__func__, PIXCIR_REG_INT_MODE, ret);
331*4882a593Smuzhiyun 		return ret;
332*4882a593Smuzhiyun 	}
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	return 0;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
pixcir_start(struct pixcir_i2c_ts_data * ts)337*4882a593Smuzhiyun static int pixcir_start(struct pixcir_i2c_ts_data *ts)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun 	struct device *dev = &ts->client->dev;
340*4882a593Smuzhiyun 	int error;
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	if (ts->gpio_enable) {
343*4882a593Smuzhiyun 		gpiod_set_value_cansleep(ts->gpio_enable, 1);
344*4882a593Smuzhiyun 		msleep(100);
345*4882a593Smuzhiyun 	}
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	/* LEVEL_TOUCH interrupt with active low polarity */
348*4882a593Smuzhiyun 	error = pixcir_set_int_mode(ts, PIXCIR_INT_LEVEL_TOUCH, 0);
349*4882a593Smuzhiyun 	if (error) {
350*4882a593Smuzhiyun 		dev_err(dev, "Failed to set interrupt mode: %d\n", error);
351*4882a593Smuzhiyun 		return error;
352*4882a593Smuzhiyun 	}
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	ts->running = true;
355*4882a593Smuzhiyun 	mb();	/* Update status before IRQ can fire */
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	/* enable interrupt generation */
358*4882a593Smuzhiyun 	error = pixcir_int_enable(ts, true);
359*4882a593Smuzhiyun 	if (error) {
360*4882a593Smuzhiyun 		dev_err(dev, "Failed to enable interrupt generation: %d\n",
361*4882a593Smuzhiyun 			error);
362*4882a593Smuzhiyun 		return error;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	return 0;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
pixcir_stop(struct pixcir_i2c_ts_data * ts)368*4882a593Smuzhiyun static int pixcir_stop(struct pixcir_i2c_ts_data *ts)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun 	int error;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	/* Disable interrupt generation */
373*4882a593Smuzhiyun 	error = pixcir_int_enable(ts, false);
374*4882a593Smuzhiyun 	if (error) {
375*4882a593Smuzhiyun 		dev_err(&ts->client->dev,
376*4882a593Smuzhiyun 			"Failed to disable interrupt generation: %d\n",
377*4882a593Smuzhiyun 			error);
378*4882a593Smuzhiyun 		return error;
379*4882a593Smuzhiyun 	}
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	/* Exit ISR if running, no more report parsing */
382*4882a593Smuzhiyun 	ts->running = false;
383*4882a593Smuzhiyun 	mb();	/* update status before we synchronize irq */
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	/* Wait till running ISR is complete */
386*4882a593Smuzhiyun 	synchronize_irq(ts->client->irq);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	if (ts->gpio_enable)
389*4882a593Smuzhiyun 		gpiod_set_value_cansleep(ts->gpio_enable, 0);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	return 0;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
pixcir_input_open(struct input_dev * dev)394*4882a593Smuzhiyun static int pixcir_input_open(struct input_dev *dev)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *ts = input_get_drvdata(dev);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	return pixcir_start(ts);
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun 
pixcir_input_close(struct input_dev * dev)401*4882a593Smuzhiyun static void pixcir_input_close(struct input_dev *dev)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *ts = input_get_drvdata(dev);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	pixcir_stop(ts);
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
pixcir_i2c_ts_suspend(struct device * dev)408*4882a593Smuzhiyun static int __maybe_unused pixcir_i2c_ts_suspend(struct device *dev)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
411*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client);
412*4882a593Smuzhiyun 	struct input_dev *input = ts->input;
413*4882a593Smuzhiyun 	int ret = 0;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	mutex_lock(&input->mutex);
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	if (device_may_wakeup(&client->dev)) {
418*4882a593Smuzhiyun 		if (!input->users) {
419*4882a593Smuzhiyun 			ret = pixcir_start(ts);
420*4882a593Smuzhiyun 			if (ret) {
421*4882a593Smuzhiyun 				dev_err(dev, "Failed to start\n");
422*4882a593Smuzhiyun 				goto unlock;
423*4882a593Smuzhiyun 			}
424*4882a593Smuzhiyun 		}
425*4882a593Smuzhiyun 	} else if (input->users) {
426*4882a593Smuzhiyun 		ret = pixcir_stop(ts);
427*4882a593Smuzhiyun 	}
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun unlock:
430*4882a593Smuzhiyun 	mutex_unlock(&input->mutex);
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	return ret;
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun 
pixcir_i2c_ts_resume(struct device * dev)435*4882a593Smuzhiyun static int __maybe_unused pixcir_i2c_ts_resume(struct device *dev)
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
438*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client);
439*4882a593Smuzhiyun 	struct input_dev *input = ts->input;
440*4882a593Smuzhiyun 	int ret = 0;
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	mutex_lock(&input->mutex);
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	if (device_may_wakeup(&client->dev)) {
445*4882a593Smuzhiyun 		if (!input->users) {
446*4882a593Smuzhiyun 			ret = pixcir_stop(ts);
447*4882a593Smuzhiyun 			if (ret) {
448*4882a593Smuzhiyun 				dev_err(dev, "Failed to stop\n");
449*4882a593Smuzhiyun 				goto unlock;
450*4882a593Smuzhiyun 			}
451*4882a593Smuzhiyun 		}
452*4882a593Smuzhiyun 	} else if (input->users) {
453*4882a593Smuzhiyun 		ret = pixcir_start(ts);
454*4882a593Smuzhiyun 	}
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun unlock:
457*4882a593Smuzhiyun 	mutex_unlock(&input->mutex);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	return ret;
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
463*4882a593Smuzhiyun 			 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume);
464*4882a593Smuzhiyun 
pixcir_i2c_ts_probe(struct i2c_client * client,const struct i2c_device_id * id)465*4882a593Smuzhiyun static int pixcir_i2c_ts_probe(struct i2c_client *client,
466*4882a593Smuzhiyun 			       const struct i2c_device_id *id)
467*4882a593Smuzhiyun {
468*4882a593Smuzhiyun 	struct device *dev = &client->dev;
469*4882a593Smuzhiyun 	struct pixcir_i2c_ts_data *tsdata;
470*4882a593Smuzhiyun 	struct input_dev *input;
471*4882a593Smuzhiyun 	int error;
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL);
474*4882a593Smuzhiyun 	if (!tsdata)
475*4882a593Smuzhiyun 		return -ENOMEM;
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	tsdata->chip = device_get_match_data(dev);
478*4882a593Smuzhiyun 	if (!tsdata->chip && id)
479*4882a593Smuzhiyun 		tsdata->chip = (const void *)id->driver_data;
480*4882a593Smuzhiyun 	if (!tsdata->chip) {
481*4882a593Smuzhiyun 		dev_err(dev, "can't locate chip data\n");
482*4882a593Smuzhiyun 		return -EINVAL;
483*4882a593Smuzhiyun 	}
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	input = devm_input_allocate_device(dev);
486*4882a593Smuzhiyun 	if (!input) {
487*4882a593Smuzhiyun 		dev_err(dev, "Failed to allocate input device\n");
488*4882a593Smuzhiyun 		return -ENOMEM;
489*4882a593Smuzhiyun 	}
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	tsdata->client = client;
492*4882a593Smuzhiyun 	tsdata->input = input;
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	input->name = client->name;
495*4882a593Smuzhiyun 	input->id.bustype = BUS_I2C;
496*4882a593Smuzhiyun 	input->open = pixcir_input_open;
497*4882a593Smuzhiyun 	input->close = pixcir_input_close;
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	input_set_capability(input, EV_ABS, ABS_MT_POSITION_X);
500*4882a593Smuzhiyun 	input_set_capability(input, EV_ABS, ABS_MT_POSITION_Y);
501*4882a593Smuzhiyun 	touchscreen_parse_properties(input, true, &tsdata->prop);
502*4882a593Smuzhiyun 	if (!input_abs_get_max(input, ABS_MT_POSITION_X) ||
503*4882a593Smuzhiyun 	    !input_abs_get_max(input, ABS_MT_POSITION_Y)) {
504*4882a593Smuzhiyun 		dev_err(dev, "Touchscreen size is not specified\n");
505*4882a593Smuzhiyun 		return -EINVAL;
506*4882a593Smuzhiyun 	}
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	error = input_mt_init_slots(input, tsdata->chip->max_fingers,
509*4882a593Smuzhiyun 				    INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
510*4882a593Smuzhiyun 	if (error) {
511*4882a593Smuzhiyun 		dev_err(dev, "Error initializing Multi-Touch slots\n");
512*4882a593Smuzhiyun 		return error;
513*4882a593Smuzhiyun 	}
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	input_set_drvdata(input, tsdata);
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	tsdata->gpio_attb = devm_gpiod_get(dev, "attb", GPIOD_IN);
518*4882a593Smuzhiyun 	if (IS_ERR(tsdata->gpio_attb)) {
519*4882a593Smuzhiyun 		error = PTR_ERR(tsdata->gpio_attb);
520*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
521*4882a593Smuzhiyun 			dev_err(dev, "Failed to request ATTB gpio: %d\n",
522*4882a593Smuzhiyun 				error);
523*4882a593Smuzhiyun 		return error;
524*4882a593Smuzhiyun 	}
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	tsdata->gpio_reset = devm_gpiod_get_optional(dev, "reset",
527*4882a593Smuzhiyun 						     GPIOD_OUT_LOW);
528*4882a593Smuzhiyun 	if (IS_ERR(tsdata->gpio_reset)) {
529*4882a593Smuzhiyun 		error = PTR_ERR(tsdata->gpio_reset);
530*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
531*4882a593Smuzhiyun 			dev_err(dev, "Failed to request RESET gpio: %d\n",
532*4882a593Smuzhiyun 				error);
533*4882a593Smuzhiyun 		return error;
534*4882a593Smuzhiyun 	}
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	tsdata->gpio_wake = devm_gpiod_get_optional(dev, "wake",
537*4882a593Smuzhiyun 						    GPIOD_OUT_HIGH);
538*4882a593Smuzhiyun 	if (IS_ERR(tsdata->gpio_wake)) {
539*4882a593Smuzhiyun 		error = PTR_ERR(tsdata->gpio_wake);
540*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
541*4882a593Smuzhiyun 			dev_err(dev, "Failed to get wake gpio: %d\n", error);
542*4882a593Smuzhiyun 		return error;
543*4882a593Smuzhiyun 	}
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 	tsdata->gpio_enable = devm_gpiod_get_optional(dev, "enable",
546*4882a593Smuzhiyun 						      GPIOD_OUT_HIGH);
547*4882a593Smuzhiyun 	if (IS_ERR(tsdata->gpio_enable)) {
548*4882a593Smuzhiyun 		error = PTR_ERR(tsdata->gpio_enable);
549*4882a593Smuzhiyun 		if (error != -EPROBE_DEFER)
550*4882a593Smuzhiyun 			dev_err(dev, "Failed to get enable gpio: %d\n", error);
551*4882a593Smuzhiyun 		return error;
552*4882a593Smuzhiyun 	}
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	if (tsdata->gpio_enable)
555*4882a593Smuzhiyun 		msleep(100);
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	error = devm_request_threaded_irq(dev, client->irq, NULL, pixcir_ts_isr,
558*4882a593Smuzhiyun 					  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
559*4882a593Smuzhiyun 					  client->name, tsdata);
560*4882a593Smuzhiyun 	if (error) {
561*4882a593Smuzhiyun 		dev_err(dev, "failed to request irq %d\n", client->irq);
562*4882a593Smuzhiyun 		return error;
563*4882a593Smuzhiyun 	}
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	pixcir_reset(tsdata);
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	/* Always be in IDLE mode to save power, device supports auto wake */
568*4882a593Smuzhiyun 	error = pixcir_set_power_mode(tsdata, PIXCIR_POWER_IDLE);
569*4882a593Smuzhiyun 	if (error) {
570*4882a593Smuzhiyun 		dev_err(dev, "Failed to set IDLE mode\n");
571*4882a593Smuzhiyun 		return error;
572*4882a593Smuzhiyun 	}
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun 	/* Stop device till opened */
575*4882a593Smuzhiyun 	error = pixcir_stop(tsdata);
576*4882a593Smuzhiyun 	if (error)
577*4882a593Smuzhiyun 		return error;
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	error = input_register_device(input);
580*4882a593Smuzhiyun 	if (error)
581*4882a593Smuzhiyun 		return error;
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	i2c_set_clientdata(client, tsdata);
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	return 0;
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun static const struct pixcir_i2c_chip_data pixcir_ts_data = {
589*4882a593Smuzhiyun 	.max_fingers = 2,
590*4882a593Smuzhiyun 	/* no hw id support */
591*4882a593Smuzhiyun };
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun static const struct pixcir_i2c_chip_data pixcir_tangoc_data = {
594*4882a593Smuzhiyun 	.max_fingers = 5,
595*4882a593Smuzhiyun 	.has_hw_ids = true,
596*4882a593Smuzhiyun };
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun static const struct i2c_device_id pixcir_i2c_ts_id[] = {
599*4882a593Smuzhiyun 	{ "pixcir_ts", (unsigned long) &pixcir_ts_data },
600*4882a593Smuzhiyun 	{ "pixcir_tangoc", (unsigned long) &pixcir_tangoc_data },
601*4882a593Smuzhiyun 	{ }
602*4882a593Smuzhiyun };
603*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id);
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun #ifdef CONFIG_OF
606*4882a593Smuzhiyun static const struct of_device_id pixcir_of_match[] = {
607*4882a593Smuzhiyun 	{ .compatible = "pixcir,pixcir_ts", .data = &pixcir_ts_data },
608*4882a593Smuzhiyun 	{ .compatible = "pixcir,pixcir_tangoc", .data = &pixcir_tangoc_data },
609*4882a593Smuzhiyun 	{ }
610*4882a593Smuzhiyun };
611*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, pixcir_of_match);
612*4882a593Smuzhiyun #endif
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun static struct i2c_driver pixcir_i2c_ts_driver = {
615*4882a593Smuzhiyun 	.driver = {
616*4882a593Smuzhiyun 		.name	= "pixcir_ts",
617*4882a593Smuzhiyun 		.pm	= &pixcir_dev_pm_ops,
618*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(pixcir_of_match),
619*4882a593Smuzhiyun 	},
620*4882a593Smuzhiyun 	.probe		= pixcir_i2c_ts_probe,
621*4882a593Smuzhiyun 	.id_table	= pixcir_i2c_ts_id,
622*4882a593Smuzhiyun };
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun module_i2c_driver(pixcir_i2c_ts_driver);
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun MODULE_AUTHOR("Jianchun Bian <jcbian@pixcir.com.cn>, Dequan Meng <dqmeng@pixcir.com.cn>");
627*4882a593Smuzhiyun MODULE_DESCRIPTION("Pixcir I2C Touchscreen Driver");
628*4882a593Smuzhiyun MODULE_LICENSE("GPL");
629