diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 810ed48a7f..e48b9406a8 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -5381,7 +5381,22 @@ int dsi_display_splash_res_cleanup(struct dsi_display *display) static int dsi_display_force_update_dsi_clk(struct dsi_display *display) { - int rc = 0; + int rc = 0, i = 0; + struct dsi_display_ctrl *ctrl; + + /* + * The force update dsi clock, is the only clock update function that toggles the state of + * DSI clocks without any ref count protection. With the addition of ASYNC command wait, + * there is a need for adding a check for any queued waits before updating these clocks. + */ + display_for_each_ctrl(i, display) { + ctrl = &display->ctrl[i]; + if (!ctrl->ctrl || !(ctrl->ctrl->post_tx_queued)) + continue; + flush_workqueue(display->post_cmd_tx_workq); + cancel_work_sync(&ctrl->ctrl->post_cmd_tx_work); + ctrl->ctrl->post_tx_queued = false; + } rc = dsi_display_link_clk_force_update_ctrl(display->dsi_clk_handle);