msm_fb: display: Update video format on fps change
Added check for frame rate change. Corner case if there is no
change in xres,yres and pixclock.
Change-Id: I0ff5eb65364d2a370e0973da7e84f738bd042a20
CRs-Fixed: 356328
Signed-off-by: Siddhartha Agrawal <agrawals@codeaurora.org>
diff --git a/drivers/video/msm/external_common.c b/drivers/video/msm/external_common.c
index 5d12e97..7f603dd 100644
--- a/drivers/video/msm/external_common.c
+++ b/drivers/video/msm/external_common.c
@@ -2056,6 +2056,7 @@
pinfo->xres = timing->active_h;
pinfo->yres = timing->active_v;
pinfo->clk_rate = timing->pixel_freq*1000;
+ pinfo->frame_rate = 60;
pinfo->lcdc.h_back_porch = timing->back_porch_h;
pinfo->lcdc.h_front_porch = timing->front_porch_h;
diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c
index 116ba67..b4d8db0 100644
--- a/drivers/video/msm/msm_fb.c
+++ b/drivers/video/msm/msm_fb.c
@@ -1194,6 +1194,7 @@
mfd->var_xres = panel_info->xres;
mfd->var_yres = panel_info->yres;
+ mfd->var_frame_rate = panel_info->frame_rate;
var->pixclock = mfd->panel_info.clk_rate;
mfd->var_pixclock = var->pixclock;
@@ -1759,6 +1760,27 @@
return 0;
}
+int msm_fb_check_frame_rate(struct msm_fb_data_type *mfd
+ , struct fb_info *info)
+{
+ int panel_height, panel_width, var_frame_rate, fps_mod;
+ struct fb_var_screeninfo *var = &info->var;
+ fps_mod = 0;
+ if ((mfd->panel_info.type == DTV_PANEL) ||
+ (mfd->panel_info.type == HDMI_PANEL)) {
+ panel_height = var->yres + var->upper_margin +
+ var->vsync_len + var->lower_margin;
+ panel_width = var->xres + var->right_margin +
+ var->hsync_len + var->left_margin;
+ var_frame_rate = ((var->pixclock)/(panel_height * panel_width));
+ if (mfd->var_frame_rate != var_frame_rate) {
+ fps_mod = 1;
+ mfd->var_frame_rate = var_frame_rate;
+ }
+ }
+ return fps_mod;
+}
+
static int msm_fb_set_par(struct fb_info *info)
{
struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
@@ -1800,7 +1822,8 @@
(mfd->hw_refresh && ((mfd->fb_imgType != old_imgType) ||
(mfd->var_pixclock != var->pixclock) ||
(mfd->var_xres != var->xres) ||
- (mfd->var_yres != var->yres)))) {
+ (mfd->var_yres != var->yres) ||
+ (msm_fb_check_frame_rate(mfd, info))))) {
mfd->var_xres = var->xres;
mfd->var_yres = var->yres;
mfd->var_pixclock = var->pixclock;
diff --git a/drivers/video/msm/msm_fb.h b/drivers/video/msm/msm_fb.h
index 3becc46..b63c022 100644
--- a/drivers/video/msm/msm_fb.h
+++ b/drivers/video/msm/msm_fb.h
@@ -148,6 +148,7 @@
__u32 var_xres;
__u32 var_yres;
__u32 var_pixclock;
+ __u32 var_frame_rate;
#ifdef MSM_FB_ENABLE_DBGFS
struct dentry *sub_dir;
@@ -210,5 +211,7 @@
void fill_black_screen(void);
void unfill_black_screen(void);
+int msm_fb_check_frame_rate(struct msm_fb_data_type *mfd,
+ struct fb_info *info);
#endif /* MSM_FB_H */
diff --git a/drivers/video/msm/msm_fb_panel.h b/drivers/video/msm/msm_fb_panel.h
index 7744e7a..9d16b7b 100644
--- a/drivers/video/msm/msm_fb_panel.h
+++ b/drivers/video/msm/msm_fb_panel.h
@@ -164,6 +164,7 @@
__u32 clk_max;
__u32 frame_count;
__u32 is_3d_panel;
+ __u32 frame_rate;
struct mddi_panel_info mddi;