disp: msm: dsi: set source to xo while turning off PLL

HW recommendation is to park the DSI byte clock and pixel clock at XO
before turning them off. The change parses XO from the DT and sets the
clock source as XO while turning off the PLL.

Change-Id: I788951d6341149300e80e8db4a5a3fd2c4eb3e03
Signed-off-by: Satya Rama Aditya Pinapala <psraditya30@codeaurora.org>
This commit is contained in:
Satya Rama Aditya Pinapala
2021-01-25 10:58:42 -08:00
szülő 457b3d3397
commit 3ff78e8f7d
3 fájl változott, egészen pontosan 59 új sor hozzáadva és 58 régi sor törölve

Fájl megtekintése

@@ -2647,6 +2647,52 @@ error:
return rc;
}
static int dsi_display_set_clk_src(struct dsi_display *display, bool set_xo)
{
int rc = 0;
int i;
struct dsi_display_ctrl *m_ctrl, *ctrl;
struct dsi_ctrl_clk_info *info;
if (display->trusted_vm_env)
return 0;
/*
* In case of split DSI usecases, the clock for master controller should
* be enabled before the other controller. Master controller in the
* clock context refers to the controller that sources the clock. While turning off the
* clocks, the source is set to xo.
*/
m_ctrl = &display->ctrl[display->clk_master_idx];
info = &m_ctrl->ctrl->clk_info;
if (!set_xo)
rc = dsi_ctrl_set_clock_source(m_ctrl->ctrl, &display->clock_info.pll_clks);
else if ((info->xo_clk.byte_clk) && (info->xo_clk.pixel_clk))
rc = dsi_ctrl_set_clock_source(m_ctrl->ctrl, &info->xo_clk);
if (rc) {
DSI_ERR("[%s] failed to set source clocks for master, rc=%d\n", display->name, rc);
return rc;
}
/* Set source for the rest of the controllers */
display_for_each_ctrl(i, display) {
ctrl = &display->ctrl[i];
if (!ctrl->ctrl || (ctrl == m_ctrl))
continue;
info = &ctrl->ctrl->clk_info;
if (!set_xo)
rc = dsi_ctrl_set_clock_source(ctrl->ctrl, &display->clock_info.pll_clks);
else if ((info->xo_clk.byte_clk) && (info->xo_clk.pixel_clk))
rc = dsi_ctrl_set_clock_source(ctrl->ctrl, &info->xo_clk);
if (rc) {
DSI_ERR("[%s] failed to set source clocks, rc=%d\n", display->name, rc);
return rc;
}
}
return 0;
}
int dsi_display_phy_pll_toggle(void *priv, bool prepare)
{
int rc = 0;
@@ -2658,6 +2704,8 @@ int dsi_display_phy_pll_toggle(void *priv, bool prepare)
return -EINVAL;
}
rc = dsi_display_set_clk_src(display, !prepare);
m_ctrl = &display->ctrl[display->clk_master_idx];
if (!m_ctrl->phy) {
DSI_ERR("[%s] PHY not found\n", display->name);
@@ -2703,44 +2751,6 @@ int dsi_display_phy_configure(void *priv, bool commit)
return rc;
}
static int dsi_display_set_clk_src(struct dsi_display *display)
{
int rc = 0;
int i;
struct dsi_display_ctrl *m_ctrl, *ctrl;
/*
* In case of split DSI usecases, the clock for master controller should
* be enabled before the other controller. Master controller in the
* clock context refers to the controller that sources the clock.
*/
m_ctrl = &display->ctrl[display->clk_master_idx];
rc = dsi_ctrl_set_clock_source(m_ctrl->ctrl,
&display->clock_info.pll_clks);
if (rc) {
DSI_ERR("[%s] failed to set source clocks for master, rc=%d\n",
display->name, rc);
return rc;
}
/* Turn on rest of the controllers */
display_for_each_ctrl(i, display) {
ctrl = &display->ctrl[i];
if (!ctrl->ctrl || (ctrl == m_ctrl))
continue;
rc = dsi_ctrl_set_clock_source(ctrl->ctrl,
&display->clock_info.pll_clks);
if (rc) {
DSI_ERR("[%s] failed to set source clocks, rc=%d\n",
display->name, rc);
return rc;
}
}
return 0;
}
static int dsi_display_phy_reset_config(struct dsi_display *display,
bool enable)
{
@@ -7241,16 +7251,6 @@ static int dsi_display_pre_switch(struct dsi_display *display)
goto error_ctrl_clk_off;
}
if (!display->trusted_vm_env) {
rc = dsi_display_set_clk_src(display);
if (rc) {
DSI_ERR(
"[%s] failed to set DSI link clock source, rc=%d\n",
display->name, rc);
goto error_ctrl_deinit;
}
}
rc = dsi_display_clk_ctrl(display->dsi_clk_handle,
DSI_LINK_CLK, DSI_CLK_ON);
if (rc) {
@@ -7650,16 +7650,6 @@ int dsi_display_prepare(struct dsi_display *display)
}
}
if (!display->trusted_vm_env) {
rc = dsi_display_set_clk_src(display);
if (rc) {
DSI_ERR(
"[%s] failed to set DSI link clock source, rc=%d\n",
display->name, rc);
goto error_phy_disable;
}
}
rc = dsi_display_ctrl_init(display);
if (rc) {
DSI_ERR("[%s] failed to setup DSI controller, rc=%d\n",