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:
Anand Tarakh
2023-02-23 15:33:21 +05:30
부모 04e6f35c65
커밋 307aea3dc1
4개의 변경된 파일126개의 추가작업 그리고 19개의 파일을 삭제

파일 보기

@@ -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;