video: rockchip: hdmi: v2: solve 480i/576i 10bit output abnormal
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rockchip-hdmi-lcdc.c
index d25e99e7b1422982399750311224851333a91c30..3fb7d689d66a48e004e397eb27fd53d86269f323 100644 (file)
 #include "rockchip-hdmi.h"
 
 static const struct hdmi_video_timing hdmi_mode[] = {
-/*             name                    refresh xres    yres    pixclock        h_bp    h_fp    v_bp    v_fp    h_pw    v_pw                    polariry                        PorI    flag            vic             2ndvic          pixelrepeat     interface */
-
-       { {     "720x480i@60Hz",        60,     720,    480,    27000000,       57,     19,     15,     4,      62,     3,                      0,                              1,      0       },      6,      HDMI_720X480I_60HZ_16_9,        2,      OUT_P888},
-       { {     "720x576i@50Hz",        50,     720,    576,    27000000,       69,     12,     19,     2,      63,     3,                      0,                              1,      0       },      21,     HDMI_720X576I_50HZ_16_9,        2,      OUT_P888},
-       { {     "720x480p@60Hz",        60,     720,    480,    27000000,       60,     16,     30,     9,      62,     6,                      0,                              0,      0       },      2,      HDMI_720X480P_60HZ_16_9,        1,      OUT_P888},
-       { {     "720x576p@50Hz",        50,     720,    576,    27000000,       68,     12,     39,     5,      64,     5,                      0,                              0,      0       },      17,     HDMI_720X576P_50HZ_16_9,        1,      OUT_P888},
-       { {     "1280x720p@24Hz",       24,     1280,   720,    59400000,       220,    1760,   20,     5,      40,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      60,     HDMI_1280X720P_24HZ_4_3,        1,      OUT_P888},
-       { {     "1280x720p@25Hz",       25,     1280,   720,    74250000,       220,    2420,   20,     5,      40,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      61,     HDMI_1280X720P_25HZ_4_3,        1,      OUT_P888},
-       { {     "1280x720p@30Hz",       30,     1280,   720,    74250000,       220,    1760,   20,     5,      40,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      62,     HDMI_1280X720P_30HZ_4_3,        1,      OUT_P888},
-       { {     "1280x720p@50Hz",       50,     1280,   720,    74250000,       220,    440,    20,     5,      40,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      19,     HDMI_1280X720P_50HZ_4_3,        1,      OUT_P888},
-       { {     "1280x720p@60Hz",       60,     1280,   720,    74250000,       220,    110,    20,     5,      40,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      4,      HDMI_1280X720P_60HZ_4_3,        1,      OUT_P888},
-       { {     "1920x1080i@50Hz",      50,     1920,   1080,   74250000,       148,    528,    15,     2,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   1,      0       },      20,     0,                              1,      OUT_P888},
-       { {     "1920x1080i@60Hz",      60,     1920,   1080,   74250000,       148,    88,     15,     2,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   1,      0       },      5,      0,                              1,      OUT_P888},
-       { {     "1920x1080p@24Hz",      24,     1920,   1080,   74250000,       148,    638,    36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      32,     HDMI_1920X1080P_24HZ_4_3,       1,      OUT_P888},
-       { {     "1920x1080p@25Hz",      25,     1920,   1080,   74250000,       148,    528,    36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      33,     HDMI_1920X1080P_25HZ_4_3,       1,      OUT_P888},
-       { {     "1920x1080p@30Hz",      30,     1920,   1080,   74250000,       148,    88,     36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      34,     HDMI_1920X1080P_30HZ_4_3,       1,      OUT_P888},
-       { {     "1920x1080p@50Hz",      50,     1920,   1080,   148500000,      148,    528,    36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      31,     HDMI_1920X1080P_50HZ_4_3,       1,      OUT_P888},
-       { {     "1920x1080p@60Hz",      60,     1920,   1080,   148500000,      148,    88,     36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      16,     HDMI_1920X1080P_60HZ_4_3,       1,      OUT_P888},
-       { {     "3840x2160p@24Hz",      24,     3840,   2160,   297000000,      296,    1276,   72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      93,     HDMI_3840X2160P_24HZ_4_3,       1,      OUT_P888},
-       { {     "3840x2160p@25Hz",      25,     3840,   2160,   297000000,      296,    1056,   72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      94,     HDMI_3840X2160P_25HZ_4_3,       1,      OUT_P888},
-       { {     "3840x2160p@30Hz",      30,     3840,   2160,   297000000,      296,    176,    72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      95,     HDMI_3840X2160P_30HZ_4_3,       1,      OUT_P888},
-       { {     "4096x2160p@24Hz",      24,     4096,   2160,   297000000,      296,    1020,   72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      98,     0,                              1,      OUT_P888},
-       { {     "4096x2160p@25Hz",      25,     4096,   2160,   297000000,      128,    968,    72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      99,     0,                              1,      OUT_P888},
-       { {     "4096x2160p@30Hz",      30,     4096,   2160,   297000000,      128,    88,     72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      100,    0,                              1,      OUT_P888},
-       { {     "3840x2160p@50Hz",      50,     3840,   2160,   594000000,      296,    1056,   72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      96,     HDMI_3840X2160P_50HZ_4_3,       1,      OUT_P888},
-       { {     "3840x2160p@60Hz",      60,     3840,   2160,   594000000,      296,    176,    72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      97,     HDMI_3840X2160P_60HZ_4_3,       1,      OUT_P888},
-       { {     "4096x2160p@50Hz",      50,     4096,   2160,   594000000,      128,    968,    72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      101,    0,                              1,      OUT_P888},
-       { {     "4096x2160p@60Hz",      60,     4096,   2160,   594000000,      128,    88,     72,     8,      88,     10,     FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      0       },      102,    0,                              1,      OUT_P888},
+       {
+               .mode = {
+                       .name = "720x480i@60Hz",
+                       .refresh = 60,
+                       .xres = 720,
+                       .yres = 480,
+                       .pixclock = 27000000,
+                       .left_margin = 57,
+                       .right_margin = 19,
+                       .upper_margin = 15,
+                       .lower_margin = 4,
+                       .hsync_len = 62,
+                       .vsync_len = 3,
+                       .sync = 0,
+                       .vmode = FB_VMODE_INTERLACED,
+                       .flag = 0,
+               },
+               .vic = HDMI_720X480I_60HZ_4_3,
+               .vic_2nd = HDMI_720X480I_60HZ_16_9,
+               .pixelrepeat = 2,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "720x576i@50Hz",
+                       .refresh = 50,
+                       .xres = 720,
+                       .yres = 576,
+                       .pixclock = 27000000,
+                       .left_margin = 69,
+                       .right_margin = 12,
+                       .upper_margin = 19,
+                       .lower_margin = 2,
+                       .hsync_len = 63,
+                       .vsync_len = 3,
+                       .sync = 0,
+                       .vmode = FB_VMODE_INTERLACED,
+                       .flag = 0,
+               },
+               .vic = HDMI_720X576I_50HZ_4_3,
+               .vic_2nd = HDMI_720X576I_50HZ_16_9,
+               .pixelrepeat = 2,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "720x480p@60Hz",
+                       .refresh = 60,
+                       .xres = 720,
+                       .yres = 480,
+                       .pixclock = 27000000,
+                       .left_margin = 60,
+                       .right_margin = 16,
+                       .upper_margin = 30,
+                       .lower_margin = 9,
+                       .hsync_len = 62,
+                       .vsync_len = 6,
+                       .sync = 0,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_720X480P_60HZ_4_3,
+               .vic_2nd = HDMI_720X480P_60HZ_16_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "720x576p@50Hz",
+                       .refresh = 50,
+                       .xres = 720,
+                       .yres = 576,
+                       .pixclock = 27000000,
+                       .left_margin = 68,
+                       .right_margin = 12,
+                       .upper_margin = 39,
+                       .lower_margin = 5,
+                       .hsync_len = 64,
+                       .vsync_len = 5,
+                       .sync = 0,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_720X576P_50HZ_4_3,
+               .vic_2nd = HDMI_720X576P_50HZ_16_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x720p@24Hz",
+                       .refresh = 24,
+                       .xres = 1280,
+                       .yres = 720,
+                       .pixclock = 59400000,
+                       .left_margin = 220,
+                       .right_margin = 1760,
+                       .upper_margin = 20,
+                       .lower_margin = 5,
+                       .hsync_len = 40,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1280X720P_24HZ,
+               .vic_2nd = HDMI_1280X720P_24HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x720p@25Hz",
+                       .refresh = 25,
+                       .xres = 1280,
+                       .yres = 720,
+                       .pixclock = 74250000,
+                       .left_margin = 220,
+                       .right_margin = 2420,
+                       .upper_margin = 20,
+                       .lower_margin = 5,
+                       .hsync_len = 40,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1280X720P_25HZ,
+               .vic_2nd = HDMI_1280X720P_25HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x720p@30Hz",
+                       .refresh = 30,
+                       .xres = 1280,
+                       .yres = 720,
+                       .pixclock = 74250000,
+                       .left_margin = 220,
+                       .right_margin = 1760,
+                       .upper_margin = 20,
+                       .lower_margin = 5,
+                       .hsync_len = 40,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1280X720P_30HZ,
+               .vic_2nd = HDMI_1280X720P_30HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x720p@50Hz",
+                       .refresh = 50,
+                       .xres = 1280,
+                       .yres = 720,
+                       .pixclock = 74250000,
+                       .left_margin = 220,
+                       .right_margin = 440,
+                       .upper_margin = 20,
+                       .lower_margin = 5,
+                       .hsync_len = 40,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1280X720P_50HZ,
+               .vic_2nd = HDMI_1280X720P_50HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x720p@60Hz",
+                       .refresh = 60,
+                       .xres = 1280,
+                       .yres = 720,
+                       .pixclock = 74250000,
+                       .left_margin = 220,
+                       .right_margin = 110,
+                       .upper_margin = 20,
+                       .lower_margin = 5,
+                       .hsync_len = 40,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1280X720P_60HZ,
+               .vic_2nd = HDMI_1280X720P_60HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080i@50Hz",
+                       .refresh = 50,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 74250000,
+                       .left_margin = 148,
+                       .right_margin = 528,
+                       .upper_margin = 15,
+                       .lower_margin = 2,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = FB_VMODE_INTERLACED,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080I_50HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080i@60Hz",
+                       .refresh = 60,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 74250000,
+                       .left_margin = 148,
+                       .right_margin = 88,
+                       .upper_margin = 15,
+                       .lower_margin = 2,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = FB_VMODE_INTERLACED,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080I_60HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080p@24Hz",
+                       .refresh = 24,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 74250000,
+                       .left_margin = 148,
+                       .right_margin = 638,
+                       .upper_margin = 36,
+                       .lower_margin = 4,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080P_24HZ,
+               .vic_2nd = HDMI_1920X1080P_24HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080p@25Hz",
+                       .refresh = 25,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 74250000,
+                       .left_margin = 148,
+                       .right_margin = 528,
+                       .upper_margin = 36,
+                       .lower_margin = 4,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080P_25HZ,
+               .vic_2nd = HDMI_1920X1080P_25HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080p@30Hz",
+                       .refresh = 30,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 74250000,
+                       .left_margin = 148,
+                       .right_margin = 88,
+                       .upper_margin = 36,
+                       .lower_margin = 4,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080P_30HZ,
+               .vic_2nd = HDMI_1920X1080P_30HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080p@50Hz",
+                       .refresh = 50,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 148500000,
+                       .left_margin = 148,
+                       .right_margin = 528,
+                       .upper_margin = 36,
+                       .lower_margin = 4,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080P_50HZ,
+               .vic_2nd = HDMI_1920X1080P_50HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1920x1080p@60Hz",
+                       .refresh = 60,
+                       .xres = 1920,
+                       .yres = 1080,
+                       .pixclock = 148500000,
+                       .left_margin = 148,
+                       .right_margin = 88,
+                       .upper_margin = 36,
+                       .lower_margin = 4,
+                       .hsync_len = 44,
+                       .vsync_len = 5,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_1920X1080P_60HZ,
+               .vic_2nd = HDMI_1920X1080P_60HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "3840x2160p@24Hz",
+                       .refresh = 24,
+                       .xres = 3840,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 296,
+                       .right_margin = 1276,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_3840X2160P_24HZ,
+               .vic_2nd = HDMI_3840X2160P_24HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "3840x2160p@25Hz",
+                       .refresh = 25,
+                       .xres = 3840,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 296,
+                       .right_margin = 1056,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_3840X2160P_25HZ,
+               .vic_2nd = HDMI_3840X2160P_25HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "3840x2160p@30Hz",
+                       .refresh = 30,
+                       .xres = 3840,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 296,
+                       .right_margin = 176,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_3840X2160P_30HZ,
+               .vic_2nd = HDMI_3840X2160P_30HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "4096x2160p@24Hz",
+                       .refresh = 24,
+                       .xres = 4096,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 296,
+                       .right_margin = 1020,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_4096X2160P_24HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "4096x2160p@25Hz",
+                       .refresh = 25,
+                       .xres = 4096,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 128,
+                       .right_margin = 968,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_4096X2160P_25HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "4096x2160p@30Hz",
+                       .refresh = 30,
+                       .xres = 4096,
+                       .yres = 2160,
+                       .pixclock = 297000000,
+                       .left_margin = 128,
+                       .right_margin = 88,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_4096X2160P_30HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "3840x2160p@50Hz",
+                       .refresh = 50,
+                       .xres = 3840,
+                       .yres = 2160,
+                       .pixclock = 594000000,
+                       .left_margin = 296,
+                       .right_margin = 1056,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_3840X2160P_50HZ,
+               .vic_2nd = HDMI_3840X2160P_50HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "3840x2160p@60Hz",
+                       .refresh = 60,
+                       .xres = 3840,
+                       .yres = 2160,
+                       .pixclock = 594000000,
+                       .left_margin = 296,
+                       .right_margin = 176,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_3840X2160P_60HZ,
+               .vic_2nd = HDMI_3840X2160P_60HZ_21_9,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "4096x2160p@50Hz",
+                       .refresh = 50,
+                       .xres = 4096,
+                       .yres = 2160,
+                       .pixclock = 594000000,
+                       .left_margin = 128,
+                       .right_margin = 968,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_4096X2160P_50HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "4096x2160p@60Hz",
+                       .refresh = 60,
+                       .xres = 4096,
+                       .yres = 2160,
+                       .pixclock = 594000000,
+                       .left_margin = 128,
+                       .right_margin = 88,
+                       .upper_margin = 72,
+                       .lower_margin = 8,
+                       .hsync_len = 88,
+                       .vsync_len = 10,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_4096X2160P_60HZ,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "800x600p@60Hz",
+                       .refresh = 60,
+                       .xres = 800,
+                       .yres = 600,
+                       .pixclock = 40000000,
+                       .left_margin = 88,
+                       .right_margin = 40,
+                       .upper_margin = 23,
+                       .lower_margin = 1,
+                       .hsync_len = 128,
+                       .vsync_len = 4,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 1,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1024x768p@60Hz",
+                       .refresh = 60,
+                       .xres = 1024,
+                       .yres = 768,
+                       .pixclock = 65000000,
+                       .left_margin = 160,
+                       .right_margin = 24,
+                       .upper_margin = 29,
+                       .lower_margin = 3,
+                       .hsync_len = 136,
+                       .vsync_len = 6,
+                       .sync = 0,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 2,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x960p@60Hz",
+                       .refresh = 60,
+                       .xres = 1280,
+                       .yres = 960,
+                       .pixclock = 108000000,
+                       .left_margin = 312,
+                       .right_margin = 96,
+                       .upper_margin = 36,
+                       .lower_margin = 1,
+                       .hsync_len = 112,
+                       .vsync_len = 3,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 3,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1280x1024p@60Hz",
+                       .refresh = 60,
+                       .xres = 1280,
+                       .yres = 1024,
+                       .pixclock = 108000000,
+                       .left_margin = 248,
+                       .right_margin = 48,
+                       .upper_margin = 38,
+                       .lower_margin = 1,
+                       .hsync_len = 112,
+                       .vsync_len = 3,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 4,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1360x768p@60Hz",
+                       .refresh = 60,
+                       .xres = 1360,
+                       .yres = 768,
+                       .pixclock = 85500000,
+                       .left_margin = 256,
+                       .right_margin = 64,
+                       .upper_margin = 18,
+                       .lower_margin = 3,
+                       .hsync_len = 112,
+                       .vsync_len = 6,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 5,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1366x768p@60Hz",
+                       .refresh = 60,
+                       .xres = 1366,
+                       .yres = 768,
+                       .pixclock = 85500000,
+                       .left_margin = 213,
+                       .right_margin = 70,
+                       .upper_margin = 24,
+                       .lower_margin = 3,
+                       .hsync_len = 143,
+                       .vsync_len = 3,
+                       .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 6,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1440x900p@60Hz",
+                       .refresh = 60,
+                       .xres = 1440,
+                       .yres = 768,
+                       .pixclock = 106500000,
+                       .left_margin = 232,
+                       .right_margin = 80,
+                       .upper_margin = 25,
+                       .lower_margin = 3,
+                       .hsync_len = 152,
+                       .vsync_len = 6,
+                       .sync = FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 7,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1600x900p@60Hz",
+                       .refresh = 60,
+                       .xres = 1600,
+                       .yres = 900,
+                       .pixclock = 108000000,
+                       .left_margin = 96,
+                       .right_margin = 24,
+                       .upper_margin = 96,
+                       .lower_margin = 1,
+                       .hsync_len = 80,
+                       .vsync_len = 3,
+                       .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 8,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
+       {
+               .mode = {
+                       .name = "1680x1050@60Hz",
+                       .refresh = 60,
+                       .xres = 1680,
+                       .yres = 1050,
+                       .pixclock = 146250000,
+                       .left_margin = 280,
+                       .right_margin = 104,
+                       .upper_margin = 30,
+                       .lower_margin = 3,
+                       .hsync_len = 176,
+                       .vsync_len = 6,
+                       .sync = FB_SYNC_VERT_HIGH_ACT,
+                       .vmode = 0,
+                       .flag = 0,
+               },
+               .vic = HDMI_VIDEO_DMT | 9,
+               .vic_2nd = 0,
+               .pixelrepeat = 1,
+               .interface = OUT_P888,
+       },
 };
 
 static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
 {
-       int i;
+       int i, vic;
        struct fb_videomode *mode;
 
-       if (screen == NULL || hdmi == NULL)
+       if (!screen || !hdmi)
                return HDMI_ERROR_FALSE;
 
        if (hdmi->vic == 0)
                hdmi->vic = hdmi->property->defaultmode;
 
+       if (hdmi->vic & HDMI_VIDEO_DMT)
+               vic = hdmi->vic;
+       else
+               vic = hdmi->vic & HDMI_VIC_MASK;
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-               if (hdmi_mode[i].vic == (hdmi->vic & HDMI_VIC_MASK) ||
-                   hdmi_mode[i].vic_2nd == (hdmi->vic & HDMI_VIC_MASK))
+               if (hdmi_mode[i].vic == vic ||
+                   hdmi_mode[i].vic_2nd == vic)
                        break;
        }
        if (i == ARRAY_SIZE(hdmi_mode))
@@ -70,7 +816,7 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
                        screen->face = hdmi_mode[i].interface;
        }
        screen->pixelrepeat = hdmi_mode[i].pixelrepeat - 1;
-       mode = (struct fb_videomode *)&(hdmi_mode[i].mode);
+       mode = (struct fb_videomode *)&hdmi_mode[i].mode;
 
        screen->mode = *mode;
        if (hdmi->video.format_3d == HDMI_3D_FRAME_PACKING) {
@@ -89,10 +835,6 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
                }
        }
        /* Pin polarity */
-       #ifdef CONFIG_HDMI_RK616
-       screen->pin_hsync = 0;
-       screen->pin_vsync = 0;
-       #else
        if (FB_SYNC_HOR_HIGH_ACT & mode->sync)
                screen->pin_hsync = 1;
        else
@@ -101,14 +843,15 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
                screen->pin_vsync = 1;
        else
                screen->pin_vsync = 0;
-       #endif
+
        screen->pin_den = 0;
        screen->pin_dclk = 1;
 
        /* Swap rule */
-       if (hdmi->soctype == HDMI_SOC_RK3368 &&
-           screen->color_mode == COLOR_YCBCR &&
-           screen->face == OUT_P888)
+       if (hdmi->soctype > HDMI_SOC_RK312X &&
+           screen->color_mode > COLOR_RGB &&
+           (screen->face == OUT_P888 ||
+            screen->face == OUT_P101010))
                screen->swap_rb = 1;
        else
                screen->swap_rb = 0;
@@ -141,7 +884,7 @@ int hdmi_find_best_mode(struct hdmi *hdmi, int vic)
        struct list_head *pos, *head = &hdmi->edid.modelist;
        struct display_modelist *modelist;
        int found = 0;
-/*     pr_info("%s vic %d\n", __FUNCTION__, vic); */
+
        if (vic) {
                list_for_each(pos, head) {
                        modelist =
@@ -153,23 +896,22 @@ int hdmi_find_best_mode(struct hdmi *hdmi, int vic)
                        }
                }
        }
-       if ((vic == 0 || found == 0) && head->next != head) {
+       if ((!vic || !found) && head->next != head) {
                /* If parse edid error, we select default mode; */
-               if (hdmi->edid.specs == NULL ||
-                   hdmi->edid.specs->modedb_len == 0)
-                       return hdmi->property->defaultmode;
-                       /*modelist = list_entry(head->prev,
-                                       struct display_modelist, list);*/
-               else
+               if (hdmi->edid.specs &&
+                   hdmi->edid.specs->modedb_len)
                        modelist = list_entry(head->next,
                                              struct display_modelist, list);
+               else
+                       return hdmi->property->defaultmode;
        }
 
-       if (modelist != NULL)
+       if (modelist)
                return modelist->vic;
        else
                return 0;
 }
+
 /**
  * hdmi_set_lcdc: switch lcdc mode to required video mode
  * @hdmi:
@@ -182,23 +924,9 @@ int hdmi_set_lcdc(struct hdmi *hdmi)
        int rc = 0;
        struct rk_screen screen;
 
-       if (hdmi->autoset)
-               hdmi->vic = hdmi_find_best_mode(hdmi, 0);
-       else
-               hdmi->vic = hdmi_find_best_mode(hdmi, hdmi->vic);
-
-       if (hdmi->vic == 0)
-               hdmi->vic = hdmi->property->defaultmode;
-
        rc = hdmi_set_info(&screen, hdmi);
-
-       if (rc == 0) {
+       if (!rc)
                rk_fb_switch_screen(&screen, 1, hdmi->lcdc->id);
-/*             if (rk_fb_get_display_policy() != DISPLAY_POLICY_BOX)
-                       rk_fb_disp_scale(hdmi->xscale,
-                                        hdmi->yscale,
-                                        hdmi->lcdc->id);
-*/     }
        return rc;
 }
 
@@ -257,7 +985,7 @@ int hdmi_add_vic(int vic, struct list_head *head)
        struct display_modelist *modelist;
        int found = 0, v;
 
-/*     DBG("%s vic %d", __FUNCTION__, vic); */
+       /*pr_info("%s vic %d\n", __FUNCTION__, vic);*/
        if (vic == 0)
                return -1;
 
@@ -299,7 +1027,7 @@ static int hdmi_add_videomode(const struct fb_videomode *mode,
        int i, found = 0;
 
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-               m = (struct fb_videomode *)&(hdmi_mode[i].mode);
+               m = (struct fb_videomode *)&hdmi_mode[i].mode;
                if (fb_mode_is_equal(m, mode)) {
                        found = 1;
                        break;
@@ -346,7 +1074,14 @@ static void hdmi_sort_modelist(struct hdmi_edid *edid, int feature)
                modelist = list_entry(pos, struct display_modelist, list);
                /*pr_info("%s vic %d\n", __function__, modelist->vic);*/
                for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-                       vic = modelist->vic & HDMI_VIC_MASK;
+                       if (modelist->vic & HDMI_VIDEO_DMT) {
+                               if (feature & SUPPORT_VESA_DMT)
+                                       vic = modelist->vic;
+                               else
+                                       continue;
+                       } else {
+                               vic = modelist->vic & HDMI_VIC_MASK;
+                       }
                        if (vic == hdmi_mode[i].vic ||
                            vic == hdmi_mode[i].vic_2nd) {
                                if ((feature & SUPPORT_4K) == 0 &&
@@ -364,23 +1099,20 @@ static void hdmi_sort_modelist(struct hdmi_edid *edid, int feature)
                                        continue;
                                if ((feature & SUPPORT_1080I) == 0 &&
                                    hdmi_mode[i].mode.xres == 1920 &&
-                                   hdmi_mode[i].mode.vmode ==
-                                   FB_VMODE_INTERLACED)
+                                   (hdmi_mode[i].mode.vmode &
+                                    FB_VMODE_INTERLACED))
                                        continue;
                                if ((feature & SUPPORT_480I_576I) == 0 &&
                                    hdmi_mode[i].mode.xres == 720 &&
-                                   hdmi_mode[i].mode.vmode ==
-                                   FB_VMODE_INTERLACED)
+                                   hdmi_mode[i].mode.vmode &
+                                    FB_VMODE_INTERLACED)
                                        continue;
-                               vic = modelist->vic;
-                               modelist->vic = hdmi_mode[i].vic;
                                modelist->mode = hdmi_mode[i].mode;
-                               if (vic & HDMI_VIDEO_YUV420) {
-                                       modelist->vic |= HDMI_VIDEO_YUV420;
+                               if (modelist->vic & HDMI_VIDEO_YUV420)
                                        modelist->mode.flag = 1;
-                               }
+
                                compare = 1;
-                               m = (struct fb_videomode *)&(modelist->mode);
+                               m = (struct fb_videomode *)&modelist->mode;
                                list_for_each(pos_new, &head_new) {
                                        modelist_new =
                                        list_entry(pos_new,
@@ -420,7 +1152,7 @@ static void hdmi_sort_modelist(struct hdmi_edid *edid, int feature)
 /**
  * hdmi_ouputmode_select - select hdmi transmitter output mode: hdmi or dvi?
  * @hdmi: handle of hdmi
- * @edid_ok: get EDID data success or not, HDMI_ERROR_SUCESS means success.
+ * @edid_ok: get EDID data success or not, HDMI_ERROR_SUCCESS means success.
  */
 int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
 {
@@ -429,7 +1161,7 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
        struct fb_videomode *modedb = NULL, *mode = NULL;
        int i, pixclock, feature = hdmi->property->feature;
 
-       if (edid_ok != HDMI_ERROR_SUCESS) {
+       if (edid_ok != HDMI_ERROR_SUCCESS) {
                dev_err(hdmi->dev, "warning: EDID error, assume sink as HDMI !!!!");
                hdmi->edid.status = -1;
                hdmi->edid.sink_hdmi = 1;
@@ -442,9 +1174,9 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                dev_info(hdmi->dev,
                         "warning: no CEA video mode parsed from EDID !!!!\n");
                /* If EDID get error, list all system supported mode.
-                  If output mode is set to DVI and EDID is ok, check
-                  the output timing.
-               */
+                * If output mode is set to DVI and EDID is ok, check
+                * the output timing.
+                */
                if (hdmi->edid.sink_hdmi == 0 && specs && specs->modedb_len) {
                        /* Get max resolution timing */
                        modedb = &specs->modedb[0];
@@ -457,8 +1189,9 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                                        modedb = &specs->modedb[i];
                        }
                        /* For some monitor, the max pixclock read from EDID
-                          is smaller than the clock of max resolution mode
-                          supported. We fix it. */
+                        * is smaller than the clock of max resolution mode
+                        * supported. We fix it.
+                        */
                        pixclock = PICOS2KHZ(modedb->pixclock);
                        pixclock /= 250;
                        pixclock *= 250;
@@ -470,7 +1203,7 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                }
 
                for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-                       mode = (struct fb_videomode *)&(hdmi_mode[i].mode);
+                       mode = (struct fb_videomode *)&hdmi_mode[i].mode;
                        if (modedb) {
                                if ((mode->pixclock < specs->dclkmin) ||
                                    (mode->pixclock > specs->dclkmax) ||
@@ -481,10 +1214,12 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                                        continue;
                        } else {
                                /* If there is no valid information in EDID,
-                                  just list common hdmi foramt. */
+                                * just list common hdmi foramt.
+                                */
                                if (mode->xres > 3840 ||
                                    mode->refresh < 50 ||
-                                   mode->vmode == FB_VMODE_INTERLACED)
+                                   (mode->vmode & FB_VMODE_INTERLACED) ||
+                                   hdmi_mode[i].vic & HDMI_VIDEO_DMT)
                                        continue;
                        }
                        if ((feature & SUPPORT_TMDS_600M) == 0 &&
@@ -498,20 +1233,21 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                                continue;
                        if ((feature & SUPPORT_1080I) == 0 &&
                            mode->xres == 1920 &&
-                           mode->vmode == FB_VMODE_INTERLACED)
+                           (mode->vmode & FB_VMODE_INTERLACED))
                                continue;
                        if ((feature & SUPPORT_480I_576I) == 0 &&
                            mode->xres == 720 &&
-                           mode->vmode == FB_VMODE_INTERLACED)
+                           (mode->vmode & FB_VMODE_INTERLACED))
                                continue;
                        hdmi_add_videomode(mode, head);
                }
        } else {
                /* There are some video mode is not defined in EDID extend
-                  block, so we need to check first block data.*/
+                * block, so we need to check first block data.
+                */
                if (specs && specs->modedb_len) {
                        for (i = 0; i < specs->modedb_len; i++) {
-                               modedb = &specs->modedb[0];
+                               modedb = &specs->modedb[i];
                                pixclock = hdmi_videomode_to_vic(modedb);
                                if (pixclock)
                                        hdmi_add_vic(pixclock, head);
@@ -520,7 +1256,7 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                hdmi_sort_modelist(&hdmi->edid, hdmi->property->feature);
        }
 
-       return HDMI_ERROR_SUCESS;
+       return HDMI_ERROR_SUCCESS;
 }
 
 /**
@@ -531,11 +1267,11 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
 int hdmi_videomode_to_vic(struct fb_videomode *vmode)
 {
        struct fb_videomode *mode;
-       unsigned char vic = 0;
+       unsigned int vic = 0;
        int i = 0;
 
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-               mode = (struct fb_videomode *)&(hdmi_mode[i].mode);
+               mode = (struct fb_videomode *)&hdmi_mode[i].mode;
                if (vmode->vmode == mode->vmode &&
                    vmode->refresh == mode->refresh &&
                    vmode->xres == mode->xres &&
@@ -567,7 +1303,7 @@ const struct hdmi_video_timing *hdmi_vic2timing(int vic)
 
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
                if (hdmi_mode[i].vic == vic || hdmi_mode[i].vic_2nd == vic)
-                       return &(hdmi_mode[i]);
+                       return &hdmi_mode[i];
        }
        return NULL;
 }
@@ -579,14 +1315,17 @@ const struct hdmi_video_timing *hdmi_vic2timing(int vic)
  */
 const struct fb_videomode *hdmi_vic_to_videomode(int vic)
 {
-       int i;
+       int i, vid;
 
        if (vic == 0)
                return NULL;
-
+       else if (vic & HDMI_VIDEO_DMT)
+               vid = vic;
+       else
+               vid = vic & HDMI_VIC_MASK;
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
-               if (hdmi_mode[i].vic == (vic & HDMI_VIC_MASK) ||
-                   hdmi_mode[i].vic_2nd == (vic & HDMI_VIC_MASK))
+               if (hdmi_mode[i].vic == vid ||
+                   hdmi_mode[i].vic_2nd == vid)
                        return &hdmi_mode[i].mode;
        }
        return NULL;
@@ -607,6 +1346,8 @@ void hdmi_init_modelist(struct hdmi *hdmi)
        feature = hdmi->property->feature;
        INIT_LIST_HEAD(&hdmi->edid.modelist);
        for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) {
+               if (hdmi_mode[i].vic & HDMI_VIDEO_DMT)
+                       continue;
                if ((feature & SUPPORT_TMDS_600M) == 0 &&
                    hdmi_mode[i].mode.pixclock > 340000000)
                        continue;
@@ -618,12 +1359,12 @@ void hdmi_init_modelist(struct hdmi *hdmi)
                        continue;
                if ((feature & SUPPORT_1080I) == 0 &&
                    hdmi_mode[i].mode.xres == 1920 &&
-                   hdmi_mode[i].mode.vmode == FB_VMODE_INTERLACED)
+                   (hdmi_mode[i].mode.vmode & FB_VMODE_INTERLACED))
                        continue;
                if ((feature & SUPPORT_480I_576I) == 0 &&
                    hdmi_mode[i].mode.xres == 720 &&
-                   hdmi_mode[i].mode.vmode == FB_VMODE_INTERLACED)
+                   (hdmi_mode[i].mode.vmode & FB_VMODE_INTERLACED))
                        continue;
-               hdmi_add_videomode(&(hdmi_mode[i].mode), head);
+               hdmi_add_videomode(&hdmi_mode[i].mode, head);
        }
 }