Merge "input: touchscreen: Add firmware upgrade via sysfs entry"

This commit is contained in:
Linux Build Service Account
2014-01-25 16:27:17 -08:00
committed by Gerrit - the friendly Code Review server
2 changed files with 67 additions and 13 deletions
+65 -10
View File
@@ -1530,12 +1530,62 @@ 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 long val;
int ret;
if (size > 2)
return -EINVAL;
ret = kstrtoul(buf, 10, &val);
if (ret != 0)
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 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 struct attribute *gtp_attrs[] = {
&dev_attr_fw_name.attr,
&dev_attr_fw_upgrade.attr,
NULL
};
@@ -1871,9 +1921,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");
@@ -1927,15 +1975,14 @@ static int goodix_ts_probe(struct i2c_client *client,
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");
@@ -2132,6 +2179,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
+2 -3
View File
@@ -93,6 +93,7 @@ struct goodix_ts_data {
u8 fw_error;
bool power_on;
struct mutex lock;
bool fw_loading;
struct regulator *avdd;
struct regulator *vdd;
struct regulator *vcc_i2c;
@@ -218,11 +219,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_ */