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 <zhuwg1@motorola.com>
Reviewed-on: https://gerrit.mot.com/2184720
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: litong <litong20@motorola.com>
Reviewed-by: Jichao Zou <zoujc@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
zhuwg1 2022-02-07 20:20:06 +08:00
commit 501e4a44f1
4 changed files with 71 additions and 1 deletions

View file

@ -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));

View file

@ -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;

View file

@ -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) {

View file

@ -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,