From 501e4a44f1d7f30e63d11b3e9e72016005111459 Mon Sep 17 00:00:00 2001 From: zhuwg1 Date: Mon, 7 Feb 2022 20:20:06 +0800 Subject: [PATCH] Use touch mmi class method to do FW upgrade TP: Use touch mmi class method and init.mmi.touch.sh to do FW upgrade. Change-Id: I300c90b6b5a8eda86cc2c52d9595e9a3a13698cf Signed-off-by: zhuwg1 Reviewed-on: https://gerrit.mot.com/2184720 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: litong Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- .../parade_tma5xx_mmi/cyttsp5_loader.c | 44 ++++++++++++++++++- .../parade_tma5xx_mmi/cyttsp5_regs.h | 3 ++ .../parade_tma5xx_mmi/cyttsp5_ts_mmi.c | 23 ++++++++++ include/linux/cyttsp5_core.h | 2 + 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c index c624c6a35107..f4ac3580e682 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_loader.c @@ -815,6 +815,9 @@ static int cyttsp5_check_firmware_config_version(struct device *dev, u16 fw_conf static int cyttsp5_check_firmware_version_builtin(struct device *dev, const struct firmware *fw) { +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + struct cyttsp5_core_data *cd = dev_get_drvdata(dev); +#endif struct cyttsp5_loader_data *ld = cyttsp5_get_loader_data(dev); u32 fw_ver_new; u32 fw_revctrl_new; @@ -829,6 +832,15 @@ static int cyttsp5_check_firmware_version_builtin(struct device *dev, const stru return CYTTSP5_AUTO_LOAD_FOR_CORRUPTED_FW; } +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + if(cd->force_fw_upgrade == 1) { + cd->force_fw_upgrade = 0; + return 1; + } else { + return 0; + } +#endif + fw_ver_new = get_unaligned_be16(fw->data + 3); /* 4 middle bytes are not used */ fw_revctrl_new = get_unaligned_be32(fw->data + 9); @@ -1067,7 +1079,7 @@ static DEVICE_ATTR(pt_bl_from_file, S_IRUGO | S_IWUSR, * - Panel ID not enabled: cyttsp5_fw.bin * - Panel ID enabled: cyttsp5_fw_pidXX.bin */ -static char *generate_firmware_filename(struct device *dev) +static __maybe_unused char *generate_firmware_filename(struct device *dev) { char *filename; u8 panel_id; @@ -1092,6 +1104,9 @@ static char *generate_firmware_filename(struct device *dev) static int upgrade_firmware_from_builtin(struct device *dev) { +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + struct cyttsp5_core_data *cd = dev_get_drvdata(dev); +#endif struct cyttsp5_loader_data *ld = cyttsp5_get_loader_data(dev); char *filename; int retval; @@ -1105,7 +1120,16 @@ retry_bl: "%s: Enabling firmware class loader built-in\n", __func__); +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + filename = kzalloc(CYTTSP5_FIRMWARE_NAME_MAX_LEN, GFP_KERNEL); + if (!filename) + return -ENOMEM; + + snprintf(filename, CYTTSP5_FIRMWARE_NAME_MAX_LEN, "%s", cd->firmware_name); +#else filename = generate_firmware_filename(dev); +#endif + if (!filename) return -ENOMEM; @@ -1732,8 +1756,22 @@ static DEVICE_ATTR(manual_upgrade, S_IWUSR, NULL, cyttsp5_manual_upgrade_store); #endif +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI +static int cyttsp5_loader_firmware_update(struct device *dev, + char *fwname) +{ + struct cyttsp5_loader_data *ld = cyttsp5_get_loader_data(dev); + cyttsp5_fw_and_config_upgrade(&ld->fw_and_config_upgrade); + + return 0; +} +#endif + static int cyttsp5_loader_probe(struct device *dev, void **data) { +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + struct cyttsp5_core_data *cd = dev_get_drvdata(dev); +#endif struct cyttsp5_loader_data *ld; struct cyttsp5_platform_data *pdata = dev_get_platdata(dev); int rc; @@ -1816,12 +1854,16 @@ static int cyttsp5_loader_probe(struct device *dev, void **data) mutex_init(&ld->config_lock); #endif +#ifdef CONFIG_INPUT_TOUCHSCREEN_MMI + cd->firmware_update = cyttsp5_loader_firmware_update; +#else #ifdef UPGRADE_FW_AND_CONFIG_IN_PROBE /* Call FW and config upgrade directly in probe */ cyttsp5_fw_and_config_upgrade(&ld->fw_and_config_upgrade); #else INIT_WORK(&ld->fw_and_config_upgrade, cyttsp5_fw_and_config_upgrade); schedule_work(&ld->fw_and_config_upgrade); +#endif #endif dev_info(dev, "%s: Successful probe %s\n", __func__, dev_name(dev)); diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h index 36f463e83958..eb56b0747716 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_regs.h @@ -1031,6 +1031,9 @@ struct cyttsp5_core_data { /* touchscreen_mmi */ struct ts_mmi_class_methods *imports; + int (*firmware_update)(struct device *dev, char *fwname); + char firmware_name[CYTTSP5_FIRMWARE_NAME_MAX_LEN]; + bool force_fw_upgrade; }; struct gd_sensor { int32_t cm_min; diff --git a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_ts_mmi.c b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_ts_mmi.c index de190598a5de..92ae05a71ab6 100644 --- a/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_ts_mmi.c +++ b/drivers/input/touchscreen/parade_tma5xx_mmi/cyttsp5_ts_mmi.c @@ -151,6 +151,27 @@ static int cyttsp5_ts_mmi_methods_reset(struct device *dev, int type) { return 0; } +static int cyttsp5_ts_firmware_update(struct device *dev, char *fwname) { + struct cyttsp5_core_data *cd = dev_get_drvdata(dev); + ASSERT_PTR(cd); + + dev_info(dev, "%s, HW request update fw, %s", __func__, fwname); + + if (!fwname) { + dev_err(dev, "%s: Error, firmware name is null\n", + __func__); + return -EINVAL; + } + + if ( !cd->firmware_update) + return -ENOSYS; + + cd->force_fw_upgrade = 1; + snprintf(cd->firmware_name, CYTTSP5_FIRMWARE_NAME_MAX_LEN, "%s", fwname); + + return cd->firmware_update(dev, fwname); +} + static struct ts_mmi_methods cyttsp5_ts_mmi_methods = { .get_vendor = cyttsp5_ts_mmi_methods_get_vendor, .get_class_entry_name = cyttsp5_mmi_get_class_entry_name, @@ -164,6 +185,8 @@ static struct ts_mmi_methods cyttsp5_ts_mmi_methods = { .get_flashprog = cyttsp5_ts_mmi_methods_get_flashprog, /* SET methods */ .reset = cyttsp5_ts_mmi_methods_reset, + /* Firmware */ + .firmware_update = cyttsp5_ts_firmware_update, }; int cyttsp5_ts_mmi_dev_register(struct device *dev) { diff --git a/include/linux/cyttsp5_core.h b/include/linux/cyttsp5_core.h index 32ecc810a4f5..995184d00041 100644 --- a/include/linux/cyttsp5_core.h +++ b/include/linux/cyttsp5_core.h @@ -58,6 +58,8 @@ __stringify(CY_DRIVER_NAME) \ #define CYTTSP5_MAX_STR_LABLE_LEN 64 +#define CYTTSP5_FIRMWARE_NAME_MAX_LEN 64 + enum cyttsp5_core_platform_flags { CY_CORE_FLAG_NONE, CY_CORE_FLAG_POWEROFF_ON_SLEEP = 0x02,