diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-11-30 05:40:59 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-11-30 05:40:58 -0800 |
| commit | 8b070723fe591937fd9b119ae2628df4aeabbb7d (patch) | |
| tree | b0618c7b170aac26527a1b6bc7b11b017889cf58 /drivers/video/fbdev | |
| parent | 3efbc80d9972a0e7988a9a7fec97f49b5c900f6d (diff) | |
| parent | 419c2b4a7c7d7b51f86f2b2bede770c84f015ad3 (diff) | |
Merge "msm: mdss: Add HFP_CALC_CLK way to switch frame rate"
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi_host.c | 10 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 7 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_video.c | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 47 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_panel.h | 10 |
5 files changed, 61 insertions, 17 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c index bf854a3140b2..d445f95924ef 100644 --- a/drivers/video/fbdev/msm/mdss_dsi_host.c +++ b/drivers/video/fbdev/msm/mdss_dsi_host.c @@ -3128,6 +3128,11 @@ irqreturn_t mdss_dsi_isr(int irq, void *ptr) pr_debug("%s: ndx=%d isr=%x\n", __func__, ctrl->ndx, isr); + if (isr & DSI_INTR_ERROR) { + MDSS_XLOG(ctrl->ndx, ctrl->mdp_busy, isr, 0x97); + mdss_dsi_error(ctrl); + } + if (isr & DSI_INTR_BTA_DONE) { MDSS_XLOG(ctrl->ndx, ctrl->mdp_busy, isr, 0x96); spin_lock(&ctrl->mdp_lock); @@ -3152,11 +3157,6 @@ irqreturn_t mdss_dsi_isr(int irq, void *ptr) spin_unlock(&ctrl->mdp_lock); } - if (isr & DSI_INTR_ERROR) { - MDSS_XLOG(ctrl->ndx, ctrl->mdp_busy, isr, 0x97); - mdss_dsi_error(ctrl); - } - if (isr & DSI_INTR_VIDEO_DONE) { spin_lock(&ctrl->mdp_lock); mdss_dsi_disable_irq_nosync(ctrl, DSI_VIDEO_TERM); diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 169095f64a0f..9c5c5ea090c3 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -5495,8 +5495,13 @@ int mdss_mdp_ctl_update_fps(struct mdss_mdp_ctl *ctl) (pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP) || (pinfo->dfps_update == DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP) || + (pinfo->dfps_update == + DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK) || pinfo->dfps_update == DFPS_IMMEDIATE_CLK_UPDATE_MODE) { - new_fps = mdss_panel_get_framerate(pinfo); + if (pinfo->type == DTV_PANEL) + new_fps = pinfo->lcdc.frame_rate; + else + new_fps = mdss_panel_get_framerate(pinfo); } else { new_fps = pinfo->new_fps; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c index fabdc5cd3e42..5d5515a91572 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c @@ -1424,7 +1424,9 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl, int new_fps) pdata->panel_info.dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP || pdata->panel_info.dfps_update - == DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP) { + == DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP || + pdata->panel_info.dfps_update + == DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK) { unsigned long flags; if (!ctx->timegen_en) { pr_err("TG is OFF. DFPS mode invalid\n"); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 5a72a73024b7..154b9d86e67c 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -3064,16 +3064,23 @@ static void cache_initial_timings(struct mdss_panel_data *pdata) * This value will change dynamically once the * actual dfps update happen in hw. */ - pdata->panel_info.current_fps = - mdss_panel_get_framerate(&pdata->panel_info); - + if (pdata->panel_info.type == DTV_PANEL) + pdata->panel_info.current_fps = + pdata->panel_info.lcdc.frame_rate; + else + pdata->panel_info.current_fps = + mdss_panel_get_framerate(&pdata->panel_info); /* * Keep the initial fps and porch values for this panel before * any dfps update happen, this is to prevent losing precision * in further calculations. */ - pdata->panel_info.default_fps = - mdss_panel_get_framerate(&pdata->panel_info); + if (pdata->panel_info.type == DTV_PANEL) + pdata->panel_info.default_fps = + pdata->panel_info.lcdc.frame_rate; + else + pdata->panel_info.default_fps = + mdss_panel_get_framerate(&pdata->panel_info); if (pdata->panel_info.dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP) { @@ -3085,7 +3092,9 @@ static void cache_initial_timings(struct mdss_panel_data *pdata) } else if (pdata->panel_info.dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP || pdata->panel_info.dfps_update == - DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP) { + DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP || + pdata->panel_info.dfps_update == + DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK) { pdata->panel_info.saved_total = mdss_panel_get_htotal(&pdata->panel_info, true); pdata->panel_info.saved_fporch = @@ -3154,8 +3163,25 @@ static void dfps_update_panel_params(struct mdss_panel_data *pdata, pdata->panel_info.lcdc.h_pulse_width = data->hpw; pdata->panel_info.clk_rate = data->clk_rate; + if (pdata->panel_info.type == DTV_PANEL) + pdata->panel_info.clk_rate *= 1000; + + dfps_update_fps(&pdata->panel_info, new_fps); + } else if (pdata->panel_info.dfps_update == + DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK) { + + pr_debug("hfp=%d, hbp=%d, hpw=%d, clk=%d, fps=%d\n", + data->hfp, data->hbp, data->hpw, + data->clk_rate, data->fps); + + pdata->panel_info.lcdc.h_front_porch = data->hfp; + pdata->panel_info.lcdc.h_back_porch = data->hbp; + pdata->panel_info.lcdc.h_pulse_width = data->hpw; + + pdata->panel_info.clk_rate = data->clk_rate; dfps_update_fps(&pdata->panel_info, new_fps); + mdss_panel_update_clk_rate(&pdata->panel_info, new_fps); } else { dfps_update_fps(&pdata->panel_info, new_fps); mdss_panel_update_clk_rate(&pdata->panel_info, new_fps); @@ -3230,7 +3256,9 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, } if (pdata->panel_info.dfps_update == - DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP) { + DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP || + pdata->panel_info.dfps_update == + DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK) { if (sscanf(buf, "%u %u %u %u %u", &data.hfp, &data.hbp, &data.hpw, &data.clk_rate, &data.fps) != 5) { @@ -3245,7 +3273,10 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, } } - panel_fps = mdss_panel_get_framerate(&pdata->panel_info); + if (pdata->panel_info.type == DTV_PANEL) + panel_fps = pdata->panel_info.lcdc.frame_rate; + else + panel_fps = mdss_panel_get_framerate(&pdata->panel_info); if (data.fps == panel_fps) { pr_debug("%s: FPS is already %d\n", diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h index 25ae326ebbc3..16bb48e22bee 100644 --- a/drivers/video/fbdev/msm/mdss_panel.h +++ b/drivers/video/fbdev/msm/mdss_panel.h @@ -540,7 +540,10 @@ struct dynamic_fps_data { * @DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP: update fps using vertical timings * @DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP: update fps using horizontal timings * @DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP: update fps using both horizontal - * timings and clock. + * timings and clock. + * @DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK: update fps using both + * horizontal timings, clock need to be caculate base on new clock and + * porches. * @DFPS_MODE_MAX: defines maximum limit of supported modes. */ enum dynamic_fps_update { @@ -549,6 +552,7 @@ enum dynamic_fps_update { DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP, DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP, DFPS_IMMEDIATE_MULTI_UPDATE_MODE_CLK_HFP, + DFPS_IMMEDIATE_MULTI_MODE_HFP_CALC_CLK, DFPS_MODE_MAX }; @@ -978,7 +982,9 @@ static inline u32 mdss_panel_get_framerate(struct mdss_panel_info *panel_info) break; case DTV_PANEL: if (panel_info->dynamic_fps) { - frame_rate = panel_info->lcdc.frame_rate; + frame_rate = panel_info->lcdc.frame_rate / 1000; + if (panel_info->lcdc.frame_rate % 1000) + frame_rate += 1; break; } default: |
