Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8907f36 authored by Shantanu Jain's avatar Shantanu Jain Committed by Sudhakar Manapati
Browse files

input: touchscreen: Add force fw_update support via sysfs entry



Add sysfs entry for force fw_update support in Goodix
driver.
Change the usage of kstrtoul to sscanf in driver to avoid
portability issues.

This patch is propagated from msm-3.10.
(commit: 08cd82422df5c1c0473bfe00458869aaeb7aa072
input: touchscreen: Add force fw_update support via sysfs entry)
Also cleared checkpatch warnings on msm-3.18 kernel.

CRs-fixed: 579806
Change-Id: I147a3e465170dda7af415ade29c04257d9b11a6b
Signed-off-by: default avatarShantanu Jain <shjain@codeaurora.org>
parent 747a191f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,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.
+53 −5
Original line number Diff line number Diff line
@@ -1540,14 +1540,14 @@ static ssize_t gtp_fw_upgrade_store(struct device *dev,
				const char *buf, size_t size)
{
	struct goodix_ts_data *ts = dev_get_drvdata(dev);
	unsigned long val;
	unsigned int val;
	int ret;

	if (size > 2)
		return -EINVAL;

	ret = kstrtoul(buf, 10, &val);
	if (ret != 0)
	ret = kstrtouint(buf, 10, &val);
	if (ret)
		return ret;

	if (ts->gtp_is_suspend) {
@@ -1574,16 +1574,61 @@ static ssize_t gtp_fw_upgrade_store(struct device *dev,
	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
};

@@ -1800,8 +1845,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");
@@ -1964,6 +2009,9 @@ 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);
+2 −1
Original line number Diff line number Diff line
@@ -56,7 +56,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];
@@ -94,6 +94,7 @@ struct goodix_ts_data {
	bool power_on;
	struct mutex lock;
	bool fw_loading;
	bool force_update;
	struct regulator *avdd;
	struct regulator *vdd;
	struct regulator *vcc_i2c;
+9 −4
Original line number Diff line number Diff line
@@ -1427,11 +1427,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);