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

Commit 25bdea09 authored by Changmin Liu's avatar Changmin Liu
Browse files

input: synaptics_2.6: add pin control func for TMO project



Add pinctrl func to make sure S2333's irq and pwr pins could be
pulled up when probed and resumed. Furthermore, they should be
pulled down when suspended and removed.

CRs-Fixed: 1020158
Change-Id: If517747243a605eacd1f6ffd6d1f7c0d45d06c1b
Signed-off-by: default avatarChangmin Liu <changmil@codeaurora.org>
parent 50239ba4
Loading
Loading
Loading
Loading
+118 −0
Original line number Diff line number Diff line
@@ -3864,6 +3864,57 @@ exit:
}
EXPORT_SYMBOL(synaptics_rmi4_new_function);

static int synaptics_dsx_pinctrl_init(struct synaptics_rmi4_data *rmi4_data)
{
	int retval;

	/* Get pinctrl if target uses pinctrl */
	rmi4_data->ts_pinctrl = devm_pinctrl_get((rmi4_data->pdev->dev.parent));
	if (IS_ERR_OR_NULL(rmi4_data->ts_pinctrl)) {
		retval = PTR_ERR(rmi4_data->ts_pinctrl);
		dev_err(rmi4_data->pdev->dev.parent,
			"Target does not use pinctrl %d\n", retval);
		goto err_pinctrl_get;
	}

	rmi4_data->pinctrl_state_active
		= pinctrl_lookup_state(rmi4_data->ts_pinctrl, "pmx_ts_active");
	if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_active)) {
		retval = PTR_ERR(rmi4_data->pinctrl_state_active);
		dev_err(rmi4_data->pdev->dev.parent,
			"Can not lookup %s pinstate %d\n",
			PINCTRL_STATE_ACTIVE, retval);
		goto err_pinctrl_lookup;
	}

	rmi4_data->pinctrl_state_suspend
		= pinctrl_lookup_state(rmi4_data->ts_pinctrl, "pmx_ts_suspend");
	if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_suspend)) {
		retval = PTR_ERR(rmi4_data->pinctrl_state_suspend);
		dev_dbg(rmi4_data->pdev->dev.parent,
			"Can not lookup %s pinstate %d\n",
			PINCTRL_STATE_SUSPEND, retval);
		goto err_pinctrl_lookup;
	}

	rmi4_data->pinctrl_state_release
		= pinctrl_lookup_state(rmi4_data->ts_pinctrl, "pmx_ts_release");
	if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_release)) {
		retval = PTR_ERR(rmi4_data->pinctrl_state_release);
		dev_dbg(rmi4_data->pdev->dev.parent,
			"Can not lookup %s pinstate %d\n",
			PINCTRL_STATE_RELEASE, retval);
	}

	return 0;

err_pinctrl_lookup:
	devm_pinctrl_put(rmi4_data->ts_pinctrl);
err_pinctrl_get:
	rmi4_data->ts_pinctrl = NULL;
	return retval;
}

static int synaptics_rmi4_probe(struct platform_device *pdev)
{
	int retval;
@@ -3933,6 +3984,21 @@ static int synaptics_rmi4_probe(struct platform_device *pdev)
		goto err_enable_reg;
	}

	retval = synaptics_dsx_pinctrl_init(rmi4_data);
	if (!retval && rmi4_data->ts_pinctrl) {
		/*
		* Pinctrl handle is optional. If pinctrl handle is found
		* let pins to be configured in active state. If not
		* found continue further without error.
		*/
		retval = pinctrl_select_state(rmi4_data->ts_pinctrl,
		rmi4_data->pinctrl_state_active);
		if (retval < 0) {
			dev_err(&pdev->dev,
				"%s: Failed to select %s pinstate %d\n",
				__func__, PINCTRL_STATE_ACTIVE, retval);
		}
	}
	retval = synaptics_rmi4_set_gpio(rmi4_data);
	if (retval < 0) {
		dev_err(&pdev->dev,
@@ -4118,6 +4184,21 @@ err_ui_hw_init:
err_set_gpio:
	synaptics_rmi4_enable_reg(rmi4_data, false);

	if (rmi4_data->ts_pinctrl) {
		if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_release)) {
			devm_pinctrl_put(rmi4_data->ts_pinctrl);
			rmi4_data->ts_pinctrl = NULL;
		} else {
			retval = pinctrl_select_state(
			rmi4_data->ts_pinctrl,
			rmi4_data->pinctrl_state_release);
			if (retval)
				dev_err(&pdev->dev,
					"%s: Failed to create sysfs attributes\n",
					__func__);
		}
	}

err_enable_reg:
	synaptics_rmi4_get_reg(rmi4_data, false);

@@ -4130,6 +4211,7 @@ err_get_reg:
static int synaptics_rmi4_remove(struct platform_device *pdev)
{
	unsigned char attr_count;
	int err;
	struct synaptics_rmi4_data *rmi4_data = platform_get_drvdata(pdev);
	const struct synaptics_dsx_board_data *bdata =
			rmi4_data->hw_if->board_data;
@@ -4185,6 +4267,22 @@ static int synaptics_rmi4_remove(struct platform_device *pdev)
	if (bdata->power_gpio >= 0)
		synaptics_rmi4_gpio_setup(bdata->power_gpio, false, 0, 0);


	if (rmi4_data->ts_pinctrl) {
		if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_release)) {
			devm_pinctrl_put(rmi4_data->ts_pinctrl);
			rmi4_data->ts_pinctrl = NULL;
		} else {
			err = pinctrl_select_state(
			rmi4_data->ts_pinctrl,
			rmi4_data->pinctrl_state_release);
			if (err)
				dev_err(&pdev->dev,
					"Failed to select release pinctrl state %d\n",
					err);
		}
	}

	synaptics_rmi4_enable_reg(rmi4_data, false);
	synaptics_rmi4_get_reg(rmi4_data, false);

@@ -4457,6 +4555,7 @@ static int synaptics_rmi4_suspend(struct device *dev)
{
	struct synaptics_rmi4_exp_fhandler *exp_fhandler;
	struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
	int retval;

	if (rmi4_data->stay_awake)
		return 0;
@@ -4475,6 +4574,13 @@ static int synaptics_rmi4_suspend(struct device *dev)
		synaptics_rmi4_free_fingers(rmi4_data);
	}

	if (rmi4_data->ts_pinctrl) {
		retval = pinctrl_select_state(rmi4_data->ts_pinctrl,
		rmi4_data->pinctrl_state_suspend);
		if (retval < 0)
			dev_err(dev, "Cannot get idle pinctrl state\n");
			goto err_pinctrl;
	}
exit:
	mutex_lock(&exp_data.mutex);
	if (!list_empty(&exp_data.list)) {
@@ -4491,6 +4597,12 @@ exit:
	rmi4_data->suspend = true;

	return 0;

err_pinctrl:
	synaptics_rmi4_sleep_enable(rmi4_data, false);
	synaptics_rmi4_irq_enable(rmi4_data, true, false);
	return retval;

}

static int synaptics_rmi4_resume(struct device *dev)
@@ -4521,6 +4633,12 @@ static int synaptics_rmi4_resume(struct device *dev)

	synaptics_rmi4_sleep_enable(rmi4_data, false);
	synaptics_rmi4_irq_enable(rmi4_data, true, false);
	if (rmi4_data->ts_pinctrl) {
		retval = pinctrl_select_state(rmi4_data->ts_pinctrl,
		rmi4_data->pinctrl_state_active);
		if (retval < 0)
			dev_err(dev, "Cannot get default pinctrl state\n");
	}

exit:
#ifdef FB_READY_RESET
+7 −0
Original line number Diff line number Diff line
@@ -122,6 +122,9 @@
#define MASK_2BIT 0x03
#define MASK_1BIT 0x01

#define PINCTRL_STATE_ACTIVE    "pmx_ts_active"
#define PINCTRL_STATE_SUSPEND   "pmx_ts_suspend"
#define PINCTRL_STATE_RELEASE   "pmx_ts_release"
enum exp_fn {
	RMI_DEV = 0,
	RMI_FW_UPDATER,
@@ -382,6 +385,10 @@ struct synaptics_rmi4_data {
			bool enable);
	void (*report_touch)(struct synaptics_rmi4_data *rmi4_data,
			struct synaptics_rmi4_fn *fhandler);
	struct pinctrl *ts_pinctrl;
	struct pinctrl_state *pinctrl_state_active;
	struct pinctrl_state *pinctrl_state_suspend;
	struct pinctrl_state *pinctrl_state_release;
#if defined(CONFIG_SECURE_TOUCH_SYNAPTICS_DSX_V26)
	atomic_t st_enabled;
	atomic_t st_pending_irqs;