diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c index a171fa5bb084..51b98632c18a 100644 --- a/drivers/video/fbdev/msm/mdss_dsi.c +++ b/drivers/video/fbdev/msm/mdss_dsi.c @@ -1970,10 +1970,9 @@ static int __mdss_dsi_dfps_update_clks(struct mdss_panel_data *pdata, clk_disable_unprepare(ctrl_pdata->pll_byte_clk); clk_disable_unprepare(ctrl_pdata->pll_pixel_clk); - pinfo->mipi.frame_rate = new_fps; + /* update new fps that at this point is already updated in hw */ pinfo->current_fps = new_fps; if (sctrl_pdata) { - spinfo->mipi.frame_rate = new_fps; spinfo->current_fps = new_fps; } @@ -2033,8 +2032,10 @@ static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps) phy_rev = mdss_dsi_get_phy_revision(ctrl_pdata); pinfo = &pdata->panel_info; - frame_rate_bkp = mdss_panel_get_framerate(pinfo); - if (new_fps == pinfo->mipi.frame_rate) { + /* get the fps configured in HW */ + frame_rate_bkp = pinfo->current_fps; + + if (new_fps == pinfo->current_fps) { /* * This is unlikely as mdss driver checks for previously * configured frame rate. diff --git a/drivers/video/fbdev/msm/mdss_dsi_panel.c b/drivers/video/fbdev/msm/mdss_dsi_panel.c index 65fe58abb248..4b7a00fbd3f2 100644 --- a/drivers/video/fbdev/msm/mdss_dsi_panel.c +++ b/drivers/video/fbdev/msm/mdss_dsi_panel.c @@ -1733,6 +1733,7 @@ static void mdss_dsi_parse_dfps_config(struct device_node *pan_node, pr_debug("dfps update mode not configured: disable\n"); } pinfo->new_fps = pinfo->mipi.frame_rate; + pinfo->current_fps = pinfo->mipi.frame_rate; return; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 3a6748998243..7435166dbfcb 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -4677,7 +4677,8 @@ int mdss_mdp_ctl_update_fps(struct mdss_mdp_ctl *ctl) mutex_lock(&mdp5_data->dfps_lock); if ((pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP) || - (pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP)) { + (pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP) || + pinfo->dfps_update == DFPS_IMMEDIATE_CLK_UPDATE_MODE) { new_fps = mdss_panel_get_framerate(pinfo); } else { new_fps = pinfo->new_fps; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index c4fa50cbdca2..d7d0e00a9741 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -2768,8 +2768,7 @@ static void mdss_mdp_dfps_update_params(struct mdss_panel_data *pdata, pdata->panel_info.saved_fporch + add_h_pixels; pdata->panel_info.mipi.frame_rate = new_fps; } else { - /* in clock method we are not updating panel data here */ - pdata->panel_info.new_fps = new_fps; + pdata->panel_info.mipi.frame_rate = new_fps; } } diff --git a/drivers/video/fbdev/msm/msm_mdss_io_8974.c b/drivers/video/fbdev/msm/msm_mdss_io_8974.c index a03120b8fe18..9bf2dbc6e205 100644 --- a/drivers/video/fbdev/msm/msm_mdss_io_8974.c +++ b/drivers/video/fbdev/msm/msm_mdss_io_8974.c @@ -1365,6 +1365,15 @@ error: return rc; } +bool is_diff_frame_rate(struct mdss_panel_info *panel_info, + u32 frame_rate) +{ + if (panel_info->dynamic_fps && panel_info->current_fps) + return (frame_rate != panel_info->current_fps); + else + return (frame_rate != panel_info->mipi.frame_rate); +} + int mdss_dsi_clk_div_config(struct mdss_panel_info *panel_info, int frame_rate) { @@ -1403,9 +1412,8 @@ int mdss_dsi_clk_div_config(struct mdss_panel_info *panel_info, h_period = mdss_panel_get_htotal(panel_info, true); v_period = mdss_panel_get_vtotal(panel_info); - if (ctrl_pdata->refresh_clk_rate || (frame_rate != - panel_info->mipi.frame_rate) || - (!panel_info->clk_rate)) { + if (ctrl_pdata->refresh_clk_rate || is_diff_frame_rate(panel_info, + frame_rate) || (!panel_info->clk_rate)) { if (lanes > 0) { panel_info->clk_rate = h_period * v_period * frame_rate * bpp * 8;