blob: d4bc5beb0203e5eece80c10e11d29cfb966cdf16 [file] [log] [blame]
Paul Changf5f30dc2018-07-18 19:37:26 +05301 /* Himax Android Driver Sample Code for Himax chipset
2*
3* Copyright (C) 2015 Himax Corporation.
4*
5* This software is licensed under the terms of the GNU General Public
6* License version 2, as published by the Free Software Foundation, and
7* may be copied, distributed, and modified under those terms.
8*
9* This program is distributed in the hope that it will be useful,
10* but WITHOUT ANY WARRANTY; without even the implied warranty of
11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12* GNU General Public License for more details.
13*
14*/
15
16#include "himax_common.h"
17#include "himax_ic.h"
18
19#define SUPPORT_FINGER_DATA_CHECKSUM 0x0F
20#define TS_WAKE_LOCK_TIMEOUT (2 * HZ)
21#define FRAME_COUNT 5
22
23#if defined(HX_AUTO_UPDATE_FW)
24 char *i_CTPM_firmware_name = "HX83100_Amber_0B01_030E.bin";
25 const struct firmware *i_CTPM_FW = NULL;
26#endif
27
28/*static int tpd_keys_local[HX_KEY_MAX_COUNT] = HX_KEY_ARRAY;
29// for Virtual key array */
30
31struct himax_ts_data *private_ts;
32struct himax_ic_data *ic_data;
33
34static int HX_TOUCH_INFO_POINT_CNT;
35
36static uint8_t vk_press = 0x00;
37static uint8_t AA_press = 0x00;
38static uint8_t EN_NoiseFilter = 0x00;
39static int hx_point_num; /*for himax_ts_work_func use*/
40static int p_point_num = 0xFFFF;
41static int tpd_key = 0x00;
42static int tpd_key_old = 0x00;
43static int probe_fail_flag;
44static bool config_load;
45static struct himax_config *config_selected;
46
47/*static int iref_number = 11;*/
48/*static bool iref_found = false;*/
49
50
51#if defined(CONFIG_FB)
52int fb_notifier_callback(struct notifier_block *self,
53 unsigned long event, void *data);
54#elif defined(CONFIG_HAS_EARLYSUSPEND)
55static void himax_ts_early_suspend(struct early_suspend *h);
56static void himax_ts_late_resume(struct early_suspend *h);
57#endif
58
59int himax_input_register(struct himax_ts_data *ts)
60{
61 int ret;
62
63 ts->input_dev = input_allocate_device();
64 if (ts->input_dev == NULL) {
65 ret = -ENOMEM;
66 E("%s: Failed to allocate input device\n", __func__);
67 return ret;
68 }
69 ts->input_dev->name = "himax-touchscreen";
70
71 set_bit(EV_SYN, ts->input_dev->evbit);
72 set_bit(EV_ABS, ts->input_dev->evbit);
73 set_bit(EV_KEY, ts->input_dev->evbit);
74
75 set_bit(KEY_BACK, ts->input_dev->keybit);
76 set_bit(KEY_HOME, ts->input_dev->keybit);
77 set_bit(KEY_MENU, ts->input_dev->keybit);
78 set_bit(KEY_SEARCH, ts->input_dev->keybit);
79#if defined(HX_SMART_WAKEUP)
80 set_bit(KEY_POWER, ts->input_dev->keybit);
81 set_bit(KEY_CUST_01, ts->input_dev->keybit);
82 set_bit(KEY_CUST_02, ts->input_dev->keybit);
83 set_bit(KEY_CUST_03, ts->input_dev->keybit);
84 set_bit(KEY_CUST_04, ts->input_dev->keybit);
85 set_bit(KEY_CUST_05, ts->input_dev->keybit);
86 set_bit(KEY_CUST_06, ts->input_dev->keybit);
87 set_bit(KEY_CUST_07, ts->input_dev->keybit);
88 set_bit(KEY_CUST_08, ts->input_dev->keybit);
89 set_bit(KEY_CUST_09, ts->input_dev->keybit);
90 set_bit(KEY_CUST_10, ts->input_dev->keybit);
91 set_bit(KEY_CUST_11, ts->input_dev->keybit);
92 set_bit(KEY_CUST_12, ts->input_dev->keybit);
93 set_bit(KEY_CUST_13, ts->input_dev->keybit);
94 set_bit(KEY_CUST_14, ts->input_dev->keybit);
95 set_bit(KEY_CUST_15, ts->input_dev->keybit);
96#endif
97 set_bit(BTN_TOUCH, ts->input_dev->keybit);
98
99 set_bit(KEY_F10, ts->input_dev->keybit);
100
101 set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);
102
103 if (ts->protocol_type == PROTOCOL_TYPE_A) {
104 /*ts->input_dev->mtsize = ts->nFinger_support;*/
105 input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID,
106 0, 3, 0, 0);
107 } else {/* PROTOCOL_TYPE_B */
108 set_bit(MT_TOOL_FINGER, ts->input_dev->keybit);
109 input_mt_init_slots(ts->input_dev, ts->nFinger_support, 0);
110 }
111
112 I("input_set_abs_params: mix_x %d, max_x %d, min_y %d, max_y %d\n",
113 ts->pdata->abs_x_min, ts->pdata->abs_x_max,
114 ts->pdata->abs_y_min, ts->pdata->abs_y_max);
115
116 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
117 ts->pdata->abs_x_min, ts->pdata->abs_x_max, ts->pdata->abs_x_fuzz, 0);
118 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
119 ts->pdata->abs_y_min, ts->pdata->abs_y_max, ts->pdata->abs_y_fuzz, 0);
120 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR,
121 ts->pdata->abs_pressure_min, ts->pdata->abs_pressure_max,
122 ts->pdata->abs_pressure_fuzz, 0);
123 input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE,
124 ts->pdata->abs_pressure_min, ts->pdata->abs_pressure_max,
125 ts->pdata->abs_pressure_fuzz, 0);
126 input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR,
127 ts->pdata->abs_width_min, ts->pdata->abs_width_max,
128 ts->pdata->abs_pressure_fuzz, 0);
129
130/*input_set_abs_params(ts->input_dev, ABS_MT_AMPLITUDE, 0,
131((ts->pdata->abs_pressure_max << 16) | ts->pdata->abs_width_max), 0, 0);*/
132/*input_set_abs_params(ts->input_dev, ABS_MT_POSITION, 0,
133(BIT(31) | (ts->pdata->abs_x_max << 16) | ts->pdata->abs_y_max), 0, 0);*/
134
135 return input_register_device(ts->input_dev);
136}
137
138static void calcDataSize(uint8_t finger_num)
139{
140 struct himax_ts_data *ts_data = private_ts;
141
142 ts_data->coord_data_size = 4 * finger_num;
143 ts_data->area_data_size = ((finger_num / 4) +
144 (finger_num % 4 ? 1 : 0)) * 4;
145 ts_data->raw_data_frame_size = 128 -
146 ts_data->coord_data_size -
147 ts_data->area_data_size - 4 - 4 - 1;
148
149 ts_data->raw_data_nframes =
150 ((uint32_t)ts_data->x_channel *
151 ts_data->y_channel + ts_data->x_channel + ts_data->y_channel) /
152 ts_data->raw_data_frame_size + (((uint32_t)ts_data->x_channel *
153 ts_data->y_channel + ts_data->x_channel + ts_data->y_channel) %
154 ts_data->raw_data_frame_size) ? 1 : 0;
155
156 I("%s: coord_data_size: %d, area_data_size:%d",
157 __func__, ts_data->coord_data_size, ts_data->area_data_size);
158 I("raw_data_frame_size:%d, raw_data_nframes:%d",
159 ts_data->raw_data_frame_size, ts_data->raw_data_nframes);
160}
161
162static void calculate_point_number(void)
163{
164 HX_TOUCH_INFO_POINT_CNT = ic_data->HX_MAX_PT * 4;
165
166 if ((ic_data->HX_MAX_PT % 4) == 0)
167 HX_TOUCH_INFO_POINT_CNT += (ic_data->HX_MAX_PT / 4) * 4;
168 else
169 HX_TOUCH_INFO_POINT_CNT += ((ic_data->HX_MAX_PT / 4) + 1) * 4;
170}
171
172/*#if 0*/
173#ifdef HX_EN_CHECK_PATCH
174static int himax_read_Sensor_ID(struct i2c_client *client)
175{
176 uint8_t val_high[1], val_low[1], ID0 = 0, ID1 = 0;
177 char data[3];
178 const int normalRetry = 10;
179 int sensor_id;
180
181 data[0] = 0x56; data[1] = 0x02;
182 data[2] = 0x02;/*ID pin PULL High*/
183 i2c_himax_master_write(client, &data[0], 3, normalRetry);
184 usleep(1000);
185
186 /*read id pin high*/
187 i2c_himax_read(client, 0x57, val_high, 1, normalRetry);
188
189 data[0] = 0x56; data[1] = 0x01;
190 data[2] = 0x01;/*ID pin PULL Low*/
191 i2c_himax_master_write(client, &data[0], 3, normalRetry);
192 usleep(1000);
193
194 /*read id pin low*/
195 i2c_himax_read(client, 0x57, val_low, 1, normalRetry);
196
197 if ((val_high[0] & 0x01) == 0)
198 ID0 = 0x02;/*GND*/
199 else if ((val_low[0] & 0x01) == 0)
200 ID0 = 0x01;/*Floating*/
201 else
202 ID0 = 0x04;/*VCC*/
203
204 if ((val_high[0] & 0x02) == 0)
205 ID1 = 0x02;/*GND*/
206 else if ((val_low[0] & 0x02) == 0)
207 ID1 = 0x01;/*Floating*/
208 else
209 ID1 = 0x04;/*VCC*/
210 if ((ID0 == 0x04) && (ID1 != 0x04)) {
211 data[0] = 0x56; data[1] = 0x02;
212 data[2] = 0x01;/*ID pin PULL High,Low*/
213 i2c_himax_master_write(client,
214 &data[0], 3, normalRetry);
215 usleep(1000);
216
217 } else if ((ID0 != 0x04) && (ID1 == 0x04)) {
218 data[0] = 0x56; data[1] = 0x01;
219 data[2] = 0x02;/*ID pin PULL Low,High*/
220 i2c_himax_master_write(client,
221 &data[0], 3, normalRetry);
222 usleep(1000);
223
224 } else if ((ID0 == 0x04) && (ID1 == 0x04)) {
225 data[0] = 0x56; data[1] = 0x02;
226 data[2] = 0x02;/*ID pin PULL High,High*/
227 i2c_himax_master_write(client,
228 &data[0], 3, normalRetry);
229 usleep(1000);
230
231 }
232 sensor_id = (ID1<<4)|ID0;
233
234 data[0] = 0xE4; data[1] = sensor_id;
235 i2c_himax_master_write(client,
236 &data[0], 2, normalRetry);/*Write to MCU*/
237 usleep(1000);
238
239 return sensor_id;
240
241}
242#endif
243static void himax_power_on_initCMD(struct i2c_client *client)
244{
245 I("%s:\n", __func__);
246 himax_touch_information(client);
247 /*himax_sense_on(private_ts->client, 0x01);//1=Flash, 0=SRAM */
248}
249
250#ifdef HX_AUTO_UPDATE_FW
251static int i_update_FW(void)
252{
253 int upgrade_times = 0;
254 int fullFileLength = 0;
255 int i_FW_VER = 0, i_CFG_VER = 0;
256 int ret = -1, result = 0;
257 /*uint8_t tmp_addr[4];*/
258 /*uint8_t tmp_data[4];*/
259 int CRC_from_FW = 0;
260 int CRC_Check_result = 0;
261
262 ret = himax_load_CRC_bin_file(private_ts->client);
263 if (ret < 0) {
264 E("%s: himax_load_CRC_bin_file fail Error Code=%d.\n",
265 __func__, ret);
266 ret = -1;
267 return ret;
268 }
269 I("file name = %s\n", i_CTPM_firmware_name);
270 ret = request_firmware(&i_CTPM_FW,
271 i_CTPM_firmware_name, private_ts->dev);
272 if (ret < 0) {
273 E("%s,fail in line%d error code=%d\n",
274 __func__, __LINE__, ret);
275 ret = -2;
276 return ret;
277 }
278
279 if (i_CTPM_FW == NULL) {
280 I("%s: i_CTPM_FW = NULL\n", __func__);
281 ret = -3;
282 return ret;
283 }
284 fullFileLength = i_CTPM_FW->size;
285
286 i_FW_VER = i_CTPM_FW->data[FW_VER_MAJ_FLASH_ADDR]<<8
287 | i_CTPM_FW->data[FW_VER_MIN_FLASH_ADDR];
288 i_CFG_VER = i_CTPM_FW->data[CFG_VER_MAJ_FLASH_ADDR]<<8
289 | i_CTPM_FW->data[CFG_VER_MIN_FLASH_ADDR];
290
291 I("%s: i_fullFileLength = %d\n", __func__, fullFileLength);
292
293 himax_sense_off(private_ts->client);
294 msleep(500);
295
296 CRC_from_FW = himax_check_CRC(private_ts->client, fw_image_64k);
297 CRC_Check_result =
298 Calculate_CRC_with_AP((unsigned char *)i_CTPM_FW->data,
299 CRC_from_FW, fw_image_64k);
300 I("%s: Check sum result = %d\n", __func__, CRC_Check_result);
301 /*I("%s: ic_data->vendor_fw_ver = %X, i_FW_VER = %X,\n",
302 __func__, ic_data->vendor_fw_ver, i_FW_VER);*/
303 /*I("%s: ic_data->vendor_config_ver = %X, i_CFG_VER = %X,\n",
304 __func__, ic_data->vendor_config_ver, i_CFG_VER);*/
305
306 if ((CRC_Check_result == 0) ||
307 (ic_data->vendor_fw_ver < i_FW_VER) ||
308 (ic_data->vendor_config_ver < i_CFG_VER)) {
309 himax_int_enable(private_ts->client->irq, 0);
310update_retry:
311 if (fullFileLength == FW_SIZE_60k) {
312 ret = fts_ctpm_fw_upgrade_with_sys_fs_60k
313 (private_ts->client,
314 (unsigned char *)i_CTPM_FW->data,
315 fullFileLength, false);
316 } else if (fullFileLength == FW_SIZE_64k) {
317 ret = fts_ctpm_fw_upgrade_with_sys_fs_64k
318 (private_ts->client,
319 (unsigned char *)i_CTPM_FW->data,
320 fullFileLength, false);
321 } else if (fullFileLength == FW_SIZE_124k) {
322 ret = fts_ctpm_fw_upgrade_with_sys_fs_124k
323 (private_ts->client,
324 (unsigned char *)i_CTPM_FW->data,
325 fullFileLength, false);
326 } else if (fullFileLength == FW_SIZE_128k) {
327 ret = fts_ctpm_fw_upgrade_with_sys_fs_128k
328 (private_ts->client,
329 (unsigned char *)i_CTPM_FW->data,
330 fullFileLength, false);
331 }
332 if (ret == 0) {
333 upgrade_times++;
334 E("%s: TP upgrade error, upgrade_times = %d\n",
335 __func__, upgrade_times);
336 if (upgrade_times < 3)
337 goto update_retry;
338 else {
339 himax_sense_on(private_ts->client, 0x01);
340 msleep(120);
341#ifdef HX_ESD_WORKAROUND
342 HX_ESD_RESET_ACTIVATE = 1;
343#endif
344 result = -1;/*upgrade fail*/
345 }
346 } else if (ret == 1) {
347 /*
348 // 1. Set DDREG_Req = 1 (0x9000_0020 = 0x0000_0001)
349 (Lock register R/W from driver)
350 tmp_addr[3] = 0x90; tmp_addr[2] = 0x00;
351 tmp_addr[1] = 0x00; tmp_addr[0] = 0x20;
352 tmp_data[3] = 0x00; tmp_data[2] = 0x00;
353 tmp_data[1] = 0x00; tmp_data[0] = 0x01;
354 himax_register_write(private_ts->client,
355 tmp_addr, 1, tmp_data);
356
357 // 2. Write driver initial code condition
358 //write value from AHB I2C:0x8001_C603 = 0x000000FF
359 tmp_addr[3] = 0x80; tmp_addr[2] = 0x01;
360 tmp_addr[1] = 0xC6; tmp_addr[0] = 0x03;
361 tmp_data[3] = 0x00; tmp_data[2] = 0x00;
362 tmp_data[1] = 0x00; tmp_data[0] = 0xFF;
363 himax_register_write(private_ts->client,
364 tmp_addr, 1, tmp_data);
365
366 // 1. Set DDREG_Req = 0(0x9000_0020 = 0x0000_0001)
367 (Lock register R/W from driver)
368 tmp_addr[3] = 0x90; tmp_addr[2] = 0x00;
369 tmp_addr[1] = 0x00; tmp_addr[0] = 0x20;
370 tmp_data[3] = 0x00; tmp_data[2] = 0x00;
371 tmp_data[1] = 0x00; tmp_data[0] = 0x00;
372 himax_register_write(private_ts->client,
373 tmp_addr, 1, tmp_data);
374 */
375 himax_sense_on(private_ts->client, 0x01);
376 msleep(120);
377#ifdef HX_ESD_WORKAROUND
378 HX_ESD_RESET_ACTIVATE = 1;
379#endif
380
381 ic_data->vendor_fw_ver = i_FW_VER;
382 ic_data->vendor_config_ver = i_CFG_VER;
383 result = 1;/*upgrade success*/
384 I("%s: TP upgrade OK\n", __func__);
385 }
386
387 himax_int_enable(private_ts->client->irq, 1);
388 return result;
389
390 } else {
391 himax_sense_on(private_ts->client, 0x01);
392 return 0;/*NO upgrade*/
393 }
394}
395#endif
396
397#ifdef HX_RST_PIN_FUNC
398void himax_HW_reset(uint8_t loadconfig, uint8_t int_off)
399{
400 struct himax_ts_data *ts = private_ts;
401 int ret = 0;
402
403 return;
404 if (ts->rst_gpio) {
405 if (int_off) {
406 if (ts->use_irq)
407 himax_int_enable(private_ts->client->irq, 0);
408 else {
409 hrtimer_cancel(&ts->timer);
410 ret = cancel_work_sync(&ts->work);
411 }
412 }
413
414 I("%s: Now reset the Touch chip.\n", __func__);
415
416 himax_rst_gpio_set(ts->rst_gpio, 0);
417 msleep(20);
418 himax_rst_gpio_set(ts->rst_gpio, 1);
419 msleep(20);
420
421 if (loadconfig)
422 himax_loadSensorConfig(private_ts->client,
423 private_ts->pdata);
424
425 if (int_off) {
426 if (ts->use_irq)
427 himax_int_enable(private_ts->client->irq, 1);
428 else
429 hrtimer_start(&ts->timer,
430 ktime_set(1, 0), HRTIMER_MODE_REL);
431 }
432 }
433}
434#endif
435
436int himax_loadSensorConfig(struct i2c_client *client,
437struct himax_i2c_platform_data *pdata)
438{
439 int err = -1;
440
441 if (!client) {
442 E("%s: Necessary parameters client are null!\n", __func__);
443 return err;
444 }
445 if (config_load == false) {
446 config_selected = kzalloc(sizeof(*config_selected), GFP_KERNEL);
447 if (config_selected == NULL) {
448 E("%s: alloc config_selected fail!\n", __func__);
449 return err;
450 }
451 }
452 himax_power_on_initCMD(client);
453
454 himax_int_enable(client->irq, 0);
455 himax_read_FW_ver(client);
456#ifdef HX_RST_PIN_FUNC
457 himax_HW_reset(true, false);
458#endif
459 himax_int_enable(client->irq, 1);
460 I("FW_VER : %X\n", ic_data->vendor_fw_ver);
461
462 ic_data->vendor_sensor_id = 0x2602;
463 I("sensor_id=%x.\n", ic_data->vendor_sensor_id);
464
465 himax_sense_on(private_ts->client, 0x01);/*1=Flash, 0=SRAM*/
466 msleep(120);
467#ifdef HX_ESD_WORKAROUND
468 HX_ESD_RESET_ACTIVATE = 1;
469#endif
470 I("%s: initialization complete\n", __func__);
471
472 return 1;
473}
474
475#ifdef HX_ESD_WORKAROUND
476void ESD_HW_REST(void)
477{
478 I("START_Himax TP: ESD - Reset\n");
479
480 HX_report_ESD_event();
481 ESD_00_counter = 0;
482 ESD_00_Flag = 0;
483 /*************************************/
484 if (private_ts->protocol_type == PROTOCOL_TYPE_A)
485 input_mt_sync(private_ts->input_dev);
486 input_report_key(private_ts->input_dev, BTN_TOUCH, 0);
487 input_sync(private_ts->input_dev);
488 /*************************************/
489
490 I("END_Himax TP: ESD - Reset\n");
491}
492#endif
493#ifdef HX_HIGH_SENSE
494void himax_set_HSEN_func(struct i2c_client *client, uint8_t HSEN_enable)
495{
496 uint8_t tmp_data[4];
497
498 if (HSEN_enable) {
499 I(" %s in", __func__);
500HSEN_bit_retry:
501 himax_set_HSEN_enable(client, HSEN_enable);
502 msleep(20);
503 himax_get_HSEN_enable(client, tmp_data);
504 I("%s: Read HSEN bit data[0]=%x data[1]=%x",
505 __func__, tmp_data[0], tmp_data[1]);
506 I("data[2]=%x data[3]=%x\n",
507 tmp_data[2], tmp_data[3]);
508
509 if (tmp_data[0] != 0x01) {
510 I("%s: retry HSEN bit write data[0]=%x\n",
511 __func__, tmp_data[0]);
512 goto HSEN_bit_retry;
513 }
514 }
515}
516
517static void himax_HSEN_func(struct work_struct *work)
518{
519 struct himax_ts_data *ts =
520 container_of(work, struct himax_ts_data, hsen_work.work);
521
522 himax_set_HSEN_func(ts->client, ts->HSEN_enable);
523}
524
525#endif
526
527#ifdef HX_SMART_WAKEUP
528#ifdef HX_GESTURE_TRACK
529static void gest_pt_log_coordinate(int rx, int tx)
530{
531 /*driver report x y with range 0 - 255*/
532 /* And we scale it up to x/y coordinates*/
533 gest_pt_x[gest_pt_cnt] = rx * (ic_data->HX_X_RES) / 255;
534 gest_pt_y[gest_pt_cnt] = tx * (ic_data->HX_Y_RES) / 255;
535}
536#endif
537static int himax_parse_wake_event(struct himax_ts_data *ts)
538{
539 uint8_t buf[64];
540 unsigned char check_sum_cal = 0;
541#ifdef HX_GESTURE_TRACK
542 int tmp_max_x = 0x00, tmp_min_x = 0xFFFF,
543 tmp_max_y = 0x00, tmp_min_y = 0xFFFF;
544 int gest_len;
545#endif
546 int i = 0, check_FC = 0, gesture_flag = 0;
547
548 himax_burst_enable(ts->client, 0);
549 himax_read_event_stack(ts->client, buf, 56);
550
551 for (i = 0 ; i < GEST_PTLG_ID_LEN ; i++) {
552 if (check_FC == 0) {
553 if ((buf[0] != 0x00) &&
554 ((buf[0] <= 0x0F) || (buf[0] == 0x80))) {
555 check_FC = 1;
556 gesture_flag = buf[i];
557 } else {
558 check_FC = 0;
559 I("ID START at %x,value = %x skip event\n",
560 i, buf[i]);
561 break;
562 }
563 } else {
564 if (buf[i] != gesture_flag) {
565 check_FC = 0;
566 I("ID NOT same %x != %x So STOP parse event\n",
567 buf[i], gesture_flag);
568 break;
569 }
570 }
571
572 I("0x%2.2X ", buf[i]);
573 if (i % 8 == 7)
574 I("\n");
575 }
576 I("Himax gesture_flag= %x\n", gesture_flag);
577 I("Himax check_FC is %d\n", check_FC);
578
579 if (check_FC == 0)
580 return 0;
581 if (buf[GEST_PTLG_ID_LEN] != GEST_PTLG_HDR_ID1
582 || buf[GEST_PTLG_ID_LEN+1] != GEST_PTLG_HDR_ID2)
583 return 0;
584 for (i = 0 ; i < (GEST_PTLG_ID_LEN + GEST_PTLG_HDR_LEN) ; i++) {
585 I("P[%x]=0x%2.2X\n", i, buf[i]);
586 I("checksum=0x%2.2X\n", check_sum_cal);
587 check_sum_cal += buf[i];
588 }
589 if ((check_sum_cal != 0x00)) {
590 I(" %s : check_sum_cal: 0x%02X\n", __func__ , check_sum_cal);
591 return 0;
592 }
593#ifdef HX_GESTURE_TRACK
594 if (buf[GEST_PTLG_ID_LEN] == GEST_PTLG_HDR_ID1
595 && buf[GEST_PTLG_ID_LEN+1] == GEST_PTLG_HDR_ID2) {
596 gest_len = buf[GEST_PTLG_ID_LEN + 2];
597 I("gest_len = %d ", gest_len);
598 i = 0;
599 gest_pt_cnt = 0;
600 I("gest doornidate start\n %s", __func__);
601 while (i < (gest_len + 1) / 2) {
602 gest_pt_log_coordinate
603 (buf[GEST_PTLG_ID_LEN + 4 + i * 2],
604 buf[GEST_PTLG_ID_LEN + 4 + i * 2 + 1]);
605 i++;
606
607 I("gest_pt_x[%d]=%d\n",
608 gest_pt_cnt, gest_pt_x[gest_pt_cnt]);
609 I("gest_pt_y[%d]=%d\n",
610 gest_pt_cnt, gest_pt_y[gest_pt_cnt]);
611
612 gest_pt_cnt += 1;
613 }
614 if (gest_pt_cnt) {
615 for (i = 0 ; i < gest_pt_cnt ; i++) {
616 if (tmp_max_x < gest_pt_x[i])
617 tmp_max_x = gest_pt_x[i];
618 if (tmp_min_x > gest_pt_x[i])
619 tmp_min_x = gest_pt_x[i];
620 if (tmp_max_y < gest_pt_y[i])
621 tmp_max_y = gest_pt_y[i];
622 if (tmp_min_y > gest_pt_y[i])
623 tmp_min_y = gest_pt_y[i];
624 }
625 I("gest_point x_min= %d, x_max= %d\n",
626 tmp_min_x, tmp_max_x);
627 I("y_min= %d, y_max= %d\n",
628 tmp_min_y, tmp_max_y);
629 gest_start_x = gest_pt_x[0];
630 gn_gesture_coor[0] = gest_start_x;
631 gest_start_y = gest_pt_y[0];
632 gn_gesture_coor[1] = gest_start_y;
633 gest_end_x = gest_pt_x[gest_pt_cnt - 1];
634 gn_gesture_coor[2] = gest_end_x;
635 gest_end_y = gest_pt_y[gest_pt_cnt - 1];
636 gn_gesture_coor[3] = gest_end_y;
637 gest_width = tmp_max_x - tmp_min_x;
638 gn_gesture_coor[4] = gest_width;
639 gest_height = tmp_max_y - tmp_min_y;
640 gn_gesture_coor[5] = gest_height;
641 gest_mid_x = (tmp_max_x + tmp_min_x) / 2;
642 gn_gesture_coor[6] = gest_mid_x;
643 gest_mid_y = (tmp_max_y + tmp_min_y) / 2;
644 gn_gesture_coor[7] = gest_mid_y;
645 /*gest_up_x*/
646 gn_gesture_coor[8] = gest_mid_x;
647 /*gest_up_y*/
648 gn_gesture_coor[9] = gest_mid_y - gest_height / 2;
649 /*gest_down_x*/
650 gn_gesture_coor[10] = gest_mid_x;
651 /*gest_down_y*/
652 gn_gesture_coor[11] = gest_mid_y + gest_height / 2;
653 /*gest_left_x*/
654 gn_gesture_coor[12] = gest_mid_x - gest_width / 2;
655 /*gest_left_y*/
656 gn_gesture_coor[13] = gest_mid_y;
657 /*gest_right_x*/
658 gn_gesture_coor[14] = gest_mid_x + gest_width / 2;
659 /*gest_right_y*/
660 gn_gesture_coor[15] = gest_mid_y;
661
662 }
663
664 }
665#endif
666 if (gesture_flag != 0x80) {
667 if (!ts->gesture_cust_en[gesture_flag]) {
668 I("%s NOT report customer key\n ", __func__);
669 return 0;/*NOT report customer key*/
670 }
671 } else {
672 if (!ts->gesture_cust_en[0]) {
673 I("%s NOT report report double click\n", __func__);
674 return 0;/*NOT report power key*/
675 }
676 }
677
678 if (gesture_flag == 0x80)
679 return EV_GESTURE_PWR;
680 else
681 return gesture_flag;
682}
683
684void himax_wake_check_func(void)
685{
686 int ret_event = 0, KEY_EVENT = 0;
687
688 ret_event = himax_parse_wake_event(private_ts);
689 switch (ret_event) {
690 case EV_GESTURE_PWR:
691 KEY_EVENT = KEY_POWER;
692 break;
693 case EV_GESTURE_01:
694 KEY_EVENT = KEY_CUST_01;
695 break;
696 case EV_GESTURE_02:
697 KEY_EVENT = KEY_CUST_02;
698 break;
699 case EV_GESTURE_03:
700 KEY_EVENT = KEY_CUST_03;
701 break;
702 case EV_GESTURE_04:
703 KEY_EVENT = KEY_CUST_04;
704 break;
705 case EV_GESTURE_05:
706 KEY_EVENT = KEY_CUST_05;
707 break;
708 case EV_GESTURE_06:
709 KEY_EVENT = KEY_CUST_06;
710 break;
711 case EV_GESTURE_07:
712 KEY_EVENT = KEY_CUST_07;
713 break;
714 case EV_GESTURE_08:
715 KEY_EVENT = KEY_CUST_08;
716 break;
717 case EV_GESTURE_09:
718 KEY_EVENT = KEY_CUST_09;
719 break;
720 case EV_GESTURE_10:
721 KEY_EVENT = KEY_CUST_10;
722 break;
723 case EV_GESTURE_11:
724 KEY_EVENT = KEY_CUST_11;
725 break;
726 case EV_GESTURE_12:
727 KEY_EVENT = KEY_CUST_12;
728 break;
729 case EV_GESTURE_13:
730 KEY_EVENT = KEY_CUST_13;
731 break;
732 case EV_GESTURE_14:
733 KEY_EVENT = KEY_CUST_14;
734 break;
735 case EV_GESTURE_15:
736 KEY_EVENT = KEY_CUST_15;
737 break;
738 }
739 if (ret_event) {
740 I(" %s SMART WAKEUP KEY event %x press\n",
741 __func__, KEY_EVENT);
742 input_report_key(private_ts->input_dev, KEY_EVENT, 1);
743 input_sync(private_ts->input_dev);
744 /*msleep(100);*/
745 I(" %s SMART WAKEUP KEY event %x release\n",
746 __func__, KEY_EVENT);
747 input_report_key(private_ts->input_dev, KEY_EVENT, 0);
748 input_sync(private_ts->input_dev);
749 FAKE_POWER_KEY_SEND = true;
750#ifdef HX_GESTURE_TRACK
751 I("gest_start_x= %d, gest_start_y= %d\n",
752 gest_start_x, gest_start_y);
753 I("gest_end_x= %d, gest_end_y= %d\n",
754 gest_end_x, gest_end_y);
755 I("gest_width= %d, gest_height= %d\n",
756 gest_width, gest_height);
757 I("gest_mid_x= %d, gest_mid_y= %d\n",
758 gest_mid_x, gest_mid_y);
759 I("gest_up_x= %d, gest_up_y= %d\n",
760 gn_gesture_coor[8], gn_gesture_coor[9]);
761 I("gest_down_x= %d, gest_down_y= %d\n",
762 gn_gesture_coor[10], gn_gesture_coor[11]);
763 I("gest_left_x= %d, gest_left_y= %d\n",
764 gn_gesture_coor[12], gn_gesture_coor[13]);
765 I("gest_right_x= %d, gest_right_y= %d\n",
766 gn_gesture_coor[14], gn_gesture_coor[15]);
767#endif
768 }
769}
770
771#endif
772static void himax_ts_button_func(int tp_key_index, struct himax_ts_data *ts)
773{
774 uint16_t x_position = 0, y_position = 0;
775
776 if (tp_key_index != 0x00) {
777 I("virtual key index =%x\n", tp_key_index);
778 if (tp_key_index == 0x01) {
779 vk_press = 1;
780 I("back key pressed\n");
781 if (ts->pdata->virtual_key) {
782 if (ts->button[0].index) {
783 x_position = (ts->button[0].x_range_min
784 + ts->button[0].x_range_max) / 2;
785 y_position = (ts->button[0].y_range_min
786 + ts->button[0].y_range_max) / 2;
787 }
788 if (ts->protocol_type == PROTOCOL_TYPE_A) {
789 input_report_abs(ts->input_dev,
790 ABS_MT_TRACKING_ID, 0);
791 input_report_abs(ts->input_dev,
792 ABS_MT_TOUCH_MAJOR, 100);
793 input_report_abs(ts->input_dev,
794 ABS_MT_WIDTH_MAJOR, 100);
795 input_report_abs(ts->input_dev,
796 ABS_MT_PRESSURE, 100);
797 input_report_abs(ts->input_dev,
798 ABS_MT_POSITION_X, x_position);
799 input_report_abs(ts->input_dev,
800 ABS_MT_POSITION_Y, y_position);
801 input_mt_sync(ts->input_dev);
802 } else if (ts->protocol_type
803 == PROTOCOL_TYPE_B) {
804 input_mt_slot(ts->input_dev, 0);
805
806 input_mt_report_slot_state
807 (ts->input_dev, MT_TOOL_FINGER, 1);
808
809 input_report_abs(ts->input_dev,
810 ABS_MT_TOUCH_MAJOR, 100);
811 input_report_abs(ts->input_dev,
812 ABS_MT_WIDTH_MAJOR, 100);
813 input_report_abs(ts->input_dev,
814 ABS_MT_PRESSURE, 100);
815 input_report_abs(ts->input_dev,
816 ABS_MT_POSITION_X, x_position);
817 input_report_abs(ts->input_dev,
818 ABS_MT_POSITION_Y, y_position);
819 }
820 } else
821 input_report_key(ts->input_dev, KEY_BACK, 1);
822 } else if (tp_key_index == 0x02) {
823 vk_press = 1;
824 I("home key pressed\n");
825 if (ts->pdata->virtual_key) {
826 if (ts->button[1].index) {
827 x_position = (ts->button[1].x_range_min
828 + ts->button[1].x_range_max) / 2;
829 y_position = (ts->button[1].y_range_min
830 + ts->button[1].y_range_max) / 2;
831 }
832 if (ts->protocol_type == PROTOCOL_TYPE_A) {
833 input_report_abs(ts->input_dev,
834 ABS_MT_TRACKING_ID, 0);
835 input_report_abs(ts->input_dev,
836 ABS_MT_TOUCH_MAJOR, 100);
837 input_report_abs(ts->input_dev,
838 ABS_MT_WIDTH_MAJOR, 100);
839 input_report_abs(ts->input_dev,
840 ABS_MT_PRESSURE, 100);
841 input_report_abs(ts->input_dev,
842 ABS_MT_POSITION_X, x_position);
843 input_report_abs(ts->input_dev,
844 ABS_MT_POSITION_Y, y_position);
845 input_mt_sync(ts->input_dev);
846 } else if (ts->protocol_type
847 == PROTOCOL_TYPE_B) {
848 input_mt_slot(ts->input_dev, 0);
849
850 input_mt_report_slot_state
851 (ts->input_dev, MT_TOOL_FINGER, 1);
852
853 input_report_abs(ts->input_dev,
854 ABS_MT_TOUCH_MAJOR, 100);
855 input_report_abs(ts->input_dev,
856 ABS_MT_WIDTH_MAJOR, 100);
857 input_report_abs(ts->input_dev,
858 ABS_MT_PRESSURE, 100);
859 input_report_abs(ts->input_dev,
860 ABS_MT_POSITION_X, x_position);
861 input_report_abs(ts->input_dev,
862 ABS_MT_POSITION_Y, y_position);
863 }
864 } else
865 input_report_key(ts->input_dev, KEY_HOME, 1);
866 } else if (tp_key_index == 0x04) {
867 vk_press = 1;
868 I("APP_switch key pressed\n");
869 if (ts->pdata->virtual_key) {
870 if (ts->button[2].index) {
871 x_position = (ts->button[2].x_range_min
872 + ts->button[2].x_range_max) / 2;
873 y_position = (ts->button[2].y_range_min
874 + ts->button[2].y_range_max) / 2;
875 }
876 if (ts->protocol_type == PROTOCOL_TYPE_A) {
877 input_report_abs(ts->input_dev,
878 ABS_MT_TRACKING_ID, 0);
879 input_report_abs(ts->input_dev,
880 ABS_MT_TOUCH_MAJOR, 100);
881 input_report_abs(ts->input_dev,
882 ABS_MT_WIDTH_MAJOR, 100);
883 input_report_abs(ts->input_dev,
884 ABS_MT_PRESSURE, 100);
885 input_report_abs(ts->input_dev,
886 ABS_MT_POSITION_X, x_position);
887 input_report_abs(ts->input_dev,
888 ABS_MT_POSITION_Y, y_position);
889 input_mt_sync(ts->input_dev);
890 } else if (ts->protocol_type ==
891 PROTOCOL_TYPE_B) {
892 input_mt_slot(ts->input_dev, 0);
893
894 input_mt_report_slot_state
895 (ts->input_dev, MT_TOOL_FINGER, 1);
896
897 input_report_abs(ts->input_dev,
898 ABS_MT_TOUCH_MAJOR, 100);
899 input_report_abs(ts->input_dev,
900 ABS_MT_WIDTH_MAJOR, 100);
901 input_report_abs(ts->input_dev,
902 ABS_MT_PRESSURE, 100);
903 input_report_abs(ts->input_dev,
904 ABS_MT_POSITION_X, x_position);
905 input_report_abs(ts->input_dev,
906 ABS_MT_POSITION_Y, y_position);
907 }
908 } else
909 input_report_key(ts->input_dev, KEY_F10, 1);
910 }
911 input_sync(ts->input_dev);
912 } else {/*tp_key_index =0x00*/
913 I("virtual key released\n");
914 vk_press = 0;
915 if (ts->protocol_type == PROTOCOL_TYPE_A) {
916 input_mt_sync(ts->input_dev);
917 } else if (ts->protocol_type == PROTOCOL_TYPE_B) {
918 input_mt_slot(ts->input_dev, 0);
919 input_mt_report_slot_state(ts->input_dev,
920 MT_TOOL_FINGER, 0);
921 }
922 input_report_key(ts->input_dev, KEY_BACK, 0);
923 input_report_key(ts->input_dev, KEY_HOME, 0);
924 input_report_key(ts->input_dev, KEY_F10, 0);
925 input_sync(ts->input_dev);
926 }
927}
928
929void himax_ts_work(struct himax_ts_data *ts)
930{
931 int ret = 0;
932 uint8_t finger_num, hw_reset_check[2];
933 uint8_t buf[128];
934 uint8_t finger_on = 0;
935 int32_t loop_i;
936 uint16_t check_sum_cal = 0;
937 int raw_cnt_max;
938 int raw_cnt_rmd;
939 int hx_touch_info_size;
940 uint8_t coordInfoSize = ts->coord_data_size + ts->area_data_size + 4;
941
942#ifdef HX_TP_PROC_DIAG
943 int16_t *mutual_data;
944 int16_t *self_data;
945 uint8_t diag_cmd;
946 int i;
947 int mul_num;
948 int self_num;
949 int RawDataLen = 0;
950 /*coordinate dump start*/
951 char coordinate_char[15 + (ic_data->HX_MAX_PT + 5) * 2 * 5 + 2];
952 struct timeval t;
953 struct tm broken;
954 /*coordinate dump end*/
955#endif
956
957 memset(buf, 0x00, sizeof(buf));
958 memset(hw_reset_check, 0x00, sizeof(hw_reset_check));
959
960 raw_cnt_max = ic_data->HX_MAX_PT / 4;
961 raw_cnt_rmd = ic_data->HX_MAX_PT % 4;
962#if defined(HX_USB_DETECT2)
963 himax_cable_detect_func();
964#endif
965
966 if (raw_cnt_rmd != 0x00) { /*more than 4 fingers*/
967 RawDataLen = cal_data_len(raw_cnt_rmd,
968 ic_data->HX_MAX_PT, raw_cnt_max);
969 hx_touch_info_size = (ic_data->HX_MAX_PT + raw_cnt_max + 2) * 4;
970 } else { /*less than 4 fingers*/
971 RawDataLen = cal_data_len(raw_cnt_rmd,
972 ic_data->HX_MAX_PT, raw_cnt_max);
973 hx_touch_info_size = (ic_data->HX_MAX_PT + raw_cnt_max + 1) * 4;
974 }
975
976#ifdef HX_TP_PROC_DIAG
977 diag_cmd = getDiagCommand();
978 if (diag_cmd) {
979 ret = read_event_stack(ts->client, buf, 128);
980 } else {
981 if (touch_monitor_stop_flag != 0) {
982 ret = read_event_stack(ts->client, buf, 128);
983 touch_monitor_stop_flag--;
984 } else {
985 ret = read_event_stack(ts->client,
986 buf, hx_touch_info_size);
987 }
988 }
989
990 if (!ret)
991#else
992 if (!read_event_stack(ts->client, buf, hx_touch_info_size))
993#endif
994 {
995 E("%s: can't read data from chip!\n", __func__);
996 goto err_workqueue_out;
997 }
998 post_read_event_stack(ts->client);
999#ifdef HX_ESD_WORKAROUND
1000 for (i = 0; i < hx_touch_info_size; i++) {
1001 if (buf[i] == 0xED) { /*case 1 ESD recovery flow*/
1002 check_sum_cal = 1;
1003
1004 } else if (buf[i] == 0x00) {
1005 ESD_00_Flag = 1;
1006 } else {
1007 check_sum_cal = 0;
1008 ESD_00_counter = 0;
1009 ESD_00_Flag = 0;
1010 i = hx_touch_info_size;
1011 break;
1012 }
1013 }
1014 if (ESD_00_Flag == 1)
1015 ESD_00_counter++;
1016 if (ESD_00_counter > 1)
1017 check_sum_cal = 2;
1018 if (check_sum_cal == 2 && HX_ESD_RESET_ACTIVATE == 0) {
1019 I("[HIMAX TP MSG]: ESD event checked - ALL Zero.\n");
1020 ESD_HW_REST();
1021 return;
1022 }
1023 if (check_sum_cal == 1 && HX_ESD_RESET_ACTIVATE == 0) {
1024 I("[HIMAX TP MSG]: ESD event checked - ALL 0xED.\n");
1025 ESD_HW_REST();
1026 return;
1027 } else if (HX_ESD_RESET_ACTIVATE) {
1028#ifdef HX_SMART_WAKEUP
1029 queue_delayed_work(ts->himax_smwp_wq,
1030 &ts->smwp_work, msecs_to_jiffies(50));
1031#endif
1032#ifdef HX_HIGH_SENSE
1033 queue_delayed_work(ts->himax_hsen_wq,
1034 &ts->hsen_work, msecs_to_jiffies(50));
1035#endif
1036/*drop 1st interrupts after chip reset*/
1037 HX_ESD_RESET_ACTIVATE = 0;
1038 I("[HIMAX TP MSG]:%s: Back from reset,ready to serve.\n",
1039 __func__);
1040 }
1041#endif
1042 for (loop_i = 0, check_sum_cal = 0;
1043 loop_i < hx_touch_info_size; loop_i++)
1044 check_sum_cal += buf[loop_i];
1045
1046 if ((check_sum_cal % 0x100 != 0)) {
1047 I("[HIMAX TP MSG] checksum fail : check_sum_cal: 0x%02X\n",
1048 check_sum_cal);
1049 return;
1050 }
1051 if (ts->debug_log_level & BIT(0)) {
1052 I("%s: raw data:\n", __func__);
1053 for (loop_i = 0; loop_i < hx_touch_info_size; loop_i++) {
1054 I("P %d = 0x%2.2X ", loop_i, buf[loop_i]);
1055 if (loop_i % 8 == 7)
1056 I("\n");
1057 }
1058 }
1059
1060 /*touch monitor raw data fetch*/
1061#ifdef HX_TP_PROC_DIAG
1062 diag_cmd = getDiagCommand();
1063 if (diag_cmd >= 1 && diag_cmd <= 6) {
1064 /*Check 124th byte CRC*/
1065 if (!diag_check_sum(hx_touch_info_size, buf))
1066 goto bypass_checksum_failed_packet;
1067
1068#ifdef HX_TP_PROC_2T2R
1069 if (Is_2T2R && diag_cmd == 4) {
1070 mutual_data = getMutualBuffer_2();
1071 self_data = getSelfBuffer();
1072
1073 /* initiallize the block number of mutual and self*/
1074 mul_num = getXChannel_2() * getYChannel_2();
1075
1076#ifdef HX_EN_SEL_BUTTON
1077 self_num = getXChannel_2() +
1078 getYChannel_2() + ic_data->HX_BT_NUM;
1079#else
1080 self_num = getXChannel_2() + getYChannel_2();
1081#endif
1082 } else
1083#endif
1084 {
1085 mutual_data = getMutualBuffer();
1086 self_data = getSelfBuffer();
1087
1088 /* initiallize the block number of mutual and self*/
1089 mul_num = getXChannel() * getYChannel();
1090
1091#ifdef HX_EN_SEL_BUTTON
1092 self_num = getXChannel() +
1093 getYChannel() + ic_data->HX_BT_NUM;
1094#else
1095 self_num = getXChannel() + getYChannel();
1096#endif
1097 }
1098
1099 diag_parse_raw_data(hx_touch_info_size,
1100 RawDataLen, mul_num, self_num, buf,
1101 diag_cmd, mutual_data, self_data);
1102
1103 } else if (diag_cmd == 7) {
1104 memcpy(&(diag_coor[0]), &buf[0], 128);
1105 }
1106 /*coordinate dump start*/
1107 if (coordinate_dump_enable == 1) {
1108 for (i = 0; i < (15 + (ic_data->
1109 HX_MAX_PT + 5) * 2 * 5);
1110 i++) {
1111 coordinate_char[i] = 0x20;
1112 }
1113 coordinate_char[15 +
1114 (ic_data->HX_MAX_PT + 5) * 2 * 5] = 0xD;
1115 coordinate_char[15 +
1116 (ic_data->HX_MAX_PT + 5) * 2 * 5 + 1] = 0xA;
1117 }
1118 /*coordinate dump end*/
1119bypass_checksum_failed_packet:
1120#endif
1121 EN_NoiseFilter = (buf[HX_TOUCH_INFO_POINT_CNT + 2] >> 3);
1122 /*I("EN_NoiseFilter=%d\n",EN_NoiseFilter);*/
1123 EN_NoiseFilter = EN_NoiseFilter & 0x01;
1124 /*I("EN_NoiseFilter2=%d\n",EN_NoiseFilter);*/
1125
1126#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON)
1127 tpd_key = (buf[HX_TOUCH_INFO_POINT_CNT + 2] >> 4);
1128 if (tpd_key == 0x0F) {/*All (VK+AA)leave*/
1129 tpd_key = 0x00;
1130 }
1131 /*I("[DEBUG] tpd_key: %x\r\n", tpd_key);*/
1132#else
1133 tpd_key = 0x00;
1134#endif
1135
1136 p_point_num = hx_point_num;
1137
1138 if (buf[HX_TOUCH_INFO_POINT_CNT] == 0xff)
1139 hx_point_num = 0;
1140 else
1141 hx_point_num = buf[HX_TOUCH_INFO_POINT_CNT] & 0x0f;
1142
1143 /* Touch Point information*/
1144 if ((hx_point_num != 0) && (vk_press == 0x00)) {
1145 uint16_t old_finger = ts->pre_finger_mask;
1146
1147 ts->pre_finger_mask = 0;
1148 finger_num = buf[coordInfoSize - 4] & 0x0F;
1149 finger_on = 1;
1150 AA_press = 1;
1151 for (i = 0; i < ts->nFinger_support; i++) {
1152 int base = i * 4;
1153 int x = buf[base] << 8 | buf[base + 1];
1154 int y = (buf[base + 2] << 8 | buf[base + 3]);
1155 int w = buf[(ts->nFinger_support * 4) + i];
1156
1157 if (x >= 0 && x <= ts->pdata->abs_x_max
1158 && y >= 0 && y <= ts->pdata->abs_y_max) {
1159 finger_num--;
1160 if ((((ts->debug_log_level & BIT(3)) > 0)
1161 && (old_finger >> i == 0))
1162 && (ts->useScreenRes)) {
1163 I("status:Screen:F:%02d", i + 1);
1164 I("Down,X:%d,Y:%d,W:%d,N:%d\n",
1165 x * ts->widthFactor >> SHIFTBITS,
1166 y * ts->heightFactor >> SHIFTBITS,
1167 w, EN_NoiseFilter);
1168 } else if ((((ts->debug_log_level & BIT(3)) > 0)
1169 && (old_finger >> i == 0))
1170 && !(ts->useScreenRes)) {
1171 I("status:Raw:F:%02d", i + 1);
1172 I("Down,X:%d,Y:%d,W:%d,N:%d\n",
1173 x, y, w, EN_NoiseFilter);
1174 }
1175
1176 if (ts->protocol_type == PROTOCOL_TYPE_B)
1177 input_mt_slot(ts->input_dev, i);
1178
1179 input_report_abs(ts->input_dev,
1180 ABS_MT_TOUCH_MAJOR, w);
1181 input_report_abs(ts->input_dev,
1182 ABS_MT_WIDTH_MAJOR, w);
1183 input_report_abs(ts->input_dev,
1184 ABS_MT_PRESSURE, w);
1185 input_report_abs(ts->input_dev,
1186 ABS_MT_POSITION_X, x);
1187 input_report_abs(ts->input_dev,
1188 ABS_MT_POSITION_Y, y);
1189
1190 if (ts->protocol_type == PROTOCOL_TYPE_A) {
1191 input_report_abs(ts->input_dev,
1192 ABS_MT_TRACKING_ID, i);
1193 input_mt_sync(ts->input_dev);
1194 } else {
1195 ts->last_slot = i;
1196 input_mt_report_slot_state
1197 (ts->input_dev,
1198 MT_TOOL_FINGER, 1);
1199 }
1200
1201 if (!ts->first_pressed) {
1202 ts->first_pressed = 1;
1203 I("S1@%d, %d\n", x, y);
1204 }
1205
1206 ts->pre_finger_data[i][0] = x;
1207 ts->pre_finger_data[i][1] = y;
1208
1209 if (ts->debug_log_level & BIT(1)) {
1210 I("Finger %d=> X:%d,Y:%d,W:%d,",
1211 i + 1, x, y, w);
1212 I("Z:%d,F:%d,N:%d\n",
1213 w, i + 1, EN_NoiseFilter);
1214 }
1215 ts->pre_finger_mask =
1216 ts->pre_finger_mask + (1 << i);
1217
1218 } else {
1219 if (ts->protocol_type == PROTOCOL_TYPE_B) {
1220 input_mt_slot(ts->input_dev, i);
1221 input_mt_report_slot_state
1222 (ts->input_dev, MT_TOOL_FINGER, 0);
1223 }
1224 if (i == 0 && ts->first_pressed == 1) {
1225 ts->first_pressed = 2;
1226 I("E1@%d, %d\n",
1227 ts->pre_finger_data[0][0],
1228 ts->pre_finger_data[0][1]);
1229 }
1230 if ((((ts->debug_log_level & BIT(3)) > 0)
1231 && (old_finger >> i == 1))
1232 && (ts->useScreenRes)) {
1233 I("status:Screen:F:%02d,Up,X:%d,Y:%d\n",
1234 i + 1, ts->pre_finger_data[i][0]
1235 * ts->widthFactor >> SHIFTBITS,
1236 ts->pre_finger_data[i][1]
1237 * ts->heightFactor >> SHIFTBITS);
1238 } else if ((((ts->debug_log_level & BIT(3)) > 0)
1239 && (old_finger >> i == 1))
1240 && !(ts->useScreenRes)) {
1241 I("status:Raw:F:%02d,Up,X:%d,Y:%d\n",
1242 i + 1, ts->pre_finger_data[i][0],
1243 ts->pre_finger_data[i][1]);
1244 }
1245 }
1246 }
1247 input_report_key(ts->input_dev, BTN_TOUCH, finger_on);
1248 input_sync(ts->input_dev);
1249 } else if ((hx_point_num != 0)
1250 && ((tpd_key_old != 0x00) && (tpd_key == 0x00))) {
1251 /*temp_x[0] = 0xFFFF;*/
1252 /*temp_y[0] = 0xFFFF;*/
1253 /*temp_x[1] = 0xFFFF;*/
1254 /*temp_y[1] = 0xFFFF;*/
1255 himax_ts_button_func(tpd_key, ts);
1256 finger_on = 0;
1257 input_report_key(ts->input_dev, BTN_TOUCH, finger_on);
1258 input_sync(ts->input_dev);
1259 } else if (hx_point_num == 0) {
1260 if (AA_press) {
1261 /*leave event*/
1262 finger_on = 0;
1263 AA_press = 0;
1264 if (ts->protocol_type == PROTOCOL_TYPE_A)
1265 input_mt_sync(ts->input_dev);
1266
1267 for (i = 0 ; i < ts->nFinger_support ; i++) {
1268 if ((((ts->pre_finger_mask >> i) & 1) == 1)
1269 && (ts->protocol_type == PROTOCOL_TYPE_B)) {
1270 input_mt_slot(ts->input_dev, i);
1271 input_mt_report_slot_state
1272 (ts->input_dev, MT_TOOL_FINGER, 0);
1273 }
1274 }
1275 if (ts->pre_finger_mask > 0) {
1276 for (i = 0; i < ts->nFinger_support
1277 && (ts->debug_log_level & BIT(3)) > 0; i++) {
1278 if ((((ts->pre_finger_mask
1279 >> i) & 1) == 1)
1280 && (ts->useScreenRes)) {
1281 I("status:%X,", 0);
1282 I("Screen:F:%02d,", i + 1);
1283 I("Up,X:%d,Y:%d\n",
1284 ts->pre_finger_data[i][0]
1285 * ts->widthFactor >> SHIFTBITS,
1286 ts->pre_finger_data[i][1]
1287 * ts->heightFactor >> SHIFTBITS
1288 );
1289 } else if ((((ts->pre_finger_mask
1290 >> i) & 1) == 1)
1291 && !(ts->useScreenRes)) {
1292 I("status:%X,", 0);
1293 I("Screen:F:%02d,", i + 1);
1294 I("Up,X:%d,Y:%d\n",
1295 ts->pre_finger_data[i][0],
1296 ts->pre_finger_data[i][1]);
1297 }
1298 }
1299 ts->pre_finger_mask = 0;
1300 }
1301
1302 if (ts->first_pressed == 1) {
1303 ts->first_pressed = 2;
1304 I("E1@%d, %d\n", ts->pre_finger_data[0][0],
1305 ts->pre_finger_data[0][1]);
1306 }
1307
1308 if (ts->debug_log_level & BIT(1))
1309 I("All Finger leave\n");
1310
1311#ifdef HX_TP_PROC_DIAG
1312 /*coordinate dump start*/
1313 if (coordinate_dump_enable == 1) {
1314 do_gettimeofday(&t);
1315 time_to_tm(t.tv_sec, 0, &broken);
1316 snprintf(&coordinate_char[0], 15,
1317 "%2d:%2d:%2d:%lu,", broken.tm_hour,
1318 broken.tm_min, broken.tm_sec,
1319 t.tv_usec / 1000);
1320
1321 snprintf(&coordinate_char[15], 10,
1322 "Touch up!");
1323
1324 coordinate_fn->f_op->write
1325 (coordinate_fn, &coordinate_char[0],
1326 15 + (ic_data->HX_MAX_PT + 5)
1327 * 2 * sizeof(char) * 5 + 2,
1328 &coordinate_fn->f_pos);
1329 }
1330 /*coordinate dump end*/
1331#endif
1332 } else if (tpd_key != 0x00) {
1333 himax_ts_button_func(tpd_key, ts);
1334 finger_on = 1;
1335 } else if ((tpd_key_old != 0x00) && (tpd_key == 0x00)) {
1336 himax_ts_button_func(tpd_key, ts);
1337 finger_on = 0;
1338 }
1339 input_report_key(ts->input_dev, BTN_TOUCH, finger_on);
1340 input_sync(ts->input_dev);
1341 }
1342 tpd_key_old = tpd_key;
1343
1344workqueue_out:
1345 return;
1346
1347err_workqueue_out:
1348 I("%s: Now reset the Touch chip.\n", __func__);
1349
1350#ifdef HX_RST_PIN_FUNC
1351 himax_HW_reset(true, false);
1352#endif
1353
1354 goto workqueue_out;
1355}
1356enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer)
1357{
1358 struct himax_ts_data *ts;
1359
1360 ts = container_of(timer, struct himax_ts_data, timer);
1361 queue_work(ts->himax_wq, &ts->work);
1362 hrtimer_start(&ts->timer, ktime_set(0, 12500000), HRTIMER_MODE_REL);
1363 return HRTIMER_NORESTART;
1364}
1365
1366#if defined(HX_USB_DETECT)
1367static void himax_cable_tp_status_handler_func(int connect_status)
1368{
1369 struct himax_ts_data *ts;
1370
1371 I("Touch: cable change to %d\n", connect_status);
1372 ts = private_ts;
1373 if (ts->cable_config) {
1374 if (!atomic_read(&ts->suspend_mode)) {
1375 if ((!!connect_status) != ts->usb_connected) {
1376 if (!!connect_status) {
1377 ts->cable_config[1] = 0x01;
1378 ts->usb_connected = 0x01;
1379 } else {
1380 ts->cable_config[1] = 0x00;
1381 ts->usb_connected = 0x00;
1382 }
1383
1384 i2c_himax_master_write(ts->client,
1385 ts->cable_config,
1386 sizeof(ts->cable_config),
1387 HIMAX_I2C_RETRY_TIMES);
1388
1389 I("%s: Cable status change: 0x%2.2X\n",
1390 __func__, ts->cable_config[1]);
1391 } else
1392 I("%s: Cable status is same, ignore.\n",
1393 __func__);
1394 } else {
1395 if (connect_status)
1396 ts->usb_connected = 0x01;
1397 else
1398 ts->usb_connected = 0x00;
1399 I("%s: Cable status remembered: 0x%2.2X\n",
1400 __func__, ts->usb_connected);
1401 }
1402 }
1403}
1404
1405static struct t_cable_status_notifier himax_cable_status_handler = {
1406 .name = "usb_tp_connected",
1407 .func = himax_cable_tp_status_handler_func,
1408};
1409
1410#endif
1411
1412#if defined(HX_USB_DETECT2)
1413void himax_cable_detect_func(void)
1414{
1415 uint8_t tmp_addr[4];
1416 uint8_t tmp_data[128];
1417 struct himax_ts_data *ts;
1418 u32 connect_status = 0;
1419
1420 connect_status = USB_Flag;/*upmu_is_chr_det();*/
1421 ts = private_ts;
1422 /*I("Touch: cable status=%d, cable_config=%p,
1423 usb_connected=%d\n", connect_status,
1424 ts->cable_config, ts->usb_connected);*/
1425
1426 if (ts->cable_config) {
1427 if ((!!connect_status) != ts->usb_connected) {
1428 /*notify USB plug/unplug*/
1429 /*0x9008_8060 ==> 0x0000_0000/0001*/
1430 tmp_addr[3] = 0x90; tmp_addr[2] = 0x08;
1431 tmp_addr[1] = 0x80; tmp_addr[0] = 0x60;
1432 tmp_data[3] = 0x00; tmp_data[2] = 0x00;
1433 tmp_data[1] = 0x00;
1434 if (!!connect_status) {
1435 tmp_data[0] = 0x01;
1436 ts->usb_connected = 0x01;
1437 } else {
1438 tmp_data[0] = 0x00;
1439 ts->usb_connected = 0x00;
1440 }
1441
1442 himax_flash_write_burst(ts->client, tmp_addr, tmp_data);
1443
1444 I("%s: Cable status change: 0x%2.2X\n",
1445 __func__, ts->usb_connected);
1446 }
1447 /*else*/
1448 /*I("%s: Cable status is the same as previous one,
1449 ignore.\n", __func__);*/
1450
1451 }
1452}
1453#endif
1454
1455#ifdef CONFIG_FB
1456int himax_fb_register(struct himax_ts_data *ts)
1457{
1458 int ret = 0;
1459
1460 I(" %s in", __func__);
1461 ts->fb_notif.notifier_call = fb_notifier_callback;
1462 ret = fb_register_client(&ts->fb_notif);
1463 if (ret)
1464 E(" Unable to register fb_notifier: %d\n", ret);
1465
1466 return ret;
1467}
1468#endif
1469
1470#ifdef HX_SMART_WAKEUP
1471void himax_set_SMWP_func(struct i2c_client *client, uint8_t SMWP_enable)
1472{
1473 uint8_t tmp_data[4];
1474
1475 if (SMWP_enable) {
1476SMWP_bit_retry:
1477 himax_set_SMWP_enable(client, SMWP_enable);
1478 msleep(20);
1479 himax_get_SMWP_enable(client, tmp_data);
1480I("%s: Read SMWP bit data[0]=%x data[1]=%x data[2]=%x data[3]=%x\n",
1481__func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]);
1482
1483 if (tmp_data[0] != 0x01) {
1484 I("%s: retry SMWP bit write data[0]=%x\n",
1485 __func__, tmp_data[0]);
1486 goto SMWP_bit_retry;
1487 }
1488 }
1489}
1490
1491static void himax_SMWP_work(struct work_struct *work)
1492{
1493 struct himax_ts_data *ts =
1494 container_of(work, struct himax_ts_data, smwp_work.work);
1495 I(" %s in", __func__);
1496
1497 himax_set_SMWP_func(ts->client, ts->SMWP_enable);
1498
1499}
1500#endif
1501
1502#ifdef HX_TP_PROC_FLASH_DUMP
1503static void himax_ts_flash_work_func(struct work_struct *work)
1504{
1505 himax_ts_flash_func();
1506}
1507#endif
1508
1509#ifdef HX_TP_PROC_DIAG
1510static void himax_ts_diag_work_func(struct work_struct *work)
1511{
1512 himax_ts_diag_func();
1513}
1514#endif
1515
1516bool himax_ts_init(struct himax_ts_data *ts)
1517{
1518 int ret = 0, err = 0;
1519 struct himax_i2c_platform_data *pdata;
1520 struct i2c_client *client;
1521
1522 client = ts->client;
1523 pdata = ts->pdata;
1524
1525 I("%s: Start.\n", __func__);
1526
1527 /* Set pinctrl in active state */
1528 if (ts->ts_pinctrl) {
1529 ret = pinctrl_select_state(ts->ts_pinctrl,
1530 ts->pinctrl_state_active);
1531 if (ret < 0)
1532 E("Failed to set pin in active state %d", ret);
1533 }
1534
1535 himax_burst_enable(client, 0);
1536
1537 /*Get Himax IC Type / FW information / Calculate the point number */
1538 if (himax_check_chip_version(ts->client) == false) {
1539 E("Himax chip doesn NOT EXIST");
1540 goto err_ic_package_failed;
1541 }
1542 if (himax_ic_package_check(ts->client) == false) {
1543 E("Himax chip doesn NOT EXIST");
1544 goto err_ic_package_failed;
1545 }
1546
1547 if (pdata->virtual_key)
1548 ts->button = pdata->virtual_key;
1549#ifdef HX_TP_PROC_FLASH_DUMP
1550 ts->flash_wq = create_singlethread_workqueue("himax_flash_wq");
1551 if (!ts->flash_wq) {
1552 E("%s: create flash workqueue failed\n", __func__);
1553 err = -ENOMEM;
1554 goto err_create_wq_failed;
1555 }
1556
1557 INIT_WORK(&ts->flash_work, himax_ts_flash_work_func);
1558
1559 setSysOperation(0);
1560 setFlashBuffer();
1561#endif
1562
1563#ifdef HX_TP_PROC_DIAG
1564 ts->himax_diag_wq = create_singlethread_workqueue("himax_diag");
1565 if (!ts->himax_diag_wq) {
1566 E("%s: create diag workqueue failed\n", __func__);
1567 err = -ENOMEM;
1568 goto err_create_wq_failed;
1569 }
1570 INIT_DELAYED_WORK(&ts->himax_diag_delay_wrok, himax_ts_diag_work_func);
1571#endif
1572
1573himax_read_FW_ver(client);
1574
1575#ifdef HX_AUTO_UPDATE_FW
1576 I(" %s in", __func__);
1577 if (i_update_FW() <= 0)
1578 I("FW NOT UPDATE=\n");
1579 else
1580 I("Have new FW=UPDATE=\n");
1581#endif
1582
1583 /*Himax Power On and Load Config*/
1584 if (himax_loadSensorConfig(client, pdata) < 0) {
1585 E("%s: Load Sesnsor config failed,unload driver.\n",
1586 __func__);
1587 goto err_detect_failed;
1588 }
1589
1590 calculate_point_number();
1591#ifdef HX_TP_PROC_DIAG
1592 setXChannel(ic_data->HX_RX_NUM); /*X channel*/
1593 setYChannel(ic_data->HX_TX_NUM); /*Y channel*/
1594
1595 setMutualBuffer();
1596 setMutualNewBuffer();
1597 setMutualOldBuffer();
1598 if (getMutualBuffer() == NULL) {
1599 E("%s: mutual buffer allocate fail failed\n", __func__);
1600 return false;
1601 }
1602#ifdef HX_TP_PROC_2T2R
1603 if (Is_2T2R) {
1604 setXChannel_2(ic_data->HX_RX_NUM_2); /*X channel*/
1605 setYChannel_2(ic_data->HX_TX_NUM_2); /*Y channel*/
1606
1607 setMutualBuffer_2();
1608
1609 if (getMutualBuffer_2() == NULL) {
1610 E("%s: mutual buffer 2 allocate fail failed\n",
1611 __func__);
1612 return false;
1613 }
1614 }
1615#endif
1616#endif
1617#ifdef CONFIG_OF
1618 ts->power = pdata->power;
1619#endif
1620 ts->pdata = pdata;
1621
1622 ts->x_channel = ic_data->HX_RX_NUM;
1623 ts->y_channel = ic_data->HX_TX_NUM;
1624 ts->nFinger_support = ic_data->HX_MAX_PT;
1625 /*calculate the i2c data size*/
1626 calcDataSize(ts->nFinger_support);
1627 I("%s: calcDataSize complete\n", __func__);
1628#ifdef CONFIG_OF
1629 ts->pdata->abs_pressure_min = 0;
1630 ts->pdata->abs_pressure_max = 200;
1631 ts->pdata->abs_width_min = 0;
1632 ts->pdata->abs_width_max = 200;
1633 pdata->cable_config[0] = 0x90;
1634 pdata->cable_config[1] = 0x00;
1635#endif
1636 ts->suspended = false;
1637#if defined(HX_USB_DETECT) || defined(HX_USB_DETECT2)
1638 ts->usb_connected = 0x00;
1639 ts->cable_config = pdata->cable_config;
1640#endif
1641 ts->protocol_type = pdata->protocol_type;
1642 I("%s: Use Protocol Type %c\n", __func__,
1643 ts->protocol_type == PROTOCOL_TYPE_A ? 'A' : 'B');
1644 ret = himax_input_register(ts);
1645 if (ret) {
1646 E("%s: Unable to register %s input device\n",
1647 __func__, ts->input_dev->name);
1648 goto err_input_register_device_failed;
1649 }
1650#ifdef HX_SMART_WAKEUP
1651 ts->SMWP_enable = 0;
1652 wakeup_source_init(&ts->ts_SMWP_wake_lock,
1653 WAKE_LOCK_SUSPEND, HIMAX_common_NAME);
1654
1655 ts->himax_smwp_wq = create_singlethread_workqueue("HMX_SMWP_WORK");
1656 if (!ts->himax_smwp_wq) {
1657 E(" allocate himax_smwp_wq failed\n");
1658 err = -ENOMEM;
1659 goto err_smwp_wq_failed;
1660 }
1661 INIT_DELAYED_WORK(&ts->smwp_work, himax_SMWP_work);
1662#endif
1663#ifdef HX_HIGH_SENSE
1664 ts->HSEN_enable = 0;
1665 ts->himax_hsen_wq = create_singlethread_workqueue("HMX_HSEN_WORK");
1666 if (!ts->himax_hsen_wq) {
1667 E(" allocate himax_hsen_wq failed\n");
1668 err = -ENOMEM;
1669 goto err_hsen_wq_failed;
1670 }
1671 INIT_DELAYED_WORK(&ts->hsen_work, himax_HSEN_func);
1672#endif
1673
1674#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
1675 himax_touch_proc_init();
1676#endif
1677
1678#if defined(HX_USB_DETECT)
1679 if (ts->cable_config)
1680 cable_detect_register_notifier(&himax_cable_status_handler);
1681#endif
1682
1683 err = himax_ts_register_interrupt(ts->client);
1684 if (err)
1685 goto err_register_interrupt_failed;
1686 return true;
1687
1688err_register_interrupt_failed:
1689#ifdef HX_HIGH_SENSE
1690err_hsen_wq_failed:
1691#endif
1692#ifdef HX_SMART_WAKEUP
1693err_smwp_wq_failed:
1694 wakeup_source_trash(&ts->ts_SMWP_wake_lock);
1695#endif
1696err_input_register_device_failed:
1697 input_free_device(ts->input_dev);
1698err_detect_failed:
1699#ifdef HX_TP_PROC_FLASH_DUMP
1700err_create_wq_failed:
1701#endif
1702err_ic_package_failed:
1703return false;
1704}
1705
1706int himax_chip_common_probe(struct i2c_client *client,
1707const struct i2c_device_id *id)
1708{
1709 int err = 0;
1710 struct himax_ts_data *ts;
1711 struct himax_i2c_platform_data *pdata;
1712
1713 /*Check I2C functionality*/
1714 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1715 E("%s: i2c check functionality error\n", __func__);
1716 err = -ENODEV;
1717 goto err_check_functionality_failed;
1718 }
1719
1720 ts = kzalloc(sizeof(struct himax_ts_data), GFP_KERNEL);
1721 if (ts == NULL) {
1722 E("%s: allocate himax_ts_data failed\n", __func__);
1723 err = -ENOMEM;
1724 goto err_alloc_data_failed;
1725 }
1726
1727 i2c_set_clientdata(client, ts);
1728 ts->client = client;
1729 ts->dev = &client->dev;
1730 mutex_init(&ts->rw_lock);
1731
1732 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1733 if (pdata == NULL) { /*Allocate Platform data space*/
1734 err = -ENOMEM;
1735 goto err_dt_platform_data_fail;
1736 }
1737
1738 ic_data = kzalloc(sizeof(*ic_data), GFP_KERNEL);
1739 if (ic_data == NULL) { /*Allocate IC data space*/
1740 err = -ENOMEM;
1741 goto err_dt_ic_data_fail;
1742 }
1743
1744#ifdef CONFIG_OF
1745 /*DeviceTree Init Platform_data*/
1746 if (client->dev.of_node) {
1747 err = himax_parse_dt(ts, pdata);
1748 if (err < 0) {
1749 I(" pdata is NULL for DT\n");
1750 goto err_alloc_dt_pdata_failed;
1751 }
1752 }
1753#endif
1754
1755#ifdef HX_RST_PIN_FUNC
1756 ts->rst_gpio = pdata->gpio_reset;
1757#endif
1758
1759 himax_gpio_power_config(ts->client, pdata);
1760
1761 err = himax_ts_pinctrl_init(ts);
1762 if (err || ts->ts_pinctrl == NULL)
1763 E(" Pinctrl init failed\n");
1764
1765#ifndef CONFIG_OF
1766 if (pdata->power) {
1767 err = pdata->power(1);
1768 if (err < 0) {
1769 E("%s: power on failed\n", __func__);
1770 goto err_power_failed;
1771 }
1772 }
1773#endif
1774 ts->pdata = pdata;
1775 private_ts = ts;
1776
1777 mutex_init(&ts->fb_mutex);
1778 /* ts initialization is deferred till FB_UNBLACK event;
1779 * probe is considered pending till then.*/
1780 ts->probe_done = false;
1781#ifdef CONFIG_FB
1782 err = himax_fb_register(ts);
1783 if (err) {
1784 E("Falied to register fb notifier\n");
1785 err = -ENOMEM;
1786 goto err_fb_notif_wq_create;
1787 }
1788#endif
1789
1790 return 0;
1791
1792#ifdef CONFIG_FB
1793err_fb_notif_wq_create:
1794#endif
1795#ifdef CONFIG_OF
1796err_alloc_dt_pdata_failed:
1797#else
1798err_power_failed:
1799err_get_platform_data_fail:
1800#endif
1801 if (ts->ts_pinctrl) {
1802 if (IS_ERR_OR_NULL(ts->pinctrl_state_release)) {
1803 devm_pinctrl_put(ts->ts_pinctrl);
1804 ts->ts_pinctrl = NULL;
1805 } else {
1806 err = pinctrl_select_state(ts->ts_pinctrl,
1807 ts->pinctrl_state_release);
1808 if (err)
1809 E("failed to select relase pinctrl state %d\n",
1810 err);
1811 }
1812 }
1813 kfree(ic_data);
1814
1815err_dt_ic_data_fail:
1816 kfree(pdata);
1817
1818err_dt_platform_data_fail:
1819 kfree(ts);
1820
1821err_alloc_data_failed:
1822
1823err_check_functionality_failed:
1824 probe_fail_flag = 1;
1825 return err;
1826
1827}
1828
1829int himax_chip_common_remove(struct i2c_client *client)
1830{
1831 struct himax_ts_data *ts = i2c_get_clientdata(client);
1832 int ret;
1833#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
1834 himax_touch_proc_deinit();
1835#endif
1836#ifdef CONFIG_FB
1837 if (fb_unregister_client(&ts->fb_notif)) {
1838 dev_err(&client->dev,
1839 "Error occurred while unregistering fb_notifier.\n");
1840 }
1841#endif
1842
1843 if (!ts->use_irq)
1844 hrtimer_cancel(&ts->timer);
1845
1846 destroy_workqueue(ts->himax_wq);
1847
1848 if (ts->protocol_type == PROTOCOL_TYPE_B)
1849 input_mt_destroy_slots(ts->input_dev);
1850
1851 input_unregister_device(ts->input_dev);
1852
1853 if (ts->ts_pinctrl) {
1854 if (IS_ERR_OR_NULL(ts->pinctrl_state_release)) {
1855 devm_pinctrl_put(ts->ts_pinctrl);
1856 ts->ts_pinctrl = NULL;
1857 } else {
1858 ret = pinctrl_select_state(ts->ts_pinctrl,
1859 ts->pinctrl_state_release);
1860 if (ret)
1861 E("failed to select relase pinctrl state %d\n",
1862 ret);
1863 }
1864 }
1865#ifdef HX_SMART_WAKEUP
1866 wakeup_source_trash(&ts->ts_SMWP_wake_lock);
1867#endif
1868 kfree(ts);
1869
1870 return 0;
1871
1872}
1873
1874int himax_chip_common_suspend(struct himax_ts_data *ts)
1875{
1876 int ret;
1877
1878 if (ts->suspended) {
1879 I("%s: Already suspended. Skipped.\n", __func__);
1880 return 0;
1881
1882 } else {
1883 ts->suspended = true;
1884 I("%s: enter\n", __func__);
1885 }
1886
1887#ifdef HX_TP_PROC_FLASH_DUMP
1888 if (getFlashDumpGoing()) {
1889 I("[himax] %s: Flash dump is going,reject suspend\n",
1890 __func__);
1891 return 0;
1892 }
1893#endif
1894#ifdef HX_TP_PROC_HITOUCH
1895 if (hitouch_is_connect) {
1896 I("[himax] %s: Hitouch connect,reject suspend\n",
1897 __func__);
1898 return 0;
1899 }
1900#endif
1901#ifdef HX_SMART_WAKEUP
1902 if (ts->SMWP_enable) {
1903 atomic_set(&ts->suspend_mode, 1);
1904 ts->pre_finger_mask = 0;
1905 FAKE_POWER_KEY_SEND = false;
1906 I("[himax] %s: SMART_WAKEUP enable,reject suspend\n",
1907 __func__);
1908 return 0;
1909 }
1910#endif
1911#ifdef HX_ESD_WORKAROUND
1912 ESD_00_counter = 0;
1913 ESD_00_Flag = 0;
1914#endif
1915 if (!ts->use_irq) {
1916 ret = cancel_work_sync(&ts->work);
1917 if (ret)
1918 himax_int_enable(ts->client->irq, 1);
1919 }
1920
1921 /*ts->first_pressed = 0;*/
1922 atomic_set(&ts->suspend_mode, 1);
1923 ts->pre_finger_mask = 0;
1924
1925 if (ts->ts_pinctrl) {
1926 ret = pinctrl_select_state(ts->ts_pinctrl,
1927 ts->pinctrl_state_suspend);
1928 if (ret < 0)
1929 E("Failed to get idle pinctrl state %d\n", ret);
1930 }
1931
1932 if (ts->pdata->powerOff3V3 && ts->pdata->power)
1933 ts->pdata->power(0);
1934
1935 return 0;
1936}
1937
1938int himax_chip_common_resume(struct himax_ts_data *ts)
1939{
1940 int retval;
1941
1942 I("%s: enter\n", __func__);
1943
1944 if (ts->pdata->powerOff3V3 && ts->pdata->power)
1945 ts->pdata->power(1);
1946
1947 if (ts->protocol_type == PROTOCOL_TYPE_A)
1948 input_mt_sync(ts->input_dev);
1949 input_report_key(ts->input_dev, BTN_TOUCH, 0);
1950 input_sync(ts->input_dev);
1951
1952 if (ts->ts_pinctrl) {
1953 retval = pinctrl_select_state(ts->ts_pinctrl,
1954 ts->pinctrl_state_active);
1955 if (retval < 0) {
1956 E("Cannot get default pinctrl state %d\n", retval);
1957 goto err_pinctrl_select_resume;
1958 }
1959 }
1960
1961 atomic_set(&ts->suspend_mode, 0);
1962
1963 himax_int_enable(ts->client->irq, 1);
1964
1965 ts->suspended = false;
1966#if defined(HX_USB_DETECT2)
1967 ts->usb_connected = 0x00;
1968 himax_cable_detect_func();
1969#endif
1970#ifdef HX_SMART_WAKEUP
1971 queue_delayed_work(ts->himax_smwp_wq,
1972 &ts->smwp_work, msecs_to_jiffies(1000));
1973#endif
1974#ifdef HX_HIGH_SENSE
1975 queue_delayed_work(ts->himax_hsen_wq,
1976 &ts->hsen_work, msecs_to_jiffies(1000));
1977#endif
1978 return 0;
1979err_pinctrl_select_resume:
1980 if (ts->pdata->powerOff3V3 && ts->pdata->power)
1981 ts->pdata->power(0);
1982 return retval;
1983}
1984