video: fbmon: identify cea vic modes
[linux-3.10.git] / drivers / video / fbmon.c
index 7aeb532..9c975bb 100644 (file)
@@ -562,6 +562,8 @@ static int get_dst_timing(unsigned char *block,
 static void get_detailed_timing(unsigned char *block,
                                struct fb_videomode *mode)
 {
+       int i;
+       int cea_vic;
        int v_size = V_SIZE;
        int h_size = H_SIZE;
 
@@ -592,6 +594,7 @@ static void get_detailed_timing(unsigned char *block,
                mode->vmode |= FB_VMODE_INTERLACED;
        }
        mode->flag = FB_MODE_IS_DETAILED;
+       mode->vmode |= FB_VMODE_IS_DETAILED;
 
        /* get aspect ratio */
        if (h_size * 18 > v_size * 31 && h_size * 18 < v_size * 33)
@@ -599,14 +602,28 @@ static void get_detailed_timing(unsigned char *block,
        if (h_size * 18 > v_size * 23 && h_size * 18 < v_size * 25)
                mode->flag |= FB_FLAG_RATIO_4_3;
 
+       /* Find if it is a CEA mode */
+       /* TODO: optimize search, for now start from top */
+       cea_vic = 0;
+       for (i = CEA_MODEDB_SIZE - 1; i > 0; i--) {
+               if (fb_mode_is_equal(cea_modes + i, mode)) {
+                       mode->vmode |= FB_VMODE_IS_CEA;
+                       cea_vic = i;
+                       break;
+               }
+       }
+
        DPRINTK("      %d MHz ",  PIXEL_CLOCK/1000000);
        DPRINTK("%d %d %d %d ", H_ACTIVE, H_ACTIVE + H_SYNC_OFFSET,
               H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH, H_ACTIVE + H_BLANKING);
        DPRINTK("%d %d %d %d ", V_ACTIVE, V_ACTIVE + V_SYNC_OFFSET,
               V_ACTIVE + V_SYNC_OFFSET + V_SYNC_WIDTH, V_ACTIVE + V_BLANKING);
        DPRINTK("%dmm %dmm ", H_SIZE, V_SIZE);
-       DPRINTK("%sHSync %sVSync\n\n", (HSYNC_POSITIVE) ? "+" : "-",
+       DPRINTK("%sHSync %sVSync ", (HSYNC_POSITIVE) ? "+" : "-",
               (VSYNC_POSITIVE) ? "+" : "-");
+       if (cea_vic)
+               DPRINTK("CEA %d", cea_vic);
+       DPRINTK("\n\n");
 }
 
 /**
@@ -1197,6 +1214,7 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs)
                        pr_warning("Reserved SVD code %d\n", idx);
                } else {
                        memcpy(&m[i], cea_modes + idx, sizeof(m[i]));
+                       m[i].vmode |= FB_VMODE_IS_CEA;
                        if (y420_support_full)
                                m[i].vmode |= FB_VMODE_Y420;
                        else {
@@ -1233,6 +1251,7 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs)
                        pr_warn("Reserved SVD code %d\n", idx);
                } else {
                        memcpy(&m[i], cea_modes + idx, sizeof(m[i]));
+                       m[i].vmode |= FB_VMODE_IS_CEA;
                        m[i].vmode |= FB_VMODE_Y420_ONLY;
                        pr_debug("Adding SVD #%d: %ux%u@%u\n", idx,
                                 m[i].xres, m[i].yres, m[i].refresh);