diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_core.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_core.c index a20beccaff1f..c7ccc55d8b1c 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_core.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_core.c @@ -28,6 +28,7 @@ #include "cyttsp5_regs.h" #include +#include #define CY_CORE_STARTUP_RETRY_COUNT 3 @@ -1960,7 +1961,7 @@ exit: return 0; } -static int cyttsp5_get_mfg_value_(struct cyttsp5_core_data *cd, u8 *mfg_buffer, u8 mfg_num) +static __maybe_unused int cyttsp5_get_mfg_value_(struct cyttsp5_core_data *cd, u8 *mfg_buffer, u8 mfg_num) { int rc; @@ -3803,6 +3804,21 @@ queue_startup: cyttsp5_start_wd_timer(cd); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) +static void cyttsp5_watchdog_timer(struct timer_list *t) +{ + struct cyttsp5_core_data *cd = from_timer(cd, t, watchdog_timer); + + if (!cd) + return; + + parade_debug(cd->dev, DEBUG_LEVEL_2, "%s: Watchdog timer triggered\n", + __func__); + + if (!work_pending(&cd->watchdog_work)) + schedule_work(&cd->watchdog_work); +} +#else static void cyttsp5_watchdog_timer(unsigned long handle) { struct cyttsp5_core_data *cd = (struct cyttsp5_core_data *)handle; @@ -3816,6 +3832,7 @@ static void cyttsp5_watchdog_timer(unsigned long handle) if (!work_pending(&cd->watchdog_work)) schedule_work(&cd->watchdog_work); } +#endif static int cyttsp5_put_device_into_easy_wakeup_(struct cyttsp5_core_data *cd) { @@ -5734,8 +5751,7 @@ static ssize_t cyttsp5_ttdl_restart_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { int rc; - struct i2c_client *client = - (struct i2c_client *)container_of(dev, struct i2c_client, dev); + struct i2c_client *client = to_i2c_client(dev); if (is_cyttsp5_probe_success) { dev_err(dev, "%s: previous cyttsp5_probe is successful, do nothing\n", @@ -5868,7 +5884,9 @@ int _pt_read_us_file(struct device *dev, u8 *file_path, u8 *buf, int *size) struct inode *inode = NULL; unsigned int file_len = 0; unsigned int read_len = 0; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) mm_segment_t oldfs; +#endif int rc = 0; if (file_path == NULL || buf == NULL) { @@ -5878,8 +5896,10 @@ int _pt_read_us_file(struct device *dev, u8 *file_path, u8 *buf, int *size) dev_info(dev, "%s: path = %s\n", __func__, file_path); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) oldfs = get_fs(); set_fs(KERNEL_DS); +#endif filp = filp_open(file_path, O_RDONLY, S_IRUSR); if (IS_ERR(filp)) { dev_err(dev, "%s: Failed to open %s\n", __func__, @@ -5921,7 +5941,11 @@ int _pt_read_us_file(struct device *dev, u8 *file_path, u8 *buf, int *size) goto exit; } filp->private_data = inode->i_private; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) if (vfs_read(filp, buf, read_len, &(filp->f_pos)) != read_len) { +#else + if (kernel_read(filp, buf, read_len, &(filp->f_pos)) != read_len) { +#endif dev_err(dev, "%s: file read error.\n", __func__); rc = -EINVAL; goto exit; @@ -5932,7 +5956,9 @@ exit: if (filp_close(filp, NULL) != 0) dev_err(dev, "%s: file close error.\n", __func__); err: +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) set_fs(oldfs); +#endif return rc; } @@ -6414,8 +6440,13 @@ int cyttsp5_probe(const struct cyttsp5_bus_ops *ops, struct device *dev, } /* Setup watchdog timer */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) + timer_setup(&cd->watchdog_timer, cyttsp5_watchdog_timer, + 0); +#else setup_timer(&cd->watchdog_timer, cyttsp5_watchdog_timer, (unsigned long)cd); +#endif rc = cyttsp5_setup_irq_gpio(cd); if (rc < 0) { diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_device_access.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_device_access.c index 1cad8abff52d..0832da84d6f0 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_device_access.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_device_access.c @@ -1207,11 +1207,11 @@ static int cyttsp5_get_cmcp_info(struct cyttsp5_device_access_data *dad, struct gd_sensor *gd_sensor_row = cmcp_info->gd_sensor_row; struct result *result = dad->result; int32_t cp_btn_cal = 0; - int32_t cm_btn_cal = 0; + //int32_t cm_btn_cal = 0; int32_t cp_btn_ave = 0; int32_t cm_ave_data_panel = 0; int32_t cm_ave_data_btn = 0; - int32_t cm_delta_data_btn = 0; + //int32_t cm_delta_data_btn = 0; int32_t cp_tx_ave_data_panel = 0; int32_t cp_rx_ave_data_panel = 0; u8 tmp_buf[3]; @@ -1795,7 +1795,7 @@ static ssize_t cyttsp5_cmcp_test_store(struct device *dev, u8 test_item = 0; u8 range_check = 0; u8 force_calibrate = 0; - int ret; + int ret = 0; static const char * const cmcp_test_case_array[] = {"Full Cm/Cp test", "Cm panel test", "Cp panel test", "Cm button test", "Cp button test"}; @@ -1853,8 +1853,9 @@ static ssize_t cyttsp5_cmcp_test_store(struct device *dev, * If it is not all Test, then range_check should be 0 * because other test does not has concept of basic check */ - if (test_item > 0 && test_item < 5) + if (test_item > 0 && test_item < 5) { range_check = 0; + } dad->cmcp_test_items = test_item; dad->cmcp_range_check = range_check; dad->cmcp_force_calibrate = force_calibrate; @@ -1901,14 +1902,14 @@ int prepare_print_data(char *out_buf, int32_t *in_buf, int index, int data_num) int save_header(char *out_buf, int index, struct result *result) { - struct timex txc; + struct timespec64 txc; struct rtc_time tm; char time_buf[100] = {0}; - do_gettimeofday(&(txc.time)); - rtc_time_to_tm(txc.time.tv_sec, &tm); + ktime_get_real_ts64(&txc); + rtc_time64_to_tm(txc.tv_sec, &tm); scnprintf(time_buf, 100, "%d/%d/%d,TIME,%d:%d:%d,", tm.tm_year+1900, - tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); index = prepare_print_string(out_buf, ",.header,\n", index); index = prepare_print_string(out_buf, ",DATE,", index); @@ -2074,11 +2075,12 @@ int save_engineering_data(struct device *dev, char *out_buf, int index, index = prepare_print_data( out_buf, &tmp, index, 1); - for (j = 1; j < tx_num; j++) + for (j = 1; j < tx_num; j++) { index = prepare_print_data( out_buf, &cmcp_info->cm_sensor_column_delta[(j-1)*rx_num+i], index, 1); + } index = prepare_print_string( out_buf, "\n", index); @@ -2112,11 +2114,12 @@ int save_engineering_data(struct device *dev, char *out_buf, int index, index = prepare_print_data( out_buf, &i, index, 1); - for (j = 0; j < tx_num; j++) + for (j = 0; j < tx_num; j++) { index = prepare_print_data( out_buf, &cmcp_info->cm_sensor_row_delta[j*rx_num+i-1], index, 1); + } index = prepare_print_string( out_buf, "\n", index); diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c index 436f5bf9185e..c624c6a35107 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c @@ -309,14 +309,24 @@ static int cyttsp5_ldr_prog_row_(struct device *dev, struct cyttsp5_hex_image *row_image) { u16 length = row_image->row_size + 3; - u8 data[3 + row_image->row_size]; + int ret = 0; + u8 *data = NULL; u8 offset = 0; + data = (u8 *) kmalloc(length, GFP_KERNEL); + if(!data) { + dev_err(dev, "%s: failed to kmalloc\n", __func__); + return -ENOMEM; + } + data[offset++] = row_image->array_id; data[offset++] = LOW_BYTE(row_image->row_num); data[offset++] = HI_BYTE(row_image->row_num); memcpy(data + 3, row_image->row_data, row_image->row_size); - return cmd->nonhid_cmd->prog_and_verify(dev, 0, length, data); + ret = cmd->nonhid_cmd->prog_and_verify(dev, 0, length, data); + + kfree(data); + return ret; } static int cyttsp5_ldr_verify_chksum_(struct device *dev) diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_mt_common.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_mt_common.c index 41b28f185d16..1ca07a8a4c32 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_mt_common.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_mt_common.c @@ -190,6 +190,7 @@ static void cyttsp5_report_event(struct cyttsp5_mt_data *md, int event, input_report_abs(md->input, sig, value); } +#define CY_MAX_ID 32 static void cyttsp5_get_mt_touches(struct cyttsp5_mt_data *md, struct cyttsp5_touch *tch, int num_cur_tch) { @@ -197,7 +198,7 @@ static void cyttsp5_get_mt_touches(struct cyttsp5_mt_data *md, struct cyttsp5_sysinfo *si = md->si; int sig; int i, j, t = 0; - DECLARE_BITMAP(ids, si->tch_abs[CY_TCH_T].max); + DECLARE_BITMAP(ids, CY_MAX_ID); int mt_sync_count = 0; u8 *tch_addr; diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h index 44ba12ef4be0..5fcb2d60b8d0 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h @@ -927,9 +927,12 @@ struct cyttsp5_features { uint8_t sensor_data; }; -#define NEED_SUSPEND_NOTIFIER \ - ((LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)) \ +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)) \ && defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_RUNTIME)) +#define NEED_SUSPEND_NOTIFIER 1 +#else +#define NEED_SUSPEND_NOTIFIER 0 +#endif struct cyttsp5_module { struct list_head node;