summaryrefslogtreecommitdiff
path: root/ft3658
diff options
context:
space:
mode:
authorMason Wang <masonwang@google.com>2022-03-30 21:24:35 +0800
committerMason Wang <masonwang@google.com>2022-04-01 17:18:04 +0800
commit76de024ce02134e5e6456e5c52d84be125225a18 (patch)
tree397aac40681252439d640755eb6eca1faf8a63d3 /ft3658
parente622fef001c5a6cfaf4c9103326279fbb04399e2 (diff)
downloadfocaltech_touch-76de024ce02134e5e6456e5c52d84be125225a18.tar.gz
touch/focaltech: support more bus reference mode.
Support force touch bus active and sysfs bus reference bit to make sure the touch bus is active while transferring SPI data. Bug: 199105131 Test: write the sysfs command successfully. Change-Id: I6bb124d692842e7eccbc9fa795d82baa186ae505
Diffstat (limited to 'ft3658')
-rw-r--r--ft3658/focaltech_common.h3
-rw-r--r--ft3658/focaltech_core.c14
-rw-r--r--ft3658/focaltech_core.h1
-rw-r--r--ft3658/focaltech_ex_fun.c111
-rw-r--r--ft3658/focaltech_test/focaltech_test.c259
5 files changed, 272 insertions, 116 deletions
diff --git a/ft3658/focaltech_common.h b/ft3658/focaltech_common.h
index 1c96e70..ef5af7b 100644
--- a/ft3658/focaltech_common.h
+++ b/ft3658/focaltech_common.h
@@ -194,6 +194,9 @@ enum {
FTS_TS_BUS_REF_SCREEN_ON = 0x01,
FTS_TS_BUS_REF_IRQ = 0x02,
FTS_TS_BUS_REF_FW_UPDATE = 0x04,
+ FTS_TS_BUS_REF_SYSFS = 0x0008,
+ FTS_TS_BUS_REF_FORCE_ACTIVE = 0x0010,
+ FTS_TS_BUS_REF_BUGREPORT = 0x0020,
};
enum TOUCH_POWER_MODE {
diff --git a/ft3658/focaltech_core.c b/ft3658/focaltech_core.c
index 7ba5729..317362d 100644
--- a/ft3658/focaltech_core.c
+++ b/ft3658/focaltech_core.c
@@ -3150,6 +3150,10 @@ static int fts_ts_suspend(struct device *dev)
struct fts_ts_data *ts_data = fts_data;
FTS_FUNC_ENTER();
+ if (ts_data->bus_refmask)
+ FTS_DEBUG("bus_refmask 0x%X\n", ts_data->bus_refmask);
+
+
if (ts_data->suspended) {
FTS_INFO("Already in suspend state");
return 0;
@@ -3171,6 +3175,16 @@ static int fts_ts_suspend(struct device *dev)
if (ts_data->gesture_mode) {
fts_gesture_suspend(ts_data);
} else {
+ if (ts_data->bus_refmask == FTS_TS_BUS_REF_BUGREPORT &&
+ ktime_ms_delta(ktime_get(), ts_data->bugreport_ktime_start) >
+ 30 * MSEC_PER_SEC) {
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_BUGREPORT, false);
+ pm_relax(ts_data->dev);
+ ts_data->bugreport_ktime_start = 0;
+ FTS_DEBUG("Force release FTS_TS_BUS_REF_BUGREPORT reference bit.");
+ return -EBUSY;
+ }
+
/* Disable irq */
fts_irq_disable();
FTS_DEBUG("make TP enter into sleep mode");
diff --git a/ft3658/focaltech_core.h b/ft3658/focaltech_core.h
index 81679fc..1c0dc60 100644
--- a/ft3658/focaltech_core.h
+++ b/ft3658/focaltech_core.h
@@ -270,6 +270,7 @@ struct fts_ts_data {
* compute the duration a single finger is touched before it is lifted.
*/
ktime_t mf_downtime;
+ ktime_t bugreport_ktime_start;
#if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
bool enable_fw_heatmap;
diff --git a/ft3658/focaltech_ex_fun.c b/ft3658/focaltech_ex_fun.c
index 50092e4..013da10 100644
--- a/ft3658/focaltech_ex_fun.c
+++ b/ft3658/focaltech_ex_fun.c
@@ -2552,6 +2552,105 @@ static const struct file_operations proc_mf_mode_fops = {
};
#endif
+/**
+ * proc_force_active_write()
+ *
+ * Attribute to set different scan mode.
+ * 0x10 - Set FTS_TS_BUS_REF_FORCE_ACTIVE bit 0.
+ * 0x11 - Set FTS_TS_BUS_REF_FORCE_ACTIVE bit 1.
+ * 0x20 - Set FTS_TS_BUS_REF_BUGREPORT bit 0.
+ * 0x21 - Set FTS_TS_BUS_REF_BUGREPORT bit 1.
+ *
+ * @return
+ * on success, return count; otherwise, return error code
+ */
+static ssize_t proc_force_active_write(struct file *filp,
+ const char __user *buff, size_t count, loff_t *ppos)
+{
+ int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
+ char tmpbuf[PROC_BUF_SIZE] = { 0 };
+ unsigned char input;
+ int buflen = count;
+ bool active;
+ u32 ref = 0;
+
+ if (buflen >= PROC_BUF_SIZE) {
+ FTS_ERROR("proc write length(%d) fails", buflen);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if (copy_from_user(tmpbuf, buff, buflen)) {
+ FTS_ERROR("copy from user error");
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ ret = kstrtou8(tmpbuf, 16, &input);
+ if (ret != 0) {
+ FTS_ERROR("get mode fails, ret=%d", ret);
+ ret = -EINVAL;
+ goto exit;
+ }
+ switch (input) {
+ case 0x10:
+ ref = FTS_TS_BUS_REF_FORCE_ACTIVE;
+ active = false;
+ break;
+ case 0x11:
+ ref = FTS_TS_BUS_REF_FORCE_ACTIVE;
+ active = true;
+ break;
+ case 0x20:
+ ref = FTS_TS_BUS_REF_BUGREPORT;
+ active = false;
+ ts_data->bugreport_ktime_start = 0;
+ break;
+ case 0x21:
+ ref = FTS_TS_BUS_REF_BUGREPORT;
+ active = true;
+ ts_data->bugreport_ktime_start = ktime_get();
+ break;
+ default:
+ FTS_ERROR("Invalid input %#x.\n", input);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ FTS_INFO("Set bus reference bit %#x %s.", ref,
+ active ? "enable" : "disable");
+
+ if (active)
+ pm_stay_awake(ts_data->dev);
+ else
+ pm_relax(ts_data->dev);
+
+ ret = fts_ts_set_bus_ref(ts_data, ref, active);
+ if (ret < 0) {
+ FTS_ERROR("Set bus reference bit %#x %s failed.", ref,
+ active ? "enable" : "disable");
+ goto exit;
+ }
+
+ ret = count;
+
+exit:
+ return ret;
+}
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
+static const struct proc_ops proc_force_active_fops = {
+ .proc_write = proc_force_active_write,
+};
+#else
+static const struct file_operations proc_force_active_fops = {
+ .owner = THIS_MODULE,
+ .write = proc_force_active_write,
+};
+#endif
+
+
struct proc_dir_entry *proc_fw_update;
struct proc_dir_entry *proc_scan_modes;
struct proc_dir_entry *proc_touch_mode;
@@ -2565,6 +2664,7 @@ struct proc_dir_entry *proc_heatmap_onoff;
struct proc_dir_entry *proc_LPTW_setting;
struct proc_dir_entry *proc_STTW_setting;
struct proc_dir_entry *proc_mf_mode;
+struct proc_dir_entry *proc_force_active;
static int fts_create_ctrl_procs(struct fts_ts_data *ts_data)
{
@@ -2674,6 +2774,14 @@ static int fts_create_ctrl_procs(struct fts_ts_data *ts_data)
return ret;
}
+ proc_force_active = proc_create_data("force_active", S_IRUSR|S_IWUSR,
+ ts_data->proc_touch_entry, &proc_force_active_fops, ts_data);
+ if (!proc_force_active) {
+ FTS_ERROR("create proc_force_active fail");
+ ret = -ENOMEM;
+ return ret;
+ }
+
FTS_INFO("create control procs succeeds");
return 0;
}
@@ -2718,6 +2826,9 @@ static void fts_free_ctrl_procs(void)
if (proc_mf_mode)
proc_remove(proc_mf_mode);
+
+ if (proc_force_active)
+ proc_remove(proc_force_active);
}
int fts_create_sysfs(struct fts_ts_data *ts_data)
diff --git a/ft3658/focaltech_test/focaltech_test.c b/ft3658/focaltech_test/focaltech_test.c
index 11cd910..f025174 100644
--- a/ft3658/focaltech_test/focaltech_test.c
+++ b/ft3658/focaltech_test/focaltech_test.c
@@ -2104,7 +2104,6 @@ static int fts_test_entry(char *ini_file_name)
#endif
}
- ret = 0;
test_err:
fts_test_main_exit();
enter_work_mode();
@@ -2317,23 +2316,28 @@ static const struct file_operations proc_run_os_test_fops = {
static int proc_test_fwver_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
u8 fw_major_ver = 0;
u8 fw_minor_ver = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = fts_read_reg(REG_FW_MAJOR_VER, &fw_major_ver);
if (ret < 0) {
FTS_ERROR("FWVER read major version fail,ret=%d\n", ret);
- return ret;
+ goto exit;
}
ret = fts_read_reg(REG_FW_MINOR_VER, &fw_minor_ver);
if (ret < 0) {
FTS_ERROR("FWVER read minor version fail,ret=%d\n", ret);
- return ret;
+ goto exit;
}
seq_printf(s, "FWVER:V%02x_D%02x\n", fw_major_ver, fw_minor_ver);
- return 0;
+
+exit:
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_fwver_open(struct inode *inode, struct file *file)
@@ -2362,34 +2366,36 @@ static const struct file_operations proc_test_fwver_fops = {
static int proc_test_chnum_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
u8 tx = 0;
u8 rx = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
if (ret < 0) {
FTS_ERROR("read tx fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHY_NUM, &rx);
if (ret < 0) {
FTS_ERROR("read rx fails");
- return ret;
- }
-
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
+ goto exit;
}
seq_printf(s, "TX:%02d, RX:%02d\n", tx, rx);
- return 0;
+
+exit:
+ enter_work_mode();
+
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_chnum_open(struct inode *inode, struct file *file)
@@ -2418,20 +2424,22 @@ static const struct file_operations proc_test_chnum_fops = {
static int proc_test_hw_reset_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
u8 reg88_val = 0xFF;
u8 tmp_val = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = fts_read_reg(FTS_TMP_REG_88, &reg88_val);
if (ret < 0) {
FTS_ERROR("read reg88 fails");
- return ret;
+ goto exit;
}
tmp_val = reg88_val - 1;
ret = fts_write_reg(FTS_TMP_REG_88, tmp_val);
if (ret < 0) {
FTS_ERROR("write reg88 fails");
- return ret;
+ goto exit;
}
fts_reset_proc(200);
@@ -2439,7 +2447,7 @@ static int proc_test_hw_reset_show(struct seq_file *s, void *v)
ret = fts_read_reg(FTS_TMP_REG_88, &tmp_val);
if (ret < 0) {
FTS_ERROR("read reg88 fails");
- return ret;
+ goto exit;
}
if (tmp_val == reg88_val)
@@ -2447,6 +2455,8 @@ static int proc_test_hw_reset_show(struct seq_file *s, void *v)
else
seq_printf(s, "Reset Pin test FAIL.\n");
+exit:
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return ret;
}
@@ -2476,37 +2486,39 @@ static const struct file_operations proc_test_hw_reset_fops = {
static int proc_test_sw_reset_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
u8 reg88_val = 0;
u8 tmp_val = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = fts_read_reg(FTS_TMP_REG_88, &reg88_val);
if (ret < 0) {
FTS_ERROR("read reg88 fails");
- return ret;
+ goto exit;
}
ret = fts_write_reg(FTS_TMP_REG_88, 0x22);
if (ret < 0) {
FTS_ERROR("write reg88 fails for SW reset");
- return ret;
+ goto exit;
}
ret = fts_write_reg(FTS_TMP_REG_SOFT_RESET, 0xAA);
if (ret < 0) {
FTS_ERROR("write 0xAA to reg 0xFC fails");
- return ret;
+ goto exit;
}
ret = fts_write_reg(FTS_TMP_REG_SOFT_RESET, 0x66);
if (ret < 0) {
FTS_ERROR("write 0x66 to reg 0xFC fails");
- return ret;
+ goto exit;
}
sys_delay(40);
ret = fts_read_reg(FTS_TMP_REG_88, &tmp_val);
if (ret < 0) {
FTS_ERROR("read reg88 fails for SW reset");
- return ret;
+ goto exit;
}
if (tmp_val == reg88_val)
@@ -2514,7 +2526,9 @@ static int proc_test_sw_reset_show(struct seq_file *s, void *v)
else
seq_printf(s, "SW Reset test FAIL.\n");
- return 0;
+exit:
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_sw_reset_open(struct inode *inode, struct file *file)
@@ -2544,11 +2558,13 @@ int int_test_has_interrupt = 0;
static int proc_test_int_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
fts_irq_enable();
@@ -2557,8 +2573,7 @@ static int proc_test_int_show(struct seq_file *s, void *v)
ret = fts_write_reg(FACTORY_REG_SCAN_ADDR2, 0x01);
if (ret < 0) {
FTS_ERROR("read tx fails");
- enter_work_mode();
- return ret;
+ goto exit;
}
sys_delay(1000);
@@ -2568,11 +2583,10 @@ static int proc_test_int_show(struct seq_file *s, void *v)
else
seq_printf(s, "INT Pin test FAIL.\n");
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+exit:
+ enter_work_mode();
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return ret;
}
@@ -2612,38 +2626,38 @@ extern int fts_test_get_panel_differ(int *panel_differ, u8 tx, u8 rx);
static int proc_test_raw_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *raw;
+ int *raw = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
/* get Tx chanel number */
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
if (ret < 0) {
FTS_ERROR("read tx fails");
- enter_work_mode();
- return ret;
+ goto exit;
}
/* get Rx chanel number */
ret = fts_read_reg(FACTORY_REG_CHY_NUM, &rx);
if (ret < 0) {
FTS_ERROR("read rx fails");
- enter_work_mode();
- return ret;
+ goto exit;
}
node_num = tx * rx;
raw = fts_malloc(node_num * sizeof(int));
if (!raw) {
FTS_ERROR("malloc memory for raw fails");
- enter_work_mode();
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto exit;
}
/* get raw data */
@@ -2663,10 +2677,13 @@ static int proc_test_raw_show(struct seq_file *s, void *v)
seq_printf(s, "\n\n");
- fts_free(raw);
+exit:
+ if (raw)
+ fts_free(raw);
- ret = enter_work_mode();
+ enter_work_mode();
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return ret;
}
@@ -2696,29 +2713,31 @@ static const struct file_operations proc_test_raw_fops = {
static int proc_test_baseline_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *raw;
- int *base_raw;
+ int *raw = NULL;
+ int *base_raw = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
if (ret < 0) {
FTS_ERROR("read tx fails");
- goto work_raw;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHY_NUM, &rx);
if (ret < 0) {
FTS_ERROR("read rx fails");
- goto work_raw;
+ goto exit;
}
node_num = tx * rx;
@@ -2726,14 +2745,14 @@ static int proc_test_baseline_show(struct seq_file *s, void *v)
if (!raw) {
FTS_ERROR("malloc memory for raw fails");
ret = -ENOMEM;
- goto work_raw;
+ goto exit;
}
base_raw = fts_malloc(node_num * sizeof(int));
if (!base_raw) {
FTS_ERROR("malloc memory for base_raw fails");
ret = -ENOMEM;
- goto work_raw;
+ goto exit;
}
/* get baseline data */
@@ -2752,16 +2771,17 @@ static int proc_test_baseline_show(struct seq_file *s, void *v)
}
seq_printf(s, "\n\n");
- fts_free(base_raw);
- fts_free(raw);
-work_raw:
+exit:
+ if (base_raw)
+ fts_free(base_raw);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ if (raw)
+ fts_free(raw);
+ enter_work_mode();
+
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return 0;
}
@@ -2804,6 +2824,7 @@ void transpose_raw(u8 *src, u8 *dist, int tx, int rx) {
static int proc_test_strength_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
int self_node = 0;
@@ -2815,17 +2836,17 @@ static int proc_test_strength_show(struct seq_file *s, void *v)
u8 rx = 34;
short base_result = 0;
- u8 *base_raw;
- u8 *trans_raw;
+ u8 *base_raw = NULL;
+ u8 *trans_raw = NULL;
int base_raw_len = 0;
int base = 0;
int Fast_events_x = 0;
int Fast_events_y = 0;
u8 Fast_events_id = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_work_mode();
if (ret < 0) {
- FTS_ERROR("enter work mode fails");
goto exit;
}
@@ -2846,14 +2867,14 @@ static int proc_test_strength_show(struct seq_file *s, void *v)
if (!trans_raw) {
FTS_ERROR("malloc memory for transpose raw fails");
ret = -ENOMEM;
- goto base_raw_err;
+ goto exit;
}
/* get strength data. */
ret = fts_test_get_strength(base_raw, tx, rx);
if (ret < 0) {
FTS_ERROR("get strength fails");
- goto trans_raw_err;
+ goto exit;
}
/*---------Output touch point-----------*/
@@ -2897,7 +2918,7 @@ static int proc_test_strength_show(struct seq_file *s, void *v)
if (i == 0)
seq_printf(s, "RX:");
- if(i == rx) {
+ if (i == rx) {
FTS_DEBUG("index(tx) = %d", (self_cap_num + (i * 2)));
seq_printf(s, "\n");
seq_printf(s, "TX:");
@@ -2914,7 +2935,7 @@ static int proc_test_strength_show(struct seq_file *s, void *v)
if (i == 0)
seq_printf(s, "RX:");
- if(i == rx){
+ if (i == rx){
seq_printf(s, "\n");
seq_printf(s, "TX:");
}
@@ -2924,11 +2945,14 @@ static int proc_test_strength_show(struct seq_file *s, void *v)
seq_printf(s, "\n\n");
/*---------END self of strength data-----------*/
-trans_raw_err:
- fts_free(trans_raw);
-base_raw_err:
- fts_free(base_raw);
exit:
+ if (trans_raw)
+ fts_free(trans_raw);
+
+ if (base_raw)
+ fts_free(base_raw);
+
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return ret;
}
@@ -2958,16 +2982,18 @@ static const struct file_operations proc_test_strength_fops = {
static int proc_test_uniformity_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *uniformity;
+ int *uniformity = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
@@ -3010,15 +3036,13 @@ static int proc_test_uniformity_show(struct seq_file *s, void *v)
seq_printf(s, "%d,\n", uniformity[node_num + i]);
}
- fts_free(uniformity);
-
exit:
+ if (uniformity)
+ fts_free(uniformity);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ enter_work_mode();
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return 0;
}
@@ -3048,6 +3072,7 @@ static const struct file_operations proc_test_uniformity_fops = {
static int proc_test_sraw_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
int *sraw = NULL;
@@ -3055,10 +3080,11 @@ static int proc_test_sraw_show(struct seq_file *s, void *v)
u8 tx = 0;
u8 rx = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
@@ -3131,16 +3157,14 @@ static int proc_test_sraw_show(struct seq_file *s, void *v)
seq_printf(s, "\n");
}
- fts_free(sraw);
-
exit:
+ if (sraw)
+ fts_free(sraw);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ enter_work_mode();
- return 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_sraw_open(struct inode *inode, struct file *file)
@@ -3169,6 +3193,7 @@ static const struct file_operations proc_test_sraw_fops = {
static int proc_test_scb_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
int *scb = NULL;
@@ -3176,10 +3201,11 @@ static int proc_test_scb_show(struct seq_file *s, void *v)
u8 tx = 0;
u8 rx = 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
@@ -3253,16 +3279,14 @@ static int proc_test_scb_show(struct seq_file *s, void *v)
seq_printf(s, "\n");
}
- fts_free(scb);
-
exit:
+ if (scb)
+ fts_free(scb);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ enter_work_mode();
- return 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_scb_open(struct inode *inode, struct file *file)
@@ -3291,16 +3315,18 @@ static const struct file_operations proc_test_scb_fops = {
static int proc_test_noise_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *noise;
+ int *noise = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
@@ -3340,16 +3366,14 @@ static int proc_test_noise_show(struct seq_file *s, void *v)
seq_printf(s, "\n\n");
- fts_free(noise);
-
exit:
+ if (noise)
+ fts_free(noise);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ enter_work_mode();
- return 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_noise_open(struct inode *inode, struct file *file)
@@ -3378,38 +3402,38 @@ static const struct file_operations proc_test_noise_fops = {
static int proc_test_short_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *short_data;
+ int *short_data = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
/* get Tx chanel number */
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
if (ret < 0) {
FTS_ERROR("read tx fails");
- enter_work_mode();
- return ret;
+ goto exit;
}
/* get Rx chanel number */
ret = fts_read_reg(FACTORY_REG_CHY_NUM, &rx);
if (ret < 0) {
FTS_ERROR("read rx fails");
- enter_work_mode();
- return ret;
+ goto exit;
}
node_num = tx + rx;
short_data = fts_malloc(node_num * sizeof(int));
if (!short_data) {
FTS_ERROR("malloc memory for raw fails");
- enter_work_mode();
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto exit;
}
/* get raw data */
@@ -3428,10 +3452,13 @@ static int proc_test_short_show(struct seq_file *s, void *v)
}
seq_printf(s, "\n\n");
- fts_free(short_data);
+exit:
+ if (short_data)
+ fts_free(short_data);
- ret = enter_work_mode();
+ enter_work_mode();
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
return ret;
}
@@ -3460,16 +3487,18 @@ static const struct file_operations proc_test_short_fops = {
static int proc_test_panel_differ_show(struct seq_file *s, void *v)
{
int ret = 0;
+ struct fts_ts_data *ts_data = fts_data;
int i = 0;
int node_num = 0;
u8 tx = 0;
u8 rx = 0;
- int *panel_differ;
+ int *panel_differ = NULL;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, true);
ret = enter_factory_mode();
if (ret < 0) {
FTS_ERROR("enter factory mode fails");
- return ret;
+ goto exit;
}
ret = fts_read_reg(FACTORY_REG_CHX_NUM, &tx);
@@ -3509,16 +3538,14 @@ static int proc_test_panel_differ_show(struct seq_file *s, void *v)
seq_printf(s, "\n\n");
- fts_free(panel_differ);
-
exit:
+ if (panel_differ)
+ fts_free(panel_differ);
- ret = enter_work_mode();
- if (ret < 0) {
- FTS_ERROR("enter work mode fails");
- }
+ enter_work_mode();
- return 0;
+ fts_ts_set_bus_ref(ts_data, FTS_TS_BUS_REF_SYSFS, false);
+ return ret;
}
static int proc_test_panel_differ_open(struct inode *inode, struct file *file)