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.
17 #include <linux/mutex.h>
18 #include <linux/i2c.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/input.h>
22 #include <linux/stat.h>
23 #include <linux/err.h>
24 #include <linux/firmware.h>
25 #include <linux/gpio.h>
26 #ifdef CONFIG_INPUT_BOOSTER
27 #include <linux/input/input_booster.h>
29 #include <linux/i2c/ist30xxc.h>
30 #include "ist30xxc_update.h"
32 #include "ist30xxc_misc.h"
35 #include "ist30xxc_cmcs.h"
39 #define COMMAND_LENGTH 64
40 #define FACTORY_BUF_SIZE PAGE_SIZE
44 #define CMD_STATE_WAITING (0)
45 #define CMD_STATE_RUNNING (1)
46 #define CMD_STATE_OK (2)
47 #define CMD_STATE_FAIL (3)
48 #define CMD_STATE_NA (4)
50 #define TSP_NODE_DEBUG (0)
51 #define TSP_CM_DEBUG (0)
53 #define TSP_CH_UNUSED (0)
54 #define TSP_CH_SCREEN (1)
55 #define TSP_CH_GTX (2)
56 #define TSP_CH_KEY (3)
57 #define TSP_CH_UNKNOWN (-1)
59 #define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func
61 struct list_head list;
62 const char * cmd_name;
63 void (*cmd_func)(void *dev_data);
66 u32 ist30xx_get_fw_ver(struct ist30xx_data *data)
71 ret = ist30xx_read_cmd(data, eHCOM_GET_VER_FW, &ver);
74 ist30xx_reset(data, false);
76 tsp_info("%s(), ret=%d\n", __func__, ret);
80 tsp_debug("Reg addr: %x, ver: %x\n", eHCOM_GET_VER_FW, ver);
85 u32 ist30xx_get_fw_chksum(struct ist30xx_data *data)
91 ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum);
93 ist30xx_reset(data, false);
95 tsp_info("%s(), ret=%d\n", __func__, ret);
99 tsp_debug("Reg addr: %x, chksum: %x\n", eHCOM_GET_CRC32,chksum);
104 #define KEY_SENSITIVITY_OFFSET 0x10
105 u32 key_sensitivity = 0;
106 int ist30xx_get_key_sensitivity(struct ist30xx_data *data, int id)
108 u32 addr = IST30XX_DA_ADDR(data->tags.algo_base) + KEY_SENSITIVITY_OFFSET;
112 if (unlikely(id >= data->tkey_info.key_num))
115 if (ist30xx_intr_wait(data, 30) < 0)
118 ret = ist30xx_read_cmd(data, addr, &val);
120 ist30xx_reset(data, false);
122 tsp_info("%s(), ret=%d\n", __func__, ret);
126 if ((val & 0xFFF) == 0xFFF)
127 return (key_sensitivity >> (16 * id)) & 0xFFFF;
129 key_sensitivity = val;
131 tsp_debug("Reg addr: %x, val: %8x\n", addr, val);
135 return (int)(val & 0xFFFF);
139 /* Factory CMD function */
140 static void set_default_result(struct sec_factory *sec)
144 memset(sec->cmd_result, 0, sec->cmd_result_length);
145 memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd));
146 strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING);
149 static void set_cmd_result(struct sec_factory *sec, char *buf, int len)
151 strncat(sec->cmd_result, buf, len);
154 static void not_support_cmd(void *dev_data)
156 char buf[16] = { 0 };
158 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
159 struct sec_factory *sec = (struct sec_factory *)&data->sec;
161 set_default_result(sec);
162 snprintf(buf, sizeof(buf), "%s", "NA");
163 tsp_info("%s(), %s\n", __func__, buf);
165 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
167 mutex_lock(&sec->cmd_lock);
168 sec->cmd_is_running = false;
169 mutex_unlock(&sec->cmd_lock);
171 sec->cmd_state = CMD_STATE_NA;
172 dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__,
173 buf, strnlen(buf, sizeof(buf)));
177 static void get_chip_vendor(void *dev_data)
179 char buf[16] = { 0 };
181 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
182 struct sec_factory *sec = (struct sec_factory *)&data->sec;
184 set_default_result(sec);
185 snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR);
186 tsp_info("%s(), %s\n", __func__, buf);
188 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
189 sec->cmd_state = CMD_STATE_OK;
190 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
191 buf, strnlen(buf, sizeof(buf)));
194 static void get_chip_name(void *dev_data)
196 char buf[16] = { 0 };
198 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
199 struct sec_factory *sec = (struct sec_factory *)&data->sec;
201 set_default_result(sec);
202 snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME);
203 tsp_info("%s(), %s\n", __func__, buf);
205 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
206 sec->cmd_state = CMD_STATE_OK;
207 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
208 buf, strnlen(buf, sizeof(buf)));
211 static void get_chip_id(void *dev_data)
213 char buf[16] = { 0 };
215 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
216 struct sec_factory *sec = (struct sec_factory *)&data->sec;
218 set_default_result(sec);
219 snprintf(buf, sizeof(buf), "%#02x", data->chip_id);
220 tsp_info("%s(), %s\n", __func__, buf);
222 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
223 sec->cmd_state = CMD_STATE_OK;
224 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
225 buf, strnlen(buf, sizeof(buf)));
227 #include <linux/uaccess.h>
228 #define MAX_FW_PATH 255
229 static void fw_update(void *dev_data)
232 char buf[16] = { 0 };
233 mm_segment_t old_fs = {0};
234 struct file *fp = NULL;
235 long fsize = 0, nread = 0;
237 char fw_path[MAX_FW_PATH+1];
238 const struct firmware *firmware = NULL;
240 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
241 struct sec_factory *sec = (struct sec_factory *)&data->sec;
243 set_default_result(sec);
245 tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]);
247 switch (sec->cmd_param[0]) {
249 if (data->dt_data->fw_bin) {
250 ret = request_firmware(&firmware, data->dt_data->fw_path, &data->client->dev);
252 tsp_err("%s: do not request firmware: %d\n", __func__, ret);
256 data->fw.buf = (u8 *)firmware->data;
257 data->fw.size = firmware->size;
259 ret = ist30xx_fw_recovery(data);
261 if (data->dt_data->fw_bin && firmware) {
262 release_firmware(firmware);
265 tsp_err("%s: failed fw_recovery: %d\n", __func__, ret);
269 if (data->dt_data->fw_bin && firmware) {
270 release_firmware(firmware);
279 snprintf(fw_path, MAX_FW_PATH, "%s", IST30XX_FW_NAME);
280 fp = filp_open(fw_path, O_RDONLY, 0);
282 tsp_warn("%s(), file %s open error:%d\n", __func__,
288 fsize = fp->f_path.dentry->d_inode->i_size;
289 if (fsize != data->fw.buf_size) {
290 tsp_warn("%s(), invalid fw size!!\n", __func__);
295 fw = kzalloc((size_t)fsize, GFP_KERNEL);
297 tsp_warn("%s(), failed to alloc buffer for fw\n", __func__);
298 filp_close(fp, NULL);
303 nread = vfs_read(fp, (char __user *)fw, fsize, &fp->f_pos);
304 if (nread != fsize) {
305 tsp_warn("%s(), failed to read fw\n", __func__);
307 filp_close(fp, NULL);
312 filp_close(fp, current->files);
314 tsp_info("%s(), ums fw is loaded!!\n", __func__);
316 ret = ist30xx_get_update_info(data, fw, fsize);
318 tsp_warn("%s(), failed to update info\n", __func__);
322 data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw);
323 data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw);
324 data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw);
325 data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw);
327 mutex_lock(&ist30xx_mutex);
328 ret = ist30xx_fw_update(data, fw, fsize);
330 mutex_unlock(&ist30xx_mutex);
334 mutex_unlock(&ist30xx_mutex);
337 ist30xx_calibrate(data, 1);
341 tsp_warn("%s(), Invalid fw file type!\n", __func__);
346 sec->cmd_state = CMD_STATE_OK;
347 snprintf(buf, sizeof(buf), "%s", "OK");
348 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
353 sec->cmd_state = CMD_STATE_FAIL;
354 snprintf(buf, sizeof(buf), "%s", "NG");
355 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
360 static void get_fw_ver_bin(void *dev_data)
363 char buf[16] = { 0 };
365 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
366 struct sec_factory *sec = (struct sec_factory *)&data->sec;
367 const struct firmware *firmware = NULL;
370 set_default_result(sec);
372 if (data->dt_data->fw_bin) {
373 ret = request_firmware(&firmware, data->dt_data->fw_path, &data->client->dev);
375 tsp_err("%s: do not request firmware: %d\n", __func__, ret);
376 sec->cmd_state = CMD_STATE_FAIL;
381 data->fw.buf = (u8 *)firmware->data;
382 data->fw.size = firmware->size;
385 ver = ist30xx_parse_ver(data, FLAG_FW, data->fw.buf);
386 snprintf(buf, sizeof(buf), "IM00%04x", ver);
387 tsp_info("%s(), %s\n", __func__, buf);
389 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
390 sec->cmd_state = CMD_STATE_OK;
391 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
392 buf, strnlen(buf, sizeof(buf)));
394 if (data->dt_data->fw_bin && firmware) {
395 release_firmware(firmware);
399 static void get_config_ver(void *dev_data)
401 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
402 struct sec_factory *sec = (struct sec_factory *)&data->sec;
404 char buff[255] = {0};
406 set_default_result(sec);
408 snprintf(buff, sizeof(buff), "%s_%s", TSP_CHIP_VENDOR, TSP_CHIP_NAME);
410 set_cmd_result(sec, buff, strnlen(buff, sizeof(buff)));
411 sec->cmd_state = CMD_STATE_OK;
412 tsp_info("%s(): %s(%d)\n", __func__, buff,
413 strnlen(buff, sizeof(buff)));
415 static void get_checksum_data(void *dev_data)
420 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
421 struct sec_factory *sec = (struct sec_factory *)&data->sec;
423 set_default_result(sec);
425 if (data->status.power == 1) {
426 chksum = ist30xx_get_fw_chksum(data);
428 tsp_info("%s(), Failed get the checksum data \n", __func__);
429 snprintf(buf, sizeof(buf), "%s", "NG");
430 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
431 sec->cmd_state = CMD_STATE_FAIL;
436 snprintf(buf, sizeof(buf), "0x%06X", chksum);
438 tsp_info("%s(), %s\n", __func__, buf);
440 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
441 sec->cmd_state = CMD_STATE_OK;
442 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
443 buf, strnlen(buf, sizeof(buf)));
446 static void get_fw_ver_ic(void *dev_data)
450 char buf[16] = { 0 };
452 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
453 struct sec_factory *sec = (struct sec_factory *)&data->sec;
455 set_default_result(sec);
457 if (data->status.power == 1) {
458 ver = ist30xx_get_fw_ver(data);
459 snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF);
461 snprintf(buf, sizeof(buf), "IM00%04x", data->fw.cur.fw_ver & 0xFFFF);
464 if (data->fw.cur.test_ver > 0) {
465 sprintf(msg, "(T%d)", data->fw.cur.test_ver);
469 tsp_info("%s(), %s\n", __func__, buf);
471 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
472 sec->cmd_state = CMD_STATE_OK;
473 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
474 buf, strnlen(buf, sizeof(buf)));
477 static void set_edge_mode(void *dev_data)
479 char buf[16] = { 0 };
481 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
482 struct sec_factory *sec = (struct sec_factory *)&data->sec;
484 set_default_result(sec);
486 tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]);
488 switch (sec->cmd_param[0]) {
490 sec->cmd_state = CMD_STATE_OK;
491 tsp_info("%s(), Set Edge Mode\n", __func__);
492 ist30xx_set_edge_mode(1);
495 sec->cmd_state = CMD_STATE_OK;
496 tsp_info("%s(), Unset Edge Mode\n", __func__);
497 ist30xx_set_edge_mode(0);
500 tsp_info("%s(), Invalid Argument\n", __func__);
503 if (sec->cmd_state == CMD_STATE_OK)
504 snprintf(buf, sizeof(buf), "%s", "OK");
506 snprintf(buf, sizeof(buf), "%s", "NG");
508 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
509 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
510 buf, strnlen(buf, sizeof(buf)));
513 static void run_connect_test(void *dev_data)
517 char buf[16] = { 0 };
519 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
520 struct sec_factory *sec = (struct sec_factory *)&data->sec;
522 set_default_result(sec);
524 ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val);
526 snprintf(buf, sizeof(buf), "%s", "NG");
528 snprintf(buf, sizeof(buf), "%s", "OK");
530 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
531 sec->cmd_state = CMD_STATE_OK;
532 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
533 buf, strnlen(buf, sizeof(buf)));
536 static void get_threshold(void *dev_data)
540 char buf[16] = { 0 };
543 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
544 struct sec_factory *sec = (struct sec_factory *)&data->sec;
546 ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val);
548 ist30xx_reset(data, false);
550 tsp_info("%s(), ret=%d\n", __func__, ret);
554 set_default_result(sec);
556 threshold = (int)(val & 0xFFFF);
558 snprintf(buf, sizeof(buf), "%d", threshold);
559 tsp_info("%s(), %s\n", __func__, buf);
561 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
562 sec->cmd_state = CMD_STATE_OK;
563 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
564 buf, strnlen(buf, sizeof(buf)));
567 static void get_scr_x_num(void *dev_data)
570 char buf[16] = { 0 };
572 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
573 struct sec_factory *sec = (struct sec_factory *)&data->sec;
575 set_default_result(sec);
577 if (data->tsp_info.dir.swap_xy)
578 val = data->tsp_info.screen.tx;
580 val = data->tsp_info.screen.rx;
583 snprintf(buf, sizeof(buf), "%u", val);
584 sec->cmd_state = CMD_STATE_OK;
585 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
586 strnlen(buf, sizeof(buf)));
588 snprintf(buf, sizeof(buf), "%s", "NG");
589 sec->cmd_state = CMD_STATE_FAIL;
590 dev_info(&data->client->dev,
591 "%s: fail to read num of x (%d).\n", __func__, val);
593 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
594 tsp_info("%s(), %s\n", __func__, buf);
597 static void get_scr_y_num(void *dev_data)
600 char buf[16] = { 0 };
602 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
603 struct sec_factory *sec = (struct sec_factory *)&data->sec;
605 set_default_result(sec);
607 if (data->tsp_info.dir.swap_xy)
608 val = data->tsp_info.screen.rx;
610 val = data->tsp_info.screen.tx;
613 snprintf(buf, sizeof(buf), "%u", val);
614 sec->cmd_state = CMD_STATE_OK;
615 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
616 strnlen(buf, sizeof(buf)));
618 snprintf(buf, sizeof(buf), "%s", "NG");
619 sec->cmd_state = CMD_STATE_FAIL;
620 dev_info(&data->client->dev,
621 "%s: fail to read num of y (%d).\n", __func__, val);
623 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
624 tsp_info("%s(), %s\n", __func__, buf);
627 static void get_all_x_num(void *dev_data)
630 char buf[16] = { 0 };
632 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
633 struct sec_factory *sec = (struct sec_factory *)&data->sec;
635 set_default_result(sec);
637 if (data->tsp_info.dir.swap_xy)
638 val = data->tsp_info.ch_num.tx;
640 val = data->tsp_info.ch_num.rx;
643 snprintf(buf, sizeof(buf), "%u", val);
644 sec->cmd_state = CMD_STATE_OK;
645 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
646 strnlen(buf, sizeof(buf)));
648 snprintf(buf, sizeof(buf), "%s", "NG");
649 sec->cmd_state = CMD_STATE_FAIL;
650 dev_info(&data->client->dev,
651 "%s: fail to read all num of x (%d).\n", __func__, val);
653 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
654 tsp_info("%s(), %s\n", __func__, buf);
657 static void get_all_y_num(void *dev_data)
660 char buf[16] = { 0 };
662 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
663 struct sec_factory *sec = (struct sec_factory *)&data->sec;
665 set_default_result(sec);
667 if (data->tsp_info.dir.swap_xy)
668 val = data->tsp_info.ch_num.rx;
670 val = data->tsp_info.ch_num.tx;
673 snprintf(buf, sizeof(buf), "%u", val);
674 sec->cmd_state = CMD_STATE_OK;
675 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
676 strnlen(buf, sizeof(buf)));
678 snprintf(buf, sizeof(buf), "%s", "NG");
679 sec->cmd_state = CMD_STATE_FAIL;
680 dev_info(&data->client->dev,
681 "%s: fail to read all num of y (%d).\n", __func__, val);
683 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
684 tsp_info("%s(), %s\n", __func__, buf);
687 #ifdef CONFIG_INPUT_BOOSTER
689 * DVFS_STAGE_NONE 0x0001 : 0000 0000 0000 0001
690 * DVFS_STAGE_SINGLE 0x0002 : 0000 0000 0000 0010
691 * DVFS_STAGE_DUAL 0x0004 : 0000 0000 0000 0100
693 static void boost_level(void *dev_data)
695 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
696 struct sec_factory *sec = (struct sec_factory *)&data->sec;
697 char buf[16] = { 0 };
700 set_default_result(sec);
702 ret = input_booster_set_level_change(sec->cmd_param[0]);
704 snprintf(buf, sizeof(buf), "%u", sec->cmd_param[0]);
705 sec->cmd_state = CMD_STATE_FAIL;
706 goto out_boost_level;
709 snprintf(buf, sizeof(buf), "%u", sec->cmd_param[0]);
710 sec->cmd_state = CMD_STATE_OK;
713 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
714 strnlen(buf, sizeof(buf)));
716 sec->cmd_state = CMD_STATE_WAITING;
718 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
719 tsp_info("%s(), %s\n", __func__, buf);
723 int check_tsp_channel(void *dev_data, int width, int height)
727 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
728 struct sec_factory *sec = (struct sec_factory *)&data->sec;
730 if (data->tsp_info.dir.swap_xy) {
731 if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= height) ||
732 (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= width)) {
733 tsp_info("%s: parameter error: %u,%u\n",
734 __func__, sec->cmd_param[0], sec->cmd_param[1]);
736 node = sec->cmd_param[1] + sec->cmd_param[0] * width;
737 tsp_info("%s: node = %d\n", __func__, node);
740 if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= width) ||
741 (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= height)) {
742 tsp_info("%s: parameter error: %u,%u\n",
743 __func__, sec->cmd_param[0], sec->cmd_param[1]);
745 node = sec->cmd_param[0] + sec->cmd_param[1] * width;
746 tsp_info("%s: node = %d\n", __func__, node);
753 static u16 node_value[IST30XX_NODE_TOTAL_NUM];
754 static u16 key_node_value[IST30XX_MAX_KEYS];
755 void get_raw_array(void *dev_data)
760 const int msg_len = 16;
762 u8 flag = NODE_FLAG_RAW;
764 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
765 struct sec_factory *sec = (struct sec_factory *)&data->sec;
766 TSP_INFO *tsp = &data->tsp_info;
768 set_default_result(sec);
770 mutex_lock(&ist30xx_mutex);
771 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
773 mutex_unlock(&ist30xx_mutex);
774 sec->cmd_state = CMD_STATE_FAIL;
775 tsp_warn("%s(), tsp node read fail!\n", __func__);
778 mutex_unlock(&ist30xx_mutex);
779 ist30xx_parse_touch_node(data, flag, &tsp->node);
781 ret = parse_tsp_node(data, flag, &tsp->node, node_value, TS_RAW_ALL);
783 sec->cmd_state = CMD_STATE_FAIL;
784 tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag);
788 buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL);
790 tsp_info("%s: Couldn't Allocate memory\n", __func__);
793 memset(buf, 0, IST30XX_NODE_TOTAL_NUM * 5);
795 for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) {
797 if ((i % tsp->ch_num.rx) == 0)
798 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
800 printk("%4d ", node_value[i]);
802 count += snprintf(msg, msg_len, "%d,", node_value[i]);
803 strncat(buf, msg, msg_len);
807 tsp_info("%s: %d\n", __func__, count - 1);
808 sec->cmd_state = CMD_STATE_OK;
809 set_cmd_result(sec, buf, count - 1);
810 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count);
814 void run_raw_read(void *dev_data)
818 int min_val, max_val;
819 char buf[16] = { 0 };
820 u8 flag = NODE_FLAG_RAW;
822 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
823 struct sec_factory *sec = (struct sec_factory *)&data->sec;
824 TSP_INFO *tsp = &data->tsp_info;
826 set_default_result(sec);
828 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
830 sec->cmd_state = CMD_STATE_FAIL;
831 tsp_warn("%s(), tsp node read fail!\n", __func__);
834 ist30xx_parse_touch_node(data, flag, &tsp->node);
836 ret = parse_tsp_node(data, flag, &tsp->node, node_value, TS_RAW_SCREEN);
838 sec->cmd_state = CMD_STATE_FAIL;
839 tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag);
843 min_val = max_val = node_value[0];
844 for (i = 0; i < tsp->screen.rx * tsp->screen.tx; i++) { // modify block
846 if ((i % tsp->screen.rx) == 0)
847 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
849 printk("%4d ", node_value[i]);
851 max_val = max(max_val, (int)node_value[i]);
853 min_val = min(min_val, (int)node_value[i]);
856 snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val);
857 tsp_info("%s(), %s\n", __func__, buf);
859 sec->cmd_state = CMD_STATE_OK;
860 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
861 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
862 strnlen(buf, sizeof(buf)));
865 void run_raw_read_key(void *dev_data)
868 char buf[16] = { 0 };
869 u8 flag = NODE_FLAG_RAW;
871 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
872 struct sec_factory *sec = (struct sec_factory *)&data->sec;
873 TSP_INFO *tsp = &data->tsp_info;
875 set_default_result(sec);
877 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
879 sec->cmd_state = CMD_STATE_FAIL;
880 tsp_warn("%s(), tsp node read fail!\n", __func__);
883 ist30xx_parse_touch_node(data, flag, &tsp->node);
885 ret = parse_tsp_node(data, flag, &tsp->node, key_node_value, TS_RAW_KEY);
887 sec->cmd_state = CMD_STATE_FAIL;
888 tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag);
892 snprintf(buf, sizeof(buf), "%d,%d", key_node_value[0], key_node_value[1]);
893 tsp_info("%s(), %s\n", __func__, buf);
895 sec->cmd_state = CMD_STATE_OK;
896 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
897 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
898 strnlen(buf, sizeof(buf)));
901 void get_raw_value(void *dev_data)
904 char buf[16] = { 0 };
906 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
907 struct sec_factory *sec = (struct sec_factory *)&data->sec;
908 TSP_INFO *tsp = &data->tsp_info;
910 set_default_result(sec);
912 idx = check_tsp_channel(data, tsp->screen.rx, tsp->screen.tx);
913 if (idx < 0) { // Parameter parsing fail
914 snprintf(buf, sizeof(buf), "%s", "NG");
915 sec->cmd_state = CMD_STATE_FAIL;
917 snprintf(buf, sizeof(buf), "%d", node_value[idx]);
918 sec->cmd_state = CMD_STATE_OK;
921 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
922 tsp_info("%s(), [%d][%d]: %s\n", __func__,
923 sec->cmd_param[0], sec->cmd_param[1], buf);
924 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
925 strnlen(buf, sizeof(buf)));
928 void get_raw_all_data(void *dev_data) {
929 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
930 struct sec_factory *sec = (struct sec_factory *)&data->sec;
931 TSP_INFO *tsp = &data->tsp_info;
934 u8 flag = NODE_FLAG_RAW;
938 set_default_result(sec);
940 raw_buffer = kzalloc(sec->cmd_result_length, GFP_KERNEL);
942 tsp_err("%s: failed to allication memory\n", __func__);
943 goto out_raw_all_data;
946 ret = ist30xx_read_touch_node(data, flag, &tsp->node);
948 sec->cmd_state = CMD_STATE_FAIL;
949 tsp_warn("%s(), tsp node read fail!\n", __func__);
952 ist30xx_parse_touch_node(data, flag, &tsp->node);
954 ret = parse_tsp_node(data, flag, &tsp->node, node_value, TS_RAW_SCREEN);
956 sec->cmd_state = CMD_STATE_FAIL;
957 tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag);
961 for (i = 0; i < tsp->screen.rx * tsp->screen.tx; i++) {
962 snprintf(temp, 10, "%d,", node_value[i]);
963 strncat(raw_buffer, temp, 10);
966 set_cmd_result(sec, raw_buffer, sec->cmd_result_length);
968 sec->cmd_state = CMD_STATE_OK;
976 sec->cmd_state = CMD_STATE_FAIL;
979 #if IST30XX_CMCS_TEST
980 extern u8 *ts_cmcs_bin;
981 extern u32 ts_cmcs_bin_size;
982 extern CMCS_BIN_INFO *ts_cmcs;
983 extern CMCS_BUF *ts_cmcs_buf;
984 int get_read_all_data(struct ist30xx_data *data, u8 flag)
986 struct sec_factory *sec = (struct sec_factory *)&data->sec;
987 TSP_INFO *tsp = &data->tsp_info;
996 if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) {
997 tsp_err("%s: cmcs binary is NULL!\n", __func__);
1001 ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size);
1002 if (unlikely(ret)) {
1003 tsp_err("%s: tsp get cmcs infomation fail!\n", __func__);
1007 mutex_lock(&ist30xx_mutex);
1008 ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size);
1009 if (unlikely(ret)) {
1010 mutex_unlock(&ist30xx_mutex);
1011 tsp_err("%s: tsp cmcs test fail!\n", __func__);
1014 mutex_unlock(&ist30xx_mutex);
1016 buffer = kzalloc(sec->cmd_result_length, GFP_KERNEL);
1018 tsp_err("%s: failed to buffer alloc\n", __func__);
1022 temp = kzalloc(10, GFP_KERNEL);
1024 tsp_err("%s: failed to temp alloc\n", __func__);
1025 goto cm_err_alloc_out;
1028 for (ii = 0; ii < tsp->ch_num.rx * tsp->ch_num.tx; ii++) {
1030 type = check_tsp_type(data, ii / tsp->ch_num.rx, ii % tsp->ch_num.rx);
1031 if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) {
1032 count += snprintf(temp, 10, "%d,", 0);
1035 case TEST_CM_ALL_DATA:
1036 count += snprintf(temp, 10, "%d,", ts_cmcs_buf->cm[ii]);
1038 case TEST_SLOPE0_ALL_DATA:
1039 count += snprintf(temp, 10, "%d,", ts_cmcs_buf->slope0[ii]);
1041 case TEST_SLOPE1_ALL_DATA:
1042 count += snprintf(temp, 10, "%d,", ts_cmcs_buf->slope1[ii]);
1044 case TEST_CS_ALL_DATA:
1045 count += snprintf(temp, 10, "%d,", ts_cmcs_buf->cs[ii]);
1049 strncat(buffer, temp, 10);
1052 set_cmd_result(sec, buffer, count - 1);
1053 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buffer, count);
1061 sec->cmd_state = CMD_STATE_FAIL;
1062 set_cmd_result(sec, "NULL", sec->cmd_result_length);
1067 void get_cm_all_data(void *dev_data) {
1068 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1069 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1072 set_default_result(sec);
1074 ret = get_read_all_data(data, TEST_CM_ALL_DATA);
1076 sec->cmd_state = CMD_STATE_FAIL;
1078 sec->cmd_state = CMD_STATE_OK;
1082 void get_slope0_all_data(void *dev_data) {
1083 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1084 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1087 set_default_result(sec);
1089 ret = get_read_all_data(data, TEST_SLOPE0_ALL_DATA);
1091 sec->cmd_state = CMD_STATE_FAIL;
1093 sec->cmd_state = CMD_STATE_OK;
1096 void get_slope1_all_data(void *dev_data) {
1097 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1098 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1101 set_default_result(sec);
1103 ret = get_read_all_data(data, TEST_SLOPE1_ALL_DATA);
1105 sec->cmd_state = CMD_STATE_FAIL;
1107 sec->cmd_state = CMD_STATE_OK;
1110 void get_cs_all_data(void *dev_data) {
1111 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1112 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1115 set_default_result(sec);
1117 ret = get_read_all_data(data, TEST_CS_ALL_DATA);
1119 sec->cmd_state = CMD_STATE_FAIL;
1121 sec->cmd_state = CMD_STATE_OK;
1124 void run_cm_test(void *dev_data)
1128 char buf[16] = { 0 };
1130 int min_val, max_val;
1132 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1133 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1134 TSP_INFO *tsp = &data->tsp_info;
1136 set_default_result(sec);
1138 if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) {
1139 sec->cmd_state = CMD_STATE_FAIL;
1140 tsp_warn("%s(), Binary is not correct!\n", __func__);
1144 ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size);
1145 if (unlikely(ret)) {
1146 sec->cmd_state = CMD_STATE_FAIL;
1147 tsp_warn("%s(), tsp get cmcs infomation fail!\n", __func__);
1151 mutex_lock(&ist30xx_mutex);
1152 ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size);
1153 if (unlikely(ret)) {
1154 mutex_unlock(&ist30xx_mutex);
1155 sec->cmd_state = CMD_STATE_FAIL;
1156 tsp_warn("%s(), tsp cmcs test fail!\n", __func__);
1159 mutex_unlock(&ist30xx_mutex);
1161 min_val = max_val = ts_cmcs_buf->cm[0];
1162 for (i = 0; i < tsp->ch_num.tx; i++) {
1164 printk("%s", IST30XX_DEBUG_TAG);
1166 for (j = 0; j < tsp->ch_num.rx; j++) {
1167 idx = (i * tsp->ch_num.rx) + j;
1168 type = check_tsp_type(data, i, j);
1170 if ((type == TSP_CH_SCREEN) || (type == TSP_CH_GTX)) {
1171 max_val = max(max_val, (int)ts_cmcs_buf->cm[idx]);
1172 min_val = min(min_val, (int)ts_cmcs_buf->cm[idx]);
1175 printk("%5d ", ts_cmcs_buf->cm[idx]);
1183 snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val);
1184 tsp_info("%s(), %s\n", __func__, buf);
1186 sec->cmd_state = CMD_STATE_OK;
1187 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
1188 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
1189 strnlen(buf, sizeof(buf)));
1192 void run_cm_test_key(void *dev_data)
1196 char buf[16] = { 0 };
1198 int cm_key[IST30XX_MAX_KEYS] = { 0 };
1201 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1202 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1203 TSP_INFO *tsp = &data->tsp_info;
1205 set_default_result(sec);
1207 if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) {
1208 sec->cmd_state = CMD_STATE_FAIL;
1209 tsp_warn("%s(), Binary is not correct!\n", __func__);
1213 ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size);
1214 if (unlikely(ret)) {
1215 sec->cmd_state = CMD_STATE_FAIL;
1216 tsp_warn("%s(), tsp get cmcs infomation fail!\n", __func__);
1220 mutex_lock(&ist30xx_mutex);
1221 ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size);
1222 if (unlikely(ret)) {
1223 mutex_unlock(&ist30xx_mutex);
1224 sec->cmd_state = CMD_STATE_FAIL;
1225 tsp_warn("%s(), tsp cmcs test fail!\n", __func__);
1228 mutex_unlock(&ist30xx_mutex);
1230 for (i = 0; i < tsp->ch_num.tx; i++) {
1232 printk("%s", IST30XXC_DEBUG_TAG);
1234 for (j = 0; j < tsp->ch_num.rx; j++) {
1235 idx = (i * tsp->ch_num.rx) + j;
1236 type = check_tsp_type(data, i, j);
1238 if (type == TSP_CH_KEY) {
1239 cm_key[key_count++] = (int)ts_cmcs_buf->cm[idx];
1242 printk("%5d ", tsp_cmcs_buf->cm[idx]);
1250 snprintf(buf, sizeof(buf), "%d,%d", cm_key[0], cm_key[1]);
1251 tsp_info("%s(), %s\n", __func__, buf);
1253 sec->cmd_state = CMD_STATE_OK;
1254 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
1255 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
1256 strnlen(buf, sizeof(buf)));
1259 void get_cm_value(void *dev_data)
1262 char buf[16] = { 0 };
1264 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1265 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1266 TSP_INFO *tsp = &data->tsp_info;
1268 set_default_result(sec);
1270 idx = check_tsp_channel(data, tsp->ch_num.rx, tsp->ch_num.tx);
1271 if (idx < 0) { // Parameter parsing fail
1272 snprintf(buf, sizeof(buf), "%s", "NG");
1273 sec->cmd_state = CMD_STATE_FAIL;
1275 snprintf(buf, sizeof(buf), "%d", ts_cmcs_buf->cm[idx]);
1276 sec->cmd_state = CMD_STATE_OK;
1279 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
1280 tsp_info("%s(), [%d][%d]: %s\n", __func__,
1281 sec->cmd_param[0], sec->cmd_param[1], buf);
1282 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
1283 strnlen(buf, sizeof(buf)));
1286 void run_cmcs_test(void *dev_data)
1289 char buf[16] = { 0 };
1291 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1292 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1294 set_default_result(sec);
1296 if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) {
1297 sec->cmd_state = CMD_STATE_FAIL;
1298 tsp_warn("%s(), Binary is not correct!\n", __func__);
1302 ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size);
1303 if (unlikely(ret)) {
1304 sec->cmd_state = CMD_STATE_FAIL;
1305 tsp_warn("%s(), tsp get cmcs infomation fail!\n", __func__);
1309 mutex_lock(&ist30xx_mutex);
1310 ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size);
1311 if (unlikely(ret)) {
1312 mutex_unlock(&ist30xx_mutex);
1313 sec->cmd_state = CMD_STATE_FAIL;
1314 tsp_warn("%s(), tsp cmcs test fail!\n", __func__);
1317 mutex_unlock(&ist30xx_mutex);
1319 snprintf(buf, sizeof(buf), "%s", "OK");
1320 tsp_info("%s(), %s\n", __func__, buf);
1322 sec->cmd_state = CMD_STATE_OK;
1323 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
1324 dev_info(&data->client->dev, "%s: %s(%d)\n",
1325 __func__, buf, strnlen(buf, sizeof(buf)));
1328 void get_cm_array(void *dev_data)
1334 const int msg_len = 16;
1337 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1338 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1339 TSP_INFO *tsp = &data->tsp_info;
1341 set_default_result(sec);
1343 buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL);
1345 tsp_info("%s: Couldn't Allocate memory\n", __func__);
1348 memset(buf, 0, IST30XX_NODE_TOTAL_NUM * 5);
1350 for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) {
1352 if ((i % tsp->ch_num.rx) == 0)
1353 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
1355 printk("%4d ", ts_cmcs_buf->cm[i]);
1357 type = check_tsp_type(data, i / tsp->ch_num.rx, i % tsp->ch_num.rx);
1358 if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED))
1359 count += snprintf(msg, msg_len, "%d,", 0);
1361 count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->cm[i]);
1362 strncat(buf, msg, msg_len);
1366 tsp_info("%s: %d\n", __func__, count - 1);
1367 sec->cmd_state = CMD_STATE_OK;
1368 set_cmd_result(sec, buf, count - 1);
1369 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count);
1373 void get_slope0_array(void *dev_data)
1378 const int msg_len = 16;
1381 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1382 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1383 TSP_INFO *tsp = &data->tsp_info;
1385 set_default_result(sec);
1387 buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL);
1389 tsp_info("%s: Couldn't Allocate memory\n", __func__);
1392 memset(buf, 0, IST30XX_NODE_TOTAL_NUM * 5);
1394 for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) {
1396 if ((i % tsp->ch_num.rx) == 0)
1397 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
1399 printk("%4d ", ts_cmcs_buf->slope0[i]);
1401 count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->slope0[i]);
1402 strncat(buf, msg, msg_len);
1406 tsp_info("%s: %d\n", __func__, count - 1);
1407 sec->cmd_state = CMD_STATE_OK;
1408 set_cmd_result(sec, buf, count - 1);
1409 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count);
1413 void get_slope1_array(void *dev_data)
1418 const int msg_len = 16;
1421 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1422 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1423 TSP_INFO *tsp = &data->tsp_info;
1425 set_default_result(sec);
1427 buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL);
1429 tsp_info("%s: Couldn't Allocate memory\n", __func__);
1432 memset(buf, 0, IST30XX_NODE_TOTAL_NUM * 5);
1434 for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) {
1436 if ((i % tsp->ch_num.rx) == 0)
1437 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
1439 printk("%4d ", ts_cmcs_buf->slope1[i]);
1441 count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->slope1[i]);
1442 strncat(buf, msg, msg_len);
1446 tsp_info("%s: %d\n", __func__, count - 1);
1447 sec->cmd_state = CMD_STATE_OK;
1448 set_cmd_result(sec, buf, count - 1);
1449 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count);
1453 void get_cs_array(void *dev_data)
1459 const int msg_len = 16;
1462 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
1463 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1464 TSP_INFO *tsp = &data->tsp_info;
1466 set_default_result(sec);
1468 buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL);
1470 tsp_info("%s: Couldn't Allocate memory\n", __func__);
1473 memset(buf, 0, IST30XX_NODE_TOTAL_NUM * 5);
1475 for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) {
1477 if ((i % tsp->ch_num.rx) == 0)
1478 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
1480 printk("%4d ", ts_cmcs_buf->cs[i]);
1482 type = check_tsp_type(data, i / tsp->ch_num.rx, i % tsp->ch_num.rx);
1483 if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED))
1484 count += snprintf(msg, msg_len, "%d,", 0);
1486 count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->cs[i]);
1487 strncat(buf, msg, msg_len);
1491 tsp_info("%s: %d\n", __func__, count - 1);
1492 sec->cmd_state = CMD_STATE_OK;
1493 set_cmd_result(sec, buf, count - 1);
1494 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count);
1500 /* sysfs: /sys/class/sec/tsp/close_tsp_test */
1501 static ssize_t show_close_tsp_test(struct device *dev,
1502 struct device_attribute *attr, char *buf)
1504 return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0);
1507 /* sysfs: /sys/class/sec/tsp/cmd */
1508 static ssize_t store_cmd(struct device *dev, struct device_attribute
1509 *devattr, const char *buf, size_t count)
1511 struct ist30xx_data *data = dev_get_drvdata(dev);
1512 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1513 struct i2c_client *client = data->client;
1515 char *cur, *start, *end;
1516 char msg[SEC_CMD_STR_LEN] = { 0 };
1518 struct tsp_cmd *tsp_cmd_ptr = NULL;
1520 bool cmd_found = false;
1524 if (sec->cmd_is_running == true) {
1525 dev_err(&client->dev, "tsp_cmd: other cmd is running.\n");
1526 tsp_err("tsp_cmd: other cmd is running.\n");
1531 mutex_lock(&sec->cmd_lock);
1532 sec->cmd_is_running = true;
1533 mutex_unlock(&sec->cmd_lock);
1535 sec->cmd_state = CMD_STATE_RUNNING;
1537 for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++)
1538 sec->cmd_param[i] = 0;
1541 if (*(buf + len - 1) == '\n')
1543 memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd));
1544 memcpy(sec->cmd, buf, len);
1546 cur = strchr(buf, (int)delim);
1548 memcpy(msg, buf, cur - buf);
1550 memcpy(msg, buf, len);
1552 list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) {
1553 if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) {
1559 /* set not_support_cmd */
1561 list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) {
1562 if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name))
1567 /* parsing parameters */
1568 if (cur && cmd_found) {
1571 memset(msg, 0, ARRAY_SIZE(msg));
1573 if (*cur == delim || cur - buf == len) {
1575 memcpy(msg, start, end - start);
1576 *(msg + strlen(msg)) = '\0';
1577 ret = kstrtoint(msg, 10, \
1578 sec->cmd_param + param_cnt);
1580 memset(msg, 0, ARRAY_SIZE(msg));
1584 } while (cur - buf <= len);
1586 tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name);
1588 for (i = 0; i < param_cnt; i++)
1589 tsp_info("SEC CMD Param %d= %d\n", i, sec->cmd_param[i]);
1591 tsp_cmd_ptr->cmd_func(data);
1597 /* sysfs: /sys/class/sec/tsp/cmd_status */
1598 static ssize_t show_cmd_status(struct device *dev,
1599 struct device_attribute *devattr, char *buf)
1601 struct ist30xx_data *data = dev_get_drvdata(dev);
1602 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1603 char msg[16] = { 0 };
1605 dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state);
1607 if (sec->cmd_state == CMD_STATE_WAITING)
1608 snprintf(msg, sizeof(msg), "WAITING");
1609 else if (sec->cmd_state == CMD_STATE_RUNNING)
1610 snprintf(msg, sizeof(msg), "RUNNING");
1611 else if (sec->cmd_state == CMD_STATE_OK)
1612 snprintf(msg, sizeof(msg), "OK");
1613 else if (sec->cmd_state == CMD_STATE_FAIL)
1614 snprintf(msg, sizeof(msg), "FAIL");
1615 else if (sec->cmd_state == CMD_STATE_NA)
1616 snprintf(msg, sizeof(msg), "NOT_APPLICABLE");
1618 return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg);
1621 /* sysfs: /sys/class/sec/tsp/cmd_result */
1622 static ssize_t show_cmd_result(struct device *dev, struct device_attribute
1623 *devattr, char *buf)
1625 struct ist30xx_data *data = dev_get_drvdata(dev);
1626 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1628 dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result);
1630 mutex_lock(&sec->cmd_lock);
1631 sec->cmd_is_running = false;
1632 mutex_unlock(&sec->cmd_lock);
1634 sec->cmd_state = CMD_STATE_WAITING;
1636 return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result);
1640 static ssize_t recent_sensitivity_show(struct device *dev,
1641 struct device_attribute *attr, char *buf)
1643 int sensitivity = 0;
1644 struct ist30xx_data *data = dev_get_drvdata(dev);
1646 sensitivity = ist30xx_get_key_sensitivity(data, 0);
1648 tsp_info("%s(), %d\n", __func__, sensitivity);
1650 return sprintf(buf, "%d", sensitivity);
1653 static ssize_t back_sensitivity_show(struct device *dev,
1654 struct device_attribute *attr, char *buf)
1656 int sensitivity = 0;
1657 struct ist30xx_data *data = dev_get_drvdata(dev);
1659 sensitivity = ist30xx_get_key_sensitivity(data, 1);
1661 tsp_info("%s(), %d\n", __func__, sensitivity);
1663 return sprintf(buf, "%d", sensitivity);
1666 static ssize_t touchkey_threshold_show(struct device *dev,
1667 struct device_attribute *attr, char *buf)
1672 struct ist30xx_data *data = dev_get_drvdata(dev);
1674 ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val);
1675 if (unlikely(ret)) {
1676 ist30xx_reset(data, false);
1677 ist30xx_start(data);
1681 threshold = (int)((val >> 16) & 0xFFFF);
1683 tsp_info("%s(), %d (ret=%d)\n", __func__, threshold, ret);
1685 return sprintf(buf, "%d", threshold);
1689 struct tsp_cmd tsp_cmds[] = {
1690 { TSP_CMD("get_chip_vendor", get_chip_vendor), },
1691 { TSP_CMD("get_chip_name", get_chip_name), },
1692 { TSP_CMD("get_chip_id", get_chip_id), },
1693 { TSP_CMD("fw_update", fw_update), },
1694 { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), },
1695 { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), },
1696 { TSP_CMD("get_threshold", get_threshold), },
1697 { TSP_CMD("get_x_num", get_scr_x_num), },
1698 { TSP_CMD("get_y_num", get_scr_y_num), },
1699 { TSP_CMD("get_all_x_num", get_all_x_num),},
1700 { TSP_CMD("get_all_y_num", get_all_y_num),},
1701 { TSP_CMD("clear_cover_mode", not_support_cmd),},
1702 #ifdef CONFIG_INPUT_BOOSTER
1703 { TSP_CMD("boost_level", boost_level),},
1705 { TSP_CMD("run_reference_read", run_raw_read), },
1706 { TSP_CMD("run_reference_read_key", run_raw_read_key),},
1707 { TSP_CMD("get_reference", get_raw_value), },
1708 { TSP_CMD("run_raw_read", run_raw_read), },
1709 { TSP_CMD("run_raw_read_key", run_raw_read_key),},
1710 { TSP_CMD("get_raw_value", get_raw_value), },
1711 { TSP_CMD("get_raw_all_data", get_raw_all_data),},
1712 { TSP_CMD("dead_zone_enable", set_edge_mode),},
1713 { TSP_CMD("get_checksum_data", get_checksum_data),},
1714 { TSP_CMD("tsp_connect_test", run_connect_test), },
1715 #if IST30XX_CMCS_TEST
1716 { TSP_CMD("get_cm_all_data", get_cm_all_data),},
1717 { TSP_CMD("get_slope0_all_data", get_slope0_all_data),},
1718 { TSP_CMD("get_slope1_all_data", get_slope1_all_data),},
1719 { TSP_CMD("get_cs_all_data", get_cs_all_data),},
1720 { TSP_CMD("run_cm_test", run_cm_test), },
1721 { TSP_CMD("get_cm_value", get_cm_value), },
1722 { TSP_CMD("run_cm_test_key", run_cm_test_key),},
1723 { TSP_CMD("get_raw_array", get_raw_array), },
1724 { TSP_CMD("run_cmcs_test", run_cmcs_test), },
1725 { TSP_CMD("get_cm_array", get_cm_array), },
1726 { TSP_CMD("get_slope0_array", get_slope0_array),},
1727 { TSP_CMD("get_slope1_array", get_slope1_array),},
1728 { TSP_CMD("get_cs_array", get_cs_array), },
1729 { TSP_CMD("get_cs0_array", get_cs_array), },
1730 { TSP_CMD("get_cs1_array", get_cs_array), },
1732 { TSP_CMD("get_config_ver", get_config_ver), },
1733 { TSP_CMD("not_support_cmd", not_support_cmd), },
1736 /* sysfs: /sys/class/sec/tsp/cmd_list */
1737 static ssize_t show_cmd_list(struct device *dev, struct device_attribute
1738 *devattr, char *buf)
1742 unsigned int ii = 0;
1745 buffer = kzalloc(FACTORY_BUF_SIZE, GFP_KERNEL);
1749 temp = kzalloc(COMMAND_LENGTH, GFP_KERNEL);
1753 snprintf(buffer, COMMAND_LENGTH, "++factory command list++\n");
1755 if (!tsp_cmds[ii].cmd_name)
1758 while(strncmp(tsp_cmds[ii].cmd_name, "not_support_cmd", 16) != 0) {
1759 snprintf(temp, COMMAND_LENGTH, "%s\n", tsp_cmds[ii].cmd_name);
1760 strncat(buffer, temp, COMMAND_LENGTH);
1764 ret = snprintf(buf, PAGE_SIZE, "%s\n", buffer);
1766 tsp_info("%s(%d)\n", buffer, ii);
1777 return snprintf(buf, PAGE_SIZE, "NULL\n");
1779 #if defined(CONFIG_TOUCH_KEY_LED)
1780 static ssize_t touch_led_control(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
1782 struct ist30xx_data *info = dev_get_drvdata(dev);
1783 struct i2c_client *client = info->client;
1787 ret = sscanf(buf, "%d", &data);
1789 dev_err(&client->dev, "%s: cmd read err\n", __func__);
1793 if (!(data == 0 || data == 1)) {
1794 dev_err(&client->dev, "%s: wrong command(%d)\n",
1800 tsp_info("[TKEY] %s : %d\n", __func__, data);
1803 if (info->dt_data->keyled_en_gpio >= 0)
1804 gpio_direction_output(info->dt_data->keyled_en_gpio, 1);
1806 if (info->dt_data->keyled_en_gpio >= 0)
1807 gpio_direction_output(info->dt_data->keyled_en_gpio, 0);
1815 static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL);
1816 static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd);
1817 static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL);
1818 static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL);
1819 static DEVICE_ATTR(cmd_list, S_IRUGO, show_cmd_list, NULL);
1821 static struct attribute *sec_touch_facotry_attributes[] = {
1822 &dev_attr_close_tsp_test.attr,
1824 &dev_attr_cmd_status.attr,
1825 &dev_attr_cmd_result.attr,
1826 &dev_attr_cmd_list.attr,
1830 static struct attribute_group sec_touch_factory_attr_group = {
1831 .attrs = sec_touch_facotry_attributes,
1835 /* sysfs - touchkey */
1836 static DEVICE_ATTR(touchkey_menu, S_IRUGO,
1837 recent_sensitivity_show, NULL);
1838 static DEVICE_ATTR(touchkey_recent, S_IRUGO,
1839 recent_sensitivity_show, NULL);
1840 static DEVICE_ATTR(touchkey_back, S_IRUGO,
1841 back_sensitivity_show, NULL);
1842 static DEVICE_ATTR(touchkey_threshold, S_IRUGO,
1843 touchkey_threshold_show, NULL);
1844 #if defined(CONFIG_TOUCH_KEY_LED)
1845 static DEVICE_ATTR(brightness, 0664, NULL, touch_led_control);
1848 static struct attribute *sec_tkey_attributes[] = {
1849 &dev_attr_touchkey_menu.attr,
1850 &dev_attr_touchkey_recent.attr,
1851 &dev_attr_touchkey_back.attr,
1852 &dev_attr_touchkey_threshold.attr,
1853 #if defined(CONFIG_TOUCH_KEY_LED)
1854 &dev_attr_brightness.attr,
1859 static struct attribute_group sec_tkey_attr_group = {
1860 .attrs = sec_tkey_attributes,
1863 struct device *sec_touchkey;
1865 struct device *sec_fac_dev;
1867 int sec_touch_sysfs(struct ist30xx_data *data)
1871 /* /sys/class/sec/sec_touchkey */
1872 if (!data->dt_data->tkey) {
1873 sec_touchkey = device_create(sec_class, NULL, 1, data, "sec_touchkey");
1874 if (IS_ERR(sec_touchkey)) {
1875 tsp_err("Failed to create device (%s)!\n", "sec_touchkey");
1876 goto err_sec_touchkey;
1878 /* /sys/class/sec/sec_touchkey/... */
1879 if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group)) {
1880 tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey");
1881 goto err_sec_touchkey_attr;
1885 /* /sys/class/sec/tsp */
1886 sec_fac_dev = device_create(sec_class, NULL, 2, data, "tsp");
1887 if (IS_ERR(sec_fac_dev)) {
1888 tsp_err("Failed to create device (%s)!\n", "tsp");
1889 goto err_sec_fac_dev;
1891 ret = sysfs_create_link(&sec_fac_dev->kobj, &data->input_dev->dev.kobj, "input");
1893 tsp_err("%s: Failed to create input symbolic link\n", __func__);
1894 /* /sys/class/sec/tsp/... */
1895 if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group)) {
1896 tsp_err("Failed to create sysfs group(%s)!\n", "tsp");
1897 goto err_sec_fac_dev_attr;
1902 err_sec_fac_dev_attr:
1903 device_destroy(sec_class, 2);
1906 err_sec_touchkey_attr:
1907 if (!data->dt_data->tkey) {
1908 device_destroy(sec_class, 1);
1914 EXPORT_SYMBOL(sec_touch_sysfs);
1915 int sec_fac_cmd_init(struct ist30xx_data *data)
1918 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1920 INIT_LIST_HEAD(&sec->cmd_list_head);
1921 for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++)
1922 list_add_tail(&tsp_cmds[i].list, &sec->cmd_list_head);
1924 sec->cmd_result_length = IST30XX_NODE_TOTAL_NUM * (sizeof(u32) / sizeof(char) + 1);
1925 sec->cmd_result = kzalloc(sec->cmd_result_length, GFP_KERNEL);
1926 if (!sec->cmd_result) {
1927 tsp_err("%s: cmd_result is not allocated memory\n", __func__);
1931 tsp_info("%s: cmd_result lenght is %d\n", __func__, sec->cmd_result_length);
1933 mutex_init(&sec->cmd_lock);
1934 sec->cmd_is_running = false;
1938 EXPORT_SYMBOL(sec_fac_cmd_init);
1940 void sec_touch_sysfs_remove(struct ist30xx_data *data)
1942 sysfs_remove_link(&sec_fac_dev->kobj, "input");
1943 sysfs_remove_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group);
1945 if (!data->dt_data->tkey) {
1946 sysfs_remove_group(&sec_touchkey->kobj, &sec_tkey_attr_group);
1947 device_destroy(sec_class, 1);
1950 device_destroy(sec_class, 2);
1952 EXPORT_SYMBOL(sec_touch_sysfs_remove);
1954 void sec_fac_cmd_remove(struct ist30xx_data *data)
1956 struct sec_factory *sec = (struct sec_factory *)&data->sec;
1958 list_del(&sec->cmd_list_head);
1959 mutex_destroy(&sec->cmd_lock);
1961 EXPORT_SYMBOL(sec_fac_cmd_remove);