summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c17
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_video.c19
-rw-r--r--drivers/video/fbdev/msm/mdss_panel.h1
5 files changed, 27 insertions, 13 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index f28401b522f8..77019bc394e5 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -53,6 +53,7 @@
#define CREATE_TRACE_POINTS
#include "mdss_debug.h"
#include "mdss_smmu.h"
+#include "mdss_mdp.h"
#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER
#define MDSS_FB_NUM 3
@@ -1450,6 +1451,9 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd)
}
if (mfd->mdp.on_fnc) {
+ struct mdss_panel_info *panel_info = mfd->panel_info;
+ struct fb_var_screeninfo *var = &mfd->fbi->var;
+
ret = mfd->mdp.on_fnc(mfd);
if (ret) {
mdss_fb_stop_disp_thread(mfd);
@@ -1463,6 +1467,13 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd)
mfd->update.is_suspend = 0;
mutex_unlock(&mfd->update.lock);
+ /*
+ * Panel info can change depending in the information
+ * programmed in the controller.
+ * Update this info in the upstream structs.
+ */
+ mdss_panelinfo_to_fb_var(panel_info, var);
+
/* Start the work thread to signal idle time */
if (mfd->idle_time)
schedule_delayed_work(&mfd->idle_notify_work,
@@ -3107,8 +3118,10 @@ static void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo,
var->xres = mdss_fb_get_panel_xres(&pdata->panel_info);
var->yres = pinfo->yres;
- var->lower_margin = pinfo->lcdc.v_front_porch;
- var->upper_margin = pinfo->lcdc.v_back_porch;
+ var->lower_margin = pinfo->lcdc.v_front_porch -
+ pinfo->prg_fet;
+ var->upper_margin = pinfo->lcdc.v_back_porch +
+ pinfo->prg_fet;
var->vsync_len = pinfo->lcdc.v_pulse_width;
var->right_margin = pinfo->lcdc.h_front_porch;
var->left_margin = pinfo->lcdc.h_back_porch;
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index c3da465a1393..ea1d3c8f5095 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -304,7 +304,6 @@ struct mdss_mdp_ctl {
void *priv_data;
void *intf_ctx[2];
u32 wb_type;
- u32 prg_fet;
struct mdss_mdp_writeback *wb;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
index 56d89f2401ee..c745bbe74aa3 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
@@ -1173,7 +1173,7 @@ static u32 mdss_mdp_get_vbp_factor(struct mdss_mdp_ctl *ctl)
fps = mdss_panel_get_framerate(pinfo);
v_total = mdss_panel_get_vtotal(pinfo);
vbp = pinfo->lcdc.v_back_porch + pinfo->lcdc.v_pulse_width;
- vbp += ctl->prg_fet;
+ vbp += pinfo->prg_fet;
vbp_fac = (vbp) ? fps * v_total / vbp : 0;
pr_debug("vbp_fac=%d vbp=%d v_total=%d\n", vbp_fac, vbp, v_total);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
index 73f482f60133..236b963a0af8 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
@@ -1153,12 +1153,12 @@ static void mdss_mdp_disable_prefill(struct mdss_mdp_ctl *ctl)
struct mdss_panel_info *pinfo = &ctl->panel_data->panel_info;
struct mdss_data_type *mdata = ctl->mdata;
- if ((ctl->prg_fet + pinfo->lcdc.v_back_porch +
+ if ((pinfo->prg_fet + pinfo->lcdc.v_back_porch +
pinfo->lcdc.v_pulse_width) > mdata->min_prefill_lines) {
ctl->disable_prefill = true;
pr_debug("disable prefill vbp:%d vpw:%d prg_fet:%d\n",
pinfo->lcdc.v_back_porch, pinfo->lcdc.v_pulse_width,
- ctl->prg_fet);
+ pinfo->prg_fet);
}
}
@@ -1171,8 +1171,8 @@ static void mdss_mdp_fetch_start_config(struct mdss_mdp_video_ctx *ctx,
mdata = ctl->mdata;
- ctl->prg_fet = mdss_mdp_get_prefetch_lines(ctl);
- if (!ctl->prg_fet) {
+ pinfo->prg_fet = mdss_mdp_get_prefetch_lines(ctl);
+ if (!pinfo->prg_fet) {
pr_debug("programmable fetch is not needed/supported\n");
return;
}
@@ -1184,7 +1184,7 @@ static void mdss_mdp_fetch_start_config(struct mdss_mdp_video_ctx *ctx,
v_total = mdss_panel_get_vtotal(pinfo);
h_total = mdss_panel_get_htotal(pinfo, true);
- fetch_start = (v_total - ctl->prg_fet) * h_total + 1;
+ fetch_start = (v_total - pinfo->prg_fet) * h_total + 1;
fetch_enable = BIT(31);
if (pinfo->dynamic_fps && (pinfo->dfps_update ==
@@ -1192,7 +1192,7 @@ static void mdss_mdp_fetch_start_config(struct mdss_mdp_video_ctx *ctx,
fetch_enable |= BIT(23);
pr_debug("ctl:%d fetch_start:%d lines:%d\n",
- ctl->num, fetch_start, ctl->prg_fet);
+ ctl->num, fetch_start, pinfo->prg_fet);
mdp_video_write(ctx, MDSS_MDP_REG_INTF_PROG_FETCH_START, fetch_start);
mdp_video_write(ctx, MDSS_MDP_REG_INTF_CONFIG, fetch_enable);
@@ -1245,8 +1245,9 @@ static int mdss_mdp_video_cdm_setup(struct mdss_mdp_cdm *cdm,
static void mdss_mdp_handoff_programmable_fetch(struct mdss_mdp_ctl *ctl,
struct mdss_mdp_video_ctx *ctx)
{
+ struct mdss_panel_info *pinfo = &ctl->panel_data->panel_info;
u32 fetch_start_handoff, v_total_handoff, h_total_handoff;
- ctl->prg_fet = 0;
+ pinfo->prg_fet = 0;
if (mdp_video_read(ctx, MDSS_MDP_REG_INTF_CONFIG) & BIT(31)) {
fetch_start_handoff = mdp_video_read(ctx,
MDSS_MDP_REG_INTF_PROG_FETCH_START);
@@ -1254,10 +1255,10 @@ static void mdss_mdp_handoff_programmable_fetch(struct mdss_mdp_ctl *ctl,
MDSS_MDP_REG_INTF_HSYNC_CTL) >> 16;
v_total_handoff = mdp_video_read(ctx,
MDSS_MDP_REG_INTF_VSYNC_PERIOD_F0)/h_total_handoff;
- ctl->prg_fet = v_total_handoff -
+ pinfo->prg_fet = v_total_handoff -
((fetch_start_handoff - 1)/h_total_handoff);
pr_debug("programmable fetch lines %d start:%d\n",
- ctl->prg_fet, fetch_start_handoff);
+ pinfo->prg_fet, fetch_start_handoff);
}
}
diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h
index dda3789d67c1..2588eda2fb52 100644
--- a/drivers/video/fbdev/msm/mdss_panel.h
+++ b/drivers/video/fbdev/msm/mdss_panel.h
@@ -516,6 +516,7 @@ struct mdss_panel_info {
u32 min_height;
u32 min_fps;
u32 max_fps;
+ u32 prg_fet;
u32 cont_splash_enabled;
bool esd_rdy;