Loading Documentation/devicetree/bindings/input/touchscreen/gt9xx/gt9xx.txt +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ Optional properties: It is a four tuple consisting of min x, min y, max x and max y values. - goodix,i2c-pull-up : To specify pull up is required. - goodix,no-force-update : To specify force update is allowed. - goodix,force-update : To specify force update is allowed. - goodix,enable-power-off : Power off touchscreen during suspend. - goodix,button-map : Button map of key codes. The number of key codes depend on panel. Loading drivers/input/touchscreen/gt9xx/gt9xx.c +118 −14 Original line number Diff line number Diff line Loading @@ -1523,12 +1523,108 @@ static ssize_t gtp_fw_name_store(struct device *dev, return size; } static ssize_t gtp_fw_upgrade_show(struct device *dev, struct device_attribute *attr, char *buf) { struct goodix_ts_data *ts = dev_get_drvdata(dev); return snprintf(buf, 2, "%d\n", ts->fw_loading); } static ssize_t gtp_fw_upgrade_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct goodix_ts_data *ts = dev_get_drvdata(dev); unsigned int val; int ret; if (size > 2) return -EINVAL; ret = kstrtouint(buf, 10, &val); if (ret) return ret; if (ts->gtp_is_suspend) { dev_err(&ts->client->dev, "Can't start fw upgrade. Device is in suspend state"); return -EBUSY; } mutex_lock(&ts->input_dev->mutex); if (!ts->fw_loading && val) { disable_irq(ts->client->irq); ts->fw_loading = true; if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_update_proc(NULL); if (ret == FAIL) dev_err(&ts->client->dev, "Fail to update GTP firmware\n"); } ts->fw_loading = false; enable_irq(ts->client->irq); } mutex_unlock(&ts->input_dev->mutex); return size; } static ssize_t gtp_force_fw_upgrade_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct goodix_ts_data *ts = dev_get_drvdata(dev); unsigned int val; int ret; if (size > 2) return -EINVAL; ret = kstrtouint(buf, 10, &val); if (ret) return ret; if (ts->gtp_is_suspend) { dev_err(&ts->client->dev, "Can't start fw upgrade. Device is in suspend state."); return -EBUSY; } mutex_lock(&ts->input_dev->mutex); if (!ts->fw_loading && val) { disable_irq(ts->client->irq); ts->fw_loading = true; ts->force_update = true; if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_update_proc(NULL); if (ret == FAIL) dev_err(&ts->client->dev, "Fail to force update GTP firmware.\n"); } ts->force_update = false; ts->fw_loading = false; enable_irq(ts->client->irq); } mutex_unlock(&ts->input_dev->mutex); return size; } static DEVICE_ATTR(fw_name, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_name_show, gtp_fw_name_store); static DEVICE_ATTR(fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_upgrade_show, gtp_fw_upgrade_store); static DEVICE_ATTR(force_fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_upgrade_show, gtp_force_fw_upgrade_store); static struct attribute *gtp_attrs[] = { &dev_attr_fw_name.attr, &dev_attr_fw_upgrade.attr, &dev_attr_force_fw_upgrade.attr, NULL }; Loading Loading @@ -1745,8 +1841,8 @@ static int goodix_parse_dt(struct device *dev, pdata->i2c_pull_up = of_property_read_bool(np, "goodix,i2c-pull-up"); pdata->no_force_update = of_property_read_bool(np, "goodix,no-force-update"); pdata->force_update = of_property_read_bool(np, "goodix,force-update"); pdata->enable_power_off = of_property_read_bool(np, "goodix,enable-power-off"); Loading Loading @@ -1861,9 +1957,7 @@ static int goodix_ts_probe(struct i2c_client *client, return -EINVAL; } #if GTP_ESD_PROTECT i2c_connect_client = client; #endif if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "GTP I2C not supported\n"); Loading Loading @@ -1911,22 +2005,24 @@ static int goodix_ts_probe(struct i2c_client *client, goto exit_power_off; } if (pdata->force_update) ts->force_update = true; if (pdata->fw_name) strlcpy(ts->fw_name, pdata->fw_name, strlen(pdata->fw_name) + 1); #ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_init_update_proc(ts); if (ret < 0) { dev_err(&client->dev, "GTP Create firmware update thread error.\n"); "GTP Create firmware update thread error\n"); goto exit_power_off; } #endif } ret = gtp_init_panel(ts); if (ret < 0) { dev_err(&client->dev, "GTP init panel failed.\n"); dev_err(&client->dev, "GTP init panel failed\n"); ts->abs_x_max = GTP_MAX_WIDTH; ts->abs_y_max = GTP_MAX_HEIGHT; ts->int_trigger_type = GTP_INT_TRIGGER; Loading @@ -1934,7 +2030,7 @@ static int goodix_ts_probe(struct i2c_client *client, ret = gtp_request_input_dev(ts); if (ret) { dev_err(&client->dev, "GTP request input dev failed.\n"); dev_err(&client->dev, "GTP request input dev failed\n"); goto exit_free_inputdev; } input_set_drvdata(ts->input_dev, ts); Loading Loading @@ -2117,6 +2213,14 @@ static int goodix_ts_suspend(struct device *dev) } mutex_lock(&ts->lock); if (ts->fw_loading) { dev_info(&ts->client->dev, "Fw upgrade in progress, can't go to suspend."); mutex_unlock(&ts->lock); return 0; } #if GTP_ESD_PROTECT gtp_esd_switch(ts->client, SWITCH_OFF); #endif Loading drivers/input/touchscreen/gt9xx/gt9xx.h +4 −4 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ struct goodix_ts_platform_data { u32 panel_miny; u32 panel_maxx; u32 panel_maxy; bool no_force_update; bool force_update; bool i2c_pull_up; bool enable_power_off; size_t config_data_len[GOODIX_MAX_CFG_GROUP]; Loading Loading @@ -89,6 +89,8 @@ struct goodix_ts_data { u8 fw_error; bool power_on; struct mutex lock; bool fw_loading; bool force_update; struct regulator *avdd; struct regulator *vdd; struct regulator *vcc_i2c; Loading Loading @@ -213,11 +215,9 @@ s32 init_wr_node(struct i2c_client *client); void uninit_wr_node(void); #endif #ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE extern u8 gup_init_update_proc(struct goodix_ts_data *ts); u8 gup_init_update_proc(struct goodix_ts_data *ts); s32 gup_enter_update_mode(struct i2c_client *client); void gup_leave_update_mode(struct i2c_client *client); s32 gup_update_proc(void *dir); extern struct i2c_client *i2c_connect_client; #endif #endif /* _GOODIX_GT9XX_H_ */ drivers/input/touchscreen/gt9xx/gt9xx_update.c +9 −4 Original line number Diff line number Diff line Loading @@ -1408,11 +1408,16 @@ s32 gup_update_proc(void *dir) goto file_fail; } if (ts->force_update) { dev_dbg(&ts->client->dev, "Enter force update."); } else { ret = gup_enter_update_judge(ts->client, &fw_head); if (ret == FAIL) { pr_err("Check *.bin file fail"); dev_err(&ts->client->dev, "Check *.bin file fail."); goto file_fail; } } ts->enter_update = 1; gtp_irq_disable(ts); Loading Loading
Documentation/devicetree/bindings/input/touchscreen/gt9xx/gt9xx.txt +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ Optional properties: It is a four tuple consisting of min x, min y, max x and max y values. - goodix,i2c-pull-up : To specify pull up is required. - goodix,no-force-update : To specify force update is allowed. - goodix,force-update : To specify force update is allowed. - goodix,enable-power-off : Power off touchscreen during suspend. - goodix,button-map : Button map of key codes. The number of key codes depend on panel. Loading
drivers/input/touchscreen/gt9xx/gt9xx.c +118 −14 Original line number Diff line number Diff line Loading @@ -1523,12 +1523,108 @@ static ssize_t gtp_fw_name_store(struct device *dev, return size; } static ssize_t gtp_fw_upgrade_show(struct device *dev, struct device_attribute *attr, char *buf) { struct goodix_ts_data *ts = dev_get_drvdata(dev); return snprintf(buf, 2, "%d\n", ts->fw_loading); } static ssize_t gtp_fw_upgrade_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct goodix_ts_data *ts = dev_get_drvdata(dev); unsigned int val; int ret; if (size > 2) return -EINVAL; ret = kstrtouint(buf, 10, &val); if (ret) return ret; if (ts->gtp_is_suspend) { dev_err(&ts->client->dev, "Can't start fw upgrade. Device is in suspend state"); return -EBUSY; } mutex_lock(&ts->input_dev->mutex); if (!ts->fw_loading && val) { disable_irq(ts->client->irq); ts->fw_loading = true; if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_update_proc(NULL); if (ret == FAIL) dev_err(&ts->client->dev, "Fail to update GTP firmware\n"); } ts->fw_loading = false; enable_irq(ts->client->irq); } mutex_unlock(&ts->input_dev->mutex); return size; } static ssize_t gtp_force_fw_upgrade_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct goodix_ts_data *ts = dev_get_drvdata(dev); unsigned int val; int ret; if (size > 2) return -EINVAL; ret = kstrtouint(buf, 10, &val); if (ret) return ret; if (ts->gtp_is_suspend) { dev_err(&ts->client->dev, "Can't start fw upgrade. Device is in suspend state."); return -EBUSY; } mutex_lock(&ts->input_dev->mutex); if (!ts->fw_loading && val) { disable_irq(ts->client->irq); ts->fw_loading = true; ts->force_update = true; if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_update_proc(NULL); if (ret == FAIL) dev_err(&ts->client->dev, "Fail to force update GTP firmware.\n"); } ts->force_update = false; ts->fw_loading = false; enable_irq(ts->client->irq); } mutex_unlock(&ts->input_dev->mutex); return size; } static DEVICE_ATTR(fw_name, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_name_show, gtp_fw_name_store); static DEVICE_ATTR(fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_upgrade_show, gtp_fw_upgrade_store); static DEVICE_ATTR(force_fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP), gtp_fw_upgrade_show, gtp_force_fw_upgrade_store); static struct attribute *gtp_attrs[] = { &dev_attr_fw_name.attr, &dev_attr_fw_upgrade.attr, &dev_attr_force_fw_upgrade.attr, NULL }; Loading Loading @@ -1745,8 +1841,8 @@ static int goodix_parse_dt(struct device *dev, pdata->i2c_pull_up = of_property_read_bool(np, "goodix,i2c-pull-up"); pdata->no_force_update = of_property_read_bool(np, "goodix,no-force-update"); pdata->force_update = of_property_read_bool(np, "goodix,force-update"); pdata->enable_power_off = of_property_read_bool(np, "goodix,enable-power-off"); Loading Loading @@ -1861,9 +1957,7 @@ static int goodix_ts_probe(struct i2c_client *client, return -EINVAL; } #if GTP_ESD_PROTECT i2c_connect_client = client; #endif if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "GTP I2C not supported\n"); Loading Loading @@ -1911,22 +2005,24 @@ static int goodix_ts_probe(struct i2c_client *client, goto exit_power_off; } if (pdata->force_update) ts->force_update = true; if (pdata->fw_name) strlcpy(ts->fw_name, pdata->fw_name, strlen(pdata->fw_name) + 1); #ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) { ret = gup_init_update_proc(ts); if (ret < 0) { dev_err(&client->dev, "GTP Create firmware update thread error.\n"); "GTP Create firmware update thread error\n"); goto exit_power_off; } #endif } ret = gtp_init_panel(ts); if (ret < 0) { dev_err(&client->dev, "GTP init panel failed.\n"); dev_err(&client->dev, "GTP init panel failed\n"); ts->abs_x_max = GTP_MAX_WIDTH; ts->abs_y_max = GTP_MAX_HEIGHT; ts->int_trigger_type = GTP_INT_TRIGGER; Loading @@ -1934,7 +2030,7 @@ static int goodix_ts_probe(struct i2c_client *client, ret = gtp_request_input_dev(ts); if (ret) { dev_err(&client->dev, "GTP request input dev failed.\n"); dev_err(&client->dev, "GTP request input dev failed\n"); goto exit_free_inputdev; } input_set_drvdata(ts->input_dev, ts); Loading Loading @@ -2117,6 +2213,14 @@ static int goodix_ts_suspend(struct device *dev) } mutex_lock(&ts->lock); if (ts->fw_loading) { dev_info(&ts->client->dev, "Fw upgrade in progress, can't go to suspend."); mutex_unlock(&ts->lock); return 0; } #if GTP_ESD_PROTECT gtp_esd_switch(ts->client, SWITCH_OFF); #endif Loading
drivers/input/touchscreen/gt9xx/gt9xx.h +4 −4 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ struct goodix_ts_platform_data { u32 panel_miny; u32 panel_maxx; u32 panel_maxy; bool no_force_update; bool force_update; bool i2c_pull_up; bool enable_power_off; size_t config_data_len[GOODIX_MAX_CFG_GROUP]; Loading Loading @@ -89,6 +89,8 @@ struct goodix_ts_data { u8 fw_error; bool power_on; struct mutex lock; bool fw_loading; bool force_update; struct regulator *avdd; struct regulator *vdd; struct regulator *vcc_i2c; Loading Loading @@ -213,11 +215,9 @@ s32 init_wr_node(struct i2c_client *client); void uninit_wr_node(void); #endif #ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE extern u8 gup_init_update_proc(struct goodix_ts_data *ts); u8 gup_init_update_proc(struct goodix_ts_data *ts); s32 gup_enter_update_mode(struct i2c_client *client); void gup_leave_update_mode(struct i2c_client *client); s32 gup_update_proc(void *dir); extern struct i2c_client *i2c_connect_client; #endif #endif /* _GOODIX_GT9XX_H_ */
drivers/input/touchscreen/gt9xx/gt9xx_update.c +9 −4 Original line number Diff line number Diff line Loading @@ -1408,11 +1408,16 @@ s32 gup_update_proc(void *dir) goto file_fail; } if (ts->force_update) { dev_dbg(&ts->client->dev, "Enter force update."); } else { ret = gup_enter_update_judge(ts->client, &fw_head); if (ret == FAIL) { pr_err("Check *.bin file fail"); dev_err(&ts->client->dev, "Check *.bin file fail."); goto file_fail; } } ts->enter_update = 1; gtp_irq_disable(ts); Loading