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

Commit aef0000e authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "input: touchscreen: add sysfs for touch-to-wake feature"

parents 8c8d49df 3244343a
Loading
Loading
Loading
Loading
+90 −5
Original line number Diff line number Diff line
@@ -180,17 +180,17 @@ struct it7260_ts_data {
	const struct it7260_ts_platform_data *pdata;
	struct regulator *vdd;
	struct regulator *avdd;
	struct work_struct work_pm_relax;
	struct mutex fw_cfg_mutex;
	bool in_low_power_mode;
	bool suspended;
	bool fw_upgrade_result;
	bool cfg_upgrade_result;
	bool fw_cfg_uploading;
	struct work_struct work_pm_relax;
	bool calibration_success;
	bool had_finger_down;
	char fw_name[MAX_BUFFER_SIZE];
	char cfg_name[MAX_BUFFER_SIZE];
	struct mutex fw_cfg_mutex;
	u8 fw_ver[VER_BUFFER_SIZE];
	u8 cfg_ver[VER_BUFFER_SIZE];
#ifdef CONFIG_FB
@@ -1147,6 +1147,40 @@ static ssize_t sysfs_fw_name_show(struct device *dev,
			"No firmware file name given\n");
}

static ssize_t sysfs_enable_wakeup_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct it7260_ts_data *ts_data = dev_get_drvdata(dev);
	int mode = 0, ret;

	if (ts_data->suspended) {
		dev_err(dev, "Device is suspended, can't flash fw!!!\n");
		return -EBUSY;
	}

	ret = kstrtoint(buf, 10, &mode);
	if (ret) {
		dev_err(dev, "failed to read input for sysfs\n");
		return -EINVAL;
	}

	if (mode == 1)
		device_init_wakeup(dev, true);
	else if (mode == 0)
		device_init_wakeup(dev, false);
	else
		dev_err(dev, "Wrong input, try again\n");

	return count;
}

static ssize_t sysfs_enable_wakeup_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	return scnprintf(buf, MAX_BUFFER_SIZE, "%s\n",
			device_may_wakeup(dev) ? "true" : "false");
}

static DEVICE_ATTR(version, S_IRUGO | S_IWUSR,
			sysfs_version_show, NULL);
static DEVICE_ATTR(sleep, S_IRUGO | S_IWUSR,
@@ -1169,6 +1203,9 @@ static DEVICE_ATTR(force_fw_update, S_IRUGO | S_IWUSR,
static DEVICE_ATTR(force_cfg_update, S_IRUGO | S_IWUSR,
			sysfs_force_cfg_upgrade_show,
			sysfs_force_cfg_upgrade_store);
static DEVICE_ATTR(enable_wakeup, S_IRUGO | S_IWUSR,
			sysfs_enable_wakeup_show,
			sysfs_enable_wakeup_store);

static struct attribute *it7260_attributes[] = {
	&dev_attr_version.attr,
@@ -1181,6 +1218,7 @@ static struct attribute *it7260_attributes[] = {
	&dev_attr_cfg_name.attr,
	&dev_attr_force_fw_update.attr,
	&dev_attr_force_cfg_update.attr,
	&dev_attr_enable_wakeup.attr,
	NULL
};

@@ -1242,7 +1280,8 @@ static irqreturn_t it7260_ts_threaded_handler(int irq, void *devid)
		 */
		if ((pt_data.flags & PD_FLAGS_DATA_TYPE_BITS) ==
				PD_FLAGS_IDLE_TO_ACTIVE &&
				pt_data.gesture_id == 0) {
				pt_data.gesture_id == 0 &&
				device_may_wakeup(&ts_data->client->dev)) {
			pm_stay_awake(&ts_data->client->dev);
			input_report_key(input_dev, KEY_WAKEUP, 1);
			input_sync(input_dev);
@@ -2125,6 +2164,15 @@ static int it7260_ts_resume(struct device *dev)
		return 0;
	}

	if (regulator_is_enabled(ts_data->vdd) &&
				regulator_is_enabled(ts_data->vdd)) {
		retval = it7260_power_on(ts_data, true);
		if (retval < 0) {
			dev_err(dev, "Cannot enable regulators, %d\n", retval);
			goto err_power_on;
		}
	}

	if (ts_data->ts_pinctrl) {
		retval = pinctrl_select_state(ts_data->ts_pinctrl,
				ts_data->pinctrl_state_active);
@@ -2133,6 +2181,13 @@ static int it7260_ts_resume(struct device *dev)
				retval);
			goto err_pinctrl_select_suspend;
		}
	} else {
		retval = it7260_gpio_configure(ts_data, true);
		if (retval < 0) {
			dev_err(dev, "Failed to configure gpios %d\n",
								retval);
			goto err_gpio_config;
		}
	}

	enable_irq(ts_data->client->irq);
@@ -2140,6 +2195,10 @@ static int it7260_ts_resume(struct device *dev)
	return 0;

err_pinctrl_select_suspend:
err_gpio_config:
	if (it7260_power_on(ts_data, false))
		dev_err(dev, "Cannot disable regulators, %d\n", retval);
err_power_on:
	return retval;
}

@@ -2186,17 +2245,43 @@ static int it7260_ts_suspend(struct device *dev)
		retval = pinctrl_select_state(ts_data->ts_pinctrl,
				ts_data->pinctrl_state_suspend);
		if (retval < 0) {
			dev_err(dev, "Cannot get idle pinctrl state %d\n",
			dev_err(dev, "Failed to get idle pinctrl state %d\n",
								retval);
			goto err_pinctrl_select_suspend;
		}
	} else {
		retval = it7260_gpio_configure(ts_data, false);
		if (retval < 0) {
			dev_err(dev, "Failed to configure gpios %d\n", retval);
			goto err_gpio_config;
		}
	}

	if (!regulator_is_enabled(ts_data->vdd) &&
				!regulator_is_enabled(ts_data->vdd)) {
		retval = it7260_power_on(ts_data, false);
		if (retval < 0) {
			dev_err(dev, "Failed to disable regulators, %d\n",
								retval);
			goto err_power_on;
		}
	}

	ts_data->suspended = true;

	return 0;

err_power_on:
	if (ts_data->ts_pinctrl) {
		if (pinctrl_select_state(ts_data->ts_pinctrl,
				ts_data->pinctrl_state_active))
			dev_err(dev, "Cannot get active pinctrl state\n");
	} else {
		if (it7260_gpio_configure(ts_data, true))
			dev_err(dev, "Failed to configure gpios\n");
	}
err_pinctrl_select_suspend:
err_gpio_config:
	return retval;
}