2 * Copyright (C) 2010,Imagis Technology Co. Ltd. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
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.
16 #include <linux/i2c.h>
17 #include <linux/delay.h>
18 #include <linux/slab.h>
19 #include <linux/firmware.h>
20 #include <linux/stat.h>
22 #include <linux/i2c/ist30xxc.h>
23 #include "ist30xxc_update.h"
24 #include "ist30xxc_misc.h"
26 #define TSP_CH_UNUSED (0)
27 #define TSP_CH_SCREEN (1)
28 #define TSP_CH_GTX (2)
29 #define TSP_CH_KEY (3)
30 #define TSP_CH_UNKNOWN (-1)
32 #define TOUCH_NODE_PARSING_DEBUG (0)
34 static u32 *ist30xx_frame_buf;
35 static u32 *ist30xx_frame_rawbuf;
36 static u32 *ist30xx_frame_fltbuf;
38 int ist30xx_check_valid_ch(struct ist30xx_data *data, int ch_tx, int ch_rx)
41 TKEY_INFO *tkey = &data->tkey_info;
42 TSP_INFO *tsp = &data->tsp_info;
44 if (unlikely((ch_tx >= tsp->ch_num.tx) || (ch_rx >= tsp->ch_num.rx)))
45 return TSP_CH_UNKNOWN;
47 if ((ch_tx >= tsp->screen.tx) || (ch_rx >= tsp->screen.rx)) {
49 for (i = 0; i < tsp->gtx.num; i++) {
50 if ((ch_tx == tsp->gtx.ch_num[i]) && (ch_rx < tsp->screen.rx))
56 for (i = 0; i < tkey->key_num; i++) {
57 if ((ch_tx == tkey->ch_num[i].tx) &&
58 (ch_rx == tkey->ch_num[i].rx))
69 int ist30xx_parse_touch_node(struct ist30xx_data *data, u8 flag,
70 struct TSP_NODE_BUF *node)
72 #if TOUCH_NODE_PARSING_DEBUG
74 TSP_INFO *tsp = &data->tsp_info;
77 u16 *raw = (u16 *)&node->raw;
78 u16 *base = (u16 *)&node->base;
79 u16 *filter = (u16 *)&node->filter;
80 u32 *tmp_rawbuf = ist30xx_frame_rawbuf;
81 u32 *tmp_fltbuf = ist30xx_frame_fltbuf;
83 for (i = 0; i < node->len; i++) {
84 if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) {
85 *raw++ = *tmp_rawbuf & 0xFFF;
86 *base++ = (*tmp_rawbuf >> 16) & 0xFFF;
90 if (flag & NODE_FLAG_FILTER)
91 *filter++ = *tmp_fltbuf++ & 0xFFF;
94 #if TOUCH_NODE_PARSING_DEBUG
95 tsp_info("RAW - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx);
96 for (i = 0; i < tsp->ch_num.tx; i++) {
98 for (j = 0; j < tsp->ch_num.rx; j++)
99 printk("%4d ", node->raw[(i * tsp->ch_num.rx) + j]);
102 tsp_info("BASE - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx);
103 for (i = 0; i < tsp->ch_num.tx; i++) {
104 printk("\n[ TSP ] ");
105 for (j = 0; j < tsp->ch_num.rx; j++)
106 printk("%4d ", node->base[(i * tsp->ch_num.rx) + j]);
109 tsp_info("FILTER - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx);
110 for (i = 0; i < tsp->ch_num.tx; i++) {
111 printk("\n[ TSP ] ");
112 for (j = 0; j < tsp->ch_num.rx; j++)
113 printk("%4d ", node->filter[(i * tsp->ch_num.rx) + j]);
120 int print_touch_node(struct ist30xx_data *data, u8 flag,
121 struct TSP_NODE_BUF *node, char *buf)
126 const int msg_len = 128;
128 TSP_INFO *tsp = &data->tsp_info;
130 if (tsp->dir.swap_xy) {
131 for (i = 0; i < tsp->ch_num.rx; i++) {
132 for (j = 0; j < tsp->ch_num.tx; j++) {
133 if (flag == NODE_FLAG_RAW)
134 val = (int)node->raw[(j * tsp->ch_num.rx) + i];
135 else if (flag == NODE_FLAG_BASE)
136 val = (int)node->base[(j * tsp->ch_num.rx) + i];
137 else if (flag == NODE_FLAG_FILTER)
138 val = (int)node->filter[(j * tsp->ch_num.rx) + i];
139 else if (flag == NODE_FLAG_DIFF)
140 val = (int)(node->raw[(j * tsp->ch_num.rx) + i]
141 - node->base[(j * tsp->ch_num.rx) + i]);
145 if (val < 0) val = 0;
147 if (ist30xx_check_valid_ch(data, j, i) == TSP_CH_UNUSED)
148 count += snprintf(msg, msg_len, "%4d ", 0);
150 count += snprintf(msg, msg_len, "%4d ", val);
152 strncat(buf, msg, msg_len);
155 count += snprintf(msg, msg_len, "\n");
156 strncat(buf, msg, msg_len);
159 for (i = 0; i < tsp->ch_num.tx; i++) {
160 for (j = 0; j < tsp->ch_num.rx; j++) {
161 if (flag == NODE_FLAG_RAW)
162 val = (int)node->raw[(i * tsp->ch_num.rx) + j];
163 else if (flag == NODE_FLAG_BASE)
164 val = (int)node->base[(i * tsp->ch_num.rx) + j];
165 else if (flag == NODE_FLAG_FILTER)
166 val = (int)node->filter[(i * tsp->ch_num.rx) + j];
167 else if (flag == NODE_FLAG_DIFF)
168 val = (int)(node->raw[(i * tsp->ch_num.rx) + j]
169 - node->base[(i * tsp->ch_num.rx) + j]);
173 if (val < 0) val = 0;
175 if (ist30xx_check_valid_ch(data, i, j) == TSP_CH_UNUSED)
176 count += snprintf(msg, msg_len, "%4d ", 0);
178 count += snprintf(msg, msg_len, "%4d ", val);
180 strncat(buf, msg, msg_len);
183 count += snprintf(msg, msg_len, "\n");
184 strncat(buf, msg, msg_len);
191 int parse_tsp_node(struct ist30xx_data *data, u8 flag,
192 struct TSP_NODE_BUF *node, s16 *buf16, int mode)
196 TSP_INFO *tsp = &data->tsp_info;
198 if (unlikely((flag != NODE_FLAG_RAW) && (flag != NODE_FLAG_BASE) &&
199 (flag != NODE_FLAG_FILTER) && (flag != NODE_FLAG_DIFF)))
202 for (i = 0; i < tsp->ch_num.tx; i++) {
203 for (j = 0; j < tsp->ch_num.rx; j++) {
204 if (mode & TS_RAW_SCREEN) {
205 if (ist30xx_check_valid_ch(data, i, j) != TSP_CH_SCREEN)
207 } else if (mode & TS_RAW_KEY) {
208 if (ist30xx_check_valid_ch(data, i, j) != TSP_CH_KEY)
213 val = (s16)node->raw[(i * tsp->ch_num.rx) + j];
216 val = (s16)node->base[(i * tsp->ch_num.rx) + j];
218 case NODE_FLAG_FILTER:
219 val = (s16)node->filter[(i * tsp->ch_num.rx) + j];
222 val = (s16)(node->raw[(i * tsp->ch_num.rx) + j]
223 - node->base[(i * tsp->ch_num.rx) + j]);
227 if (val < 0) val = 0;
229 if (ist30xx_check_valid_ch(data, i, j) == TSP_CH_UNUSED)
239 int ist30xx_read_touch_node(struct ist30xx_data *data, u8 flag,
240 struct TSP_NODE_BUF *node)
245 u32 *tmp_rawbuf = ist30xx_frame_rawbuf;
246 u32 *tmp_fltbuf = ist30xx_frame_fltbuf;
248 ist30xx_disable_irq(data);
250 if (flag & NODE_FLAG_NO_CCP) {
251 ist30xx_reset(data, false);
252 ret = ist30xx_write_cmd(data->client, IST30XX_HIB_CMD,
253 ((eHCOM_CP_CORRECT_EN << 16) | (IST30XX_DISABLE & 0xFFFF)));
255 goto read_tsp_node_end;
260 ret = ist30xx_cmd_hold(data, 1);
262 goto read_tsp_node_end;
264 addr = IST30XX_DA_ADDR(data->tags.raw_base);
265 if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) {
266 tsp_info("Reg addr: %x, size: %d\n", addr, node->len);
267 for (i = 0; i < node->len; i++) {
268 ret = ist30xx_read_buf(data->client, addr, tmp_rawbuf, 1);
272 addr += IST30XX_DATA_LEN;
277 addr = IST30XX_DA_ADDR(data->tags.filter_base);
278 if (flag & NODE_FLAG_FILTER) {
279 tsp_info("Reg addr: %x, size: %d\n", addr, node->len);
280 for (i = 0; i < node->len; i++) {
281 ret = ist30xx_read_buf(data->client, addr, tmp_fltbuf, 1);
285 addr += IST30XX_DATA_LEN;
291 ist30xx_cmd_hold(data, 0);
293 if (flag & NODE_FLAG_NO_CCP) {
294 ist30xx_reset(data, false);
299 ist30xx_enable_irq(data);
304 /* sysfs: /sys/class/touch/node/refresh */
305 ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr,
309 struct ist30xx_data *data = dev_get_drvdata(dev);
310 TSP_INFO *tsp = &data->tsp_info;
311 u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER;
313 tsp_info("refresh\n");
314 mutex_lock(&ist30xx_mutex);
315 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
317 mutex_unlock(&ist30xx_mutex);
318 tsp_err("cmd 1frame raw update fail\n");
319 return sprintf(buf, "FAIL\n");
321 mutex_unlock(&ist30xx_mutex);
323 ist30xx_parse_touch_node(data, flag, &tsp->node);
325 return sprintf(buf, "OK\n");
329 /* sysfs: /sys/class/touch/node/read_nocp */
330 ssize_t ist30xx_frame_nocp(struct device *dev, struct device_attribute *attr,
334 struct ist30xx_data *data = dev_get_drvdata(dev);
335 TSP_INFO *tsp = &data->tsp_info;
336 u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER |
339 mutex_lock(&ist30xx_mutex);
340 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
342 mutex_unlock(&ist30xx_mutex);
343 tsp_err("cmd 1frame raw update fail\n");
344 return sprintf(buf, "FAIL\n");
346 mutex_unlock(&ist30xx_mutex);
348 ist30xx_parse_touch_node(data, flag, &tsp->node);
350 return sprintf(buf, "OK\n");
354 /* sysfs: /sys/class/touch/node/base */
355 ssize_t ist30xx_base_show(struct device *dev, struct device_attribute *attr,
359 struct ist30xx_data *data = dev_get_drvdata(dev);
360 TSP_INFO *tsp = &data->tsp_info;
363 count = sprintf(buf, "dump ist30xx baseline(%d)\n", tsp->node.len);
365 count += print_touch_node(data, NODE_FLAG_BASE, &tsp->node, buf);
371 /* sysfs: /sys/class/touch/node/raw */
372 ssize_t ist30xx_raw_show(struct device *dev, struct device_attribute *attr,
376 struct ist30xx_data *data = dev_get_drvdata(dev);
377 TSP_INFO *tsp = &data->tsp_info;
380 count = sprintf(buf, "dump ist30xx raw(%d)\n", tsp->node.len);
382 count += print_touch_node(data, NODE_FLAG_RAW, &tsp->node, buf);
388 /* sysfs: /sys/class/touch/node/diff */
389 ssize_t ist30xx_diff_show(struct device *dev, struct device_attribute *attr,
393 struct ist30xx_data *data = dev_get_drvdata(dev);
394 TSP_INFO *tsp = &data->tsp_info;
397 count = sprintf(buf, "dump ist30xx difference (%d)\n", tsp->node.len);
399 count += print_touch_node(data, NODE_FLAG_DIFF, &tsp->node, buf);
405 /* sysfs: /sys/class/touch/node/filter */
406 ssize_t ist30xx_filter_show(struct device *dev, struct device_attribute *attr,
410 struct ist30xx_data *data = dev_get_drvdata(dev);
411 TSP_INFO *tsp = &data->tsp_info;
414 count = sprintf(buf, "dump ist30xx filter (%d)\n", tsp->node.len);
416 count += print_touch_node(data, NODE_FLAG_FILTER, &tsp->node, buf);
421 /* sysfs: /sys/class/touch/sys/debug_mode */
422 ssize_t ist30xx_debug_mode_store(struct device *dev,
423 struct device_attribute *attr, const char *buf, size_t size)
427 struct ist30xx_data *data = dev_get_drvdata(dev);
429 sscanf(buf, "%d", &enable);
431 if (unlikely((enable != 0) && (enable != 1))) {
432 tsp_err("input data error(%d)\n", enable);
436 if (data->status.power) {
437 ret = ist30xx_write_cmd(data->client, IST30XX_HIB_CMD,
438 (eHCOM_SLEEP_MODE_EN << 16) | ((enable ? 0 : 1) & 0xFFFF));
441 tsp_info("failed to set debug mode(%d)\n", enable);
443 data->debug_mode = enable;
444 tsp_info("debug mode %s\n", enable ? "start" : "stop");
447 data->debug_mode = enable;
448 tsp_info("debug mode %s\n", enable ? "start" : "stop");
454 /* sysfs: /sys/class/touch/sys/jig_mode */
455 ssize_t ist30xx_jig_mode_store(struct device *dev,
456 struct device_attribute *attr, const char *buf, size_t size)
459 struct ist30xx_data *data = dev_get_drvdata(dev);
461 sscanf(buf, "%d", &enable);
463 if (unlikely((enable != 0) && (enable != 1))) {
464 tsp_err("input data error(%d)\n", enable);
468 data->jig_mode = enable;
469 tsp_info("set jig mode: %s\n", enable ? "start" : "stop");
471 mutex_lock(&ist30xx_mutex);
472 ist30xx_reset(data, false);
474 mutex_unlock(&ist30xx_mutex);
479 extern int calib_ms_delay;
480 /* sysfs: /sys/class/touch/sys/clb_time */
481 ssize_t ist30xx_calib_time_store(struct device *dev,
482 struct device_attribute *attr, const char *buf, size_t size)
486 sscanf(buf, "%d", &ms_delay);
488 if (ms_delay > 10 && ms_delay < 1000) // 1sec ~ 100sec
489 calib_ms_delay = ms_delay;
491 tsp_info("Calibration wait time %dsec\n", calib_ms_delay / 10);
496 /* sysfs: /sys/class/touch/sys/clb */
497 ssize_t ist30xx_calib_show(struct device *dev, struct device_attribute *attr,
500 struct ist30xx_data *data = dev_get_drvdata(dev);
502 mutex_lock(&ist30xx_mutex);
503 ist30xx_disable_irq(data);
505 ist30xx_reset(data, false);
506 ist30xx_calibrate(data, 1);
508 mutex_unlock(&ist30xx_mutex);
514 /* sysfs: /sys/class/touch/sys/clb_result */
515 ssize_t ist30xx_calib_result_show(struct device *dev,
516 struct device_attribute *attr, char *buf)
521 struct ist30xx_data *data = dev_get_drvdata(dev);
523 ret = ist30xx_read_cmd(data, eHCOM_GET_CAL_RESULT, &value);
525 mutex_lock(&ist30xx_mutex);
526 ist30xx_reset(data, false);
528 mutex_unlock(&ist30xx_mutex);
529 tsp_warn("Error Read Calibration Result\n");
530 count = sprintf(buf, "Error Read Calibration Result\n");
535 "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n",
536 CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value);
543 /* sysfs: /sys/class/touch/sys/power_on */
544 ssize_t ist30xx_power_on_show(struct device *dev, struct device_attribute *attr,
547 struct ist30xx_data *data = dev_get_drvdata(dev);
549 tsp_info("Power enable: %d\n", true);
551 mutex_lock(&ist30xx_mutex);
552 ist30xx_internal_resume(data);
553 ist30xx_enable_irq(data);
554 mutex_unlock(&ist30xx_mutex);
561 /* sysfs: /sys/class/touch/sys/power_off */
562 ssize_t ist30xx_power_off_show(struct device *dev,
563 struct device_attribute *attr, char *buf)
565 struct ist30xx_data *data = dev_get_drvdata(dev);
567 tsp_info("Power enable: %d\n", false);
569 mutex_lock(&ist30xx_mutex);
570 ist30xx_disable_irq(data);
571 ist30xx_internal_suspend(data);
572 mutex_unlock(&ist30xx_mutex);
577 /* sysfs: /sys/class/touch/sys/errcnt */
578 ssize_t ist30xx_errcnt_store(struct device *dev, struct device_attribute *attr,
579 const char *buf, size_t size)
582 struct ist30xx_data *data = dev_get_drvdata(dev);
584 sscanf(buf, "%d", &err_cnt);
586 if (unlikely(err_cnt < 0))
589 tsp_info("Request reset error count: %d\n", err_cnt);
591 data->max_irq_err_cnt = err_cnt;
596 /* sysfs: /sys/class/touch/sys/scancnt */
597 ssize_t ist30xx_scancnt_store(struct device *dev, struct device_attribute *attr,
598 const char *buf, size_t size)
601 struct ist30xx_data *data = dev_get_drvdata(dev);
603 sscanf(buf, "%d", &retry);
605 if (unlikely(retry < 0))
608 tsp_info("Timer scan count retry: %d\n", retry);
610 data->max_scan_retry = retry;
615 extern int ist30xx_dbg_level;
616 /* sysfs: /sys/class/touch/sys/printk */
617 ssize_t ist30xx_printk_store(struct device *dev, struct device_attribute *attr,
618 const char *buf, size_t size)
622 sscanf(buf, "%d", &level);
624 if (unlikely((level < DEV_ERR) || (level > DEV_VERB)))
627 tsp_info("prink log level: %d\n", level);
629 ist30xx_dbg_level = level;
634 ssize_t ist30xx_printk_show(struct device *dev, struct device_attribute *attr,
637 return sprintf(buf, "prink log level: %d\n", ist30xx_dbg_level);
640 /* sysfs: /sys/class/touch/sys/printk5 */
641 ssize_t ist30xx_printk5_show(struct device *dev, struct device_attribute *attr,
644 tsp_info("prink log level:%d\n", DEV_DEBUG);
646 ist30xx_dbg_level = DEV_DEBUG;
651 /* sysfs: /sys/class/touch/sys/printk6 */
652 ssize_t ist30xx_printk6_show(struct device *dev, struct device_attribute *attr,
655 tsp_info("prink log level:%d\n", DEV_VERB);
657 ist30xx_dbg_level = DEV_VERB;
663 /* sysfs: /sys/class/touch/sys/gesture */
664 ssize_t ist30xx_gesture_store(struct device *dev, struct device_attribute *attr,
665 const char *buf, size_t size)
668 struct ist30xx_data *data = dev_get_drvdata(dev);
670 sscanf(buf, "%d", &gesture);
672 tsp_info("gesture enable : %s\n", (gesture == 0) ? "disable" : "enable");
674 data->gesture = (gesture == 0) ? false : true;
680 /* sysfs: /sys/class/touch/sys/touch_rate */
681 ssize_t ist30xx_touch_rate_store(struct device *dev,
682 struct device_attribute *attr, const char *buf, size_t size)
685 struct ist30xx_data *data = dev_get_drvdata(dev);
687 sscanf(buf, "%d", &rate); // us
689 if (unlikely(rate > 0xFFFF)) // over 65.5ms
692 data->report_rate = rate;
693 ist30xx_write_cmd(data->client, IST30XX_HIB_CMD,
694 ((eHCOM_SET_TIME_ACTIVE << 16) | (data->report_rate & 0xFFFF)));
695 tsp_info(" active rate : %dus\n", data->report_rate);
700 /* sysfs: /sys/class/touch/sys/idle_rate */
701 ssize_t ist30xx_idle_scan_rate_store(struct device *dev,
702 struct device_attribute *attr, const char *buf, size_t size)
705 struct ist30xx_data *data = dev_get_drvdata(dev);
707 sscanf(buf, "%d", &rate); // us
709 if (unlikely(rate > 0xFFFF)) // over 65.5ms
712 data->idle_rate = rate;
713 ist30xx_write_cmd(data->client, IST30XX_HIB_CMD,
714 ((eHCOM_SET_TIME_IDLE << 16) | (data->idle_rate & 0xFFFF)));
715 tsp_info(" idle rate : %dus\n", data->idle_rate);
720 extern void ist30xx_set_ta_mode(bool charging);
721 /* sysfs: /sys/class/touch/sys/mode_ta */
722 ssize_t ist30xx_ta_mode_store(struct device *dev, struct device_attribute *attr,
723 const char *buf, size_t size)
727 sscanf(buf, "%d", &mode);
729 if (unlikely((mode != 0) && (mode != 1))) // enable/disable
732 ist30xx_set_ta_mode(mode);
737 extern void ist30xx_set_call_mode(int mode);
738 /* sysfs: /sys/class/touch/sys/mode_call */
739 ssize_t ist30xx_call_mode_store(struct device *dev,
740 struct device_attribute *attr, const char *buf, size_t size)
744 sscanf(buf, "%d", &mode);
746 if (unlikely((mode != 0) && (mode != 1))) // enable/disable
749 ist30xx_set_call_mode(mode);
754 extern void ist30xx_set_cover_mode(int mode);
755 /* sysfs: /sys/class/touch/sys/mode_cover */
756 ssize_t ist30xx_cover_mode_store(struct device *dev,
757 struct device_attribute *attr, const char *buf, size_t size)
761 sscanf(buf, "%d", &mode);
763 if (unlikely((mode != 0) && (mode != 1))) // enable/disable
766 ist30xx_set_cover_mode(mode);
771 /* sysfs: /sys/class/touch/sys/ic_inform */
772 ssize_t ist30xx_read_ic_inform(struct device *dev, struct device_attribute *attr,
775 struct ist30xx_data *data = dev_get_drvdata(dev);
777 ist30xx_print_info(data);
782 #define TUNES_CMD_WRITE (1)
783 #define TUNES_CMD_READ (2)
784 #define TUNES_CMD_REG_ENTER (3)
785 #define TUNES_CMD_REG_EXIT (4)
786 #define TUNES_CMD_UPDATE_PARAM (5)
787 #define TUNES_CMD_UPDATE_FW (6)
789 #define DIRECT_ADDR(n) (IST30XX_DA_ADDR(n))
790 #define DIRECT_CMD_WRITE ('w')
791 #define DIRECT_CMD_READ ('r')
808 static TUNES_INFO ist30xx_tunes;
809 static DIRECT_INFO ist30xx_direct;
810 static bool tunes_cmd_done = false;
811 static bool ist30xx_reg_mode = false;
813 /* sysfs: /sys/class/touch/sys/direct */
814 ssize_t ist30xx_direct_store(struct device *dev, struct device_attribute *attr,
815 const char *buf, size_t size)
818 struct ist30xx_data *data = dev_get_drvdata(dev);
819 DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct;
821 sscanf(buf, "%c %x %x", &direct->cmd, &direct->addr, &direct->val);
823 tsp_debug("Direct cmd: %c, addr: %x, val: %x\n",
824 direct->cmd, direct->addr, direct->val);
826 if (unlikely((direct->cmd != DIRECT_CMD_WRITE) &&
827 (direct->cmd != DIRECT_CMD_READ))) {
828 tsp_warn("Direct cmd is not correct!\n");
832 if (ist30xx_intr_wait(data, 30) < 0)
835 data->status.event_mode = false;
836 if (direct->cmd == DIRECT_CMD_WRITE) {
837 ist30xx_cmd_hold(data, 1);
838 ist30xx_write_cmd(data->client, DIRECT_ADDR(direct->addr),
840 ist30xx_read_reg(data->client, DIRECT_ADDR(direct->addr),
842 ret = ist30xx_cmd_hold(data, 0);
844 tsp_debug("Direct write fail\n");
845 ist30xx_reset(data, false);
848 tsp_debug("Direct write addr: %x, val: %x\n",
849 direct->addr, direct->val);
852 data->status.event_mode = true;
857 #define DIRECT_BUF_COUNT (4)
858 ssize_t ist30xx_direct_show(struct device *dev, struct device_attribute *attr,
861 int i, ret, count = 0;
864 u32 buf32[DIRECT_BUF_COUNT];
865 int max_len = DIRECT_BUF_COUNT;
866 const int msg_len = 256;
868 struct ist30xx_data *data = dev_get_drvdata(dev);
869 DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct;
871 if (unlikely(direct->cmd != DIRECT_CMD_READ))
872 return sprintf(buf, "ex) echo r addr len > direct\n");
875 addr = DIRECT_ADDR(direct->addr);
877 if (ist30xx_intr_wait(data, 30) < 0)
880 data->status.event_mode = false;
881 ist30xx_cmd_hold(data, 1);
884 if (len < max_len) max_len = len;
886 memset(buf32, 0, sizeof(buf32));
887 for (i = 0; i < max_len; i++) {
888 ret = ist30xx_read_buf(data->client, addr, &buf32[i], 1);
890 count = sprintf(buf, "I2C Burst read fail, addr: %x\n", addr);
894 addr += IST30XX_DATA_LEN;
897 for (i = 0; i < max_len; i++) {
898 count += snprintf(msg, msg_len, "0x%08x ", buf32[i]);
899 strncat(buf, msg, msg_len);
901 count += snprintf(msg, msg_len, "\n");
902 strncat(buf, msg, msg_len);
907 ret = ist30xx_cmd_hold(data, 0);
909 ist30xx_reset(data, false);
912 data->status.event_mode = true;
914 tsp_debug("%s", buf);
919 /* sysfs: /sys/class/touch/tunes/node_info */
920 ssize_t tunes_node_info_show(struct device *dev,
921 struct device_attribute *attr, char *buf)
924 struct ist30xx_data *data = dev_get_drvdata(dev);
925 TSP_INFO *tsp = &data->tsp_info;
926 TKEY_INFO *tkey = &data->tkey_info;
929 size = sprintf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
930 data->chip_id, tsp->dir.swap_xy, tsp->ch_num.tx,
931 tsp->ch_num.rx,tsp->screen.tx, tsp->screen.rx,
932 tsp->gtx.num, tsp->gtx.ch_num[0],
933 tsp->gtx.ch_num[1], tsp->gtx.ch_num[2], tsp->gtx.ch_num[3],
934 tsp->baseline, tkey->enable, tkey->baseline, tkey->key_num,
935 tkey->ch_num[0].tx, tkey->ch_num[0].rx, tkey->ch_num[1].tx,
936 tkey->ch_num[1].rx, tkey->ch_num[2].tx, tkey->ch_num[2].rx,
937 tkey->ch_num[3].tx, tkey->ch_num[3].rx, tkey->ch_num[4].tx,
938 tkey->ch_num[4].rx, data->tags.raw_base, data->tags.filter_base);
943 /* sysfs: /sys/class/touch/tunes/regcmd */
944 ssize_t tunes_regcmd_store(struct device *dev, struct device_attribute *attr,
945 const char *buf, size_t size)
949 struct ist30xx_data *data = dev_get_drvdata(dev);
951 memcpy(&ist30xx_tunes, buf, sizeof(ist30xx_tunes));
952 buf += sizeof(ist30xx_tunes);
955 tunes_cmd_done = false;
957 switch (ist30xx_tunes.cmd) {
958 case TUNES_CMD_WRITE:
962 case TUNES_CMD_REG_ENTER:
963 ist30xx_disable_irq(data);
965 /* enter reg access mode */
966 ret = ist30xx_cmd_hold(data, 1);
970 ist30xx_reg_mode = true;
972 case TUNES_CMD_REG_EXIT:
973 /* exit reg access mode */
974 ret = ist30xx_cmd_hold(data, 0);
976 ist30xx_reset(data, false);
981 ist30xx_reg_mode = false;
982 ist30xx_enable_irq(data);
985 ist30xx_enable_irq(data);
988 tunes_cmd_done = true;
993 tsp_err("Tunes regcmd i2c_fail, ret=%d\n", ret);
997 ssize_t tunes_regcmd_show(struct device *dev, struct device_attribute *attr,
1002 size = sprintf(buf, "cmd: 0x%02x, addr: 0x%08x, len: 0x%04x\n",
1003 ist30xx_tunes.cmd, ist30xx_tunes.addr, ist30xx_tunes.len);
1008 #define MAX_WRITE_LEN (1)
1009 /* sysfs: /sys/class/touch/tunes/reg */
1010 ssize_t tunes_reg_store(struct device *dev, struct device_attribute *attr,
1011 const char *buf, size_t size)
1014 u32 *buf32 = (u32 *)buf;
1015 int waddr, wcnt = 0, len = 0;
1016 struct ist30xx_data *data = dev_get_drvdata(dev);
1018 if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_WRITE)) {
1019 tsp_err("error, IST30XX_REG_CMD is not correct!\n");
1023 if (unlikely(!ist30xx_reg_mode)) {
1024 tsp_err("error, IST30XX_REG_CMD is not ready!\n");
1028 if (unlikely(!tunes_cmd_done)) {
1029 tsp_err("error, IST30XX_REG_CMD is not ready!\n");
1033 waddr = ist30xx_tunes.addr;
1034 if (ist30xx_tunes.len >= MAX_WRITE_LEN)
1035 len = MAX_WRITE_LEN;
1037 len = ist30xx_tunes.len;
1039 while (wcnt < ist30xx_tunes.len) {
1040 ret = ist30xx_write_buf(data->client, waddr, buf32, len);
1041 if (unlikely(ret)) {
1042 tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret);
1048 if ((ist30xx_tunes.len - wcnt) < MAX_WRITE_LEN)
1049 len = ist30xx_tunes.len - wcnt;
1051 buf32 += MAX_WRITE_LEN;
1052 waddr += MAX_WRITE_LEN * IST30XX_DATA_LEN;
1055 tunes_cmd_done = false;
1060 ssize_t tunes_reg_show(struct device *dev, struct device_attribute *attr,
1065 #if I2C_MONOPOLY_MODE
1066 unsigned long flags;
1068 struct ist30xx_data *data = dev_get_drvdata(dev);
1070 if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_READ)) {
1071 tsp_err("error, IST30XX_REG_CMD is not correct!\n");
1075 if (unlikely(!tunes_cmd_done)) {
1076 tsp_err("error, IST30XX_REG_CMD is not ready!\n");
1080 #if I2C_MONOPOLY_MODE
1081 local_irq_save(flags); // Activated only when the GPIO I2C is used
1083 ret = ist30xx_burst_read(data->client, ist30xx_tunes.addr,
1084 (u32 *)buf, ist30xx_tunes.len, false);
1085 #if I2C_MONOPOLY_MODE
1086 local_irq_restore(flags); // Activated only when the GPIO I2C is used
1088 if (unlikely(ret)) {
1089 tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret);
1093 size = ist30xx_tunes.len * IST30XX_DATA_LEN;
1095 tunes_cmd_done = false;
1100 /* sysfs: /sys/class/touch/tunes/adb */
1101 ssize_t tunes_adb_store(struct device *dev, struct device_attribute *attr,
1102 const char *buf, size_t size)
1107 u32 cmd, addr, len, val;
1109 struct ist30xx_data *data = dev_get_drvdata(dev);
1111 sscanf(buf, "%x %x %x", &cmd, &addr, &len);
1114 case TUNES_CMD_WRITE: /* write cmd */
1116 ptr = (char *)(buf + 15);
1118 while (write_len < len) {
1119 memcpy(token, ptr, 8);
1121 val = simple_strtoul(token, &tmp, 16);
1122 ret = ist30xx_write_buf(data->client, addr, &val, 1);
1123 if (unlikely(ret)) {
1124 tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret);
1134 case TUNES_CMD_READ: /* read cmd */
1135 ist30xx_tunes.cmd = cmd;
1136 ist30xx_tunes.addr = addr;
1137 ist30xx_tunes.len = len;
1140 case TUNES_CMD_REG_ENTER: /* enter */
1141 ist30xx_disable_irq(data);
1143 ret = ist30xx_cmd_hold(data, 1);
1144 if (unlikely(ret < 0)) {
1148 ist30xx_reg_mode = true;
1151 case TUNES_CMD_REG_EXIT: /* exit */
1152 if (ist30xx_reg_mode == true) {
1153 ret = ist30xx_cmd_hold(data, 0);
1154 if (unlikely(ret < 0)) {
1155 ist30xx_reset(data, false);
1156 ist30xx_start(data);
1160 ist30xx_reg_mode = false;
1161 ist30xx_enable_irq(data);
1172 tsp_err("Tunes adb i2c_fail\n");
1176 ssize_t tunes_adb_show(struct device *dev, struct device_attribute *attr,
1180 int i, len, size = 0;
1182 #if I2C_MONOPOLY_MODE
1183 unsigned long flags;
1185 struct ist30xx_data *data = dev_get_drvdata(dev);
1187 tsp_info("tunes_adb_show,%08x,%d\n", ist30xx_tunes.addr, ist30xx_tunes.len);
1189 #if I2C_MONOPOLY_MODE
1190 local_irq_save(flags); // Activated only when the GPIO I2C is used
1192 ret = ist30xx_burst_read(data->client, ist30xx_tunes.addr,
1193 ist30xx_frame_buf, ist30xx_tunes.len, false);
1194 if (unlikely(ret)) {
1195 tsp_err("Tunes adbshow i2c_fail, ret=%d\n", ret);
1199 #if I2C_MONOPOLY_MODE
1200 local_irq_restore(flags); // Activated only when the GPIO I2C is used
1205 len = sprintf(reg_val, "%08x", ist30xx_tunes.addr);
1206 strcat(buf, reg_val);
1208 for (i = 0; i < ist30xx_tunes.len; i++) {
1209 len = sprintf(reg_val, "%08x", ist30xx_frame_buf[i]);
1210 strcat(buf, reg_val);
1217 #ifdef IST30XX_ALGORITHM_MODE
1218 /* sysfs: /sys/class/touch/tunes/algorithm */
1219 extern u32 ist30xx_algr_addr, ist30xx_algr_size;
1220 ssize_t ist30xx_algr_store(struct device *dev, struct device_attribute *attr,
1221 const char *buf, size_t size)
1223 sscanf(buf, "%x %d", &ist30xx_algr_addr, &ist30xx_algr_size);
1225 tsp_info("Algorithm addr: 0x%x, count: %d\n",
1226 ist30xx_algr_addr, ist30xx_algr_size);
1228 ist30xx_algr_addr |= IST30XX_DIRECT_ACCESS;
1233 ssize_t ist30xx_algr_show(struct device *dev, struct device_attribute *attr,
1239 struct ist30xx_data *data = dev_get_drvdata(dev);
1241 ret = ist30xx_read_cmd(data, eHCOM_GET_ALGO_BASE, &algr_addr);
1242 if (unlikely(ret)) {
1243 mutex_lock(&ist30xx_mutex);
1244 ist30xx_reset(data, false);
1245 ist30xx_start(data);
1246 mutex_unlock(&ist30xx_mutex);
1247 tsp_warn("Algorithm mem addr read fail!\n");
1251 tsp_info("algr_addr(0x%x): 0x%x\n", eHCOM_GET_ALGO_BASE, algr_addr);
1253 count = sprintf(buf, "Algorithm addr : 0x%x\n", algr_addr);
1257 #endif // IST30XX_ALGORITHM_MODE
1259 /* sysfs: /sys/class/touch/tunes/intr_debug */
1260 extern u32 intr_debug_addr, intr_debug_size;
1261 ssize_t intr_debug_store(struct device *dev, struct device_attribute *attr,
1262 const char *buf, size_t size)
1264 sscanf(buf, "%x %d", &intr_debug_addr, &intr_debug_size);
1265 tsp_info("Interrupt debug addr: 0x%x, count: %d\n",
1266 intr_debug_addr, intr_debug_size);
1268 intr_debug_addr |= IST30XX_DIRECT_ACCESS;
1273 ssize_t intr_debug_show(struct device *dev, struct device_attribute *attr,
1278 tsp_info("intr_debug_addr(0x%x): %d\n", intr_debug_addr, intr_debug_size);
1280 count = sprintf(buf, "intr_debug_addr(0x%x): %d\n",
1281 intr_debug_addr, intr_debug_size);
1286 /* sysfs: /sys/class/touch/tunes/intr_debug2 */
1287 extern u32 intr_debug2_addr, intr_debug2_size;
1288 ssize_t intr_debug2_store(struct device *dev, struct device_attribute *attr,
1289 const char *buf, size_t size)
1291 sscanf(buf, "%x %d", &intr_debug2_addr, &intr_debug2_size);
1292 tsp_info("Interrupt debug2 addr: 0x%x, count: %d\n",
1293 intr_debug2_addr, intr_debug2_size);
1295 intr_debug2_addr |= IST30XX_DIRECT_ACCESS;
1300 ssize_t intr_debug2_show(struct device *dev, struct device_attribute *attr,
1305 tsp_info("intr_debug2_addr(0x%x): %d\n",
1306 intr_debug2_addr, intr_debug2_size);
1308 count = sprintf(buf, "intr_debug2_addr(0x%x): %d\n",
1309 intr_debug2_addr, intr_debug2_size);
1314 /* sysfs: /sys/class/touch/tunes/intr_debug3 */
1315 extern u32 intr_debug3_addr, intr_debug3_size;
1316 ssize_t intr_debug3_store(struct device *dev, struct device_attribute *attr,
1317 const char *buf, size_t size)
1319 sscanf(buf, "%x %d", &intr_debug3_addr, &intr_debug3_size);
1320 tsp_info("Interrupt debug3 addr: 0x%x, count: %d\n",
1321 intr_debug3_addr, intr_debug3_size);
1323 intr_debug3_addr |= IST30XX_DIRECT_ACCESS;
1328 ssize_t intr_debug3_show(struct device *dev, struct device_attribute *attr,
1333 tsp_info("intr_debug3_addr(0x%x): %d\n",
1334 intr_debug3_addr, intr_debug3_size);
1336 count = sprintf(buf, "intr_debug3_addr(0x%x): %d\n",
1337 intr_debug3_addr, intr_debug3_size);
1343 static DEVICE_ATTR(refresh, S_IRUGO, ist30xx_frame_refresh, NULL);
1344 static DEVICE_ATTR(nocp, S_IRUGO, ist30xx_frame_nocp, NULL);
1345 static DEVICE_ATTR(filter, S_IRUGO, ist30xx_filter_show, NULL);
1346 static DEVICE_ATTR(raw, S_IRUGO, ist30xx_raw_show, NULL);
1347 static DEVICE_ATTR(base, S_IRUGO, ist30xx_base_show, NULL);
1348 static DEVICE_ATTR(diff, S_IRUGO, ist30xx_diff_show, NULL);
1351 static DEVICE_ATTR(debug_mode, S_IWUSR | S_IWGRP, NULL, ist30xx_debug_mode_store);
1352 static DEVICE_ATTR(jig_mode, S_IWUSR | S_IWGRP, NULL, ist30xx_jig_mode_store);
1353 static DEVICE_ATTR(printk, S_IRUGO | S_IWUSR | S_IWGRP,
1354 ist30xx_printk_show, ist30xx_printk_store);
1355 static DEVICE_ATTR(printk5, S_IRUGO, ist30xx_printk5_show, NULL);
1356 static DEVICE_ATTR(printk6, S_IRUGO, ist30xx_printk6_show, NULL);
1358 static DEVICE_ATTR(gesture, S_IWUSR | S_IWGRP, NULL, ist30xx_gesture_store);
1360 static DEVICE_ATTR(direct, S_IRUGO | S_IWUSR | S_IWGRP,
1361 ist30xx_direct_show, ist30xx_direct_store);
1362 static DEVICE_ATTR(clb_time, S_IWUSR | S_IWGRP, NULL, ist30xx_calib_time_store);
1363 static DEVICE_ATTR(clb, S_IRUGO, ist30xx_calib_show, NULL);
1364 static DEVICE_ATTR(clb_result, S_IRUGO, ist30xx_calib_result_show, NULL);
1365 static DEVICE_ATTR(tsp_power_on, S_IRUGO, ist30xx_power_on_show, NULL);
1366 static DEVICE_ATTR(tsp_power_off, S_IRUGO, ist30xx_power_off_show, NULL);
1367 static DEVICE_ATTR(errcnt, S_IWUSR | S_IWGRP, NULL, ist30xx_errcnt_store);
1368 static DEVICE_ATTR(scancnt, S_IWUSR | S_IWGRP, NULL, ist30xx_scancnt_store);
1369 static DEVICE_ATTR(report_rate, S_IWUSR | S_IWGRP, NULL, ist30xx_touch_rate_store);
1370 static DEVICE_ATTR(idle_rate, S_IWUSR | S_IWGRP, NULL, ist30xx_idle_scan_rate_store);
1371 static DEVICE_ATTR(mode_ta, S_IWUSR | S_IWGRP, NULL, ist30xx_ta_mode_store);
1372 static DEVICE_ATTR(mode_call, S_IWUSR | S_IWGRP, NULL, ist30xx_call_mode_store);
1373 static DEVICE_ATTR(mode_cover, S_IWUSR | S_IWGRP, NULL, ist30xx_cover_mode_store);
1374 static DEVICE_ATTR(ic_inform, S_IRUGO, ist30xx_read_ic_inform, NULL);
1376 static DEVICE_ATTR(node_info, S_IRUGO, tunes_node_info_show, NULL);
1377 static DEVICE_ATTR(regcmd, S_IRUGO | S_IWUSR | S_IWGRP, tunes_regcmd_show, tunes_regcmd_store);
1378 static DEVICE_ATTR(reg, S_IRUGO | S_IWUSR | S_IWGRP, tunes_reg_show, tunes_reg_store);
1379 static DEVICE_ATTR(adb, S_IRUGO | S_IWUSR | S_IWGRP, tunes_adb_show, tunes_adb_store);
1380 #ifdef IST30XX_ALGORITHM_MODE
1381 static DEVICE_ATTR(algorithm, S_IRUGO | S_IWUSR | S_IWGRP, ist30xx_algr_show, ist30xx_algr_store);
1383 static DEVICE_ATTR(intr_debug, S_IRUGO | S_IWUSR | S_IWGRP, intr_debug_show, intr_debug_store);
1384 static DEVICE_ATTR(intr_debug2, S_IRUGO | S_IWUSR | S_IWGRP, intr_debug2_show, intr_debug2_store);
1385 static DEVICE_ATTR(intr_debug3, S_IRUGO | S_IWUSR | S_IWGRP, intr_debug3_show, intr_debug3_store);
1387 static struct attribute *node_attributes[] = {
1388 &dev_attr_refresh.attr,
1389 &dev_attr_nocp.attr,
1390 &dev_attr_filter.attr,
1392 &dev_attr_base.attr,
1393 &dev_attr_diff.attr,
1397 static struct attribute *sys_attributes[] = {
1398 &dev_attr_debug_mode.attr,
1399 &dev_attr_jig_mode.attr,
1400 &dev_attr_printk.attr,
1401 &dev_attr_printk5.attr,
1402 &dev_attr_printk6.attr,
1404 &dev_attr_gesture.attr,
1406 &dev_attr_direct.attr,
1407 &dev_attr_clb_time.attr,
1409 &dev_attr_clb_result.attr,
1410 &dev_attr_tsp_power_on.attr,
1411 &dev_attr_tsp_power_off.attr,
1412 &dev_attr_errcnt.attr,
1413 &dev_attr_scancnt.attr,
1414 &dev_attr_report_rate.attr,
1415 &dev_attr_idle_rate.attr,
1416 &dev_attr_mode_ta.attr,
1417 &dev_attr_mode_call.attr,
1418 &dev_attr_mode_cover.attr,
1419 &dev_attr_ic_inform.attr,
1423 static struct attribute *tunes_attributes[] = {
1424 &dev_attr_node_info.attr,
1425 &dev_attr_regcmd.attr,
1428 #ifdef IST30XX_ALGORITHM_MODE
1429 &dev_attr_algorithm.attr,
1431 &dev_attr_intr_debug.attr,
1432 &dev_attr_intr_debug2.attr,
1433 &dev_attr_intr_debug3.attr,
1437 static struct attribute_group node_attr_group = {
1438 .attrs = node_attributes,
1441 static struct attribute_group sys_attr_group = {
1442 .attrs = sys_attributes,
1445 static struct attribute_group tunes_attr_group = {
1446 .attrs = tunes_attributes,
1449 extern struct class *ist30xx_class;
1450 struct device *ist30xx_sys_dev;
1451 struct device *ist30xx_tunes_dev;
1452 struct device *ist30xx_node_dev;
1454 int ist30xx_init_misc_sysfs(struct ist30xx_data *data)
1456 int frame_buf_size = IST30XX_NODE_TOTAL_NUM * IST30XX_DATA_LEN;
1458 /* /sys/class/touch/sys */
1459 ist30xx_sys_dev = device_create(ist30xx_class, NULL, 0, data, "sys");
1461 /* /sys/class/touch/sys/... */
1462 if (unlikely(sysfs_create_group(&ist30xx_sys_dev->kobj,
1464 tsp_err("Failed to create sysfs group(%s)!\n", "sys");
1466 /* /sys/class/touch/tunes */
1467 ist30xx_tunes_dev = device_create(ist30xx_class, NULL, 0, data, "tunes");
1469 /* /sys/class/touch/tunes/... */
1470 if (unlikely(sysfs_create_group(&ist30xx_tunes_dev->kobj,
1471 &tunes_attr_group)))
1472 tsp_err("Failed to create sysfs group(%s)!\n", "tunes");
1474 /* /sys/class/touch/node */
1475 ist30xx_node_dev = device_create(ist30xx_class, NULL, 0, data, "node");
1477 /* /sys/class/touch/node/... */
1478 if (unlikely(sysfs_create_group(&ist30xx_node_dev->kobj,
1480 tsp_err("Failed to create sysfs group(%s)!\n", "node");
1482 ist30xx_frame_buf = kmalloc(frame_buf_size, GFP_KERNEL);
1483 ist30xx_frame_rawbuf = kmalloc(frame_buf_size, GFP_KERNEL);
1484 ist30xx_frame_fltbuf = kmalloc(frame_buf_size, GFP_KERNEL);
1485 if (!ist30xx_frame_buf || !ist30xx_frame_rawbuf || !ist30xx_frame_fltbuf)