Merge "msm: mdss: Add HFP_CALC_CLK way to switch frame rate"
This commit is contained in:
commit
8b070723fe
5 changed files with 61 additions and 17 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue