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

Commit f54ca1a0 authored by Archit Taneja's avatar Archit Taneja Committed by Rob Clark
Browse files

drm/msm/dsi: Implement RPM suspend/resume callbacks



The bus clocks are always enabled/disabled along with the power
domain, so move it to the runtime suspend/resume ops. This cleans
up the clock code a bit. Get rid of the clk_mutex mutex since it
isn't needed.

Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent f6be1121
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -161,12 +161,17 @@ static const struct of_device_id dt_match[] = {
	{}
};

static const struct dev_pm_ops dsi_pm_ops = {
	SET_RUNTIME_PM_OPS(msm_dsi_runtime_suspend, msm_dsi_runtime_resume, NULL)
};

static struct platform_driver dsi_driver = {
	.probe = dsi_dev_probe,
	.remove = dsi_dev_remove,
	.driver = {
		.name = "msm_dsi",
		.of_match_table = dt_match,
		.pm = &dsi_pm_ops,
	},
};

+2 −0
Original line number Diff line number Diff line
@@ -179,6 +179,8 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host);
int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
					struct drm_device *dev);
int msm_dsi_host_init(struct msm_dsi *msm_dsi);
int msm_dsi_runtime_suspend(struct device *dev);
int msm_dsi_runtime_resume(struct device *dev);

/* dsi phy */
struct msm_dsi_phy;
+42 −41
Original line number Diff line number Diff line
@@ -135,7 +135,6 @@ struct msm_dsi_host {
	struct completion video_comp;
	struct mutex dev_mutex;
	struct mutex cmd_mutex;
	struct mutex clk_mutex;
	spinlock_t intr_lock; /* Protect interrupt ctrl register */

	u32 err_work_state;
@@ -458,6 +457,34 @@ static void dsi_bus_clk_disable(struct msm_dsi_host *msm_host)
		clk_disable_unprepare(msm_host->bus_clks[i]);
}

int msm_dsi_runtime_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct msm_dsi *msm_dsi = platform_get_drvdata(pdev);
	struct mipi_dsi_host *host = msm_dsi->host;
	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);

	if (!msm_host->cfg_hnd)
		return 0;

	dsi_bus_clk_disable(msm_host);

	return 0;
}

int msm_dsi_runtime_resume(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct msm_dsi *msm_dsi = platform_get_drvdata(pdev);
	struct mipi_dsi_host *host = msm_dsi->host;
	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);

	if (!msm_host->cfg_hnd)
		return 0;

	return dsi_bus_clk_enable(msm_host);
}

static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
{
	int ret;
@@ -599,35 +626,6 @@ static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
	}
}

static int dsi_clk_ctrl(struct msm_dsi_host *msm_host, bool enable)
{
	int ret = 0;

	mutex_lock(&msm_host->clk_mutex);
	if (enable) {
		ret = dsi_bus_clk_enable(msm_host);
		if (ret) {
			pr_err("%s: Can not enable bus clk, %d\n",
				__func__, ret);
			goto unlock_ret;
		}
		ret = dsi_link_clk_enable(msm_host);
		if (ret) {
			pr_err("%s: Can not enable link clk, %d\n",
				__func__, ret);
			dsi_bus_clk_disable(msm_host);
			goto unlock_ret;
		}
	} else {
		dsi_link_clk_disable(msm_host);
		dsi_bus_clk_disable(msm_host);
	}

unlock_ret:
	mutex_unlock(&msm_host->clk_mutex);
	return ret;
}

static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
{
	struct drm_display_mode *mode = msm_host->mode;
@@ -1702,6 +1700,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
	}

	msm_host->pdev = pdev;
	msm_dsi->host = &msm_host->base;

	ret = dsi_host_parse_dt(msm_host);
	if (ret) {
@@ -1758,7 +1757,6 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
	init_completion(&msm_host->video_comp);
	mutex_init(&msm_host->dev_mutex);
	mutex_init(&msm_host->cmd_mutex);
	mutex_init(&msm_host->clk_mutex);
	spin_lock_init(&msm_host->intr_lock);

	/* setup workqueue */
@@ -1766,7 +1764,6 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
	INIT_WORK(&msm_host->err_work, dsi_err_worker);
	INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker);

	msm_dsi->host = &msm_host->base;
	msm_dsi->id = msm_host->id;

	DBG("Dsi Host %d initialized", msm_host->id);
@@ -1788,7 +1785,6 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host)
		msm_host->workqueue = NULL;
	}

	mutex_destroy(&msm_host->clk_mutex);
	mutex_destroy(&msm_host->cmd_mutex);
	mutex_destroy(&msm_host->dev_mutex);

@@ -1889,7 +1885,7 @@ int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
	 * mdp clock need to be enabled to receive dsi interrupt
	 */
	pm_runtime_get_sync(&msm_host->pdev->dev);
	dsi_clk_ctrl(msm_host, 1);
	dsi_link_clk_enable(msm_host);

	/* TODO: vote for bus bandwidth */

@@ -1919,7 +1915,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,

	/* TODO: unvote for bus bandwidth */

	dsi_clk_ctrl(msm_host, 0);
	dsi_link_clk_disable(msm_host);
	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
}

@@ -2169,8 +2165,11 @@ int msm_dsi_host_enable(struct mipi_dsi_host *host)
	 * and only turned on before MDP START.
	 * This part of code should be enabled once mdp driver support it.
	 */
	/* if (msm_panel->mode == MSM_DSI_CMD_MODE)
		dsi_clk_ctrl(msm_host, 0); */
	/* if (msm_panel->mode == MSM_DSI_CMD_MODE) {
	 *	dsi_link_clk_disable(msm_host);
	 *	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
	 * }
	 */

	return 0;
}
@@ -2227,9 +2226,10 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
	}

	pm_runtime_get_sync(&msm_host->pdev->dev);
	ret = dsi_clk_ctrl(msm_host, 1);
	ret = dsi_link_clk_enable(msm_host);
	if (ret) {
		pr_err("%s: failed to enable clocks. ret=%d\n", __func__, ret);
		pr_err("%s: failed to enable link clocks. ret=%d\n",
		       __func__, ret);
		goto fail_disable_reg;
	}

@@ -2253,7 +2253,8 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
	return 0;

fail_disable_clk:
	dsi_clk_ctrl(msm_host, 0);
	dsi_link_clk_disable(msm_host);
	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
fail_disable_reg:
	dsi_host_regulator_disable(msm_host);
unlock_ret:
@@ -2278,7 +2279,7 @@ int msm_dsi_host_power_off(struct mipi_dsi_host *host)

	pinctrl_pm_select_sleep_state(&msm_host->pdev->dev);

	dsi_clk_ctrl(msm_host, 0);
	dsi_link_clk_disable(msm_host);
	pm_runtime_put_autosuspend(&msm_host->pdev->dev);

	dsi_host_regulator_disable(msm_host);