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 *)®_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 *)®_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