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

Commit 6b61d917 authored by yushixian's avatar yushixian Committed by Rohit Sekhar
Browse files

ts: hxchipset: Add pinctrl to reduce standby consumption

[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 88273e13
Loading
Loading
Loading
Loading
+51 −2
Original line number Original line Diff line number Diff line
@@ -2868,7 +2868,13 @@ int himax_chip_common_init(void)
		goto err_xfer_buff_fail;
		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__)
#if defined(__EMBEDDED_FW__)
	g_embedded_fw.size = (size_t)_binary___Himax_firmware_bin_end -
	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);
	kfree(hx_touch_data);
	hx_touch_data = NULL;
	hx_touch_data = NULL;
err_alloc_touch_data_failed:
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);
	kfree(ic_data);
	ic_data = NULL;
	ic_data = NULL;
err_dt_ic_data_fail:
err_dt_ic_data_fail:
@@ -3212,6 +3230,19 @@ void himax_chip_common_deinit(void)
	if (himax_mcu_cmd_struct_free)
	if (himax_mcu_cmd_struct_free)
		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);
	kfree(hx_touch_data);
	hx_touch_data = NULL;
	hx_touch_data = NULL;
	kfree(ic_data);
	kfree(ic_data);
@@ -3231,6 +3262,8 @@ void himax_chip_common_deinit(void)


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

	if (ts->suspended) {
	if (ts->suspended) {
		I("%s: Already suspended. Skipped.\n", __func__);
		I("%s: Already suspended. Skipped.\n", __func__);
		goto END;
		goto END;
@@ -3285,6 +3318,13 @@ int himax_chip_common_suspend(struct himax_ts_data *ts)
	atomic_set(&ts->suspend_mode, 1);
	atomic_set(&ts->suspend_mode, 1);
	ts->pre_finger_mask = 0;
	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)
		if (ts->pdata->powerOff3V3 && ts->pdata->power)
		if (ts->pdata->powerOff3V3 && ts->pdata->power)
			ts->pdata->power(0);
			ts->pdata->power(0);
@@ -3303,6 +3343,8 @@ int himax_chip_common_resume(struct himax_ts_data *ts)
#if defined(HX_RESUME_SET_FW)
#if defined(HX_RESUME_SET_FW)
	int result = 0;
	int result = 0;
#endif
#endif
	int ret;

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


	if (ts->suspended == false) {
	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. */
		/* continuous N times record, not total N times. */
		g_zero_event_count = 0;
		g_zero_event_count = 0;
#endif
#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);
	atomic_set(&ts->suspend_mode, 0);
	ts->diag_cmd = 0;
	ts->diag_cmd = 0;


+5 −0
Original line number Original line Diff line number Diff line
@@ -523,6 +523,11 @@ struct himax_ts_data {
	struct work_struct guest_info_work;
	struct work_struct guest_info_work;
#endif
#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 Original line Diff line number Diff line
@@ -16,6 +16,10 @@
#include "himax_platform.h"
#include "himax_platform.h"
#include "himax_common.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;
int i2c_error_count;
u8 *gp_rw_buf;
u8 *gp_rw_buf;


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


#endif
#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)
void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata)
{
{
	if (gpio_is_valid(pdata->gpio_irq))
	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);
	mutex_init(&ts->rw_lock);
	private_ts = ts;
	private_ts = ts;


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

	ts->initialized = false;
	ts->initialized = false;
	ret = himax_chip_common_init();
	ret = himax_chip_common_init();
	if (ret < 0)
	if (ret < 0)
+1 −0
Original line number Original line 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 enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer);
extern int himax_chip_common_init(void);
extern int himax_chip_common_init(void);
extern void himax_chip_common_deinit(void);
extern void himax_chip_common_deinit(void);
int himax_ts_pinctrl_init(struct himax_ts_data *ts);


#endif
#endif