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

Commit 3aee47e1 authored by keith fallows's avatar keith fallows Committed by Sudhakar Manapati
Browse files

input: synaptics: Secure touch clocks



Because of a change in the underlying bus driver, the secure
touch layer in the input drivers is now required to control
directly the clocks which are needed during the touch sessions.
Clocks are turned on/off when the session is started/ended.

This patch is propagated from msm-3.10 kernel
(commit: 21e44aa786f45ba978d3b9660ce06dbf7812cf39
input: synaptics: Secure touch clocks)
Also cleaned checkpatch warnings on msm-3.18 kernel.

Change-Id: Ib123ea6f9f38d990e1ab6e6bdbb776faeb591c11
Acked-by: default avatarChristian Bolis <cbolis@qti.qualcomm.com>
Signed-off-by: default avatarKeith Fallows <keithf@codeaurora.org>
Signed-off-by: default avatarSudhakar Manapati <smanap@codeaurora.org>
parent 568463b2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -215,7 +215,7 @@ static int synaptics_rmi4_i2c_get(struct synaptics_rmi4_data *rmi4_data)

	mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
	retval = pm_runtime_get_sync(i2c->adapter->dev.parent);
	if (retval >= 0) {
	if (retval == 0) {
		retval = synaptics_rmi4_clk_prepare_enable(rmi4_data);
		if (retval)
			pm_runtime_put_sync(i2c->adapter->dev.parent);
+67 −5
Original line number Diff line number Diff line
@@ -469,10 +469,64 @@ static struct mutex exp_fn_list_mutex;
static struct list_head exp_fn_list;

#if defined(CONFIG_SECURE_TOUCH)
static int synaptics_secure_touch_clk_prepare_enable(
		struct synaptics_rmi4_data *rmi4_data)
{
	int ret;

	ret = clk_prepare_enable(rmi4_data->iface_clk);
	if (ret) {
		dev_err(&rmi4_data->i2c_client->dev,
			"error on clk_prepare_enable(iface_clk):%d\n", ret);
		return ret;
	}

	ret = clk_prepare_enable(rmi4_data->core_clk);
	if (ret) {
		clk_disable_unprepare(rmi4_data->iface_clk);
		dev_err(&rmi4_data->i2c_client->dev,
			"error clk_prepare_enable(core_clk):%d\n", ret);
	}
	return ret;
}

static void synaptics_secure_touch_clk_disable_unprepare(
		struct synaptics_rmi4_data *rmi4_data)
{
	clk_disable_unprepare(rmi4_data->core_clk);
	clk_disable_unprepare(rmi4_data->iface_clk);
}

static void synaptics_secure_touch_init(struct synaptics_rmi4_data *data)
{
	int ret = 0;

	data->st_initialized = 0;
	init_completion(&data->st_powerdown);
	init_completion(&data->st_irq_processed);
	/* Get clocks */
	data->core_clk = clk_get(&data->i2c_client->dev, "core_clk");
	if (IS_ERR(data->core_clk)) {
		ret = PTR_ERR(data->core_clk);
		dev_err(&data->i2c_client->dev,
			"%s: error on clk_get(core_clk):%d\n", __func__, ret);
		return;
	}

	data->iface_clk = clk_get(&data->i2c_client->dev, "iface_clk");
	if (IS_ERR(data->iface_clk)) {
		ret = PTR_ERR(data->iface_clk);
		dev_err(&data->i2c_client->dev,
			"%s: error on clk_get(iface_clk)\n", __func__);
		goto err_iface_clk;
	}

	data->st_initialized = 1;
	return;

err_iface_clk:
		clk_put(data->core_clk);
		data->core_clk = NULL;
}
static void synaptics_secure_touch_notify(struct synaptics_rmi4_data *data)
{
@@ -541,6 +595,7 @@ static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
				    const char *buf, size_t count)
{
	struct synaptics_rmi4_data *data = dev_get_drvdata(dev);
	struct device *adapter = data->i2c_client->adapter->dev.parent;
	unsigned long value;
	int err = 0;

@@ -551,6 +606,9 @@ static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
	if (err != 0)
		return err;

	if (!data->st_initialized)
		return -EIO;

	err = count;

	switch (value) {
@@ -558,7 +616,8 @@ static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
		if (atomic_read(&data->st_enabled) == 0)
			break;

		pm_runtime_put_sync(data->i2c_client->adapter->dev.parent);
		synaptics_secure_touch_clk_disable_unprepare(data);
		pm_runtime_put_sync(adapter);
		atomic_set(&data->st_enabled, 0);
		synaptics_secure_touch_notify(data);
		complete(&data->st_irq_processed);
@@ -573,11 +632,14 @@ static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
		}

		synchronize_irq(data->irq);
		if (pm_runtime_get_sync(adapter) < 0) {
			dev_err(&data->i2c_client->dev, "pm_runtime_get_sync failed\n");
			err = -EIO;
			break;
		}

		if (pm_runtime_get_sync(
			data->i2c_client->adapter->dev.parent) < 0) {
			dev_err(&data->i2c_client->dev,
				"pm_runtime_get failed\n");
		if (synaptics_secure_touch_clk_prepare_enable(data) < 0) {
			pm_runtime_put_sync(adapter);
			err = -EIO;
			break;
		}
+4 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#if defined(CONFIG_SECURE_TOUCH)
#include <linux/completion.h>
#include <linux/atomic.h>
#include <linux/clk.h>
#endif

#define PDT_PROPS (0x00EF)
@@ -280,8 +281,11 @@ struct synaptics_rmi4_data {
#if defined(CONFIG_SECURE_TOUCH)
	atomic_t st_enabled;
	atomic_t st_pending_irqs;
	bool st_initialized;
	struct completion st_powerdown;
	struct completion st_irq_processed;
	struct clk *core_clk;
	struct clk *iface_clk;
#endif
};