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

Commit cbdf488b authored by Naveen Kaje's avatar Naveen Kaje
Browse files

msm_serial_hs: Handle GPIO state in PM routines



In case of OBS, the wakeup handshake is performed by an external GPIO,
outside the UART driver. In such cases, set the GPIO state appropriately
during suspend and resume operations.

Change-Id: Ibba9592e14e7983e1f6af0bd94bcdb7d5be7a9a6
Signed-off-by: default avatarNaveen Kaje <nkaje@codeaurora.org>
parent dbd2b72e
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -2988,10 +2988,20 @@ static void msm_hs_pm_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct msm_hs_port *msm_uport = get_matching_hs_port(pdev);
	int ret;

	if (!msm_uport)
		goto err_suspend;

	/* For OBS, don't use wakeup interrupt, set gpio to suspended state */
	if (msm_uport->obs) {
		ret = pinctrl_select_state(msm_uport->pinctrl,
			msm_uport->gpio_state_suspend);
		if (ret)
			MSM_HS_ERR("%s(): Error selecting suspend state",
				__func__);
	}

	msm_uport->pm_state = MSM_HS_PM_SUSPENDED;
	msm_hs_resource_off(msm_uport);
	msm_hs_clk_bus_unvote(msm_uport);
@@ -3008,6 +3018,7 @@ static int msm_hs_pm_resume(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct msm_hs_port *msm_uport = get_matching_hs_port(pdev);
	int ret;

	if (!msm_uport)
		goto err_resume;
@@ -3016,6 +3027,16 @@ static int msm_hs_pm_resume(struct device *dev)
	msm_hs_clk_bus_vote(msm_uport);
	msm_uport->pm_state = MSM_HS_PM_ACTIVE;
	msm_hs_resource_on(msm_uport);

	/* For OBS, don't use wakeup interrupt, set gpio to active state */
	if (msm_uport->obs) {
		ret = pinctrl_select_state(msm_uport->pinctrl,
			msm_uport->gpio_state_active);
		if (ret)
			MSM_HS_ERR("%s(): Error selecting active state",
				__func__);
	}

	MSM_HS_DBG("%s(): return resume\n", __func__);
	return 0;
err_resume: