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>
27 #include "ist30xx_update.h"
28 #include "ist30xx_misc.h"
32 static char IsfwUpdate[20] = { 0 };
34 #define FW_DOWNLOADING "Downloading"
35 #define FW_DOWNLOAD_COMPLETE "Complete"
36 #define FW_DOWNLOAD_FAIL "FAIL"
38 #define FACTORY_BUF_SIZE (1024)
42 #define CMD_STATE_WAITING (0)
43 #define CMD_STATE_RUNNING (1)
44 #define CMD_STATE_OK (2)
45 #define CMD_STATE_FAIL (3)
46 #define CMD_STATE_NA (4)
48 #define TSP_NODE_DEBUG (1)
50 static u16 node_value[TSP_TOTAL_NUM];
52 extern struct ist30xx_data *ts_data;
53 extern TSP_INFO ist30xx_tsp_info;
54 extern TKEY_INFO ist30xx_tkey_info;
57 #define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func
59 struct list_head list;
60 const char * cmd_name;
61 void (*cmd_func)(void *dev_data);
64 u32 ist30xxb_get_fw_ver(struct ist30xx_data *data)
66 u32 addr = data->tags.cfg_addr + 4;
71 ist30xx_disable_irq(data);
72 ret = ist30xx_cmd_reg(data->client, CMD_ENTER_REG_ACCESS);
73 if (unlikely(ret)) goto get_fw_ver_fail;
75 ret = ist30xx_write_cmd(data->client, IST30XX_RX_CNT_ADDR, len);
76 if (unlikely(ret)) goto get_fw_ver_fail;
78 ret = ist30xx_read_cmd(data->client, addr, &ver);
79 if (unlikely(ret)) goto get_fw_ver_fail;
81 tsp_debug("Reg addr: %x, ver: %x\n", addr, ver);
83 ret = ist30xx_cmd_reg(data->client, CMD_EXIT_REG_ACCESS);
88 ist30xx_cmd_run_device(data->client, true);
91 ist30xx_cmd_start_scan(data->client);
92 ist30xx_enable_irq(data);
97 int ist30xxb_get_key_sensitivity(struct ist30xx_data *data, int id)
99 u32 addr = IST30XXB_MEM_COUNT + 4 * sizeof(u32);
101 static u32 key_sensitivity = 0;
104 if (unlikely(id >= ist30xx_tkey_info.key_num))
107 if (ist30xx_intr_wait(30) < 0) return 0;
109 ret = ist30xx_read_cmd(data->client, addr, &val);
110 if ((val & 0xFFF) == 0xFFF)
111 return (key_sensitivity >> (16 * id)) & 0xFFFF;
113 key_sensitivity = val;
115 tsp_debug("Reg addr: %x, val: %8x\n", addr, val);
119 return (int)(val & 0xFFFF);
123 /* Factory CMD function */
124 static void set_default_result(struct sec_factory *sec)
128 memset(sec->cmd_result, 0, ARRAY_SIZE(sec->cmd_result));
129 memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd));
130 strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING);
133 static void set_cmd_result(struct sec_factory *sec, char *buf, int len)
135 strncat(sec->cmd_result, buf, len);
138 static void not_support_cmd(void *dev_data)
140 char buf[16] = { 0 };
142 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
143 struct sec_factory *sec = (struct sec_factory *)&data->sec;
145 set_default_result(sec);
146 snprintf(buf, sizeof(buf), "%s", "NA");
147 tsp_info("%s(), %s\n", __func__, buf);
149 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
150 sec->cmd_state = CMD_STATE_NA;
151 dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__,
152 buf, strnlen(buf, sizeof(buf)));
156 static void get_chip_vendor(void *dev_data)
158 char buf[16] = { 0 };
160 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
161 struct sec_factory *sec = (struct sec_factory *)&data->sec;
163 set_default_result(sec);
164 snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR);
165 tsp_info("%s(), %s\n", __func__, buf);
167 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
168 sec->cmd_state = CMD_STATE_OK;
169 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
170 buf, strnlen(buf, sizeof(buf)));
173 static void get_chip_name(void *dev_data)
175 char buf[16] = { 0 };
177 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
178 struct sec_factory *sec = (struct sec_factory *)&data->sec;
180 set_default_result(sec);
181 snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME);
182 tsp_info("%s(), %s\n", __func__, buf);
184 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
185 sec->cmd_state = CMD_STATE_OK;
186 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
187 buf, strnlen(buf, sizeof(buf)));
190 static void get_chip_id(void *dev_data)
192 char buf[16] = { 0 };
194 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
195 struct sec_factory *sec = (struct sec_factory *)&data->sec;
197 set_default_result(sec);
198 snprintf(buf, sizeof(buf), "%#02x", data->chip_id);
199 tsp_info("%s(), %s\n", __func__, buf);
201 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
202 sec->cmd_state = CMD_STATE_OK;
203 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
204 buf, strnlen(buf, sizeof(buf)));
206 #include <linux/uaccess.h>
207 #define MAX_FW_PATH 255
208 static void fw_update(void *dev_data)
211 char buf[16] = { 0 };
212 mm_segment_t old_fs = {0};
213 struct file *fp = NULL;
214 long fsize = 0, nread = 0;
216 char fw_path[MAX_FW_PATH+1];
218 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
219 struct sec_factory *sec = (struct sec_factory *)&data->sec;
221 set_default_result(sec);
223 tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]);
225 switch (sec->cmd_param[0]) {
227 sec->cmd_state = CMD_STATE_OK;
228 ret = ist30xx_fw_recovery(data);
230 sec->cmd_state = CMD_STATE_FAIL;
234 sec->cmd_state = CMD_STATE_OK;
238 snprintf(fw_path, MAX_FW_PATH, "/sdcard/%s", IST30XXB_FW_NAME);
239 fp = filp_open(fw_path, O_RDONLY, 0);
241 tsp_warn("[TSP] %s(), file %s open error:%d\n", __func__, fw_path, (s32)fp);
242 sec->cmd_state= CMD_STATE_FAIL;
247 fsize = fp->f_path.dentry->d_inode->i_size;
248 if(fsize != data->fw.buf_size) {
249 tsp_warn("[TSP] %s(), invalid fw size!!\n", __func__);
250 sec->cmd_state = CMD_STATE_FAIL;
254 fw = kzalloc((size_t)fsize, GFP_KERNEL);
256 tsp_warn("[TSP] failed to alloc buffer for fw\n");
257 sec->cmd_state = CMD_STATE_FAIL;
258 filp_close(fp, NULL);
262 nread = vfs_read(fp, (char __user *)fw, fsize, &fp->f_pos);
263 if (nread != fsize) {
264 tsp_warn("[TSP] failed to read fw\n");
265 sec->cmd_state = CMD_STATE_FAIL;
266 filp_close(fp, NULL);
271 filp_close(fp, current->files);
273 tsp_info("[TSP] %s(), ums fw is loaded!!\n", __func__);
275 mutex_lock(&ist30xx_mutex);
276 ist30xx_fw_update(data->client, fw, fsize, true);
277 mutex_unlock(&ist30xx_mutex);
279 ist30xx_calibrate(1);
280 ist30xx_init_touch_driver(data);
284 tsp_warn("%s(), Invalid fw file type!\n", __func__);
288 if (sec->cmd_state == CMD_STATE_OK)
289 snprintf(buf, sizeof(buf), "%s", "OK");
291 snprintf(buf, sizeof(buf), "%s", "NG");
293 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
297 static void get_fw_ver_bin(void *dev_data)
300 char buf[16] = { 0 };
302 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
303 struct sec_factory *sec = (struct sec_factory *)&data->sec;
305 set_default_result(sec);
307 ver = ist30xx_parse_ver(FLAG_PARAM, data->fw.buf);
308 snprintf(buf, sizeof(buf), "IM00%04x", ver);
309 tsp_info("%s(), %s\n", __func__, buf);
311 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
312 sec->cmd_state = CMD_STATE_OK;
313 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
314 buf, strnlen(buf, sizeof(buf)));
317 static void get_fw_ver_ic(void *dev_data)
320 char buf[16] = { 0 };
322 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
323 struct sec_factory *sec = (struct sec_factory *)&data->sec;
325 set_default_result(sec);
327 if (data->status.power == 1)
328 ver = ist30xxb_get_fw_ver(ts_data);
330 snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF);
331 tsp_info("%s(), %s\n", __func__, buf);
333 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
334 sec->cmd_state = CMD_STATE_OK;
335 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
336 buf, strnlen(buf, sizeof(buf)));
339 static void get_threshold(void *dev_data)
341 char buf[16] = { 0 };
345 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
346 struct sec_factory *sec = (struct sec_factory *)&data->sec;
348 set_default_result(sec);
350 ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size);
351 cfg_buf = (u32 *)&data->fw.buf[data->tags.cfg_addr];
353 threshold = (int)(cfg_buf[0x108 / IST30XX_DATA_LEN] >> 16);
355 snprintf(buf, sizeof(buf), "%d", threshold);
356 tsp_info("%s(), %s\n", __func__, buf);
358 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
359 sec->cmd_state = CMD_STATE_OK;
360 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__,
361 buf, strnlen(buf, sizeof(buf)));
364 static void get_x_num(void *dev_data)
366 int val = ist30xx_tsp_info.width;
367 char buf[16] = { 0 };
369 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
370 struct sec_factory *sec = (struct sec_factory *)&data->sec;
372 set_default_result(sec);
375 snprintf(buf, sizeof(buf), "%u", val);
376 sec->cmd_state = CMD_STATE_OK;
377 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
378 strnlen(buf, sizeof(buf)));
380 snprintf(buf, sizeof(buf), "%s", "NG");
381 sec->cmd_state = CMD_STATE_FAIL;
382 dev_info(&data->client->dev,
383 "%s: fail to read num of x (%d).\n", __func__, val);
385 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
386 tsp_info("%s(), %s\n", __func__, buf);
389 static void get_y_num(void *dev_data)
391 int val = ist30xx_tsp_info.height;
392 char buf[16] = { 0 };
394 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
395 struct sec_factory *sec = (struct sec_factory *)&data->sec;
397 set_default_result(sec);
400 snprintf(buf, sizeof(buf), "%u", val);
401 sec->cmd_state = CMD_STATE_OK;
402 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
403 strnlen(buf, sizeof(buf)));
405 snprintf(buf, sizeof(buf), "%s", "NG");
406 sec->cmd_state = CMD_STATE_FAIL;
407 dev_info(&data->client->dev,
408 "%s: fail to read num of x (%d).\n", __func__, val);
410 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
411 tsp_info("%s(), %s\n", __func__, buf);
414 int check_tsp_channel(void *dev_data)
418 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
419 struct sec_factory *sec = (struct sec_factory *)&data->sec;
420 TSP_INFO *tsp = &ist30xx_tsp_info;
422 if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= tsp->width) ||
423 (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= tsp->height)) {
424 dev_info(&data->client->dev, "%s: parameter error: %u,%u\n",
425 __func__, sec->cmd_param[0], sec->cmd_param[1]);
427 node = sec->cmd_param[0] + sec->cmd_param[1] * tsp->width;
428 dev_info(&data->client->dev, "%s: node = %d\n", __func__, node);
435 extern int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16);
436 void run_reference_read(void *dev_data)
439 int min_val, max_val;
440 char buf[16] = { 0 };
441 u8 flag = NODE_FLAG_RAW;
443 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
444 struct sec_factory *sec = (struct sec_factory *)&data->sec;
445 TSP_INFO *tsp = &ist30xx_tsp_info;
447 set_default_result(sec);
449 ret = ist30xx_read_touch_node(flag, &tsp->node);
451 sec->cmd_state = CMD_STATE_FAIL;
452 tsp_warn("%s(), tsp node read fail!\n", __func__);
455 ist30xx_parse_touch_node(flag, &tsp->node);
457 ret = parse_tsp_node(flag, &tsp->node, node_value);
459 sec->cmd_state = CMD_STATE_FAIL;
460 tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag);
464 min_val = max_val = node_value[0];
465 for (i = 0; i < tsp->width * tsp->height; i++) {
467 if ((i % tsp->width) == 0)
468 printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i);
470 printk("%4d ", node_value[i]);
473 max_val = max(max_val, (int)node_value[i]);
474 min_val = min(min_val, (int)node_value[i]);
477 snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val);
478 tsp_info("%s(), %s\n", __func__, buf);
480 sec->cmd_state = CMD_STATE_OK;
481 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
482 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
483 strnlen(buf, sizeof(buf)));
486 void get_reference(void *dev_data)
489 char buf[16] = { 0 };
491 struct ist30xx_data *data = (struct ist30xx_data *)dev_data;
492 struct sec_factory *sec = (struct sec_factory *)&data->sec;
494 set_default_result(sec);
496 idx = check_tsp_channel(data);
497 if (idx < 0) { // Parameter parsing fail
498 snprintf(buf, sizeof(buf), "%s", "NG");
499 sec->cmd_state = CMD_STATE_FAIL;
501 snprintf(buf, sizeof(buf), "%d", node_value[idx]);
502 sec->cmd_state = CMD_STATE_OK;
505 set_cmd_result(sec, buf, strnlen(buf, sizeof(buf)));
506 tsp_info("%s(), [%d][%d]: %s\n", __func__,
507 sec->cmd_param[0], sec->cmd_param[1], buf);
508 dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf,
509 strnlen(buf, sizeof(buf)));
514 /* sysfs: /sys/class/sec/tsp/close_tsp_test */
515 static ssize_t show_close_tsp_test(struct device *dev,
516 struct device_attribute *attr, char *buf)
518 return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0);
521 /* sysfs: /sys/class/sec/tsp/cmd */
522 static ssize_t store_cmd(struct device *dev, struct device_attribute
523 *devattr, const char *buf, size_t count)
525 struct ist30xx_data *data = dev_get_drvdata(dev);
526 struct sec_factory *sec = (struct sec_factory *)&data->sec;
527 struct i2c_client *client = data->client;
529 char *cur, *start, *end;
530 char msg[SEC_CMD_STR_LEN] = { 0 };
532 struct tsp_cmd *tsp_cmd_ptr = NULL;
534 bool cmd_found = false;
538 if (sec->cmd_is_running == true) {
539 dev_err(&client->dev, "tsp_cmd: other cmd is running.\n");
540 tsp_err("tsp_cmd: other cmd is running.\n");
545 mutex_lock(&sec->cmd_lock);
546 sec->cmd_is_running = true;
547 mutex_unlock(&sec->cmd_lock);
549 sec->cmd_state = CMD_STATE_RUNNING;
551 for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++)
552 sec->cmd_param[i] = 0;
555 if (*(buf + len - 1) == '\n')
557 memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd));
558 memcpy(sec->cmd, buf, len);
560 cur = strchr(buf, (int)delim);
562 memcpy(msg, buf, cur - buf);
564 memcpy(msg, buf, len);
566 list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) {
567 if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) {
573 /* set not_support_cmd */
575 list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) {
576 if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name))
581 /* parsing parameters */
582 if (cur && cmd_found) {
585 memset(msg, 0, ARRAY_SIZE(msg));
587 if (*cur == delim || cur - buf == len) {
589 memcpy(msg, start, end - start);
590 *(msg + strlen(msg)) = '\0';
591 ret = kstrtoint(msg, 10, \
592 sec->cmd_param + param_cnt);
594 memset(msg, 0, ARRAY_SIZE(msg));
598 } while (cur - buf <= len);
600 dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name);
601 tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name);
603 for (i = 0; i < param_cnt; i++)
604 dev_info(&client->dev, "cmd param %d= %d\n", i, sec->cmd_param[i]);
606 tsp_cmd_ptr->cmd_func(data);
612 /* sysfs: /sys/class/sec/tsp/cmd_status */
613 static ssize_t show_cmd_status(struct device *dev,
614 struct device_attribute *devattr, char *buf)
616 struct ist30xx_data *data = dev_get_drvdata(dev);
617 struct sec_factory *sec = (struct sec_factory *)&data->sec;
618 char msg[16] = { 0 };
620 dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state);
622 if (sec->cmd_state == CMD_STATE_WAITING)
623 snprintf(msg, sizeof(msg), "WAITING");
625 else if (sec->cmd_state == CMD_STATE_RUNNING)
626 snprintf(msg, sizeof(msg), "RUNNING");
628 else if (sec->cmd_state == CMD_STATE_OK)
629 snprintf(msg, sizeof(msg), "OK");
631 else if (sec->cmd_state == CMD_STATE_FAIL)
632 snprintf(msg, sizeof(msg), "FAIL");
634 else if (sec->cmd_state == CMD_STATE_NA)
635 snprintf(msg, sizeof(msg), "NOT_APPLICABLE");
637 return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg);
640 /* sysfs: /sys/class/sec/tsp/result */
641 static ssize_t show_cmd_result(struct device *dev, struct device_attribute
644 struct ist30xx_data *data = dev_get_drvdata(dev);
645 struct sec_factory *sec = (struct sec_factory *)&data->sec;
647 dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result);
649 mutex_lock(&sec->cmd_lock);
650 sec->cmd_is_running = false;
651 mutex_unlock(&sec->cmd_lock);
653 sec->cmd_state = CMD_STATE_WAITING;
655 return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result);
660 /* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_phone */
661 static ssize_t phone_firmware_show(struct device *dev, struct device_attribute *attr, char *buf)
663 u32 ver = ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf);
665 tsp_info("%s(), IM00%04x\n", __func__, ver);
667 return sprintf(buf, "IM00%04x", ver);
670 /* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_panel */
671 static ssize_t part_firmware_show(struct device *dev, struct device_attribute *attr, char *buf)
675 if (ts_data->status.power == 1)
676 ver = ist30xxb_get_fw_ver(ts_data);
678 tsp_info("%s(), IM00%04x\n", __func__, ver);
680 return sprintf(buf, "IM00%04x", ver);
683 /* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_threshold */
684 static ssize_t threshold_firmware_show(struct device *dev, struct device_attribute *attr, char *buf)
689 ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size);
690 cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr];
692 threshold = (int)(cfg_buf[0x108 / IST30XX_DATA_LEN] >> 16);
694 tsp_info("%s(), %d\n", __func__, threshold);
696 return sprintf(buf, "%d", threshold);
699 /* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update */
700 static ssize_t firmware_update(struct device *dev, struct device_attribute *attr, char *buf)
704 sprintf(IsfwUpdate, "%s\n", FW_DOWNLOADING);
705 tsp_info("%s(), %s\n", __func__, IsfwUpdate);
707 ret = ist30xx_fw_recovery(ts_data);
708 ret = (ret == 0 ? 1 : -1);
710 sprintf(IsfwUpdate, "%s\n",
711 (ret > 0 ? FW_DOWNLOAD_COMPLETE : FW_DOWNLOAD_FAIL));
712 tsp_info("%s(), %s\n", __func__, IsfwUpdate);
714 return sprintf(buf, "%d", ret);
717 /* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update_status */
718 static ssize_t firmware_update_status(struct device *dev, struct device_attribute *attr, char *buf)
720 tsp_info("%s(), %s\n", __func__, IsfwUpdate);
722 return sprintf(buf, "%s\n", IsfwUpdate);
726 /* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_recent */
727 static ssize_t recent_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf)
729 int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 0);
731 tsp_info("%s(), %d\n", __func__, sensitivity);
733 return sprintf(buf, "%d\n", sensitivity);
736 /* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_back */
737 static ssize_t back_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf)
739 int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 1);
741 tsp_info("%s(), %d\n", __func__, sensitivity);
743 return sprintf(buf, "%d\n", sensitivity);
746 /* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_threshold */
747 static ssize_t touchkey_threshold_show(struct device *dev, struct device_attribute *attr, char *buf)
752 ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size);
753 cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr];
755 threshold = (int)(cfg_buf[0x134 / IST30XX_DATA_LEN] >> 16);
757 tsp_info("%s(), %d\n", __func__, threshold);
759 return snprintf(buf, sizeof(int), "%d\n", threshold);
761 /* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_dummy_btn1 */
762 static ssize_t touchkey_dummy_btn1_show(struct device *dev, struct device_attribute *attr, char *buf)
764 printk("[TSP]Hidden btn 1 not supported\n");
767 /* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_dummy_btn3 */
768 static ssize_t touchkey_dummy_btn3_show(struct device *dev, struct device_attribute *attr, char *buf)
770 printk("[TSP]Hidden btn 3 not supported\n");
773 struct tsp_cmd tsp_cmd[] = {
774 { TSP_CMD("get_chip_vendor", get_chip_vendor), },
775 { TSP_CMD("get_chip_name", get_chip_name), },
776 { TSP_CMD("get_chip_id", get_chip_id), },
777 { TSP_CMD("fw_update", fw_update), },
778 { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), },
779 { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), },
780 { TSP_CMD("get_threshold", get_threshold), },
781 { TSP_CMD("get_x_num", get_x_num), },
782 { TSP_CMD("get_y_num", get_y_num), },
783 { TSP_CMD("run_reference_read", run_reference_read),},
784 { TSP_CMD("get_reference", get_reference), },
785 { TSP_CMD("not_support_cmd", not_support_cmd), },
788 #define SEC_DEFAULT_ATTR (S_IRUGO | S_IWUSR | S_IWGRP)
789 /* sysfs - touchscreen */
790 static DEVICE_ATTR(tsp_firm_version_phone, SEC_DEFAULT_ATTR,
791 phone_firmware_show, NULL);
792 static DEVICE_ATTR(tsp_firm_version_panel, SEC_DEFAULT_ATTR,
793 part_firmware_show, NULL);
794 static DEVICE_ATTR(tsp_threshold, SEC_DEFAULT_ATTR,
795 threshold_firmware_show, NULL);
796 static DEVICE_ATTR(tsp_firm_update, SEC_DEFAULT_ATTR,
797 firmware_update, NULL);
798 static DEVICE_ATTR(tsp_firm_update_status, SEC_DEFAULT_ATTR,
799 firmware_update_status, NULL);
801 /* sysfs - touchkey */
802 static DEVICE_ATTR(touchkey_recent, SEC_DEFAULT_ATTR,
803 recent_sensitivity_show, NULL);
804 static DEVICE_ATTR(touchkey_back, SEC_DEFAULT_ATTR,
805 back_sensitivity_show, NULL);
806 static DEVICE_ATTR(touchkey_threshold, SEC_DEFAULT_ATTR,
807 touchkey_threshold_show, NULL);
808 static DEVICE_ATTR(touchkey_dummy_btn1, SEC_DEFAULT_ATTR,
809 touchkey_dummy_btn1_show,NULL);
810 static DEVICE_ATTR(touchkey_dummy_btn3, SEC_DEFAULT_ATTR,
811 touchkey_dummy_btn3_show,NULL);
814 static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL);
815 static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd);
816 static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL);
817 static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL);
819 static struct attribute *sec_tsp_attributes[] = {
820 &dev_attr_tsp_firm_version_phone.attr,
821 &dev_attr_tsp_firm_version_panel.attr,
822 &dev_attr_tsp_threshold.attr,
823 &dev_attr_tsp_firm_update.attr,
824 &dev_attr_tsp_firm_update_status.attr,
828 static struct attribute *sec_tkey_attributes[] = {
829 &dev_attr_touchkey_recent.attr,
830 &dev_attr_touchkey_back.attr,
831 &dev_attr_touchkey_threshold.attr,
832 &dev_attr_touchkey_dummy_btn1.attr,
833 &dev_attr_touchkey_dummy_btn3.attr,
837 static struct attribute *sec_touch_facotry_attributes[] = {
838 &dev_attr_close_tsp_test.attr,
840 &dev_attr_cmd_status.attr,
841 &dev_attr_cmd_result.attr,
845 static struct attribute_group sec_tsp_attr_group = {
846 .attrs = sec_tsp_attributes,
849 static struct attribute_group sec_tkey_attr_group = {
850 .attrs = sec_tkey_attributes,
853 static struct attribute_group sec_touch_factory_attr_group = {
854 .attrs = sec_touch_facotry_attributes,
857 extern struct class *sec_class;
858 struct device *sec_touchscreen;
859 EXPORT_SYMBOL(sec_touchscreen);
860 struct device *sec_touchkey;
861 EXPORT_SYMBOL(sec_touchkey);
862 struct device *sec_fac_dev;
865 int sec_touch_sysfs(struct ist30xx_data *data)
867 /* /sys/class/sec/sec_touchscreen */
868 sec_touchscreen = device_create(sec_class, NULL, 0, NULL, "sec_touchscreen");
869 if (IS_ERR(sec_touchscreen)) {
870 tsp_err("Failed to create device (%s)!\n", "sec_touchscreen");
873 /* /sys/class/sec/sec_touchscreen/... */
874 if (sysfs_create_group(&sec_touchscreen->kobj, &sec_tsp_attr_group))
875 tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchscreen");
877 /* /sys/class/sec/sec_touchkey */
878 sec_touchkey = device_create(sec_class, NULL, 0, NULL, "sec_touchkey");
879 if (IS_ERR(sec_touchkey)) {
880 tsp_err("Failed to create device (%s)!\n", "sec_touchkey");
883 /* /sys/class/sec/sec_touchkey/... */
884 if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group))
885 tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey");
887 /* /sys/class/sec/tsp */
888 sec_fac_dev = device_create(sec_class, NULL, 0, data, "tsp");
889 if (IS_ERR(sec_fac_dev)) {
890 tsp_err("Failed to create device (%s)!\n", "tsp");
893 /* /sys/class/sec/tsp/... */
894 if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group))
895 tsp_err("Failed to create sysfs group(%s)!\n", "tsp");
900 int sec_fac_cmd_init(struct ist30xx_data *data)
903 struct sec_factory *sec = (struct sec_factory *)&data->sec;
905 INIT_LIST_HEAD(&sec->cmd_list_head);
906 for (i = 0; i < ARRAY_SIZE(tsp_cmd); i++)
907 list_add_tail(&tsp_cmd[i].list, &sec->cmd_list_head);
909 mutex_init(&sec->cmd_lock);
910 sec->cmd_is_running = false;