]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blobdiff - drivers/video/tegra/dc/hdmi2.0.c
drivers: video: tegra: dc: Fix VIC for a few modes
[sojka/nv-tegra/linux-3.10.git] / drivers / video / tegra / dc / hdmi2.0.c
index bfa91581cef89285aa95fc160de140e5d5cdb90e..404f35dee23975b77b5ade91e292229443d420cb 100644 (file)
@@ -1117,6 +1117,11 @@ static void tegra_hdmi_get_cea_fb_videomode(struct fb_videomode *m,
                dc_mode.pclk = (dc_mode.pclk / 5) * 8;
        }
 
+       if (dc_mode.vmode & FB_VMODE_1000DIV1001) {
+               dc_mode.pclk = DIV_ROUND_UP((u64)dc_mode.pclk * 1001,  1000);
+               dc_mode.vmode &= ~FB_VMODE_1000DIV1001;
+       }
+
        tegra_dc_to_fb_videomode(m, &dc_mode);
 
        /* only interlaced required for VIC identification */
@@ -1148,7 +1153,20 @@ static int tegra_hdmi_find_cea_vic(struct tegra_hdmi *hdmi)
        for (i = 1; i < modedb_size; i++) {
                const struct fb_videomode *curr = &cea_modes[i];
 
-               if (!fb_mode_is_equal(&m, curr))
+               if (!((m.refresh == curr->refresh ||
+                      m.refresh + 1 == curr->refresh ||
+                      m.refresh == curr->refresh + 1) &&
+                     m.xres         == curr->xres &&
+                     m.yres         == curr->yres &&
+                     m.pixclock     == curr->pixclock &&
+                     m.hsync_len    == curr->hsync_len &&
+                     m.vsync_len    == curr->vsync_len &&
+                     m.left_margin  == curr->left_margin &&
+                     m.right_margin == curr->right_margin &&
+                     m.upper_margin == curr->upper_margin &&
+                     m.lower_margin == curr->lower_margin &&
+                     m.sync         == curr->sync &&
+                     m.vmode        == curr->vmode))
                        continue;
 
                if (!best)