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

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
...@@ -161,12 +161,17 @@ static const struct of_device_id dt_match[] = { ...@@ -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 = { static struct platform_driver dsi_driver = {
.probe = dsi_dev_probe, .probe = dsi_dev_probe,
.remove = dsi_dev_remove, .remove = dsi_dev_remove,
.driver = { .driver = {
.name = "msm_dsi", .name = "msm_dsi",
.of_match_table = dt_match, .of_match_table = dt_match,
.pm = &dsi_pm_ops,
}, },
}; };
......
...@@ -179,6 +179,8 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host); ...@@ -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, int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
struct drm_device *dev); struct drm_device *dev);
int msm_dsi_host_init(struct msm_dsi *msm_dsi); 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 */ /* dsi phy */
struct msm_dsi_phy; struct msm_dsi_phy;
......
...@@ -135,7 +135,6 @@ struct msm_dsi_host { ...@@ -135,7 +135,6 @@ struct msm_dsi_host {
struct completion video_comp; struct completion video_comp;
struct mutex dev_mutex; struct mutex dev_mutex;
struct mutex cmd_mutex; struct mutex cmd_mutex;
struct mutex clk_mutex;
spinlock_t intr_lock; /* Protect interrupt ctrl register */ spinlock_t intr_lock; /* Protect interrupt ctrl register */
u32 err_work_state; u32 err_work_state;
...@@ -458,6 +457,34 @@ static void dsi_bus_clk_disable(struct msm_dsi_host *msm_host) ...@@ -458,6 +457,34 @@ static void dsi_bus_clk_disable(struct msm_dsi_host *msm_host)
clk_disable_unprepare(msm_host->bus_clks[i]); 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) static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
{ {
int ret; int ret;
...@@ -599,35 +626,6 @@ static void dsi_link_clk_disable(struct msm_dsi_host *msm_host) ...@@ -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) static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
{ {
struct drm_display_mode *mode = msm_host->mode; struct drm_display_mode *mode = msm_host->mode;
...@@ -1702,6 +1700,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi) ...@@ -1702,6 +1700,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
} }
msm_host->pdev = pdev; msm_host->pdev = pdev;
msm_dsi->host = &msm_host->base;
ret = dsi_host_parse_dt(msm_host); ret = dsi_host_parse_dt(msm_host);
if (ret) { if (ret) {
...@@ -1758,7 +1757,6 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi) ...@@ -1758,7 +1757,6 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
init_completion(&msm_host->video_comp); init_completion(&msm_host->video_comp);
mutex_init(&msm_host->dev_mutex); mutex_init(&msm_host->dev_mutex);
mutex_init(&msm_host->cmd_mutex); mutex_init(&msm_host->cmd_mutex);
mutex_init(&msm_host->clk_mutex);
spin_lock_init(&msm_host->intr_lock); spin_lock_init(&msm_host->intr_lock);
/* setup workqueue */ /* setup workqueue */
...@@ -1766,7 +1764,6 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi) ...@@ -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->err_work, dsi_err_worker);
INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker); INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker);
msm_dsi->host = &msm_host->base;
msm_dsi->id = msm_host->id; msm_dsi->id = msm_host->id;
DBG("Dsi Host %d initialized", 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) ...@@ -1788,7 +1785,6 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host)
msm_host->workqueue = NULL; msm_host->workqueue = NULL;
} }
mutex_destroy(&msm_host->clk_mutex);
mutex_destroy(&msm_host->cmd_mutex); mutex_destroy(&msm_host->cmd_mutex);
mutex_destroy(&msm_host->dev_mutex); mutex_destroy(&msm_host->dev_mutex);
...@@ -1889,7 +1885,7 @@ int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host, ...@@ -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 * mdp clock need to be enabled to receive dsi interrupt
*/ */
pm_runtime_get_sync(&msm_host->pdev->dev); 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 */ /* TODO: vote for bus bandwidth */
...@@ -1919,7 +1915,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host, ...@@ -1919,7 +1915,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
/* TODO: unvote for bus bandwidth */ /* 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); pm_runtime_put_autosuspend(&msm_host->pdev->dev);
} }
...@@ -2169,8 +2165,11 @@ int msm_dsi_host_enable(struct mipi_dsi_host *host) ...@@ -2169,8 +2165,11 @@ int msm_dsi_host_enable(struct mipi_dsi_host *host)
* and only turned on before MDP START. * and only turned on before MDP START.
* This part of code should be enabled once mdp driver support it. * This part of code should be enabled once mdp driver support it.
*/ */
/* if (msm_panel->mode == MSM_DSI_CMD_MODE) /* if (msm_panel->mode == MSM_DSI_CMD_MODE) {
dsi_clk_ctrl(msm_host, 0); */ * dsi_link_clk_disable(msm_host);
* pm_runtime_put_autosuspend(&msm_host->pdev->dev);
* }
*/
return 0; return 0;
} }
...@@ -2227,9 +2226,10 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host, ...@@ -2227,9 +2226,10 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
} }
pm_runtime_get_sync(&msm_host->pdev->dev); pm_runtime_get_sync(&msm_host->pdev->dev);
ret = dsi_clk_ctrl(msm_host, 1); ret = dsi_link_clk_enable(msm_host);
if (ret) { 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; goto fail_disable_reg;
} }
...@@ -2253,7 +2253,8 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host, ...@@ -2253,7 +2253,8 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
return 0; return 0;
fail_disable_clk: 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: fail_disable_reg:
dsi_host_regulator_disable(msm_host); dsi_host_regulator_disable(msm_host);
unlock_ret: unlock_ret:
...@@ -2278,7 +2279,7 @@ int msm_dsi_host_power_off(struct mipi_dsi_host *host) ...@@ -2278,7 +2279,7 @@ int msm_dsi_host_power_off(struct mipi_dsi_host *host)
pinctrl_pm_select_sleep_state(&msm_host->pdev->dev); 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); pm_runtime_put_autosuspend(&msm_host->pdev->dev);
dsi_host_regulator_disable(msm_host); dsi_host_regulator_disable(msm_host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment