From 76de024ce02134e5e6456e5c52d84be125225a18 Mon Sep 17 00:00:00 2001 From: Mason Wang Date: Wed, 30 Mar 2022 21:24:35 +0800 Subject: 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 --- ft3658/focaltech_common.h | 3 + ft3658/focaltech_core.c | 14 ++ ft3658/focaltech_core.h | 1 + ft3658/focaltech_ex_fun.c | 111 ++++++++++++++ ft3658/focaltech_test/focaltech_test.c | 259 ++++++++++++++++++--------------- 5 files changed, 272 insertions(+), 116 deletions(-) (limited to 'ft3658') 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, ®88_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, ®88_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) -- cgit v1.2.3