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