Merge "input: touchscreen: Add force fw_update support via sysfs entry"
This commit is contained in:
commit
c33b570e39
4 changed files with 132 additions and 23 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
ret = gup_init_update_proc(ts);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev,
|
||||
"GTP Create firmware update thread error.\n");
|
||||
goto exit_power_off;
|
||||
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");
|
||||
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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
@ -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;
|
||||
|
@ -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_ */
|
||||
|
|
|
@ -1408,10 +1408,15 @@ s32 gup_update_proc(void *dir)
|
|||
goto file_fail;
|
||||
}
|
||||
|
||||
ret = gup_enter_update_judge(ts->client, &fw_head);
|
||||
if (ret == FAIL) {
|
||||
pr_err("Check *.bin file fail");
|
||||
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) {
|
||||
dev_err(&ts->client->dev,
|
||||
"Check *.bin file fail.");
|
||||
goto file_fail;
|
||||
}
|
||||
}
|
||||
|
||||
ts->enter_update = 1;
|
||||
|
|
Loading…
Add table
Reference in a new issue