mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 10:37:51 +07:00
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: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
f6be1121ea
commit
f54ca1a096
@ -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,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user