disp: msm: dsi: add mutex lock before link clock frequency update
Acquire mngr clk_mutex before updating link clock frequencies. Failing this may lead to race around condition while setting the link clock frequency rates. Make sure byteclk and pclk rates of PLL are configured according to clock manager and not the controller. Change-Id: I2cd26e659ce166d5bc55eb6c060672eeee192bea Signed-off-by: Anand Tarakh <quic_atarakh@quicinc.com>
This commit is contained in:
@@ -2840,7 +2840,7 @@ int dsi_display_phy_configure(void *priv, bool commit)
|
||||
struct dsi_display *display = priv;
|
||||
struct dsi_display_ctrl *m_ctrl;
|
||||
struct dsi_pll_resource *pll_res;
|
||||
struct dsi_ctrl *ctrl;
|
||||
struct link_clk_freq link_freq;
|
||||
|
||||
if (!display) {
|
||||
DSI_ERR("invalid arguments\n");
|
||||
@@ -2862,9 +2862,15 @@ int dsi_display_phy_configure(void *priv, bool commit)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ctrl = m_ctrl->ctrl;
|
||||
pll_res->byteclk_rate = ctrl->clk_freq.byte_clk_rate;
|
||||
pll_res->pclk_rate = ctrl->clk_freq.pix_clk_rate;
|
||||
rc = dsi_clk_get_link_frequencies(&link_freq, display->dsi_clk_handle,
|
||||
display->clk_master_idx);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to get link frequencies\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
pll_res->byteclk_rate = link_freq.byte_clk_rate;
|
||||
pll_res->pclk_rate = link_freq.pix_clk_rate;
|
||||
|
||||
rc = dsi_phy_configure(m_ctrl->phy, commit);
|
||||
|
||||
@@ -4481,6 +4487,26 @@ void dsi_display_update_byte_intf_div(struct dsi_display *display)
|
||||
config->byte_intf_clk_div = 2;
|
||||
}
|
||||
|
||||
static int dsi_display_set_link_frequencies(struct dsi_display *display)
|
||||
{
|
||||
int rc = 0, i = 0;
|
||||
|
||||
dsi_clk_acquire_mngr_lock(display->dsi_clk_handle);
|
||||
display_for_each_ctrl(i, display) {
|
||||
struct dsi_display_ctrl *ctrl = &display->ctrl[i];
|
||||
|
||||
rc = dsi_clk_set_link_frequencies(display->dsi_clk_handle, ctrl->ctrl->clk_freq, i);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to update link frequencies of ctrl_%d, rc=%d\n", i, rc);
|
||||
dsi_clk_release_mngr_lock(display->dsi_clk_handle);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
dsi_clk_release_mngr_lock(display->dsi_clk_handle);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int dsi_display_update_dsi_bitrate(struct dsi_display *display,
|
||||
u32 bit_clk_rate)
|
||||
{
|
||||
@@ -4563,12 +4589,6 @@ static int dsi_display_update_dsi_bitrate(struct dsi_display *display,
|
||||
ctrl->clk_freq.byte_clk_rate = byte_clk_rate;
|
||||
ctrl->clk_freq.byte_intf_clk_rate = byte_intf_clk_rate;
|
||||
ctrl->clk_freq.pix_clk_rate = pclk_rate;
|
||||
rc = dsi_clk_set_link_frequencies(display->dsi_clk_handle,
|
||||
ctrl->clk_freq, ctrl->cell_index);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to update link frequencies\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
ctrl->host_config.bit_clk_rate_hz = bit_clk_rate;
|
||||
error:
|
||||
@@ -4579,6 +4599,12 @@ error:
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = dsi_display_set_link_frequencies(display);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to set display link frequencies\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5233,6 +5259,15 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
|
||||
}
|
||||
}
|
||||
|
||||
if (!(mode->dsi_mode_flags & (DSI_MODE_FLAG_SEAMLESS | DSI_MODE_FLAG_VRR |
|
||||
DSI_MODE_FLAG_DYN_CLK))) {
|
||||
rc = dsi_display_set_link_frequencies(display);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to set display link frequencies\n");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if ((mode->dsi_mode_flags & DSI_MODE_FLAG_DMS) &&
|
||||
(display->panel->panel_mode == DSI_OP_CMD_MODE)) {
|
||||
u64 cur_bitclk = display->panel->cur_mode->timing.clk_rate_hz;
|
||||
@@ -7461,6 +7496,13 @@ int dsi_display_update_transfer_time(void *display, u32 transfer_time)
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
rc = dsi_display_set_link_frequencies(disp);
|
||||
if (rc) {
|
||||
DSI_ERR("Failed to set display link frequencies\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
atomic_set(&disp->clkrate_change_pending, 1);
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user