diff --git a/drivers/input/touchscreen/nova_0flash_mmi/Android.mk b/drivers/input/touchscreen/nova_0flash_mmi/Android.mk index 58a4c9112b0b..cf57dd59972e 100644 --- a/drivers/input/touchscreen/nova_0flash_mmi/Android.mk +++ b/drivers/input/touchscreen/nova_0flash_mmi/Android.mk @@ -55,6 +55,11 @@ endif ifeq ($(TOUCH_PANEL_NOTIFICATIONS),true) KERNEL_CFLAGS += CONFIG_TOUCH_PANEL_NOTIFICATIONS=y endif + +ifeq ($(TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW),true) + KERNEL_CFLAGS += CONFIG_TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW=y +endif + include $(CLEAR_VARS) ifneq ($(BOARD_USES_DOUBLE_TAP),) LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko diff --git a/drivers/input/touchscreen/nova_0flash_mmi/Kbuild b/drivers/input/touchscreen/nova_0flash_mmi/Kbuild index 3fb6e9f049a8..408d244e20c8 100644 --- a/drivers/input/touchscreen/nova_0flash_mmi/Kbuild +++ b/drivers/input/touchscreen/nova_0flash_mmi/Kbuild @@ -62,5 +62,9 @@ ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),) KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI nova_0flash_mmi-objs += nt36xxx_mmi_class.o + + ifneq ($(filter m y, $(CONFIG_TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW)),) + EXTRA_CFLAGS += -DTS_MMI_TOUCH_MULTIWAY_UPDATE_FW + endif endif KBUILD_EXTRA_SYMBOLS += $(CURDIR)/../../kernel/msm-$(MODULE_KERNEL_VERSION)/Module.symvers diff --git a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx.h b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx.h index 43d4ad24e68c..6b24acb4b119 100644 --- a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx.h +++ b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx.h @@ -264,6 +264,9 @@ struct nvt_ts_data { #if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) struct ts_mmi_class_methods *imports; #endif +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + int flash_mode; +#endif }; #if NVT_TOUCH_PROC diff --git a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_fw_update.c b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_fw_update.c index 7c5bf314bcda..5983c40a7d6b 100644 --- a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_fw_update.c +++ b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_fw_update.c @@ -20,6 +20,7 @@ #include #include "nt36xxx.h" +#include #if BOOT_UPDATE_FIRMWARE @@ -285,6 +286,13 @@ return: static void update_firmware_release(void) { if (fw_entry) { +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + if (ts->flash_mode == FW_PARAM_MODE) { + vfree(fw_entry->data); + fw_entry = NULL; + return; + } +#endif release_firmware(fw_entry); } @@ -302,6 +310,15 @@ static int32_t update_firmware_request(char *filename) { uint8_t retry = 0; int32_t ret = 0; +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + char path[TS_MMI_MAX_FULL_FW_PATH] = { 0 }; + void *data = NULL; + struct firmware *fw_tmp; + struct file *filp = NULL; + struct inode *inode; + loff_t pos = 0; + loff_t file_len = 0; +#endif if (NULL == filename) { return -ENOENT; @@ -310,10 +327,53 @@ static int32_t update_firmware_request(char *filename) while (1) { NVT_LOG("filename is %s\n", filename); - ret = request_firmware(&fw_entry, filename, &ts->client->dev); - if (ret) { - NVT_ERR("firmware load failed, ret=%d\n", ret); - goto request_fail; +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + if (ts->flash_mode == FW_PARAM_MODE) { + NVT_LOG("Read FW data from param path: %s\n", filename); + snprintf(path, TS_MMI_MAX_FULL_FW_PATH, "%s%s", TS_MMI_FW_PARAM_PATH, filename); + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + NVT_ERR("Open %s file fail!\n", path); + return -ENOENT; + } + + fw_tmp = vzalloc(sizeof(struct firmware)); + if (!fw_tmp) { + NVT_ERR("Failed to malloc (struct) firmware!\n"); + return -ENOMEM; + } + + inode = filp->f_inode; + file_len = inode->i_size; + data = (u8 *)vzalloc(file_len); + if (NULL == data) { + NVT_ERR("Failed to malloc param firmware memory!\n"); + filp_close(filp, NULL); + return -ENOMEM; + } + + ret = kernel_read(filp, data, file_len, &pos); + if (ret < 0) { + NVT_ERR("Failed to read param firmware data, ret = %d\n", ret); + filp_close(filp, NULL); + vfree(data); + vfree(fw_tmp); + fw_entry = NULL; + return -EIO; + } + fw_tmp->data = data; + fw_tmp->size = file_len; + NVT_ERR("fw file len:%d pos:%d!\n", (u32)file_len, (u32)pos); + filp_close(filp, NULL); + fw_entry = fw_tmp; + } else +#endif + { + ret = request_firmware(&fw_entry, filename, &ts->client->dev); + if (ret) { + NVT_ERR("firmware load failed, ret=%d\n", ret); + goto request_fail; + } } // check FW need to write size diff --git a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_mmi_class.c b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_mmi_class.c index d165f3fa5025..b82e7de6721f 100644 --- a/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_mmi_class.c +++ b/drivers/input/touchscreen/nova_0flash_mmi/nt36xxx_mmi_class.c @@ -124,6 +124,28 @@ static int nvt_mmi_methods_get_flashprog(struct device *dev, void *idata) return 0; } +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW +static int nvt_mmi_get_flash_mode(struct device *dev, void *idata) +{ + struct nvt_ts_data *ts_data; + + GET_TS_DATA(dev); + TO_INT(idata) = ts_data->flash_mode; + + return 0; +} + +static int nvt_mmi_flash_mode(struct device *dev, int mode) +{ + struct nvt_ts_data *ts_data; + + GET_TS_DATA(dev); + ts_data->flash_mode = mode; + + return 0; +} +#endif + static int nvt_mmi_methods_drv_irq(struct device *dev, int state) { int ret = 0; @@ -168,8 +190,10 @@ static int nvt_mmi_firmware_update(struct device *dev, char *fwname) GET_TS_DATA(dev); mutex_lock(&ts->lock); - snprintf(nvt_boot_firmware_name, NVT_FILE_NAME_LENGTH, "%s", fwname); - snprintf(nvt_mp_firmware_name, NVT_FILE_NAME_LENGTH, "mp-%s", fwname); + if (strncmp(fwname, "Default", sizeof("Default"))) { + snprintf(nvt_boot_firmware_name, NVT_FILE_NAME_LENGTH, "%s", fwname); + snprintf(nvt_mp_firmware_name, NVT_FILE_NAME_LENGTH, "mp-%s", fwname); + } nvt_update_firmware(nvt_boot_firmware_name); mutex_unlock(&ts->lock); @@ -251,18 +275,22 @@ return: static int nvt_mmi_pre_resume(struct device *dev) { struct nvt_ts_data *ts_data; - int ret = 0; GET_TS_DATA(dev); NVT_LOG("enter\n"); - mutex_lock(&ts->lock); - ret = nvt_update_firmware(nvt_boot_firmware_name); - if (ret) { - NVT_ERR("download firmware failed, ignore check fw state\n"); - } else { - nvt_check_fw_reset_state(RESET_STATE_REK); +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + if (ts_data->flash_mode == FW_PARAM_MODE) + { + NVT_LOG("update firmware through touchUpg service\n"); + return 0; } +#endif + + mutex_lock(&ts->lock); + NVT_LOG("update firmware: %s\n", nvt_boot_firmware_name); + nvt_update_firmware(nvt_boot_firmware_name); + mutex_unlock(&ts->lock); return 0; @@ -295,12 +323,18 @@ static struct ts_mmi_methods nvt_mmi_methods = { .get_irq_status = nvt_mmi_methods_get_irq_status, .get_drv_irq = nvt_mmi_methods_get_drv_irq, .get_flashprog = nvt_mmi_methods_get_flashprog, +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + .get_flash_mode = nvt_mmi_get_flash_mode, +#endif .get_poweron = nvt_mmi_methods_get_poweron, /* SET methods */ .reset = nvt_mmi_methods_reset, .drv_irq = nvt_mmi_methods_drv_irq, .charger_mode = nvt_mmi_charger_mode, /* Firmware */ +#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW + .flash_mode = nvt_mmi_flash_mode, +#endif .firmware_update = nvt_mmi_firmware_update, /* PM callback */ .panel_state = nvt_mmi_panel_state,