summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVeera Sundaram Sankaran <veeras@codeaurora.org>2016-04-28 18:36:38 -0700
committerKyle Yan <kyan@codeaurora.org>2016-07-05 15:31:19 -0700
commit8370151cfe4d3657c532af7cb90db5f8529453d7 (patch)
treea40dd7327c97d85369738ad51b33f10eaa0c62c9 /drivers
parent5e6e59afed34056296add6be9b51774a6685a3b9 (diff)
msm: mdss: match pixclock calculation for videomode and fb var
When multiple panel timings are available and enumerating videomode list, pixclock is calculated using htotal, vtotal and refresh rate. But fb var struct is populated with actual pixclock value calculated by DSI. This pixclock mismatch would cause issues, when usermode does GET_VSCREENINFO/PUT_VSCREENINFO. Fix by using the same pixclock calculation for both structures. Change-Id: I42bfc40b5904ec80f20b296e3b4610ca3b2c5ee0 [veeras@codeaurora.org: Resolved conflicts in mdss_fb.c] Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 9af5ee7fa20c..cac94f69e5e3 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -3409,6 +3409,8 @@ static void mdss_fb_var_to_panelinfo(struct fb_var_screeninfo *var,
void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo,
struct fb_var_screeninfo *var)
{
+ u32 frame_rate;
+
var->xres = mdss_fb_get_panel_xres(pinfo);
var->yres = pinfo->yres;
var->lower_margin = pinfo->lcdc.v_front_porch -
@@ -3420,9 +3422,21 @@ void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo,
var->left_margin = pinfo->lcdc.h_back_porch;
var->hsync_len = pinfo->lcdc.h_pulse_width;
- if (pinfo->clk_rate)
- var->pixclock = KHZ2PICOS((unsigned long int)
- pinfo->clk_rate/1000);
+ frame_rate = mdss_panel_get_framerate(pinfo);
+ if (frame_rate) {
+ unsigned long clk_rate, h_total, v_total;
+
+ h_total = var->xres + var->left_margin
+ + var->right_margin + var->hsync_len;
+ v_total = var->yres + var->lower_margin
+ + var->upper_margin + var->vsync_len;
+ clk_rate = h_total * v_total * frame_rate;
+ var->pixclock = KHZ2PICOS(clk_rate / 1000);
+ } else if (pinfo->clk_rate) {
+ var->pixclock = KHZ2PICOS(
+ (unsigned long int) pinfo->clk_rate / 1000);
+ }
+
if (pinfo->physical_width)
var->width = pinfo->physical_width;
if (pinfo->physical_height)