drm/msm/dsi: make save/restore_state phy-level functions
Morph msm_dsi_pll_save/restore_state() into msm_dsi_phy_save/restore_state(), thus removing last bits of knowledge about msm_dsi_pll from dsi_manager. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org> Tested-by: Stephen Boyd <swboyd@chromium.org> # on sc7180 lazor Link: https://lore.kernel.org/r/20210331105735.3690009-14-dmitry.baryshkov@linaro.org Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
committed by
Rob Clark
parent
a7c13d4f59
commit
aaadcbb4d7
@@ -92,21 +92,6 @@ static inline bool msm_dsi_device_connected(struct msm_dsi *msm_dsi)
|
||||
|
||||
struct drm_encoder *msm_dsi_get_encoder(struct msm_dsi *msm_dsi);
|
||||
|
||||
/* dsi pll */
|
||||
struct msm_dsi_pll;
|
||||
#ifdef CONFIG_DRM_MSM_DSI_PLL
|
||||
void msm_dsi_pll_save_state(struct msm_dsi_pll *pll);
|
||||
int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll);
|
||||
#else
|
||||
static inline void msm_dsi_pll_save_state(struct msm_dsi_pll *pll)
|
||||
{
|
||||
}
|
||||
static inline int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* dsi host */
|
||||
struct msm_dsi_host;
|
||||
int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
|
||||
@@ -182,11 +167,12 @@ int msm_dsi_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
|
||||
void msm_dsi_phy_disable(struct msm_dsi_phy *phy);
|
||||
void msm_dsi_phy_get_shared_timings(struct msm_dsi_phy *phy,
|
||||
struct msm_dsi_phy_shared_timings *shared_timing);
|
||||
struct msm_dsi_pll *msm_dsi_phy_get_pll(struct msm_dsi_phy *phy);
|
||||
void msm_dsi_phy_set_usecase(struct msm_dsi_phy *phy,
|
||||
enum msm_dsi_phy_usecase uc);
|
||||
int msm_dsi_phy_get_clk_provider(struct msm_dsi_phy *phy,
|
||||
struct clk **byte_clk_provider, struct clk **pixel_clk_provider);
|
||||
void msm_dsi_phy_pll_save_state(struct msm_dsi_phy *phy);
|
||||
int msm_dsi_phy_pll_restore_state(struct msm_dsi_phy *phy);
|
||||
|
||||
#endif /* __DSI_CONNECTOR_H__ */
|
||||
|
||||
|
||||
@@ -498,7 +498,6 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
|
||||
struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1);
|
||||
struct mipi_dsi_host *host = msm_dsi->host;
|
||||
struct drm_panel *panel = msm_dsi->panel;
|
||||
struct msm_dsi_pll *src_pll;
|
||||
bool is_dual_dsi = IS_DUAL_DSI();
|
||||
int ret;
|
||||
|
||||
@@ -532,9 +531,8 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
|
||||
id, ret);
|
||||
}
|
||||
|
||||
/* Save PLL status if it is a clock source */
|
||||
src_pll = msm_dsi_phy_get_pll(msm_dsi->phy);
|
||||
msm_dsi_pll_save_state(src_pll);
|
||||
/* Save PHY status if it is a clock source */
|
||||
msm_dsi_phy_pll_save_state(msm_dsi->phy);
|
||||
|
||||
ret = msm_dsi_host_power_off(host);
|
||||
if (ret)
|
||||
|
||||
@@ -799,9 +799,9 @@ int msm_dsi_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
|
||||
* source.
|
||||
*/
|
||||
if (phy->usecase != MSM_DSI_PHY_SLAVE) {
|
||||
ret = msm_dsi_pll_restore_state(phy->pll);
|
||||
ret = msm_dsi_phy_pll_restore_state(phy);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev, "%s: failed to restore pll state, %d\n",
|
||||
DRM_DEV_ERROR(dev, "%s: failed to restore phy state, %d\n",
|
||||
__func__, ret);
|
||||
goto pll_restor_fail;
|
||||
}
|
||||
@@ -838,14 +838,6 @@ void msm_dsi_phy_get_shared_timings(struct msm_dsi_phy *phy,
|
||||
sizeof(*shared_timings));
|
||||
}
|
||||
|
||||
struct msm_dsi_pll *msm_dsi_phy_get_pll(struct msm_dsi_phy *phy)
|
||||
{
|
||||
if (!phy)
|
||||
return NULL;
|
||||
|
||||
return phy->pll;
|
||||
}
|
||||
|
||||
void msm_dsi_phy_set_usecase(struct msm_dsi_phy *phy,
|
||||
enum msm_dsi_phy_usecase uc)
|
||||
{
|
||||
@@ -863,3 +855,26 @@ int msm_dsi_phy_get_clk_provider(struct msm_dsi_phy *phy,
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
void msm_dsi_phy_pll_save_state(struct msm_dsi_phy *phy)
|
||||
{
|
||||
if (phy->cfg->pll_ops.save_state) {
|
||||
phy->cfg->pll_ops.save_state(phy->pll);
|
||||
phy->pll->state_saved = true;
|
||||
}
|
||||
}
|
||||
|
||||
int msm_dsi_phy_pll_restore_state(struct msm_dsi_phy *phy)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (phy->cfg->pll_ops.restore_state && phy->pll->state_saved) {
|
||||
ret = phy->cfg->pll_ops.restore_state(phy->pll);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
phy->pll->state_saved = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#ifndef __DSI_PHY_H__
|
||||
#define __DSI_PHY_H__
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include "dsi.h"
|
||||
@@ -13,6 +14,16 @@
|
||||
#define dsi_phy_read(offset) msm_readl((offset))
|
||||
#define dsi_phy_write(offset, data) msm_writel((data), (offset))
|
||||
|
||||
struct msm_dsi_pll {
|
||||
struct clk_hw clk_hw;
|
||||
bool pll_on;
|
||||
bool state_saved;
|
||||
|
||||
const struct msm_dsi_phy_cfg *cfg;
|
||||
};
|
||||
|
||||
#define hw_clk_to_pll(x) container_of(x, struct msm_dsi_pll, clk_hw)
|
||||
|
||||
struct msm_dsi_phy_ops {
|
||||
int (*pll_init)(struct msm_dsi_phy *phy);
|
||||
int (*enable)(struct msm_dsi_phy *phy, int src_pll_id,
|
||||
|
||||
@@ -782,7 +782,7 @@ static int dsi_pll_10nm_init(struct msm_dsi_phy *phy)
|
||||
phy->pll = pll;
|
||||
|
||||
/* TODO: Remove this when we have proper display handover support */
|
||||
msm_dsi_pll_save_state(pll);
|
||||
msm_dsi_phy_pll_save_state(phy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -807,7 +807,7 @@ static int dsi_pll_7nm_init(struct msm_dsi_phy *phy)
|
||||
phy->pll = pll;
|
||||
|
||||
/* TODO: Remove this when we have proper display handover support */
|
||||
msm_dsi_pll_save_state(pll);
|
||||
msm_dsi_phy_pll_save_state(phy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -56,29 +56,3 @@ void msm_dsi_pll_helper_clk_unprepare(struct clk_hw *hw)
|
||||
|
||||
pll->pll_on = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* DSI PLL API
|
||||
*/
|
||||
void msm_dsi_pll_save_state(struct msm_dsi_pll *pll)
|
||||
{
|
||||
if (pll->cfg->pll_ops.save_state) {
|
||||
pll->cfg->pll_ops.save_state(pll);
|
||||
pll->state_saved = true;
|
||||
}
|
||||
}
|
||||
|
||||
int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (pll->cfg->pll_ops.restore_state && pll->state_saved) {
|
||||
ret = pll->cfg->pll_ops.restore_state(pll);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pll->state_saved = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,21 +6,10 @@
|
||||
#ifndef __DSI_PLL_H__
|
||||
#define __DSI_PLL_H__
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "dsi.h"
|
||||
|
||||
struct msm_dsi_pll {
|
||||
struct clk_hw clk_hw;
|
||||
bool pll_on;
|
||||
bool state_saved;
|
||||
|
||||
const struct msm_dsi_phy_cfg *cfg;
|
||||
};
|
||||
|
||||
#define hw_clk_to_pll(x) container_of(x, struct msm_dsi_pll, clk_hw)
|
||||
|
||||
static inline void pll_write(void __iomem *reg, u32 data)
|
||||
{
|
||||
msm_writel(data, reg);
|
||||
|
||||
Reference in New Issue
Block a user