diff options
author | Veera Sundaram Sankaran <veeras@codeaurora.org> | 2016-04-28 18:36:38 -0700 |
---|---|---|
committer | Kyle Yan <kyan@codeaurora.org> | 2016-07-05 15:31:19 -0700 |
commit | 8370151cfe4d3657c532af7cb90db5f8529453d7 (patch) | |
tree | a40dd7327c97d85369738ad51b33f10eaa0c62c9 /drivers | |
parent | 5e6e59afed34056296add6be9b51774a6685a3b9 (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.c | 20 |
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) |