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

Unverified Commit eb3661dc authored by yushixian's avatar yushixian Committed by Michael Bestas
Browse files

[ALM:11037226] [FP4]:add pinctrl to reduce TP standby consumption

 &&&%%%comment:[FP4]:add pinctrl to reduce TP standby consumption
 &&&%%%bug number:11037226
 &&&%%%product name:sm7225_r_fp4
 &&&%%%root cause:Specification
 &&&%%%Bug category:T2M
 &&&%%%Module_Impact:kernel
 &&&%%%Test_Suggestion:no
 &&&%%%Solution:add FP4 dts
 &&&%%%Test_Report:test is ok
 &&&%%%VAL Can Test:NO

Change-Id: I69eecf6107284b2e02c1281e191ba7501f088635
parent d28f79ab
Loading
Loading
Loading
Loading
+51 −2
Original line number Diff line number Diff line
@@ -2868,7 +2868,13 @@ int himax_chip_common_init(void)
		goto err_xfer_buff_fail;
	}


	/* Set pinctrl in active state */
	if (ts->ts_pinctrl) {
		ret = pinctrl_select_state(ts->ts_pinctrl,
		ts->pinctrl_state_active);
		if (ret < 0)
			E("Failed to set pin in active state %d", ret);
	}

#if defined(__EMBEDDED_FW__)
	g_embedded_fw.size = (size_t)_binary___Himax_firmware_bin_end -
@@ -3139,6 +3145,18 @@ int himax_chip_common_init(void)
	kfree(hx_touch_data);
	hx_touch_data = NULL;
err_alloc_touch_data_failed:
	if (ts->ts_pinctrl) {
		if (IS_ERR_OR_NULL(ts->pinctrl_state_release)) {
			devm_pinctrl_put(ts->ts_pinctrl);
			ts->ts_pinctrl = NULL;
		} else {
			err = pinctrl_select_state(ts->ts_pinctrl,
					ts->pinctrl_state_release);
			if (err)
				E("failed to select relase pinctrl state %d\n",
					err);
		}
	}
	kfree(ic_data);
	ic_data = NULL;
err_dt_ic_data_fail:
@@ -3212,6 +3230,19 @@ void himax_chip_common_deinit(void)
	if (himax_mcu_cmd_struct_free)
		himax_mcu_cmd_struct_free();

	if (ts->ts_pinctrl) {
		if (IS_ERR_OR_NULL(ts->pinctrl_state_release)) {
			devm_pinctrl_put(ts->ts_pinctrl);
			ts->ts_pinctrl = NULL;
		} else {
			ret = pinctrl_select_state(ts->ts_pinctrl,
					ts->pinctrl_state_release);
			if (ret)
				E("failed to select relase pinctrl state %d\n",
					ret);
		}
	}

	kfree(hx_touch_data);
	hx_touch_data = NULL;
	kfree(ic_data);
@@ -3231,6 +3262,8 @@ void himax_chip_common_deinit(void)

int himax_chip_common_suspend(struct himax_ts_data *ts)
{
	int ret;

	if (ts->suspended) {
		I("%s: Already suspended. Skipped.\n", __func__);
		goto END;
@@ -3285,6 +3318,13 @@ int himax_chip_common_suspend(struct himax_ts_data *ts)
	atomic_set(&ts->suspend_mode, 1);
	ts->pre_finger_mask = 0;

	if (ts->ts_pinctrl) {
		ret = pinctrl_select_state(ts->ts_pinctrl,
				ts->pinctrl_state_suspend);
		if (ret < 0)
			E("Failed to get idle pinctrl state %d\n", ret);
	}

	if (ts->pdata)
		if (ts->pdata->powerOff3V3 && ts->pdata->power)
			ts->pdata->power(0);
@@ -3303,6 +3343,8 @@ int himax_chip_common_resume(struct himax_ts_data *ts)
#if defined(HX_RESUME_SET_FW)
	int result = 0;
#endif
	int ret;

	I("%s: enter\n", __func__);

	if (ts->suspended == false) {
@@ -3316,7 +3358,14 @@ int himax_chip_common_resume(struct himax_ts_data *ts)
		/* continuous N times record, not total N times. */
		g_zero_event_count = 0;
#endif

	if (ts->ts_pinctrl) {
		ret = pinctrl_select_state(ts->ts_pinctrl,
				ts->pinctrl_state_active);
		if (ret < 0) {
			E("Cannot get default pinctrl state %d\n", ret);
			return ret;
		}
	}
	atomic_set(&ts->suspend_mode, 0);
	ts->diag_cmd = 0;

+5 −0
Original line number Diff line number Diff line
@@ -523,6 +523,11 @@ struct himax_ts_data {
	struct work_struct guest_info_work;
#endif

	/* pinctrl data */
	struct pinctrl *ts_pinctrl;
	struct pinctrl_state *pinctrl_state_active;
	struct pinctrl_state *pinctrl_state_suspend;
	struct pinctrl_state *pinctrl_state_release;

};

+55 −0
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@
#include "himax_platform.h"
#include "himax_common.h"

#define PINCTRL_STATE_ACTIVE	"pmx_ts_active"
#define PINCTRL_STATE_SUSPEND	"pmx_ts_suspend"
#define PINCTRL_STATE_RELEASE	"pmx_ts_release"

int i2c_error_count;
u8 *gp_rw_buf;

@@ -749,6 +753,53 @@ int himax_gpio_power_config(struct himax_i2c_platform_data *pdata)

#endif

int himax_ts_pinctrl_init(struct himax_ts_data *ts)
{
	int retval;
	/* Get pinctrl if target uses pinctrl */
	ts->ts_pinctrl = devm_pinctrl_get(ts->dev);
	if (IS_ERR_OR_NULL(ts->ts_pinctrl)) {
		retval = PTR_ERR(ts->ts_pinctrl);
		dev_dbg(&ts->client->dev, "Target does not use pinctrl %d\n",
		retval);
		goto err_pinctrl_get;
	}

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

	ts->pinctrl_state_suspend = pinctrl_lookup_state(ts->ts_pinctrl,
						PINCTRL_STATE_SUSPEND);
	if (IS_ERR_OR_NULL(ts->pinctrl_state_suspend)) {
		retval = PTR_ERR(ts->pinctrl_state_suspend);
		dev_err(ts->dev, "Can not lookup %s pinstate %d\n",
		PINCTRL_STATE_SUSPEND, retval);
		goto err_pinctrl_lookup;
	}

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

	return 0;

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

void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata)
{
	if (gpio_is_valid(pdata->gpio_irq))
@@ -1057,6 +1108,10 @@ int himax_chip_common_probe(struct i2c_client *client,
	mutex_init(&ts->rw_lock);
	private_ts = ts;

	ret = himax_ts_pinctrl_init(ts);
	if (ret || ts->ts_pinctrl == NULL)
		E(" Pinctrl init failed\n");

	ts->initialized = false;
	ret = himax_chip_common_init();
	if (ret < 0)
+1 −0
Original line number Diff line number Diff line
@@ -143,6 +143,7 @@ extern void himax_ts_work(struct himax_ts_data *ts);
extern enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer);
extern int himax_chip_common_init(void);
extern void himax_chip_common_deinit(void);
int himax_ts_pinctrl_init(struct himax_ts_data *ts);

#endif