blob: 5d2e946cc895f9a49baef14df18041bf7536fe1c [file] [log] [blame]
Flemmarde596a9a2013-04-25 20:52:12 -07001/* drivers/input/touchscreen/atmel_224e.c - ATMEL Touch driver
2 *
3 * Copyright (C) 2011 HTC 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 <linux/module.h>
17#include <linux/input.h>
18#include <linux/interrupt.h>
19#include <linux/earlysuspend.h>
20#include <linux/platform_device.h>
21#include <linux/i2c.h>
22#include <linux/delay.h>
23#include <linux/slab.h>
24#include <asm/io.h>
25#include <asm/gpio.h>
26#include <mach/board.h>
27#include <asm/mach-types.h>
28#include <linux/atmel_qt602240.h>
29#include <linux/input/mt.h>
30#include <linux/jiffies.h>
31#include <mach/msm_hsusb.h>
32#include <linux/stat.h>
33#include <linux/pl_sensor.h>
34#if defined(CONFIG_TOUCH_KEY_FILTER)
35#include <linux/input/cy8c_cs.h>
36#endif
37
38#define ATMEL_EN_SYSFS
39#define ATMEL_I2C_RETRY_TIMES 10
40
41#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
42#include <mach/cable_detect.h>
43#endif
44
45#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS))
46#include <mach/htc_battery.h>
47#endif
48
49static DEFINE_MUTEX(reload_lock);
50
Ethan Chen608c7fd2013-05-20 20:16:01 -070051/* config_setting */
Flemmarde596a9a2013-04-25 20:52:12 -070052#define NONE 0
53#define CONNECTED 1
54
Ethan Chen608c7fd2013-05-20 20:16:01 -070055/* anti-touch calibration */
Flemmarde596a9a2013-04-25 20:52:12 -070056#define RECALIB_NEED 0
57#define RECALIB_NG 1
58#define RECALIB_UNLOCK 2
59#define RECALIB_DONE 3
60#define ATCHCAL_DELAY 200
61#define SAFE_TIMEOUT 500
62
63struct atmel_ts_data {
64 struct i2c_client *client;
65 struct input_dev *input_dev;
66 struct input_dev *sr_input_dev;
67 struct workqueue_struct *atmel_wq;
68 struct workqueue_struct *atmel_delayed_wq;
69 struct workqueue_struct *atmel_cable_vbus_wq;
70 struct work_struct check_delta_work;
71 struct work_struct cable_vbus_work;
72 struct delayed_work unlock_work;
73 int (*power) (int on);
74 uint8_t unlock_attr;
75 struct early_suspend early_suspend;
76 struct info_id_t *id;
77 struct object_t *object_table;
78 uint8_t report_type;
79 uint8_t finger_count;
80 uint16_t abs_x_min;
81 uint16_t abs_x_max;
82 uint16_t abs_y_min;
83 uint16_t abs_y_max;
84 uint8_t abs_pressure_min;
85 uint8_t abs_pressure_max;
86 uint8_t abs_width_min;
87 uint8_t abs_width_max;
88 uint8_t first_pressed;
89 uint8_t valid_pressed_cnt;
90 uint8_t cal_after_unlock;
91 uint8_t debug_log_level;
92 struct atmel_finger_data finger_data[10];
93 uint8_t high_res_x_en;
94 uint8_t high_res_y_en;
95 uint8_t finger_type;
96 uint8_t finger_support;
97 uint16_t finger_pressed;
98 uint8_t face_suppression;
99 uint8_t grip_suppression;
100 uint8_t noise_state;
101 uint8_t noise_err_count;
102 uint16_t *filter_level;
103 uint8_t calibration_confirm;
104 uint64_t timestamp;
105 unsigned long valid_press_timeout;
106 unsigned long safe_unlock_timeout;
107 struct atmel_config_data config_setting[2];
108 struct atmel_finger_data pre_finger_data[10];
109 uint8_t repeat_flag;
110 struct atmel_mferr mferr_config;
111 struct atmel_mferr cfm_calb;
112 struct atmel_mferr cable_config;
113 uint8_t noiseLine_config[8];
114 int8_t wlc_config[7];
115 uint8_t wlc_freq[4];
116 uint8_t wlc_status;
117 int8_t noise_config[3];
118 uint8_t call_tchthr[2];
119 uint8_t locking_config[1];
120 uint8_t status;
121 uint8_t cable_vbus_status;
122 uint8_t diag_command;
123 uint8_t psensor_status;
124 uint8_t noiseLine_status;
125 uint8_t *ATCH_EXT;
126 int pre_data[11];
127#if defined(CONFIG_TOUCH_KEY_FILTER)
128 uint8_t key_bypass;
129 uint16_t flt_th;
130#endif
131#ifdef ATMEL_EN_SYSFS
132 struct device dev;
133#endif
134 uint8_t workaround;
135};
136
137static struct atmel_ts_data *private_ts;
138static short htc_event_enable, disable_touch;
139
140#ifdef CONFIG_HAS_EARLYSUSPEND
141static void atmel_ts_early_suspend(struct early_suspend *h);
142static void atmel_ts_late_resume(struct early_suspend *h);
143#endif
144
145static void restore_normal_threshold(struct atmel_ts_data *ts);
146static void confirm_calibration(struct atmel_ts_data *ts, uint8_t recal, uint8_t reason);
147static void multi_input_report(struct atmel_ts_data *ts);
148
149static int i2c_atmel_read(struct i2c_client *client, uint16_t address, uint8_t *data, uint8_t length)
150{
151 int retry;
152 uint8_t addr[2];
153
154 struct i2c_msg msg[] = {
155 {
156 .addr = client->addr,
157 .flags = 0,
158 .len = 2,
159 .buf = addr,
160 },
161 {
162 .addr = client->addr,
163 .flags = I2C_M_RD,
164 .len = length,
165 .buf = data,
166 }
167 };
168 addr[0] = address & 0xFF;
169 addr[1] = (address >> 8) & 0xFF;
170
171 for (retry = 0; retry < ATMEL_I2C_RETRY_TIMES; retry++) {
172 if (i2c_transfer(client->adapter, msg, 2) == 2)
173 break;
174 mdelay(10);
175 }
176 if (retry == ATMEL_I2C_RETRY_TIMES) {
177 printk(KERN_ERR "[TP]TOUCH_ERR: i2c_read_block retry over %d\n",
178 ATMEL_I2C_RETRY_TIMES);
179 return -EIO;
180 }
181 return 0;
182
183}
184
185static int i2c_atmel_write(struct i2c_client *client, uint16_t address, uint8_t *data, uint8_t length)
186{
187 int retry, loop_i;
188 uint8_t buf[length + 2];
189
190 struct i2c_msg msg[] = {
191 {
192 .addr = client->addr,
193 .flags = 0,
194 .len = length + 2,
195 .buf = buf,
196 }
197 };
198
199 buf[0] = address & 0xFF;
200 buf[1] = (address >> 8) & 0xFF;
201
202 for (loop_i = 0; loop_i < length; loop_i++)
203 buf[loop_i + 2] = data[loop_i];
204
205 for (retry = 0; retry < ATMEL_I2C_RETRY_TIMES; retry++) {
206 if (i2c_transfer(client->adapter, msg, 1) == 1)
207 break;
208 mdelay(10);
209 }
210
211 if (retry == ATMEL_I2C_RETRY_TIMES) {
212 printk(KERN_ERR "[TP]TOUCH_ERR: i2c_write_block retry over %d\n",
213 ATMEL_I2C_RETRY_TIMES);
214 return -EIO;
215 }
216 return 0;
217
218}
219
220static int i2c_atmel_write_byte_data(struct i2c_client *client, uint16_t address, uint8_t value)
221{
Ethan Chen608c7fd2013-05-20 20:16:01 -0700222 return i2c_atmel_write(client, address, &value, 1);
Flemmarde596a9a2013-04-25 20:52:12 -0700223}
224
225static uint16_t get_object_address(struct atmel_ts_data *ts, uint8_t object_type)
226{
227 uint8_t loop_i;
228 for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) {
229 if (ts->object_table[loop_i].object_type == object_type)
230 return ts->object_table[loop_i].i2c_address;
231 }
232 return 0;
233}
234static uint8_t get_object_size(struct atmel_ts_data *ts, uint8_t object_type)
235{
236 uint8_t loop_i;
237 for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) {
238 if (ts->object_table[loop_i].object_type == object_type)
239 return ts->object_table[loop_i].size;
240 }
241 return 0;
242}
243
244static uint8_t get_rid(struct atmel_ts_data *ts, uint8_t object_type)
245{
246 uint8_t loop_i;
247 for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) {
248 if (ts->object_table[loop_i].object_type == object_type)
249 return ts->object_table[loop_i].report_ids;
250 }
251 return 0;
252}
253
254#ifdef ATMEL_EN_SYSFS
255
256enum SR_REG_STATE{
257 ALLOCATE_DEV_FAIL = -2,
258 REGISTER_DEV_FAIL,
259 SUCCESS,
260};
261
262static int register_sr_touch_device(void)
263{
264 struct atmel_ts_data *ts = private_ts;
265
266 ts->sr_input_dev = input_allocate_device();
267
268 if (ts->sr_input_dev == NULL) {
269 printk(KERN_ERR "[TP][TOUCH_ERR]%s: Failed to allocate SR input device\n", __func__);
270 return ALLOCATE_DEV_FAIL;
271 }
272 ts->sr_input_dev->name = "sr_touchscreen";
273 set_bit(EV_SYN, ts->sr_input_dev->evbit);
274 set_bit(EV_ABS, ts->sr_input_dev->evbit);
275 set_bit(EV_KEY, ts->sr_input_dev->evbit);
276
277 set_bit(KEY_BACK, ts->sr_input_dev->keybit);
278 set_bit(KEY_HOME, ts->sr_input_dev->keybit);
279 set_bit(KEY_MENU, ts->sr_input_dev->keybit);
280 set_bit(KEY_SEARCH, ts->sr_input_dev->keybit);
281 set_bit(BTN_TOUCH, ts->sr_input_dev->keybit);
282 set_bit(KEY_APP_SWITCH, ts->sr_input_dev->keybit);
283 set_bit(INPUT_PROP_DIRECT, ts->sr_input_dev->propbit);
284 ts->sr_input_dev->mtsize = ts->finger_support;
285 input_set_abs_params(ts->sr_input_dev, ABS_MT_TRACKING_ID,
286 0, ts->finger_support - 1, 0, 0);
287 printk(KERN_INFO "[TP][SR]input_set_abs_params: mix_x %d, max_x %d,"
288 " min_y %d, max_y %d\n", ts->abs_x_min, ts->abs_x_max,
289 ts->abs_y_min, ts->abs_y_max);
290
291 input_set_abs_params(ts->sr_input_dev, ABS_MT_POSITION_X,
292 ts->abs_x_min, ts->abs_x_max, 0, 0);
293 input_set_abs_params(ts->sr_input_dev, ABS_MT_POSITION_Y,
294 ts->abs_y_min, ts->abs_y_max, 0, 0);
295 input_set_abs_params(ts->sr_input_dev, ABS_MT_TOUCH_MAJOR,
296 0, 255, 0, 0);
297 input_set_abs_params(ts->sr_input_dev, ABS_MT_WIDTH_MAJOR,
298 0, 30, 0, 0);
299 input_set_abs_params(ts->sr_input_dev, ABS_MT_PRESSURE,
300 0, 30, 0, 0);
301
302 if (input_register_device(ts->sr_input_dev)) {
303 input_free_device(ts->sr_input_dev);
304 printk(KERN_ERR "[TP][SR][TOUCH_ERR]%s: Unable to register %s input device\n",
305 __func__, ts->sr_input_dev->name);
306 return REGISTER_DEV_FAIL;
307 }
308 return SUCCESS;
309}
310
311static ssize_t set_en_sr(struct device *dev, struct device_attribute *attr,
312 const char *buf, size_t count)
313{
314 struct atmel_ts_data *ts = private_ts;
315 if (buf[0]) {
316 if (ts->sr_input_dev)
317 printk(KERN_INFO "[TP]%s: SR device already exist!\n", __func__);
318 else
319 printk(KERN_INFO "[TP]%s: SR touch device enable result:%X\n", __func__, register_sr_touch_device());
320 }
321 return count;
322}
323
324static DEVICE_ATTR(sr_en, S_IWUSR, 0, set_en_sr);
325
326static ssize_t atmel_reset(struct device *dev, struct device_attribute *attr,
327 const char *buf, size_t count)
328{
329 int i;
330 struct atmel_ts_data *ts;
331 struct atmel_i2c_platform_data *pdata;
332
333 ts = private_ts;
334 pdata = ts->client->dev.platform_data;
335
336 if (sscanf(buf, "%d", &i) == 1 && i < 2) {
337 if (pdata->gpio_rst) {
338 gpio_set_value(pdata->gpio_rst, 0);
339 msleep(5);
340 gpio_set_value(pdata->gpio_rst, 1);
341 msleep(40);
342
343 pr_info("[TP] Reset Atmel Chip\n");
344 } else
345 pr_info("[TP] Reset pin NOT ASSIGN\n");
346 } else
347 pr_info("[TP] Parameter Error\n");
348
349 return count;
350}
351static DEVICE_ATTR(reset, (S_IWUSR|S_IRUGO), NULL, atmel_reset);
352
353static ssize_t show_report_type(struct device *dev, struct device_attribute *attr, char *buf)
354{
355 struct atmel_ts_data *ts;
356
357 ts = private_ts;
358
359 return sprintf(buf, "report_type = %d\n", ts->report_type);
360}
361DEVICE_ATTR(report_type, S_IRUGO, show_report_type, NULL);
362
363static ssize_t set_htc_event(struct device *dev, struct device_attribute *attr,
364 const char *buf, size_t count)
365{
366 int ret;
367 unsigned long mode;
368 ret = strict_strtoul(buf, 10, &mode);
369 htc_event_enable = mode;
370 pr_info("[TP]htc event enable = %d\n", htc_event_enable);
371 return count;
372}
373
374static ssize_t show_htc_event(struct device *dev, struct device_attribute *attr, char *buf)
375{
376 return sprintf(buf, "htc event enable = %d\n", htc_event_enable);
377}
378DEVICE_ATTR(htc_event, (S_IWUSR|S_IRUGO), show_htc_event, set_htc_event);
379
380static ssize_t stop_touch(struct device *dev, struct device_attribute *attr,
381 const char *buf, size_t count)
382{
383 int i;
384 if (sscanf(buf, "%d", &i) == 1 && i < 2) {
385 disable_touch = i;
386 pr_info("[TP] Touch Report %s!!\n", i ? "STOP" : "Work");
387 } else
388 pr_info("[TP] Parameter Error\n");
389 return count;
390}
391static ssize_t stop_touch_show(struct device *dev, struct device_attribute *attr, char *buf)
392{
393 return sprintf(buf, "Touch Report enable = %d\n", disable_touch);
394}
395
396DEVICE_ATTR(disable_touch, (S_IWUSR|S_IRUGO), stop_touch_show, stop_touch);
397
Ethan Chen608c7fd2013-05-20 20:16:01 -0700398static ssize_t atmel_gpio_show(struct device *dev, struct device_attribute *attr, char *buf)
Flemmarde596a9a2013-04-25 20:52:12 -0700399{
400 int ret = 0;
401 struct atmel_ts_data *ts_data;
402 struct atmel_i2c_platform_data *pdata;
403
404 ts_data = private_ts;
405 pdata = ts_data->client->dev.platform_data;
406
407 ret = gpio_get_value(pdata->gpio_irq);
408 printk(KERN_DEBUG "[TP]GPIO_TP_INT_N=%d\n", pdata->gpio_irq);
409 sprintf(buf, "GPIO_TP_INT_N=%d\n", ret);
410 ret = strlen(buf) + 1;
411 return ret;
412}
413static DEVICE_ATTR(gpio, S_IRUGO, atmel_gpio_show, NULL);
414
Ethan Chen608c7fd2013-05-20 20:16:01 -0700415static ssize_t atmel_vendor_show(struct device *dev, struct device_attribute *attr, char *buf)
Flemmarde596a9a2013-04-25 20:52:12 -0700416{
417 int ret = 0;
418 struct atmel_ts_data *ts_data;
419 ts_data = private_ts;
420 sprintf(buf, "%s_x%2.2X_x%2.2X_x%2.2X\n", "ATMEL",
421 ts_data->id->family_id, ts_data->id->version, ts_data->id->build);
422 ret = strlen(buf) + 1;
423 return ret;
424}
425
426static DEVICE_ATTR(vendor, S_IRUGO, atmel_vendor_show, NULL);
427
428static unsigned long atmel_reg_addr;
429
Ethan Chen608c7fd2013-05-20 20:16:01 -0700430static ssize_t atmel_register_show(struct device *dev, struct device_attribute *attr, char *buf)
Flemmarde596a9a2013-04-25 20:52:12 -0700431{
432 int ret = 0;
433 uint8_t ptr[1] = { 0 };
434 struct atmel_ts_data *ts_data;
435 ts_data = private_ts;
436 if (i2c_atmel_read(ts_data->client, atmel_reg_addr, ptr, 1) < 0) {
437 printk(KERN_WARNING "[TP]%s: read fail\n", __func__);
438 return ret;
439 }
440 ret += sprintf(buf, "addr: %ld, data: %d\n", atmel_reg_addr, ptr[0]);
441 return ret;
442}
443
444static ssize_t atmel_register_store(struct device *dev,
445 struct device_attribute *attr, const char *buf, size_t count)
446{
447 int ret = 0;
448 struct atmel_ts_data *ts_data;
449 char buf_tmp[4], buf_zero[200];
450 unsigned long write_da = 0;
451
452 ts_data = private_ts;
453 memset(buf_tmp, 0x0, sizeof(buf_tmp));
454 if ((buf[0] == 'r' || buf[0] == 'w') && buf[1] == ':' &&
455 (buf[5] == ':' || buf[5] == '\n')) {
456 memcpy(buf_tmp, buf + 2, 3);
457 ret = strict_strtoul(buf_tmp, 10, &atmel_reg_addr);
458 printk(KERN_DEBUG "read addr: 0x%lX\n", atmel_reg_addr);
459 if (!atmel_reg_addr) {
460 printk(KERN_WARNING "[TP]%s: string to number fail\n",
461 __func__);
462 return count;
463 }
464 printk(KERN_DEBUG "[TP]%s: set atmel_reg_addr is: %ld\n",
465 __func__, atmel_reg_addr);
466 if (buf[0] == 'w' && buf[5] == ':' && buf[9] == '\n') {
467 memcpy(buf_tmp, buf + 6, 3);
468 ret = strict_strtoul(buf_tmp, 10, &write_da);
469 printk(KERN_DEBUG "[TP]write addr: 0x%lX, data: 0x%lX\n",
470 atmel_reg_addr, write_da);
471 ret = i2c_atmel_write_byte_data(ts_data->client,
472 atmel_reg_addr, write_da);
473 if (ret < 0) {
474 printk(KERN_WARNING "[TP]%s: write fail(%d)\n",
475 __func__, ret);
476 }
477 }
478 }
479 if ((buf[0] == '0') && (buf[1] == ':') && (buf[5] == ':')) {
480 unsigned long val = 0;
481 memcpy(buf_tmp, buf + 2, 3);
482 ret = strict_strtol(buf_tmp, 10, &atmel_reg_addr);
483 memcpy(buf_tmp, buf + 6, 3);
484 ret = strict_strtol(buf_tmp, 10, &val);
485 memset(buf_zero, 0x0, sizeof(buf_zero));
486 ret = i2c_atmel_write(ts_data->client, atmel_reg_addr,
487 buf_zero, val - atmel_reg_addr + 1);
488 if (buf[9] == 'r') {
489 i2c_atmel_write_byte_data(ts_data->client,
490 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) +
491 T6_CFG_BACKUPNV, 0x55);
492 i2c_atmel_write_byte_data(ts_data->client,
493 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) +
494 T6_CFG_RESET, 0x11);
495 }
496 }
497
498 return count;
499}
500
501static DEVICE_ATTR(register, (S_IWUSR|S_IRUGO),
502 atmel_register_show, atmel_register_store);
503
504static ssize_t atmel_regdump_show(struct device *dev,
505 struct device_attribute *attr, char *buf)
506{
507 int count = 0, ret_t = 0;
508 struct atmel_ts_data *ts_data;
509 uint16_t loop_i, startAddr, endAddr;
510 uint8_t numObj;
511 uint8_t ptr[1] = { 0 };
512
513 ts_data = private_ts;
514 if (!ts_data->id->num_declared_objects)
515 return count;
516 numObj = ts_data->id->num_declared_objects - 1;
517 startAddr = get_object_address(ts_data, GEN_POWERCONFIG_T7);
518 if (ts_data->id->version < 0x11) {
519 endAddr = get_object_address(ts_data, PROCG_NOISESUPPRESSION_T48);
520 endAddr += get_object_size(ts_data, PROCG_NOISESUPPRESSION_T48) - 1;
521 } else {
522 endAddr = get_object_address(ts_data, PROCI_ADAPTIVETHRESHOLD_T55);
523 endAddr += get_object_size(ts_data, PROCI_ADAPTIVETHRESHOLD_T55) - 1;
524 }
525 for (loop_i = startAddr; loop_i <= endAddr; loop_i++) {
526 ret_t = i2c_atmel_read(ts_data->client, loop_i, ptr, 1);
527 if (ret_t < 0) {
528 printk(KERN_WARNING "dump fail, addr: %d\n",
529 loop_i);
530 }
531 count += sprintf(buf + count, "addr[%3d]: %3d, ",
532 loop_i , *ptr);
533 if (((loop_i - startAddr) % 4) == 3)
534 count += sprintf(buf + count, "\n");
535 }
536 count += sprintf(buf + count, "\n");
537 return count;
538}
539
540#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS) || defined(CONFIG_TOUCHSCREEN_ATMEL_WLS))
541#ifdef DEBUG
542static void regdump_to_kernel(void)
543{
544 int count = 0, ret_t = 0;
545 struct atmel_ts_data *ts_data;
546 char buf[80];
547 uint16_t loop_i, startAddr, endAddr;
548 uint8_t numObj;
549 uint8_t ptr[1] = { 0 };
550
551 ts_data = private_ts;
552 if (!ts_data->id->num_declared_objects)
553 return;
554 numObj = ts_data->id->num_declared_objects - 1;
555 startAddr = get_object_address(ts_data, GEN_POWERCONFIG_T7);
556 if (ts_data->id->version < 0x11) {
557 endAddr = get_object_address(ts_data, PROCG_NOISESUPPRESSION_T48);
558 endAddr += get_object_size(ts_data, PROCG_NOISESUPPRESSION_T48) - 1;
559 } else {
560 endAddr = get_object_address(ts_data, PROCI_ADAPTIVETHRESHOLD_T55);
561 endAddr += get_object_size(ts_data, PROCI_ADAPTIVETHRESHOLD_T55) - 1;
562 }
563 for (loop_i = startAddr; loop_i <= endAddr; loop_i++) {
564 ret_t = i2c_atmel_read(ts_data->client, loop_i, ptr, 1);
565 if (ret_t < 0) {
566 printk(KERN_WARNING "[TP]dump fail, addr: %d\n",
567 loop_i);
568 }
569 count += sprintf(buf + count, "addr[%3d]: %3d, ",
570 loop_i , *ptr);
571 if (((loop_i - startAddr) % 4) == 3) {
572 printk(KERN_INFO "%s\n", buf);
573 count = 0;
574 }
575 }
576 printk(KERN_INFO "%s\n", buf);
577 return;
578}
579#else
580static void regdump_to_kernel(void) { }
581#endif
582#endif
583
584static ssize_t atmel_regdump_dump(struct device *dev,
585 struct device_attribute *attr, const char *buf, size_t count)
586{
587 struct atmel_ts_data *ts_data;
588 ts_data = private_ts;
589 if (buf[0] >= '0' && buf[0] <= '9' && buf[1] == '\n')
590 ts_data->debug_log_level = buf[0] - '0';
591
592 return count;
593
594}
595
596static DEVICE_ATTR(regdump, (S_IWUSR|S_IRUGO),
597 atmel_regdump_show, atmel_regdump_dump);
598
599static ssize_t atmel_debug_level_show(struct device *dev,
600 struct device_attribute *attr, char *buf)
601{
602 struct atmel_ts_data *ts_data;
603 size_t count = 0;
604 ts_data = private_ts;
605
606 count += sprintf(buf, "%d\n", ts_data->debug_log_level);
607
608 return count;
609}
610
611static ssize_t atmel_debug_level_dump(struct device *dev,
612 struct device_attribute *attr, const char *buf, size_t count)
613{
614 struct atmel_ts_data *ts_data;
615 ts_data = private_ts;
616 if (buf[0] >= '0' && buf[0] <= '9' && buf[1] == '\n')
617 ts_data->debug_log_level = buf[0] - '0';
618
619 return count;
620}
621
622static DEVICE_ATTR(debug_level, (S_IWUSR|S_IRUGO),
623 atmel_debug_level_show, atmel_debug_level_dump);
624
625static ssize_t atmel_diag_show(struct device *dev,
626 struct device_attribute *attr, char *buf)
627{
628 struct atmel_ts_data *ts_data;
629 size_t count = 0;
630 uint8_t data[T37_PAGE_SIZE];
631 uint8_t loop_i, loop_j;
632 int16_t rawdata;
633 int x, y;
634 ts_data = private_ts;
635 memset(data, 0x0, sizeof(data));
636
637 if (ts_data->diag_command != T6_CFG_DIAG_CMD_DELTAS &&
638 ts_data->diag_command != T6_CFG_DIAG_CMD_REF)
639 return count;
640
641 i2c_atmel_write_byte_data(ts_data->client,
642 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) + T6_CFG_DIAG,
643 ts_data->diag_command);
644
645 x = T46_CFG_MODE0_X + ts_data->config_setting[NONE].config_T46[T46_CFG_MODE];
646 y = T46_CFG_MODE0_Y - ts_data->config_setting[NONE].config_T46[T46_CFG_MODE];
647 count += sprintf(buf, "Channel: %d * %d\n", x, y);
648
649 for (loop_i = 0; loop_i < 4; loop_i++) {
650 for (loop_j = 0;
651 !(data[T37_MODE] == ts_data->diag_command && data[T37_PAGE] == loop_i) && loop_j < 10; loop_j++) {
652 msleep(5);
653 i2c_atmel_read(ts_data->client,
654 get_object_address(ts_data, DIAGNOSTIC_T37), data, 2);
655 }
656 if (loop_j == 10)
657 printk(KERN_INFO "[TP]%s: Diag data not ready\n", __func__);
658
659 i2c_atmel_read(ts_data->client,
660 get_object_address(ts_data, DIAGNOSTIC_T37) +
661 T37_DATA, data, T37_PAGE_SIZE);
662 for (loop_j = 0; loop_j < T37_PAGE_SIZE - 1; loop_j += 2) {
663 if ((loop_i * 64 + loop_j / 2) >= (x * y)) {
664 count += sprintf(buf + count, "\n");
665 return count;
666 } else {
667 rawdata = data[loop_j+1] << 8 | data[loop_j];
668 if (ts_data->diag_command == T6_CFG_DIAG_CMD_REF)
Ethan Chen608c7fd2013-05-20 20:16:01 -0700669 rawdata -= 0x4000; /* 16384 */
Flemmarde596a9a2013-04-25 20:52:12 -0700670 count += sprintf(buf + count, "%6d", rawdata);
671 if (((loop_i * 64 + loop_j / 2) % y) == (y - 1))
672 count += sprintf(buf + count, "\n");
673 }
674 }
675 i2c_atmel_write_byte_data(ts_data->client,
676 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) +
677 T6_CFG_DIAG, T6_CFG_DIAG_CMD_PAGEUP);
Flemmarde596a9a2013-04-25 20:52:12 -0700678 }
679
680 return count;
681}
682
683static ssize_t atmel_diag_dump(struct device *dev,
684 struct device_attribute *attr, const char *buf, size_t count)
685{
686 struct atmel_ts_data *ts_data;
687 ts_data = private_ts;
688 if (buf[0] == '1')
689 ts_data->diag_command = T6_CFG_DIAG_CMD_DELTAS;
690 if (buf[0] == '2')
691 ts_data->diag_command = T6_CFG_DIAG_CMD_REF;
692
693 return count;
694}
695
696static DEVICE_ATTR(diag, (S_IWUSR|S_IRUGO),
697 atmel_diag_show, atmel_diag_dump);
698
699static ssize_t atmel_unlock_store(struct device *dev,
700 struct device_attribute *attr, const char *buf, size_t count)
701{
702 struct atmel_ts_data *ts_data;
703 int unlock = -1;
704 ts_data = private_ts;
705
706 if (buf[0] >= '0' && buf[0] <= '9' && buf[1] == '\n')
707 unlock = buf[0] - '0';
708
709 printk(KERN_INFO "[TP]unlock change to %d\n", unlock);
710
Ethan Chen608c7fd2013-05-20 20:16:01 -0700711 if (!ts_data->unlock_attr)
712 return count;
713
Flemmarde596a9a2013-04-25 20:52:12 -0700714 if ((unlock == 2 || unlock == 3) &&
715 (ts_data->first_pressed || ts_data->finger_count) &&
Ethan Chen608c7fd2013-05-20 20:16:01 -0700716 ts_data->pre_data[0] < RECALIB_UNLOCK) {
Flemmarde596a9a2013-04-25 20:52:12 -0700717
718 ts_data->valid_press_timeout = jiffies + msecs_to_jiffies(15);
719 if (ts_data->finger_count == 0)
720 ts_data->valid_pressed_cnt = 1;
Ethan Chen608c7fd2013-05-20 20:16:01 -0700721 else /* unlock direction: left to right */
Flemmarde596a9a2013-04-25 20:52:12 -0700722 ts_data->valid_pressed_cnt = 0;
723
724 ts_data->cal_after_unlock = 0;
725 ts_data->pre_data[0] = RECALIB_UNLOCK;
726 restore_normal_threshold(ts_data);
727 i2c_atmel_write_byte_data(ts_data->client,
728 get_object_address(ts_data, GEN_ACQUISITIONCONFIG_T8) +
729 T8_CFG_ATCHCALST, 0x01);
730 if (time_after(jiffies, ts_data->safe_unlock_timeout))
731 queue_delayed_work(ts_data->atmel_delayed_wq, &ts_data->unlock_work,
732 msecs_to_jiffies(ATCHCAL_DELAY));
733 else
734 printk(KERN_INFO "[TP]unsafe unlock, give up delta check\n");
735 }
736
737 return count;
738}
739
Ethan Chen608c7fd2013-05-20 20:16:01 -0700740static DEVICE_ATTR(unlock, (S_IWUSR|S_IRUGO), NULL, atmel_unlock_store);
Flemmarde596a9a2013-04-25 20:52:12 -0700741
742static ssize_t atmel_info_show(struct device *dev,
Ethan Chen608c7fd2013-05-20 20:16:01 -0700743 struct device_attribute *attr, char *buf)
Flemmarde596a9a2013-04-25 20:52:12 -0700744{
745 size_t count = 0;
746 count += sprintf(buf, "Type B/mtsize/new filter/INT\n");
747 count += sprintf(buf + count, "2012.02.23.\n");
748 return count;
749}
750
751static DEVICE_ATTR(info, S_IRUGO, atmel_info_show, NULL);
752
Flemmarde596a9a2013-04-25 20:52:12 -0700753static struct kobject *android_touch_kobj;
754
755static int atmel_touch_sysfs_init(void)
756{
757 int ret;
758 android_touch_kobj = kobject_create_and_add("android_touch", NULL);
759 if (android_touch_kobj == NULL) {
760 printk(KERN_ERR "[TP]TOUCH_ERR: subsystem_register failed\n");
761 ret = -ENOMEM;
762 return ret;
763 }
764 ret = sysfs_create_file(android_touch_kobj, &dev_attr_gpio.attr);
765 if (ret) {
766 printk(KERN_ERR "[TP]TOUCH_ERR: create_file gpio failed\n");
767 return ret;
768 }
769 ret = sysfs_create_file(android_touch_kobj, &dev_attr_vendor.attr);
770 if (ret) {
771 printk(KERN_ERR "[TP]TOUCH_ERR: create_file vendor failed\n");
772 return ret;
773 }
774 atmel_reg_addr = 0;
775 ret = sysfs_create_file(android_touch_kobj, &dev_attr_register.attr);
776 if (ret) {
777 printk(KERN_ERR "[TP]TOUCH_ERR: create_file register failed\n");
778 return ret;
779 }
780 ret = sysfs_create_file(android_touch_kobj, &dev_attr_regdump.attr);
781 if (ret) {
782 printk(KERN_ERR "[TP]TOUCH_ERR: create_file regdump failed\n");
783 return ret;
784 }
785 ret = sysfs_create_file(android_touch_kobj, &dev_attr_debug_level.attr);
786 if (ret) {
787 printk(KERN_ERR "[TP]TOUCH_ERR: create_file debug_level failed\n");
788 return ret;
789 }
790 ret = sysfs_create_file(android_touch_kobj, &dev_attr_diag.attr);
791 if (ret) {
792 printk(KERN_ERR "[TP]TOUCH_ERR: create_file diag failed\n");
793 return ret;
794 }
795 ret = sysfs_create_file(android_touch_kobj, &dev_attr_unlock.attr);
796 if (ret) {
797 printk(KERN_ERR "[TP]TOUCH_ERR: create_file unlock failed\n");
798 return ret;
799 }
800 ret = sysfs_create_file(android_touch_kobj, &dev_attr_htc_event.attr);
801 if (ret) {
802 printk(KERN_ERR "[TP]TOUCH_ERR: create_file htc_event failed\n");
803 return ret;
804 }
Ethan Chen608c7fd2013-05-20 20:16:01 -0700805 ret = sysfs_create_file(android_touch_kobj, &dev_attr_report_type.attr);
806 if (ret) {
807 printk(KERN_ERR "[TP]TOUCH_ERR: create_file report_type failed\n");
808 return ret;
809 }
Flemmarde596a9a2013-04-25 20:52:12 -0700810 ret = sysfs_create_file(android_touch_kobj, &dev_attr_disable_touch.attr);
811 if (ret) {
812 printk(KERN_ERR "[TP]TOUCH_ERR: create_file disable_touch failed\n");
813 return ret;
814 }
815 ret = sysfs_create_file(android_touch_kobj, &dev_attr_reset.attr);
816 if (ret) {
817 printk(KERN_ERR "[TP]TOUCH_ERR: create_file RESET failed\n");
818 return ret;
819 }
820 ret = sysfs_create_file(android_touch_kobj, &dev_attr_info.attr);
821 if (ret) {
822 printk(KERN_ERR "[TP]TOUCH_ERR: create_file info failed\n");
823 return ret;
824 }
825 ret = sysfs_create_file(android_touch_kobj, &dev_attr_sr_en.attr);
826 if (ret) {
827 printk(KERN_ERR "[TP]TOUCH_ERR: create_file SR_EN failed\n");
828 return ret;
829 }
830
831 return 0;
832}
833
834static void atmel_touch_sysfs_deinit(void)
835{
836 sysfs_remove_file(android_touch_kobj, &dev_attr_info.attr);
837 sysfs_remove_file(android_touch_kobj, &dev_attr_unlock.attr);
838 sysfs_remove_file(android_touch_kobj, &dev_attr_diag.attr);
839 sysfs_remove_file(android_touch_kobj, &dev_attr_debug_level.attr);
840 sysfs_remove_file(android_touch_kobj, &dev_attr_regdump.attr);
841 sysfs_remove_file(android_touch_kobj, &dev_attr_register.attr);
842 sysfs_remove_file(android_touch_kobj, &dev_attr_vendor.attr);
843 sysfs_remove_file(android_touch_kobj, &dev_attr_gpio.attr);
844 sysfs_remove_file(android_touch_kobj, &dev_attr_report_type.attr);
845 sysfs_remove_file(android_touch_kobj, &dev_attr_htc_event.attr);
846 sysfs_remove_file(android_touch_kobj, &dev_attr_disable_touch.attr);
847 sysfs_remove_file(android_touch_kobj, &dev_attr_reset.attr);
848 sysfs_remove_file(android_touch_kobj, &dev_attr_sr_en.attr);
849 kobject_del(android_touch_kobj);
850}
851
852#endif
853
854static int check_delta_full(struct atmel_ts_data *ts,
855 uint8_t delta, uint8_t percent, uint8_t print_log)
856{
857 int8_t data[T37_DATA + T37_PAGE_SIZE];
858 uint8_t loop_i, loop_j;
859 uint8_t cnt, pos_cnt, neg_cnt, node_thr_cnt;
860 uint8_t x, y;
861 int16_t rawdata;
862
863 cnt = pos_cnt = neg_cnt = 0;
864 i2c_atmel_write_byte_data(ts->client,
865 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
866 T6_CFG_DIAG, T6_CFG_DIAG_CMD_DELTAS);
867
868 x = T46_CFG_MODE0_X + ts->config_setting[NONE].config_T46[T46_CFG_MODE];
869 y = T46_CFG_MODE0_Y - ts->config_setting[NONE].config_T46[T46_CFG_MODE];
870 node_thr_cnt = (x * y) * percent / 100;
871
872 for (loop_i = 0; loop_i < 4; loop_i++) {
873 memset(data, 0xFF, sizeof(data));
874 for (loop_j = 0;
875 !(data[T37_MODE] == T6_CFG_DIAG_CMD_DELTAS && data[T37_PAGE] == loop_i) && loop_j < 10; loop_j++) {
876 msleep(5);
877 i2c_atmel_read(ts->client,
878 get_object_address(ts, DIAGNOSTIC_T37), data, 2);
879 }
880 if (loop_j == 10)
881 printk(KERN_WARNING "[TP]%s: Diag data not ready\n", __func__);
882
883 i2c_atmel_read(ts->client,
884 get_object_address(ts, DIAGNOSTIC_T37),
885 data, T37_DATA + T37_PAGE_SIZE);
886 for (loop_j = T37_DATA;
887 loop_j < (T37_DATA + T37_PAGE_SIZE - 1); loop_j += 2) {
888 rawdata = data[loop_j+1] << 8 | data[loop_j];
889 cnt++;
890 if (rawdata > delta)
891 pos_cnt++;
892 else if (rawdata < -(delta))
893 neg_cnt++;
894
895 if (cnt >= x * y)
896 break;
897 }
898 i2c_atmel_write_byte_data(ts->client,
899 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
900 T6_CFG_DIAG, T6_CFG_DIAG_CMD_PAGEUP);
901 }
902
903 if (pos_cnt + neg_cnt > node_thr_cnt) {
904 if (print_log)
905 printk(KERN_INFO "[TP]channels C=%d P=%d N=%d T=%d\n",
906 cnt, pos_cnt, neg_cnt, node_thr_cnt);
907 return 1;
908 }
909
910 return 0;
911}
912
913static void restore_normal_threshold(struct atmel_ts_data *ts)
914{
915 if (ts->call_tchthr[0]) {
916 if (ts->config_setting[ts->status].config[0])
917 i2c_atmel_write_byte_data(ts->client,
918 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
919 T9_CFG_TCHTHR,
920 ts->config_setting[ts->status].config[CB_TCHTHR]);
921 else if (ts->config_setting[ts->status].config_T9 != NULL)
922 i2c_atmel_write_byte_data(ts->client,
923 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
924 T9_CFG_TCHTHR,
925 ts->config_setting[ts->status].config_T9[T9_CFG_TCHTHR]);
926 else
927 i2c_atmel_write_byte_data(ts->client,
928 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
929 T9_CFG_TCHTHR,
930 ts->config_setting[NONE].config_T9[T9_CFG_TCHTHR]);
931
932 i2c_atmel_write_byte_data(ts->client,
933 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
934 T8_CFG_ATCHCALSTHR,
935 ts->config_setting[ts->status].config_T8[T8_CFG_ATCHCALSTHR]);
936 }
937 if (ts->locking_config[0]) {
938 i2c_atmel_write_byte_data(ts->client,
939 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
940 T9_CFG_MRGTHR,
941 ts->config_setting[NONE].config_T9[T9_CFG_MRGTHR]);
942 }
943}
944
945static void confirm_calibration(struct atmel_ts_data *ts,
946 uint8_t recal, uint8_t reason)
947{
948 uint8_t i;
949 uint8_t ATCH_NOR[4] = {0, 1, 0, 0};
950 if (ts->cfm_calb.cnt) {
951 for (i = 0; i < ts->cfm_calb.cnt; i++)
952 i2c_atmel_write_byte_data(ts->client,
953 get_object_address(ts, ts->cfm_calb.cfg[i].objid) +
954 ts->cfm_calb.cfg[i].byte,
955 ts->cfm_calb.cfg[i].value);
956 } else
957 i2c_atmel_write(ts->client,
958 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
959 T8_CFG_ATCHCALST, ATCH_NOR, 4);
960
961 ts->pre_data[0] = RECALIB_DONE;
962 if (recal)
963 i2c_atmel_write_byte_data(ts->client,
964 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
965 T6_CFG_CALIBRATE, 0x55);
966 printk(KERN_INFO "[TP]calibration confirm %sby %s\n",
967 recal ? "with recal " : "",
968 (reason == 0) ? "position" :
969 (reason == 1) ? "clicks" :
970 (reason == 2) ? "delta" :
971 (reason == 3) ? "suspend" : "unknown");
972}
973
974static void msg_process_finger_data(struct atmel_ts_data *ts,
975 struct atmel_finger_data *fdata, uint8_t *data, uint8_t idx)
976{
977 if (!ts->high_res_x_en)
978 fdata->x = data[T9_MSG_XPOSMSB] << 2 | data[T9_MSG_XYPOSLSB] >> 6;
979 else
980 fdata->x = data[T9_MSG_XPOSMSB] << 4 | data[T9_MSG_XYPOSLSB] >> 4;
981 if (!ts->high_res_y_en)
982 fdata->y = data[T9_MSG_YPOSMSB] << 2 | (data[T9_MSG_XYPOSLSB] & 0x0C) >> 2;
983 else
984 fdata->y = data[T9_MSG_YPOSMSB] << 4 | (data[T9_MSG_XYPOSLSB] & 0x0F);
985 fdata->w = data[T9_MSG_TCHAREA];
986 fdata->z = data[T9_MSG_TCHAMPLITUDE];
987 ts->repeat_flag = 0;
988 if (ts->finger_count == 1) {
989 if ((ts->pre_finger_data[idx].x == fdata->x) && (ts->pre_finger_data[idx].y == fdata->y)
990 && (ts->pre_finger_data[idx].w == fdata->w) && (ts->pre_finger_data[idx].z == fdata->z))
991 ts->repeat_flag = 1;
992 }
993 ts->pre_finger_data[idx].x = fdata->x;
994 ts->pre_finger_data[idx].y = fdata->y;
995 ts->pre_finger_data[idx].w = fdata->w;
996 ts->pre_finger_data[idx].z = fdata->z;
997}
998
999static void msg_process_multitouch(struct atmel_ts_data *ts, uint8_t *data, uint8_t idx)
1000{
1001 msg_process_finger_data(ts, &ts->finger_data[idx], data, idx);
1002 if (data[T9_MSG_STATUS] & T9_MSG_STATUS_RELEASE) {
1003 if (ts->finger_pressed & BIT(idx)) {
1004 if (data[T9_MSG_STATUS] & T9_MSG_STATUS_MOVE) {
1005 if (ts->repeat_flag == 0) {
1006 multi_input_report(ts);
1007 if (htc_event_enable == 0)
1008 input_sync(ts->input_dev);
1009 }
1010 }
1011 }
1012
1013 if (ts->grip_suppression & BIT(idx))
1014 ts->grip_suppression &= ~BIT(idx);
Flemmarde596a9a2013-04-25 20:52:12 -07001015
Ethan Chen608c7fd2013-05-20 20:16:01 -07001016 if (!(ts->finger_pressed & BIT(idx)))
1017 /* end since finger was not pressed */
1018 return;
1019
1020 if (ts->report_type == SYN_AND_REPORT_TYPE_B) {
1021 input_mt_slot(ts->input_dev, idx);
1022 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
1023 input_sync(ts->input_dev);
Flemmarde596a9a2013-04-25 20:52:12 -07001024 }
Ethan Chen608c7fd2013-05-20 20:16:01 -07001025
1026 if (ts->finger_count == 0)
1027 printk(KERN_ERR "[TP]TOUCH_ERR: finger count has reached zero\n");
1028 else
1029 ts->finger_count--;
1030 ts->finger_pressed &= ~BIT(idx);
1031
1032 if (!ts->first_pressed) {
1033 if (ts->finger_count == 0)
1034 ts->first_pressed = 1;
1035 printk(KERN_INFO "[TP]E%d@%d,%d\n",
1036 idx + 1, ts->finger_data[idx].x, ts->finger_data[idx].y);
1037 }
1038
1039 switch (ts->pre_data[0]) {
1040 case RECALIB_NEED:
1041 if (ts->finger_count == 0 && !ts->unlock_attr && idx == 0 &&
1042 ts->finger_data[idx].y > 750 && ts->finger_data[idx].y - ts->pre_data[idx+1] > 135) {
1043 /* recalibrate on last release */
1044 restore_normal_threshold(ts);
1045 confirm_calibration(ts, 1, 0);
1046 }
1047 break;
1048 case RECALIB_UNLOCK:
1049 if (ts->finger_count) {
1050 i2c_atmel_write_byte_data(ts->client,
1051 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
1052 T6_CFG_CALIBRATE, 0x55);
1053 } else if (ts->unlock_attr && idx == 0 &&
1054 time_after(jiffies, ts->valid_press_timeout)) {
1055 ts->valid_pressed_cnt++;
1056 if (ts->valid_pressed_cnt > 2) {
1057 cancel_delayed_work_sync(&ts->unlock_work);
1058 confirm_calibration(ts, 0, 1);
1059 }
1060 }
1061 break;
1062 case RECALIB_NG:
1063 if (ts->finger_count == 0)
1064 ts->pre_data[0] = RECALIB_NEED;
1065 break;
1066 default:
1067 break;
1068 }
1069 } else if (data[T9_MSG_STATUS] & (T9_MSG_STATUS_DETECT|T9_MSG_STATUS_PRESS)) {
1070 if (ts->finger_pressed & BIT(idx))
1071 /* end since finger is already pressed */
1072 return;
1073
Flemmarde596a9a2013-04-25 20:52:12 -07001074 if (ts->filter_level[0]) {
1075 if (ts->finger_data[idx].x < ts->filter_level[FL_XLOGRIPMIN] ||
1076 ts->finger_data[idx].x > ts->filter_level[FL_XHIGRIPMAX])
1077 ts->grip_suppression |= BIT(idx);
1078 else if ((ts->finger_data[idx].x < ts->filter_level[FL_XLOGRIPMAX] ||
1079 ts->finger_data[idx].x > ts->filter_level[FL_XHIGRIPMIN]) &&
1080 (ts->grip_suppression & BIT(idx)))
1081 ts->grip_suppression |= BIT(idx);
1082 else if (ts->finger_data[idx].x > ts->filter_level[FL_XLOGRIPMAX] &&
1083 ts->finger_data[idx].x < ts->filter_level[FL_XHIGRIPMIN])
1084 ts->grip_suppression &= ~BIT(idx);
1085 }
Ethan Chen608c7fd2013-05-20 20:16:01 -07001086
Flemmarde596a9a2013-04-25 20:52:12 -07001087 if (!(ts->grip_suppression & BIT(idx))) {
Flemmarde596a9a2013-04-25 20:52:12 -07001088 ts->finger_pressed |= BIT(idx);
Ethan Chen608c7fd2013-05-20 20:16:01 -07001089
1090 if (ts->finger_count < ts->finger_support)
1091 ts->finger_count++;
1092
1093 switch (ts->pre_data[0]) {
1094 case RECALIB_UNLOCK:
1095 if (ts->unlock_attr && ts->finger_count > 1)
1096 ts->valid_pressed_cnt = 0;
1097 break;
1098 case RECALIB_NG:
1099 case RECALIB_NEED:
Flemmarde596a9a2013-04-25 20:52:12 -07001100 ts->pre_data[idx + 1] = ts->finger_data[idx].y;
Ethan Chen608c7fd2013-05-20 20:16:01 -07001101 if (ts->finger_count == ts->finger_support) {
Flemmarde596a9a2013-04-25 20:52:12 -07001102 i2c_atmel_write_byte_data(ts->client,
1103 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
1104 T6_CFG_CALIBRATE, 0x55);
Ethan Chen608c7fd2013-05-20 20:16:01 -07001105 } else if (ts->finger_count > 1) {
1106 if (ts->pre_data[0] == RECALIB_NEED)
1107 ts->pre_data[0] = RECALIB_NG;
1108 }
1109 break;
1110 default:
1111 break;
Flemmarde596a9a2013-04-25 20:52:12 -07001112 }
1113 }
1114 }
1115}
1116
1117static void initial_freq_scan(struct atmel_ts_data *ts)
1118{
1119 uint8_t data = 0;
1120 if (ts->id->version >= 0x11) {
1121 i2c_atmel_read(ts->client, get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1122 T48_CFG_NOCALCFG, &data, 1);
1123 data = data^0x20;
1124 i2c_atmel_write_byte_data(ts->client,
1125 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1126 T48_CFG_NOCALCFG, data);
1127 printk(KERN_INFO "[TP]%s: toggle = 0x%x\n", __func__, data);
1128 }
1129}
1130
1131static void msg_process_noisesuppression(struct atmel_ts_data *ts, uint8_t *data)
1132{
1133 uint8_t i;
1134 ts->noise_state = data[T48_MSG_STATE];
1135 if (ts->id->version >= 0x11 && ts->noiseLine_config[0] && ts->status == CONNECTED) {
1136 if (!ts->noiseLine_status && data[5] >= 0x15) {
1137 printk(KERN_INFO "[TP]noiseLine change\n");
1138 ts->noiseLine_status = 1;
1139 i2c_atmel_write_byte_data(ts->client,
1140 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
1141 T9_CFG_TCHTHR,
1142 ts->noiseLine_config[CB_TCHTHR]);
1143 i2c_atmel_write_byte_data(ts->client,
1144 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1145 T48_CFG_NLTHR,
1146 ts->noiseLine_config[CB_NLTHR]);
1147 i2c_atmel_write_byte_data(ts->client,
1148 get_object_address(ts, SPT_CTECONFIG_T46) +
1149 T46_CFG_IDLESYNCSPERX,
1150 ts->noiseLine_config[CB_IDLESYNCSPERX]);
1151 i2c_atmel_write_byte_data(ts->client,
1152 get_object_address(ts, SPT_CTECONFIG_T46) +
1153 T46_CFG_ACTVSYNCSPERX,
1154 ts->noiseLine_config[CB_ACTVSYNCSPERX]);
1155 i2c_atmel_write_byte_data(ts->client,
1156 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
1157 T9_CFG_TCHDI,
1158 ts->noiseLine_config[CB_TCHDI]);
1159 i2c_atmel_write_byte_data(ts->client,
1160 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
1161 T9_CFG_NEXTTCHDI,
1162 ts->noiseLine_config[CB_NEXTTCHDI]);
1163 }
1164 }
1165 if ((ts->id->version == 0x11 && (ts->id->build == 0x01 || ts->id->build == 0xAA)) && (ts->mferr_config.cnt) && ts->status == CONNECTED && ts->noise_state == T48_MSG_STATE_MF_ERR) {
1166 if (ts->noise_err_count < 3)
1167 ts->noise_err_count++;
1168 if (ts->noise_err_count == 2) {
1169 printk(KERN_INFO "[TP]mferr change\n");
1170 if (ts->id->build == 0xAA) {
1171 for (i = 0; i < ts->mferr_config.cnt; i++)
1172 i2c_atmel_write_byte_data(ts->client,
1173 get_object_address(ts, ts->mferr_config.cfg[i].objid) +
1174 ts->mferr_config.cfg[i].byte,
1175 ts->mferr_config.cfg[i].value);
1176 }
1177 }
1178 }
1179}
1180
1181
1182static void compatible_input_report(struct input_dev *idev,
1183 struct atmel_finger_data *fdata, uint8_t press, uint8_t last, uint8_t report_type, uint8_t slot_num)
1184{
1185 if (report_type == SYN_AND_REPORT_TYPE_B) {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001186 if (!press) {
Flemmarde596a9a2013-04-25 20:52:12 -07001187 input_mt_slot(idev, slot_num);
1188 input_mt_report_slot_state(idev, MT_TOOL_FINGER, 0);
1189 } else {
1190 input_mt_slot(idev, slot_num);
1191 input_mt_report_slot_state(idev, MT_TOOL_FINGER, 1);
1192 input_report_abs(idev, ABS_MT_PRESSURE, fdata->z);
1193 input_report_abs(idev, ABS_MT_TOUCH_MAJOR, fdata->z);
1194 input_report_abs(idev, ABS_MT_WIDTH_MAJOR, fdata->w);
1195 input_report_abs(idev, ABS_MT_POSITION_X, fdata->x);
1196 input_report_abs(idev, ABS_MT_POSITION_Y, fdata->y);
Ethan Chen608c7fd2013-05-20 20:16:01 -07001197 }
Flemmarde596a9a2013-04-25 20:52:12 -07001198 } else {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001199 if (!press)
Flemmarde596a9a2013-04-25 20:52:12 -07001200 input_mt_sync(idev);
1201 else {
1202 input_report_abs(idev, ABS_MT_PRESSURE, fdata->z);
1203 input_report_abs(idev, ABS_MT_TOUCH_MAJOR, fdata->z);
1204 input_report_abs(idev, ABS_MT_WIDTH_MAJOR, fdata->w);
1205 input_report_abs(idev, ABS_MT_POSITION_X, fdata->x);
1206 input_report_abs(idev, ABS_MT_POSITION_Y, fdata->y);
1207 input_mt_sync(idev);
Ethan Chen608c7fd2013-05-20 20:16:01 -07001208 }
Flemmarde596a9a2013-04-25 20:52:12 -07001209 }
1210}
1211
1212static void htc_input_report(struct input_dev *idev,
1213 struct atmel_finger_data *fdata, uint8_t press, uint8_t last)
1214{
1215 if (!press) {
1216 input_report_abs(idev, ABS_MT_AMPLITUDE, 0);
1217 input_report_abs(idev, ABS_MT_POSITION, BIT(31));
1218 } else {
1219 input_report_abs(idev, ABS_MT_AMPLITUDE, fdata->z << 16 | fdata->w);
1220 input_report_abs(idev, ABS_MT_POSITION,
1221 (last ? BIT(31) : 0) | fdata->x << 16 | fdata->y);
1222 }
1223}
1224
1225static void multi_input_report(struct atmel_ts_data *ts)
1226{
1227 uint8_t loop_i, finger_report = 0;
1228
1229 for (loop_i = 0; loop_i < ts->finger_support; loop_i++) {
1230 if (ts->finger_pressed & BIT(loop_i)) {
1231 if (disable_touch == 0) {
1232 if (htc_event_enable == 0) {
1233#if defined(CONFIG_TOUCH_KEY_FILTER)
1234 if (ts->finger_data[loop_i].y > ts->flt_th && ts->key_bypass == 1) {
1235 pr_info("[TP] key_bypass\n");
1236 ts->key_bypass = 0;
1237 } else
1238#endif
1239 compatible_input_report(ts->input_dev, &ts->finger_data[loop_i],
1240 1, (ts->finger_count == ++finger_report), ts->report_type, loop_i);
1241 } else
1242 htc_input_report(ts->input_dev, &ts->finger_data[loop_i],
1243 1, (ts->finger_count == ++finger_report));
1244 if (ts->debug_log_level & 0x2)
1245 printk(KERN_INFO "[TP]Finger %d=> X:%d, Y:%d, w:%d, z:%d, F:%d\n",
1246 loop_i + 1,
1247 ts->finger_data[loop_i].x, ts->finger_data[loop_i].y,
1248 ts->finger_data[loop_i].w, ts->finger_data[loop_i].z,
1249 ts->finger_count);
1250 } else
1251 return;
1252 }
1253 }
1254}
1255
1256static irqreturn_t atmel_irq_thread(int irq, void *ptr)
1257{
1258 int ret;
1259 struct atmel_ts_data *ts = ptr;
1260 uint8_t data[7];
1261 int8_t report_num;
1262 uint8_t loop_i, loop_j, msg_byte_num = 7;
1263
1264 memset(data, 0x0, sizeof(data));
1265
1266 ret = i2c_atmel_read(ts->client, get_object_address(ts,
1267 GEN_MESSAGEPROCESSOR_T5), data, 7);
1268
1269 if (ts->debug_log_level & 0x1) {
1270 printk(KERN_INFO "[TP]");
1271 for (loop_i = 0; loop_i < 7; loop_i++)
1272 printk("0x%2.2X ", data[loop_i]);
1273 printk("\n");
1274 }
1275
1276 report_num = data[MSG_RID] - ts->finger_type;
1277 if (report_num >= 0 && report_num < ts->finger_support) {
1278 msg_process_multitouch(ts, data, report_num);
1279 } else {
1280 if (data[MSG_RID] == get_rid(ts, GEN_COMMANDPROCESSOR_T6)) {
1281 if ((data[T6_MSG_STATUS] & T6_MSG_STATUS_CAL) &&
1282 ts->unlock_attr) {
1283 if (ts->pre_data[0] == RECALIB_UNLOCK) {
1284 ts->valid_pressed_cnt = 0;
1285 ts->cal_after_unlock = 1;
1286 ts->valid_press_timeout = jiffies +
1287 msecs_to_jiffies(15 + ts->finger_count * 5);
1288 } else if (ts->pre_data[0] < RECALIB_UNLOCK) {
1289 ts->safe_unlock_timeout = jiffies +
1290 msecs_to_jiffies(SAFE_TIMEOUT);
1291 }
1292 }
1293 printk(KERN_INFO "[TP]Touch Status: ");
1294 msg_byte_num = 5;
1295 } else if (data[MSG_RID] == get_rid(ts, PROCI_TOUCHSUPPRESSION_T42)) {
1296 ts->face_suppression = data[T42_MSG_STATUS];
1297 printk(KERN_INFO "Touch suppression %s: ",
1298 ts->face_suppression ? "Active" : "Inactive");
1299 msg_byte_num = 2;
1300 } else if (data[MSG_RID] == get_rid(ts, PROCG_NOISESUPPRESSION_T48)) {
1301 if (ts->id->version < 0x11)
1302 msg_byte_num = 5;
1303 else if (ts->id->version == 0x11 && (ts->id->build == 0x01 || ts->id->build == 0xAA)) {
1304 if ((data[T48_MSG_STATUS] & (T48_MSG_STATUS_FREQCHG|T48_MSG_STATUS_ALGOERR|T48_MSG_STATUS_STATCHG)))
1305 msg_byte_num = 7;
1306 else
1307 msg_byte_num = 0;
1308 } else
1309 msg_byte_num = 6;
1310 if (msg_byte_num)
1311 printk(KERN_INFO "[TP]Touch Noise suppression: ");
1312 msg_process_noisesuppression(ts, data);
1313 } else
1314 printk(KERN_INFO "[TP]Touch Unhandled: ");
1315
1316 if (data[MSG_RID] != 0xFF) {
1317 for (loop_j = 0; loop_j < msg_byte_num; loop_j++)
1318 printk("0x%2.2X ", data[loop_j]);
1319 if (msg_byte_num)
1320 printk("\n");
1321 }
1322 return IRQ_HANDLED;
1323 }
1324
1325 if (ts->report_type == SYN_AND_REPORT_TYPE_B) {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001326 if (!ts->finger_count || ts->face_suppression) {
1327 ts->finger_pressed = 0;
1328 ts->finger_count = 0;
Flemmarde596a9a2013-04-25 20:52:12 -07001329
Ethan Chen608c7fd2013-05-20 20:16:01 -07001330 if (ts->debug_log_level & 0x2)
1331 printk(KERN_INFO "[TP]Finger leave\n");
1332 } else {
1333 if (ts->repeat_flag == 0) {
1334 multi_input_report(ts);
1335 if (htc_event_enable == 0 || disable_touch == 0)
1336 input_sync(ts->input_dev);
1337 }
1338 }
Flemmarde596a9a2013-04-25 20:52:12 -07001339 } else {
1340 if (!ts->finger_count || ts->face_suppression) {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001341 printk(KERN_INFO "[TP] Total finger count: %d\n", ts->finger_count);
Flemmarde596a9a2013-04-25 20:52:12 -07001342 ts->finger_pressed = 0;
1343 ts->finger_count = 0;
1344 if (htc_event_enable == 0)
1345 compatible_input_report(ts->input_dev, NULL, 0, 1, 0, 0);
1346 else
1347 htc_input_report(ts->input_dev, NULL, 0, 1);
1348
1349 if (htc_event_enable == 0 || disable_touch == 0)
1350 input_sync(ts->input_dev);
1351
1352 if (ts->debug_log_level & 0x2)
1353 printk(KERN_INFO "[TP]Finger leave\n");
1354 } else {
1355 if (ts->repeat_flag == 0) {
1356 multi_input_report(ts);
1357 if (htc_event_enable == 0 || disable_touch == 0)
1358 input_sync(ts->input_dev);
1359 }
1360 }
1361 }
1362
1363 return IRQ_HANDLED;
1364}
1365
1366static void atmel_ts_check_delta_work_func(struct work_struct *work)
1367{
1368 struct atmel_ts_data *ts;
1369 uint8_t delta = 0;
1370
1371 ts = container_of(work, struct atmel_ts_data, check_delta_work);
1372
1373 i2c_atmel_read(ts->client, get_object_address(ts,
1374 TOUCH_MULTITOUCHSCREEN_T9) + T9_CFG_TCHTHR, &delta, 1);
1375 delta = (delta >> 2) << 4;
1376 if (check_delta_full(ts, delta, 50, 1)) {
1377 i2c_atmel_write_byte_data(ts->client,
1378 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
1379 T8_CFG_ATCHCALST, ts->ATCH_EXT[0]);
1380 i2c_atmel_write_byte_data(ts->client,
1381 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
1382 T8_CFG_ATCHCALSTHR, ts->ATCH_EXT[1]);
1383 i2c_atmel_write_byte_data(ts->client,
1384 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
1385 T8_CFG_ATCHFRCCALTHR, 16);
1386 i2c_atmel_write_byte_data(ts->client,
1387 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) +
1388 T8_CFG_ATCHFRCCALRATIO, 240);
1389 msleep(1);
1390 i2c_atmel_write_byte_data(ts->client,
1391 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
1392 T6_CFG_CALIBRATE, 0x55);
1393 }
1394}
1395
1396static void atmel_ts_unlock_work_func(struct work_struct *work)
1397{
1398 struct atmel_ts_data *ts;
1399 uint8_t delta = 0;
1400 int ret;
1401
1402 ts = container_of(work, struct atmel_ts_data, unlock_work.work);
1403 if (ts->pre_data[0] != RECALIB_UNLOCK || ts->cal_after_unlock)
1404 goto give_up;
1405 else {
1406 if (ts->finger_count)
1407 ret = 1;
1408 else {
1409 i2c_atmel_read(ts->client, get_object_address(ts,
1410 TOUCH_MULTITOUCHSCREEN_T9) + T9_CFG_TCHTHR, &delta, 1);
1411 delta = (delta >> 2) << 4;
1412 ret = check_delta_full(ts, delta, 2, 0);
1413 }
1414 if (ts->pre_data[0] != RECALIB_UNLOCK || ts->cal_after_unlock)
1415 goto give_up;
1416 else {
1417 if (ret == 0)
1418 confirm_calibration(ts, 0, 2);
Ethan Chen608c7fd2013-05-20 20:16:01 -07001419 else /* retry, schedule next work */
Flemmarde596a9a2013-04-25 20:52:12 -07001420 queue_delayed_work(ts->atmel_delayed_wq, &ts->unlock_work,
1421 msecs_to_jiffies(ATCHCAL_DELAY));
1422 }
1423 }
1424
1425 return;
1426
1427give_up:
1428 printk(KERN_INFO "[TP]give up delta check\n");
1429}
1430
1431#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
1432static void atmel_ts_cable_vbus_work_func(struct work_struct *work)
1433{
1434 struct atmel_ts_data *ts;
1435
1436 ts = container_of(work, struct atmel_ts_data, cable_vbus_work);
1437
1438 if (ts->cable_vbus_status) {
1439 i2c_atmel_write_byte_data(ts->client,
1440 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1441 T48_CFG_SELFREQMAX, 30);
1442 initial_freq_scan(ts);
1443 } else {
1444 i2c_atmel_write_byte_data(ts->client,
1445 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1446 T48_CFG_SELFREQMAX,
1447 ts->config_setting[NONE].config[CB_SELFREQMAX]);
1448 initial_freq_scan(ts);
1449 }
1450}
1451#endif
1452
1453static int psensor_tp_status_handler_func(struct notifier_block *this,
1454 unsigned long status, void *unused)
1455{
1456 struct atmel_ts_data *ts;
1457
1458 ts = private_ts;
1459 printk(KERN_INFO "[TP]psensor status %d -> %lu\n",
1460 ts->psensor_status, status);
1461 if (ts->psensor_status == 0) {
1462 if (status == 1)
1463 ts->psensor_status = status;
1464 else
1465 ts->psensor_status = 0;
1466 } else
1467 ts->psensor_status = status;
1468
1469 return NOTIFY_OK;
1470}
1471
1472#if defined(CONFIG_TOUCH_KEY_FILTER)
1473static int touchkey_tp_status_handler_func(struct notifier_block *this,
1474 unsigned long status, void *unused)
1475{
1476 struct atmel_ts_data *ts;
1477
1478 ts = private_ts;
1479 if (status == 1)
1480 ts->key_bypass = status;
1481 else
1482 ts->key_bypass = 0;
1483
1484 return NOTIFY_OK;
1485}
1486#endif
1487
1488#if defined(CONFIG_TOUCHSCREEN_ATMEL_WLS)
1489static int wlc_tp_status_handler_func(struct notifier_block *this,
1490 unsigned long connect_status, void *unused)
1491{
1492 struct atmel_ts_data *ts;
1493 int wlc_status;
1494
1495 wlc_status = connect_status > 0 ? CONNECTED : NONE;
1496 printk(KERN_INFO "[TP]wireless charger %d\n", wlc_status);
1497
1498 ts = private_ts;
1499 if (ts->status)
1500 printk(KERN_ERR "[TP]TOUCH_ERR:ambigurous wireless charger state\n");
1501
1502 if (wlc_status != ts->wlc_status) {
1503 ts->wlc_status = wlc_status ? CONNECTED : NONE;
1504 if (!ts->status && ts->wlc_freq[0]) {
1505 if (ts->wlc_status) {
1506 i2c_atmel_write_byte_data(ts->client,
1507 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1508 T48_CFG_BASEFREQ,
1509 ts->wlc_freq[0]);
1510 i2c_atmel_write(ts->client,
1511 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1512 T48_CFG_MFFREQ,
1513 ts->wlc_freq + 1, 2);
1514 i2c_atmel_write_byte_data(ts->client,
1515 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
1516 T48_CFG_SELFREQMAX,
1517 ts->wlc_freq[3]);
1518 } else {
1519 i2c_atmel_write(ts->client,
1520 get_object_address(ts, PROCG_NOISESUPPRESSION_T48),
1521 ts->config_setting[NONE].config_T48,
1522 get_object_size(ts, PROCG_NOISESUPPRESSION_T48));
1523 }
1524 initial_freq_scan(ts);
1525 }
1526 regdump_to_kernel();
1527 }
1528
1529 return NOTIFY_OK;
1530}
1531#endif
1532
1533#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS))
1534static void cable_tp_status_handler_func(int connect_status)
1535{
1536 uint8_t i;
1537 struct atmel_ts_data *ts;
1538 ts = private_ts;
1539
1540#if defined(CONFIG_TOUCHSCREEN_ATMEL_WLS)
1541 if (connect_status == 4 || (connect_status <= 0 && ts->wlc_status)) {
1542 wlc_tp_status_handler_func(NULL, connect_status == 4 ? 1 : 0, NULL);
1543 return;
1544 }
1545#endif
1546
1547 printk(KERN_INFO "[TP]cable change to %d\n", connect_status);
1548
1549 if (connect_status != ts->status) {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001550 ts->status = connect_status ? CONNECTED : NONE;
Flemmarde596a9a2013-04-25 20:52:12 -07001551 printk(KERN_INFO "[TP]ts->status change to %d\n", ts->status);
1552 if (!ts->status && ts->wlc_status)
1553 printk(KERN_ERR "[TP]TOUCH_ERR:ambigurous wireless charger state\n");
1554 if (ts->status && ts->wlc_status) {
1555 mutex_lock(&reload_lock);
1556 i2c_atmel_write(ts->client,
1557 get_object_address(ts, PROCG_NOISESUPPRESSION_T48),
1558 ts->config_setting[NONE].config_T48,
1559 get_object_size(ts, PROCG_NOISESUPPRESSION_T48));
1560 mutex_unlock(&reload_lock);
1561 printk(KERN_INFO "[TP]cable %s overrides wireless charger\n",
1562 ts->status ? "in" : "out");
1563 ts->wlc_status = NONE;
1564 }
1565 if (ts->config_setting[CONNECTED].config[0]) {
1566 mutex_lock(&reload_lock);
1567
1568 for (i = 0; i < ts->cable_config.cnt; i++)
1569 i2c_atmel_write_byte_data(ts->client,
1570 get_object_address(ts, ts->cable_config.cfg[i].objid) +
1571 ts->cable_config.cfg[i].byte,
Ethan Chen608c7fd2013-05-20 20:16:01 -07001572 ts->status ? (ts->cable_config.cfg[i].value) : (ts->cable_config.cfg[i].orival));
Flemmarde596a9a2013-04-25 20:52:12 -07001573
1574 if (ts->status == NONE && ts->noiseLine_status) {
1575 i2c_atmel_write_byte_data(ts->client,
1576 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
1577 T9_CFG_TCHDI,
1578 ts->config_setting[NONE].config_T9[T9_CFG_TCHDI]);
1579 i2c_atmel_write_byte_data(ts->client,
1580 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
1581 T9_CFG_NEXTTCHDI,
1582 ts->config_setting[NONE].config_T9[T9_CFG_NEXTTCHDI]);
1583 ts->noiseLine_status = 0;
1584 }
1585 if (ts->status == NONE && ts->noise_err_count >= 2) {
1586 for (i = 0 ; i < ts->mferr_config.cnt ; i++)
1587 i2c_atmel_write_byte_data(ts->client,
1588 get_object_address(ts, ts->mferr_config.cfg[i].objid) +
1589 ts->mferr_config.cfg[i].byte,
1590 ts->mferr_config.cfg[i].orival);
1591 ts->noise_err_count = 0;
1592 }
1593#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
1594 initial_freq_scan(ts);
1595#endif
1596 mutex_unlock(&reload_lock);
1597 }
1598 regdump_to_kernel();
1599 }
1600}
1601#endif
1602
1603#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
1604void cable_tp_status_vbus_handler_func(int code)
1605{
1606 struct atmel_ts_data *ts;
1607 int ret;
1608 ts = private_ts;
1609 ts->cable_vbus_status = code;
1610 ret = queue_work(ts->atmel_cable_vbus_wq, &ts->cable_vbus_work);
1611 printk(KERN_INFO "[TP]cable_tp_status_vbus_handler_func: %d, ret = %d\n", code, ret);
1612}
1613#endif
1614
1615static int read_object_table(struct atmel_ts_data *ts)
1616{
1617 uint8_t i, type_count = 0;
1618 uint8_t data[6];
1619 memset(data, 0x0, sizeof(data));
1620
1621 ts->object_table = kzalloc(sizeof(struct object_t)*ts->id->num_declared_objects, GFP_KERNEL);
1622 if (ts->object_table == NULL) {
1623 printk(KERN_ERR "[TP]TOUCH_ERR: allocate object_table failed\n");
1624 return -ENOMEM;
1625 }
1626
1627 for (i = 0; i < ts->id->num_declared_objects; i++) {
1628 i2c_atmel_read(ts->client, i * 6 + 0x07, data, 6);
1629 ts->object_table[i].object_type = data[OBJ_TABLE_TYPE];
1630 ts->object_table[i].i2c_address =
1631 data[OBJ_TABLE_LSB] | data[OBJ_TABLE_MSB] << 8;
1632 ts->object_table[i].size = data[OBJ_TABLE_SIZE] + 1;
1633 ts->object_table[i].instances = data[OBJ_TABLE_INSTANCES];
1634 ts->object_table[i].num_report_ids = data[OBJ_TABLE_RIDS];
1635 if (data[OBJ_TABLE_RIDS]) {
1636 ts->object_table[i].report_ids = type_count + 1;
1637 type_count += data[OBJ_TABLE_RIDS];
1638 }
1639 if (data[OBJ_TABLE_TYPE] == TOUCH_MULTITOUCHSCREEN_T9)
1640 ts->finger_type = ts->object_table[i].report_ids;
1641 printk(KERN_INFO
1642 "[TP]Type: %2.2X, Start: %4.4X, Size: %2X, Instance: %2X, RD#: %2X, %2X\n",
1643 ts->object_table[i].object_type , ts->object_table[i].i2c_address,
1644 ts->object_table[i].size, ts->object_table[i].instances,
1645 ts->object_table[i].num_report_ids, ts->object_table[i].report_ids);
1646 }
1647
1648 return 0;
1649}
1650
1651#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
1652static struct t_cable_status_notifier cable_status_handler = {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001653 .name = "usb_tp_connected",
1654 .func = cable_tp_status_handler_func,
Flemmarde596a9a2013-04-25 20:52:12 -07001655};
1656#endif
1657
1658#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS))
1659static struct t_usb_status_notifier cable_status_handler = {
1660 .name = "usb_tp_connected",
1661 .func = cable_tp_status_handler_func,
1662};
1663#if defined(CONFIG_TOUCHSCREEN_ATMEL_WLS)
1664static struct notifier_block wlc_status_handler = {
1665 .notifier_call = wlc_tp_status_handler_func,
1666};
1667#endif
1668#endif
1669
1670static struct notifier_block psensor_status_handler = {
1671 .notifier_call = psensor_tp_status_handler_func,
1672};
1673
1674#if defined(CONFIG_TOUCH_KEY_FILTER)
1675static struct notifier_block touchkey_status_handler = {
1676 .notifier_call = touchkey_tp_status_handler_func,
1677};
1678#endif
1679
1680static void erase_config(struct atmel_ts_data *ts_data, int intr)
1681{
1682 uint16_t startAddr, endAddr, loop_i, ret;
1683 uint8_t data[7] = {0};
1684
1685 printk(KERN_INFO "[TP]Erase Config\n");
1686 startAddr = get_object_address(ts_data, GEN_POWERCONFIG_T7);
1687 if (ts_data->id->version < 0x11) {
1688 endAddr = get_object_address(ts_data, PROCG_NOISESUPPRESSION_T48);
1689 endAddr += get_object_size(ts_data, PROCG_NOISESUPPRESSION_T48) - 1;
1690 } else {
1691 endAddr = get_object_address(ts_data, PROCI_ADAPTIVETHRESHOLD_T55);
1692 endAddr += get_object_size(ts_data, PROCI_ADAPTIVETHRESHOLD_T55) - 1;
1693 }
1694 for (loop_i = startAddr; loop_i <= endAddr; loop_i++)
1695 i2c_atmel_write_byte_data(ts_data->client, loop_i, 0);
1696
1697 ret = i2c_atmel_write_byte_data(ts_data->client,
1698 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) +
1699 T6_CFG_BACKUPNV, 0x55);
1700
1701 for (loop_i = 0; loop_i < 10; loop_i++) {
1702 if (!gpio_get_value(intr))
1703 break;
1704 printk(KERN_INFO "[TP]wait for Message(%d)\n", loop_i + 1);
1705 msleep(10);
1706 }
1707
1708 i2c_atmel_read(ts_data->client,
1709 get_object_address(ts_data, GEN_MESSAGEPROCESSOR_T5), data, 7);
1710 printk(KERN_INFO
1711 "[TP]0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n",
1712 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
1713
1714 ret = i2c_atmel_write_byte_data(ts_data->client,
1715 get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) +
1716 T6_CFG_RESET, 0x11);
1717 msleep(100);
1718}
1719
Ethan Chen608c7fd2013-05-20 20:16:01 -07001720static int atmel_224e_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
Flemmarde596a9a2013-04-25 20:52:12 -07001721{
1722 struct atmel_ts_data *ts;
1723 struct atmel_i2c_platform_data *pdata;
1724 int ret = 0, intr = 0;
1725 uint8_t loop_i;
1726 struct i2c_msg msg[2];
1727 uint8_t data[16], cfgdata[2] = {0};
1728 uint8_t CRC_check = 0;
1729#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
1730 int cable_connect_type = 0;
1731#endif
1732 uint16_t x_range;
1733 uint16_t y_range;
1734 uint8_t config_err = 0;
1735
1736 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1737 printk(KERN_ERR "[TP]TOUCH_ERR: need I2C_FUNC_I2C\n");
1738 ret = -ENODEV;
1739 goto err_check_functionality_failed;
1740 }
1741
1742 ts = kzalloc(sizeof(struct atmel_ts_data), GFP_KERNEL);
1743 if (ts == NULL) {
1744 printk(KERN_ERR "[TP]TOUCH_ERR: allocate atmel_ts_data failed\n");
1745 ret = -ENOMEM;
1746 goto err_alloc_data_failed;
1747 }
1748
1749 ts->atmel_wq = create_singlethread_workqueue("atmel_wq");
1750 if (!ts->atmel_wq) {
1751 printk(KERN_ERR "[TP]TOUCH_ERR: create workqueue atmel_wq failed\n");
1752 ret = -ENOMEM;
1753 goto err_create_atmel_wq_failed;
1754 }
1755
1756 ts->atmel_delayed_wq = create_singlethread_workqueue("atmel_delayed_wq");
1757 if (!ts->atmel_delayed_wq) {
1758 printk(KERN_ERR "[TP]TOUCH_ERR: create workqueue atmel_delayed_wq failed\n");
1759 ret = -ENOMEM;
1760 goto err_create_atmel_delayed_wq_failed;
1761 }
1762
1763#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
1764 ts->atmel_cable_vbus_wq = create_singlethread_workqueue("atmel_cable_vbus_wq");
1765 if (!ts->atmel_cable_vbus_wq) {
1766 printk(KERN_ERR "[TP]TOUCH_ERR: create workqueue atmel_delayed_wq failed\n");
1767 ret = -ENOMEM;
1768 goto err_create_atmel_cable_vbus_wq_failed;
1769 }
1770#endif
1771
1772 INIT_WORK(&ts->check_delta_work, atmel_ts_check_delta_work_func);
1773
1774#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
1775 INIT_WORK(&ts->cable_vbus_work, atmel_ts_cable_vbus_work_func);
1776#endif
1777
1778 INIT_DELAYED_WORK(&ts->unlock_work, atmel_ts_unlock_work_func);
1779 ts->client = client;
1780 i2c_set_clientdata(client, ts);
1781 pdata = client->dev.platform_data;
1782
1783 if (pdata) {
1784 ts->power = pdata->power;
1785 intr = pdata->gpio_irq;
1786 } else {
1787 printk(KERN_INFO "[TP]No pdata information\n");
1788 goto err_detect_failed;
1789 }
1790
1791 if (ts->power)
1792 ret = ts->power(1);
1793
1794 for (loop_i = 0; loop_i < 10; loop_i++) {
1795 if (!gpio_get_value(intr))
1796 break;
1797 msleep(10);
1798 }
1799
1800 if (loop_i == 10)
1801 printk(KERN_INFO "[TP]No Messages after reset\n");
1802
1803 htc_event_enable = 0;
1804
Ethan Chen608c7fd2013-05-20 20:16:01 -07001805 /* read message*/
Flemmarde596a9a2013-04-25 20:52:12 -07001806 msg[0].addr = ts->client->addr;
1807 msg[0].flags = I2C_M_RD;
1808 msg[0].len = 7;
1809 msg[0].buf = data;
1810 ret = i2c_transfer(client->adapter, msg, 1);
1811
1812 if (ret < 0) {
1813 printk(KERN_INFO "[TP]No Atmel chip inside\n");
1814 goto err_detect_failed;
1815 }
1816
1817#if !defined(CONFIG_ARCH_MSM8X60)
1818 if (ts->power)
1819 ret = ts->power(2);
1820#endif
1821
1822 printk(KERN_INFO
1823 "[TP]0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n",
1824 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
1825
1826 if (data[MSG_RID] == 0x01 &&
1827 (data[T6_MSG_STATUS] & (T6_MSG_STATUS_SIGERR|T6_MSG_STATUS_COMSERR))) {
1828 printk(KERN_ERR "[TP]TOUCH_ERR: init err: %x\n", data[T6_MSG_STATUS]);
1829 goto err_detect_failed;
1830 } else {
1831 for (loop_i = 0; loop_i < 10; loop_i++) {
1832 if (gpio_get_value(intr)) {
1833 printk(KERN_INFO "[TP]No more message\n");
1834 break;
1835 }
1836 ret = i2c_transfer(client->adapter, msg, 1);
1837 printk(KERN_INFO
1838 "[TP]0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n",
1839 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
1840
1841 if (!config_err && data[MSG_RID] == 0x01 && (data[T6_MSG_STATUS] & T6_MSG_STATUS_CFGERR))
1842 config_err = 1;
1843
1844 msleep(10);
1845 }
1846 }
1847
Ethan Chen608c7fd2013-05-20 20:16:01 -07001848 /* Read the info block data. */
Flemmarde596a9a2013-04-25 20:52:12 -07001849 ts->id = kzalloc(sizeof(struct info_id_t), GFP_KERNEL);
1850 if (ts->id == NULL) {
1851 printk(KERN_ERR "[TP]TOUCH_ERR: allocate info_id_t failed\n");
1852 goto err_alloc_failed;
1853 }
1854 ret = i2c_atmel_read(client, 0x00, data, 7);
1855
1856 ts->id->family_id = data[INFO_BLK_FID];
1857 ts->id->variant_id = data[INFO_BLK_VID];
1858 ts->id->version = data[INFO_BLK_VER];
1859 ts->id->build = data[INFO_BLK_BUILD];
1860 ts->id->matrix_x_size = data[INFO_BLK_XSIZE];
1861 ts->id->matrix_y_size = data[INFO_BLK_YSIZE];
1862 ts->id->num_declared_objects = data[INFO_BLK_OBJS];
1863
1864 printk(KERN_INFO
1865 "[TP]info block: 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n",
1866 ts->id->family_id, ts->id->variant_id,
1867 ts->id->version, ts->id->build,
1868 ts->id->matrix_x_size, ts->id->matrix_y_size,
1869 ts->id->num_declared_objects);
1870
1871 ret = i2c_atmel_read(client, 258, cfgdata, 2);
1872 if (cfgdata[0])
1873 pr_info("[TP]reg[258]=%x\n", cfgdata[0]);
1874
Ethan Chen608c7fd2013-05-20 20:16:01 -07001875 /* Read object table. */
Flemmarde596a9a2013-04-25 20:52:12 -07001876 ret = read_object_table(ts);
1877 if (ret < 0)
1878 goto err_alloc_failed;
1879
1880 if (pdata) {
1881 while (pdata->version > ts->id->version)
1882 pdata++;
1883 if (ts->id->version == 0x11 && ts->id->build == 0xF8)
1884 while (pdata->build != 0xF8)
1885 pdata++;
1886 if (cfgdata[0] > 0) {
1887 pr_info("[TP]pdata++\n");
1888 pdata++;
1889 }
1890
1891 if (config_err) {
1892 erase_config(ts, intr);
1893 i2c_atmel_write(ts->client,
1894 get_object_address(ts, SPT_GPIOPWM_T19),
1895 pdata->config_T19,
1896 get_object_size(ts, SPT_GPIOPWM_T19));
1897 msleep(10);
1898 config_err = 0;
1899 }
1900 if (pdata->source) {
1901 i2c_atmel_write_byte_data(client,
1902 get_object_address(ts, SPT_GPIOPWM_T19) + T19_CFG_CTRL,
1903 T19_CFG_CTRL_ENABLE |
1904 T19_CFG_CTRL_RPTEN |
1905 T19_CFG_CTRL_FORCERPT);
1906 for (loop_i = 0; loop_i < 10; loop_i++) {
1907 if (!gpio_get_value(intr))
1908 break;
1909 msleep(10);
1910 }
1911 if (loop_i == 10)
1912 printk(KERN_ERR "[TP]TOUCH_ERR: No Messages when check source\n");
1913 for (loop_i = 0; loop_i < 100; loop_i++) {
1914 i2c_atmel_read(ts->client, get_object_address(ts,
1915 GEN_MESSAGEPROCESSOR_T5), data, 2);
1916 if (data[MSG_RID] == get_rid(ts, SPT_GPIOPWM_T19)) {
1917 while (((data[T19_MSG_STATUS] >> 3) & 0x1) != pdata->source)
1918 pdata++;
1919 break;
1920 }
1921 }
1922 }
1923
1924 if ((pdata->config_T9[T9_CFG_NUMTOUCH] > 0) && (pdata->config_T9[T9_CFG_NUMTOUCH] <= 10)) {
1925 ts->finger_support = pdata->config_T9[T9_CFG_NUMTOUCH];
1926 } else {
1927 printk(KERN_INFO "[TP]T9_CFG_NUMTOUCH=%d is over range (1~10)!!\n", pdata->config_T9[T9_CFG_NUMTOUCH]);
1928 goto err_alloc_failed;
1929 }
1930
1931 x_range = ((uint8_t)(pdata->config_T9[T9_CFG_XRANGE + 1]) << 8) +
1932 (uint8_t)(pdata->config_T9[T9_CFG_XRANGE]);
1933 y_range = ((uint8_t)(pdata->config_T9[T9_CFG_YRANGE + 1]) << 8) +
1934 (uint8_t)(pdata->config_T9[T9_CFG_YRANGE]);
1935 if ((pdata->config_T9[T9_CFG_ORIENT] & 0x1) == 0) {
1936 if (x_range >= 1024)
1937 ts->high_res_x_en = 1;
1938 if (y_range >= 1024)
1939 ts->high_res_y_en = 1;
Ethan Chen608c7fd2013-05-20 20:16:01 -07001940 } else { /* Switches the X and Y */
Flemmarde596a9a2013-04-25 20:52:12 -07001941 if (x_range >= 1024)
1942 ts->high_res_y_en = 1;
1943 if (y_range >= 1024)
1944 ts->high_res_x_en = 1;
1945 }
1946 printk(KERN_INFO
1947 "[TP]finger_type: %d, max finger: %d%s%s\n",
1948 ts->finger_type, ts->finger_support,
1949 ts->high_res_x_en ? ", x: 12-bit" : "",
1950 ts->high_res_y_en ? ", y: 12-bit" : "");
1951
Ethan Chen608c7fd2013-05-20 20:16:01 -07001952 /* infoamtion block CRC check */
Flemmarde596a9a2013-04-25 20:52:12 -07001953 if (pdata->object_crc[0]) {
1954 ret = i2c_atmel_write_byte_data(client,
1955 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
1956 T6_CFG_CALIBRATE, 0x55);
1957 for (loop_i = 0; loop_i < 10; loop_i++) {
1958 if (!gpio_get_value(intr)) {
1959 ret = i2c_atmel_read(ts->client, get_object_address(ts,
1960 GEN_MESSAGEPROCESSOR_T5), data, 5);
1961 if (data[MSG_RID] == get_rid(ts, GEN_COMMANDPROCESSOR_T6))
1962 break;
1963 }
1964 msleep(10);
1965 }
1966 if (loop_i == 10)
1967 printk(KERN_INFO "[TP]No checksum read\n");
1968 else {
1969 for (loop_i = 0; loop_i < 3; loop_i++) {
1970 if (pdata->object_crc[loop_i] !=
1971 data[T6_MSG_CHECKSUM + loop_i]) {
Ethan Chen608c7fd2013-05-20 20:16:01 -07001972 printk(KERN_INFO
Flemmarde596a9a2013-04-25 20:52:12 -07001973 "[TP]CRC Error: DRV=0x%2.2X,0x%2.2X,0x%2.2X NV=0x%2.2X,0x%2.2X,0x%2.2X\n",
1974 pdata->object_crc[0],
1975 pdata->object_crc[1],
1976 pdata->object_crc[2],
1977 data[T6_MSG_CHECKSUM + 0],
1978 data[T6_MSG_CHECKSUM + 1],
1979 data[T6_MSG_CHECKSUM + 2]);
1980 break;
1981 }
1982 }
1983 if (loop_i == 3) {
1984 printk(KERN_INFO "[TP]CRC passed: ");
1985 for (loop_i = 0; loop_i < 3; loop_i++)
1986 printk("0x%2.2X ", pdata->object_crc[loop_i]);
1987 printk("\n");
1988 CRC_check = 1;
1989 }
1990 }
1991 }
1992 ts->abs_x_min = pdata->abs_x_min;
1993 ts->abs_x_max = pdata->abs_x_max;
1994 ts->abs_y_min = pdata->abs_y_min;
1995 ts->abs_y_max = pdata->abs_y_max;
1996 ts->abs_pressure_min = pdata->abs_pressure_min;
1997 ts->abs_pressure_max = pdata->abs_pressure_max;
1998 ts->abs_width_min = pdata->abs_width_min;
1999 ts->abs_width_max = pdata->abs_width_max;
2000 ts->ATCH_EXT = &pdata->config_T8[T8_CFG_ATCHCALST];
2001 ts->filter_level = pdata->filter_level;
2002 ts->unlock_attr = pdata->unlock_attr;
2003 ts->noiseLine_status = 0;
2004 ts->workaround = pdata->workaround;
2005#if defined(CONFIG_TOUCH_KEY_FILTER)
2006 ts->flt_th = pdata->flt_th;
2007#endif
2008 ts->report_type = pdata->report_type;
2009
2010#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
2011 cable_connect_type = cable_get_connect_type();
2012 if (cable_connect_type == 4)
2013 ts->wlc_status = CONNECTED;
Ethan Chen608c7fd2013-05-20 20:16:01 -07002014 if (cable_connect_type != 0)
Flemmarde596a9a2013-04-25 20:52:12 -07002015 ts->status = CONNECTED;
2016#endif
2017
2018#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS))
2019 if (usb_get_connect_type())
2020 ts->status = CONNECTED;
2021 else if (htc_is_wireless_charger())
2022 ts->wlc_status = CONNECTED;
2023#endif
2024
2025 ts->config_setting[NONE].config_T7
2026 = ts->config_setting[CONNECTED].config_T7
2027 = pdata->config_T7;
2028 ts->config_setting[NONE].config_T8
2029 = ts->config_setting[CONNECTED].config_T8
2030 = pdata->config_T8;
2031 ts->config_setting[NONE].config_T9 = pdata->config_T9;
2032 ts->config_setting[NONE].config_T48 = pdata->config_T48;
2033 ts->config_setting[NONE].config_T46 = pdata->config_T46;
2034 ts->config_setting[NONE].config_T35 = pdata->config_T35;
2035 ts->config_setting[NONE].config_T58 = pdata->config_T58;
2036
2037 if (pdata->wlc_freq[0])
2038 for (loop_i = 0; loop_i < 4; loop_i++)
2039 ts->wlc_freq[loop_i] = pdata->wlc_freq[loop_i];
2040
2041 if (pdata->noise_config[0])
2042 for (loop_i = 0; loop_i < 3; loop_i++)
2043 ts->noise_config[loop_i] = pdata->noise_config[loop_i];
2044
2045 pr_info("[TP] cable cnt = %d\n", pdata->cable_config.cnt);
2046
2047 if (pdata->cable_config.cnt) {
2048 ts->cable_config = pdata->cable_config;
2049 for (loop_i = 0; loop_i < ts->cable_config.cnt; loop_i++)
2050 ts->config_setting[NONE].config[loop_i] =
2051 pdata->cable_config.cfg[loop_i].orival;
2052
2053 for (loop_i = 0; loop_i < ts->cable_config.cnt; loop_i++)
2054 ts->config_setting[CONNECTED].config[loop_i] =
2055 pdata->cable_config.cfg[loop_i].value;
2056 }
2057
2058 if (pdata->call_tchthr[0])
2059 for (loop_i = 0; loop_i < 2; loop_i++)
2060 ts->call_tchthr[loop_i] = pdata->call_tchthr[loop_i];
2061
2062 if (pdata->locking_config[0])
2063 ts->locking_config[0] = pdata->locking_config[0];
2064
2065 if (pdata->mferr_config.cnt) {
2066 pr_info("[TP] mferr count = %d\n", pdata->mferr_config.cnt);
2067 ts->mferr_config = pdata->mferr_config;
2068 for (loop_i = 0; loop_i < ts->mferr_config.cnt; loop_i++)
2069 pr_info("[TP] mferr(%02d) obj = %02d, byte = %02d, vale = %02d\n",
2070 loop_i,
2071 ts->mferr_config.cfg[loop_i].objid,
2072 ts->mferr_config.cfg[loop_i].byte,
2073 ts->mferr_config.cfg[loop_i].value);
2074 }
2075
2076 if (pdata->cfm_calb.cnt) {
2077 pr_info("[TP] T8 setting :");
2078 ts->cfm_calb = pdata->cfm_calb;
2079 for (loop_i = 0; loop_i < ts->cfm_calb.cnt; loop_i++)
2080 printk("%d, ", ts->cfm_calb.cfg[loop_i].value);
2081 printk("\n");
2082 }
2083
2084 if (pdata->noiseLine_config[0])
2085 for (loop_i = 0; loop_i < 8; loop_i++)
2086 ts->noiseLine_config[loop_i] = pdata->noiseLine_config[loop_i];
2087 private_ts = ts;
2088
2089#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_CABLE)
2090 pr_info("[TP] DETECT_CABLE\n");
2091 cable_detect_register_notifier(&cable_status_handler);
2092#endif
2093
2094#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
2095 msm_hsusb_vbus_notif_register(&cable_tp_status_vbus_handler_func);
2096#endif
2097
2098#if (defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB) || defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS))
2099 usb_register_notifier(&cable_status_handler);
2100#if defined(CONFIG_TOUCHSCREEN_ATMEL_WLS)
2101 if (ts->wlc_config[0])
2102 register_notifier_wireless_charger(&wlc_status_handler);
2103#endif
2104#endif
2105
2106 if (!CRC_check) {
2107 printk(KERN_INFO "[TP]Config reload\n");
2108 mutex_lock(&reload_lock);
2109 i2c_atmel_write(ts->client,
2110 get_object_address(ts, SPT_CTECONFIG_T46),
2111 pdata->config_T46, get_object_size(ts, SPT_CTECONFIG_T46));
2112
2113 ret = i2c_atmel_write_byte_data(client,
2114 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
2115 T6_CFG_BACKUPNV, 0x55);
2116 msleep(10);
2117
2118 ret = i2c_atmel_write_byte_data(client,
2119 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
2120 T6_CFG_RESET, 0x11);
2121 msleep(100);
2122
2123 i2c_atmel_write(ts->client,
2124 get_object_address(ts, GEN_COMMANDPROCESSOR_T6),
2125 pdata->config_T6,
2126 get_object_size(ts, GEN_COMMANDPROCESSOR_T6));
2127 i2c_atmel_write(ts->client,
2128 get_object_address(ts, GEN_POWERCONFIG_T7),
2129 pdata->config_T7,
2130 get_object_size(ts, GEN_POWERCONFIG_T7));
2131 i2c_atmel_write(ts->client,
2132 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8),
2133 pdata->config_T8,
2134 get_object_size(ts, GEN_ACQUISITIONCONFIG_T8));
2135 i2c_atmel_write(ts->client,
2136 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9),
2137 pdata->config_T9,
2138 get_object_size(ts, TOUCH_MULTITOUCHSCREEN_T9));
2139 if (ts->id->version < 0x11)
2140 i2c_atmel_write(ts->client,
2141 get_object_address(ts, TOUCH_KEYARRAY_T15),
2142 pdata->config_T15,
2143 get_object_size(ts, TOUCH_KEYARRAY_T15));
2144 i2c_atmel_write(ts->client,
2145 get_object_address(ts, SPT_COMCONFIG_T18),
2146 pdata->config_T18,
2147 get_object_size(ts, SPT_COMCONFIG_T18));
2148 i2c_atmel_write(ts->client,
2149 get_object_address(ts, SPT_GPIOPWM_T19),
2150 pdata->config_T19,
2151 get_object_size(ts, SPT_GPIOPWM_T19));
2152 if (ts->id->version < 0x11)
2153 i2c_atmel_write(ts->client,
2154 get_object_address(ts, PROCI_GRIPSUPPRESSION_T40),
2155 pdata->config_T40,
2156 get_object_size(ts, PROCI_GRIPSUPPRESSION_T40));
2157 i2c_atmel_write(ts->client,
2158 get_object_address(ts, PROCI_TOUCHSUPPRESSION_T42),
2159 pdata->config_T42,
2160 get_object_size(ts, PROCI_TOUCHSUPPRESSION_T42));
2161 i2c_atmel_write(ts->client,
2162 get_object_address(ts, PROCG_NOISESUPPRESSION_T48),
2163 pdata->config_T48,
2164 get_object_size(ts, PROCG_NOISESUPPRESSION_T48));
2165 if (ts->id->version >= 0x11) {
2166 i2c_atmel_write(ts->client,
2167 get_object_address(ts, PROCI_ADAPTIVETHRESHOLD_T55),
2168 pdata->config_T55,
2169 get_object_size(ts, PROCI_ADAPTIVETHRESHOLD_T55));
2170 if (ts->id->version == 0x11 && ts->id->build == 0x01)
2171 i2c_atmel_write(ts->client,
2172 get_object_address(ts, SPT_PROTOTYPE_T35),
2173 pdata->config_T35,
2174 get_object_size(ts, SPT_PROTOTYPE_T35));
2175 if (ts->id->version == 0x11 && ts->id->build == 0xAA)
2176 i2c_atmel_write(ts->client,
2177 get_object_address(ts, EXTRA_NOISE_SUPPRESSION_T58),
2178 pdata->config_T58,
2179 get_object_size(ts, EXTRA_NOISE_SUPPRESSION_T58));
2180 }
2181 i2c_atmel_write(ts->client,
2182 get_object_address(ts, PROCI_STYLUS_T47),
2183 pdata->config_T47,
2184 get_object_size(ts, PROCI_STYLUS_T47));
2185 if (ts->id->version < 0x11)
2186 i2c_atmel_write(ts->client,
2187 get_object_address(ts, TOUCH_PROXIMITY_T23),
2188 pdata->config_T23,
2189 get_object_size(ts, TOUCH_PROXIMITY_T23));
2190 i2c_atmel_write(ts->client,
2191 get_object_address(ts, SPT_SELFTEST_T25),
2192 pdata->config_T25,
2193 get_object_size(ts, SPT_SELFTEST_T25));
2194 i2c_atmel_write(ts->client,
2195 get_object_address(ts, SPT_CTECONFIG_T46),
2196 pdata->config_T46,
2197 get_object_size(ts, SPT_CTECONFIG_T46));
2198
2199 ret = i2c_atmel_write_byte_data(client,
2200 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
2201 T6_CFG_BACKUPNV, 0x55);
2202
2203 for (loop_i = 0; loop_i < 10; loop_i++) {
2204 if (!gpio_get_value(intr))
2205 break;
2206 printk(KERN_INFO "[TP]wait for Message(%d)\n", loop_i + 1);
2207 msleep(10);
2208 }
2209
2210 i2c_atmel_read(client,
2211 get_object_address(ts, GEN_MESSAGEPROCESSOR_T5), data, 7);
2212 printk(KERN_INFO
2213 "[TP]0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n",
2214 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
2215
2216 ret = i2c_atmel_write_byte_data(client,
2217 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
2218 T6_CFG_RESET, 0x11);
2219 msleep(100);
2220 mutex_unlock(&reload_lock);
2221 }
2222
2223 if (ts->status == CONNECTED) {
2224 printk(KERN_INFO "[TP]set cable config\n");
2225 if (ts->config_setting[CONNECTED].config[0]) {
2226
2227 for (loop_i = 0; loop_i < ts->cable_config.cnt; loop_i++)
2228 i2c_atmel_write_byte_data(ts->client,
2229 get_object_address(ts, ts->cable_config.cfg[loop_i].objid) +
2230 ts->cable_config.cfg[loop_i].byte,
2231 ts->cable_config.cfg[loop_i].value);
2232
2233 if (ts->id->version == 0x11 && ts->id->build == 0xAA) {
2234 if (ts->status == CONNECTED)
2235 i2c_atmel_write_byte_data(ts->client,
2236 get_object_address(ts, EXTRA_NOISE_SUPPRESSION_T58) +
2237 T58_CFG_MAXNLTHR, 55);
2238 else if (ts->status == NONE)
2239 i2c_atmel_write_byte_data(ts->client,
2240 get_object_address(ts, EXTRA_NOISE_SUPPRESSION_T58) +
2241 T58_CFG_MAXNLTHR,
2242 ts->config_setting[NONE].config_T58[T58_CFG_MAXNLTHR]);
2243 }
2244 }
2245 initial_freq_scan(ts);
2246 } else if (ts->wlc_status == CONNECTED) {
2247 printk(KERN_INFO "[TP]set wireless charger config\n");
2248 if (ts->wlc_freq[0]) {
2249 i2c_atmel_write_byte_data(ts->client,
2250 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
2251 T48_CFG_BASEFREQ,
2252 ts->wlc_freq[0]);
2253 i2c_atmel_write(ts->client,
2254 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
2255 T48_CFG_MFFREQ,
2256 ts->wlc_freq + 1, 2);
2257 i2c_atmel_write_byte_data(ts->client,
2258 get_object_address(ts, PROCG_NOISESUPPRESSION_T48) +
2259 T48_CFG_SELFREQMAX,
2260 ts->wlc_freq[3]);
2261 }
2262 initial_freq_scan(ts);
2263 }
2264
2265 if (ts->call_tchthr[0]) {
2266 i2c_atmel_write_byte_data(ts->client,
2267 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + T9_CFG_TCHTHR,
2268 ts->call_tchthr[ts->status]);
2269 i2c_atmel_write_byte_data(ts->client,
2270 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + T8_CFG_ATCHCALSTHR,
2271 ts->call_tchthr[ts->status] - 5);
2272 }
2273
2274 if (ts->locking_config[0]) {
2275 i2c_atmel_write_byte_data(ts->client,
2276 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
2277 T9_CFG_MRGTHR,
2278 ts->locking_config[0]);
2279 }
2280 }
2281 ts->input_dev = input_allocate_device();
2282 if (ts->input_dev == NULL) {
2283 ret = -ENOMEM;
2284 dev_err(&client->dev, "[TP]TOUCH_ERR: Failed to allocate input device\n");
2285 goto err_input_dev_alloc_failed;
2286 }
2287 ts->input_dev->name = "atmel-touchscreen";
2288 ts->input_dev->id.version = (ts->id->version << 8 | ts->id->build);
2289
2290 set_bit(EV_SYN, ts->input_dev->evbit);
2291 set_bit(EV_KEY, ts->input_dev->evbit);
2292 set_bit(EV_ABS, ts->input_dev->evbit);
2293
2294 set_bit(KEY_BACK, ts->input_dev->keybit);
2295 set_bit(KEY_HOME, ts->input_dev->keybit);
2296 set_bit(KEY_MENU, ts->input_dev->keybit);
2297 set_bit(KEY_SEARCH, ts->input_dev->keybit);
2298
2299 if (ts->report_type == SYN_AND_REPORT_TYPE_B) {
2300 input_mt_init_slots(ts->input_dev, ts->finger_support);
2301 } else {
2302 ts->input_dev->mtsize = ts->finger_support;
2303 }
2304
2305 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
2306 ts->abs_x_min, ts->abs_x_max, 0, 0);
2307 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
2308 ts->abs_y_min, ts->abs_y_max, 0, 0);
2309 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR,
2310 ts->abs_pressure_min, ts->abs_pressure_max,
2311 0, 0);
2312 input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR,
2313 ts->abs_width_min, ts->abs_width_max, 0, 0);
2314 input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE,
2315 ts->abs_pressure_min, ts->abs_pressure_max,
2316 0, 0);
2317 input_set_abs_params(ts->input_dev, ABS_MT_AMPLITUDE,
2318 0, ((ts->abs_pressure_max << 16) | ts->abs_width_max), 0, 0);
2319 input_set_abs_params(ts->input_dev, ABS_MT_POSITION,
2320 0, (BIT(31) | (ts->abs_x_max << 16) | ts->abs_y_max), 0, 0);
2321
2322 ret = input_register_device(ts->input_dev);
2323 if (ret) {
2324 dev_err(&client->dev,
2325 "[TP]TOUCH_ERR: Unable to register %s input device\n",
2326 ts->input_dev->name);
2327 goto err_input_register_device_failed;
2328 }
2329 ret = request_threaded_irq(client->irq, NULL, atmel_irq_thread,
2330 IRQF_TRIGGER_LOW | IRQF_ONESHOT, client->name, ts);
2331
2332 if (ret)
2333 dev_err(&client->dev, "[TP]TOUCH_ERR: request_irq failed\n");
2334
2335#ifdef CONFIG_HAS_EARLYSUSPEND
2336 ts->early_suspend.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1;
2337 ts->early_suspend.suspend = atmel_ts_early_suspend;
2338 ts->early_suspend.resume = atmel_ts_late_resume;
2339 register_early_suspend(&ts->early_suspend);
2340#endif
2341
2342#ifdef ATMEL_EN_SYSFS
2343 atmel_touch_sysfs_init();
2344#endif
2345
2346 dev_info(&client->dev, "[TP]Start touchscreen %s in interrupt mode\n",
2347 ts->input_dev->name);
2348
2349 register_notifier_by_psensor(&psensor_status_handler);
2350
2351#if defined(CONFIG_TOUCH_KEY_FILTER)
2352 register_notifier_by_touchkey(&touchkey_status_handler);
2353#endif
2354 return 0;
2355
2356err_input_register_device_failed:
2357 input_free_device(ts->input_dev);
2358
2359err_input_dev_alloc_failed:
2360err_alloc_failed:
2361err_detect_failed:
2362
2363#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
2364 destroy_workqueue(ts->atmel_cable_vbus_wq);
2365err_create_atmel_cable_vbus_wq_failed:
2366#endif
2367
2368 destroy_workqueue(ts->atmel_delayed_wq);
2369err_create_atmel_delayed_wq_failed:
2370 destroy_workqueue(ts->atmel_wq);
2371
2372err_create_atmel_wq_failed:
2373 kfree(ts);
2374
2375err_alloc_data_failed:
2376err_check_functionality_failed:
2377
2378 return ret;
2379}
2380
2381static int atmel_224e_ts_remove(struct i2c_client *client)
2382{
2383 struct atmel_ts_data *ts = i2c_get_clientdata(client);
2384
2385#ifdef ATMEL_EN_SYSFS
2386 atmel_touch_sysfs_deinit();
2387#endif
2388
2389 unregister_early_suspend(&ts->early_suspend);
2390 free_irq(client->irq, ts);
2391
2392 destroy_workqueue(ts->atmel_delayed_wq);
2393 destroy_workqueue(ts->atmel_wq);
2394 if (ts->sr_input_dev != NULL)
2395 input_unregister_device(ts->sr_input_dev);
2396 input_unregister_device(ts->input_dev);
2397 kfree(ts);
2398
2399 return 0;
2400}
2401
2402static int atmel_224e_ts_suspend(struct i2c_client *client, pm_message_t mesg)
2403{
2404 struct atmel_ts_data *ts = i2c_get_clientdata(client);
2405 printk(KERN_INFO "[TP]%s:enter unlock 0\n", __func__);
2406
2407 disable_irq(client->irq);
2408
2409 cancel_delayed_work_sync(&ts->unlock_work);
2410 if (ts->pre_data[0] == RECALIB_UNLOCK && ts->psensor_status)
2411 confirm_calibration(ts, 0, 3);
2412
2413#if defined(CONFIG_TOUCHSCREEN_ATMEL_DETECT_USB_VBUS)
2414 cancel_work_sync(&ts->cable_vbus_work);
2415#endif
2416
2417 cancel_work_sync(&ts->check_delta_work);
2418
2419 ts->finger_pressed = 0;
2420 ts->finger_count = 0;
2421 ts->first_pressed = 0;
2422
2423 if (ts->psensor_status == 0) {
2424 ts->pre_data[0] = RECALIB_NEED;
2425 i2c_atmel_write(client,
2426 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + T8_CFG_ATCHCALST,
2427 ts->ATCH_EXT, 4);
2428 }
2429
2430 if (ts->workaround & TW_SHIFT)
2431 i2c_atmel_write_byte_data(ts->client,
2432 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
2433 T9_CFG_YHICLIP, ts->config_setting[NONE].config_T9[T9_CFG_YHICLIP] - 1);
2434
2435 i2c_atmel_write_byte_data(client,
2436 get_object_address(ts, GEN_POWERCONFIG_T7) + T7_CFG_IDLEACQINT, 0x0);
2437 i2c_atmel_write_byte_data(client,
2438 get_object_address(ts, GEN_POWERCONFIG_T7) + T7_CFG_ACTVACQINT, 0x0);
2439 return 0;
2440}
2441
2442static int atmel_224e_ts_resume(struct i2c_client *client)
2443{
2444 struct atmel_ts_data *ts = i2c_get_clientdata(client);
2445 uint8_t loop_i = 0;
2446
2447 printk(KERN_INFO "[TP] unlock change to 1\n");
2448
2449 if (ts->workaround & TW_SHIFT)
2450 i2c_atmel_write_byte_data(ts->client,
2451 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
2452 T9_CFG_YHICLIP, ts->config_setting[NONE].config_T9[T9_CFG_YHICLIP]);
2453
2454 if (ts->pre_data[0] == RECALIB_NEED) {
2455 if (ts->call_tchthr[0] && ts->psensor_status == 2 && !ts->wlc_status) {
2456 printk(KERN_INFO "[TP]raise touch threshold\n");
2457 i2c_atmel_write_byte_data(ts->client,
2458 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + T9_CFG_TCHTHR,
2459 ts->call_tchthr[ts->status]);
2460 i2c_atmel_write_byte_data(ts->client,
2461 get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + T8_CFG_ATCHCALSTHR,
2462 ts->call_tchthr[ts->status] - 5);
2463 }
2464 if (ts->locking_config[0]) {
2465 i2c_atmel_write_byte_data(ts->client,
2466 get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) +
2467 T9_CFG_MRGTHR,
2468 ts->locking_config[0]);
2469 }
2470 }
2471
2472 i2c_atmel_write(ts->client,
2473 get_object_address(ts, GEN_POWERCONFIG_T7),
2474 ts->config_setting[ts->status].config_T7,
2475 get_object_size(ts, GEN_POWERCONFIG_T7));
2476
2477 if (ts->status == NONE) {
2478 if (ts->noise_state == T48_MSG_STATE_GC_ERR ||
2479 ts->noise_state == T48_MSG_STATE_MF_ERR)
2480 initial_freq_scan(ts);
2481 }
2482
2483 if (ts->pre_data[0] != RECALIB_NEED) {
2484 printk(KERN_INFO "[TP]resume in call, psensor status %d\n",
2485 ts->psensor_status);
2486 queue_work(ts->atmel_wq, &ts->check_delta_work);
2487 } else {
2488 msleep(1);
2489 i2c_atmel_write_byte_data(client,
2490 get_object_address(ts, GEN_COMMANDPROCESSOR_T6) +
2491 T6_CFG_CALIBRATE, 0x55);
2492 }
2493
2494 if (ts->report_type == SYN_AND_REPORT_TYPE_B) {
2495 for (loop_i = 0; loop_i < ts->finger_support; loop_i++) {
2496 input_mt_slot(ts->input_dev, loop_i);
2497 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
2498 input_sync(ts->input_dev);
2499 }
2500 }
2501
2502 enable_irq(client->irq);
2503
2504 return 0;
2505}
2506
2507#ifdef CONFIG_HAS_EARLYSUSPEND
2508static void atmel_ts_early_suspend(struct early_suspend *h)
2509{
2510 struct atmel_ts_data *ts;
2511 ts = container_of(h, struct atmel_ts_data, early_suspend);
2512 atmel_224e_ts_suspend(ts->client, PMSG_SUSPEND);
2513}
2514
2515static void atmel_ts_late_resume(struct early_suspend *h)
2516{
2517 struct atmel_ts_data *ts;
2518 ts = container_of(h, struct atmel_ts_data, early_suspend);
2519 atmel_224e_ts_resume(ts->client);
2520}
2521#endif
2522
2523static const struct i2c_device_id atml_224e_ts_i2c_id[] = {
2524 { ATMEL_MXT224E_NAME, 0 },
2525 { }
2526};
2527
2528static struct i2c_driver atmel_224e_ts_driver = {
2529 .id_table = atml_224e_ts_i2c_id,
2530 .probe = atmel_224e_ts_probe,
2531 .remove = atmel_224e_ts_remove,
2532#ifndef CONFIG_HAS_EARLYSUSPEND
2533 .suspend = atmel_224e_ts_suspend,
2534 .resume = atmel_224e_ts_resume,
2535#endif
2536 .driver = {
2537 .name = ATMEL_MXT224E_NAME,
2538 },
2539};
2540
2541static int __devinit atmel_224e_ts_init(void)
2542{
2543 printk(KERN_INFO "[TP]atmel_224e_ts_init():\n");
2544 return i2c_add_driver(&atmel_224e_ts_driver);
2545}
2546
2547static void __exit atmel_224e_ts_exit(void)
2548{
2549 i2c_del_driver(&atmel_224e_ts_driver);
2550}
2551
2552module_init(atmel_224e_ts_init);
2553module_exit(atmel_224e_ts_exit);
2554
2555MODULE_DESCRIPTION("ATMEL Touch driver");
2556MODULE_LICENSE("GPL");