From 4f0e9cb6e2a0f5896eb3a64e99b4a65497b0ca06 Mon Sep 17 00:00:00 2001 From: Devin Kim <dojip.kim@lge.com> Date: Fri, 3 Oct 2014 16:43:43 -0700 Subject: [PATCH] msm: mdss: Fix the race condition on phy regulator control mdss_dsi_phy_init() controls the phy regulator. If mdss_dsi_ulps_config_sub is invoked at that time, it will cause unexpected behavior like clock control failure. mdss_dsi_phy_init() is invoked by mdss_dsi_on() which is for unblank. To avoid this problem, mdss_dsi_on() is protected with ctrl_pdata->ulps_lock. Change-Id: Ib2dc0f49f6f15f7a9cdc5218ca0e9fe13b9e0ae4 Signed-off-by: Devin Kim <dojip.kim@lge.com> --- drivers/video/msm/mdss/mdss_dsi.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 4c85c4f806e7..f11763e51cff 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -682,13 +682,15 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) pinfo = &pdata->panel_info; mipi = &pdata->panel_info.mipi; + mutex_lock(&ctrl_pdata->ulps_lock); + ret = mdss_dsi_panel_power_on(pdata, 1); if (ret) { pr_err("%s:Panel power on failed. rc=%d\n", __func__, ret); - return ret; + goto exit; } - mdss_dsi_clk_ctrl(ctrl_pdata, DSI_BUS_CLKS, 1); + ret = mdss_dsi_clk_ctrl(ctrl_pdata, DSI_BUS_CLKS, 1); if (ret) { pr_err("%s: failed to enable bus clocks. rc=%d\n", __func__, ret); @@ -696,10 +698,10 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); - return ret; + goto exit; } pdata->panel_info.panel_power_on = 0; - return ret; + goto exit; } pdata->panel_info.panel_power_on = 1; @@ -735,8 +737,11 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) if (pdata->panel_info.type == MIPI_CMD_PANEL) mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); +exit: + mutex_unlock(&ctrl_pdata->ulps_lock); + pr_debug("%s-:\n", __func__); - return 0; + return ret; } static int mdss_dsi_pinctrl_set_state( -- GitLab