video: rockchip: hdmi: fix compile warning
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rockchip-hdmi-lcdc.c
index d737a852ae132700b15f808250da88e170cf812f..db6d0a4b6f31daf871b4fd9ecc886a5b425fe637 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))
@@ -54,24 +800,41 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
 
        /* screen type & face */
        screen->type = SCREEN_HDMI;
-       if (hdmi->colormode_input == HDMI_COLOR_RGB_0_255)
+       if (hdmi->video.color_input == HDMI_COLOR_RGB_0_255)
                screen->color_mode = COLOR_RGB;
        else
                screen->color_mode = COLOR_YCBCR;
-       if (hdmi->vic & HDMI_VIDEO_YUV420)
-               screen->face = OUT_YUV_420;
-       else
-               screen->face = hdmi_mode[i].interface;
+       if (hdmi->vic & HDMI_VIDEO_YUV420) {
+               if (hdmi->video.color_output_depth == 10)
+                       screen->face = OUT_YUV_420_10BIT;
+               else
+                       screen->face = OUT_YUV_420;
+       } else {
+               if (hdmi->video.color_output_depth == 10)
+                       screen->face = OUT_P101010;
+               else
+                       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) {
+               screen->mode.pixclock = 2 * mode->pixclock;
+               if (mode->vmode == 0) {
+                       screen->mode.yres = 2 * mode->yres +
+                                       mode->upper_margin +
+                                       mode->lower_margin +
+                                       mode->vsync_len;
+               } else {
+                       screen->mode.yres = 2 * mode->yres +
+                                           3 * (mode->upper_margin +
+                                                mode->lower_margin +
+                                                mode->vsync_len) + 2;
+                       screen->mode.vmode = 0;
+               }
+       }
        /* 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
@@ -80,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;
@@ -118,9 +882,9 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
 int hdmi_find_best_mode(struct hdmi *hdmi, int vic)
 {
        struct list_head *pos, *head = &hdmi->edid.modelist;
-       struct display_modelist *modelist;
+       struct display_modelist *modelist = NULL;
        int found = 0;
-/*     pr_info("%s vic %d\n", __FUNCTION__, vic); */
+
        if (vic) {
                list_for_each(pos, head) {
                        modelist =
@@ -132,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:
@@ -161,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;
 }
 
@@ -236,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;
 
@@ -278,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;
@@ -308,128 +1057,6 @@ static int hdmi_add_videomode(const struct fb_videomode *mode,
        return 0;
 }
 
-/**
- * hdmi_show_sink_info: show hdmi sink device infomation
- * @hdmi: handle of hdmi
- */
-static void hdmi_show_sink_info(struct hdmi *hdmi)
-{
-       struct list_head *pos, *head = &hdmi->edid.modelist;
-       struct display_modelist *modelist;
-       struct fb_videomode *m;
-       int i;
-       struct hdmi_audio *audio;
-
-       pr_info("******** Show Sink Info ********\n");
-       pr_info("Max tmds clk is %u\n", hdmi->edid.maxtmdsclock);
-       if (hdmi->edid.hf_vsdb_version)
-               pr_info("Support HFVSDB\n");
-       if (hdmi->edid.scdc_present)
-               pr_info("Support SCDC\n");
-       pr_info("Support video mode:\n");
-       list_for_each(pos, head) {
-               modelist = list_entry(pos, struct display_modelist, list);
-               m = &modelist->mode;
-               if (m->flag)
-                       pr_info("       %s(YCbCr420)\n", m->name);
-               else
-                       pr_info("       %s\n", m->name);
-       }
-       pr_info("Support video color mode:\n");
-       pr_info("       RGB\n");
-       if (hdmi->edid.ycbcr420)
-               pr_info("       YCbCr420\n");
-       if (hdmi->edid.ycbcr422)
-               pr_info("       YCbCr422\n");
-       if (hdmi->edid.ycbcr444)
-               pr_info("       YCbCr444\n");
-       pr_info("Support video color depth:\n");
-       pr_info("       24bit\n");
-       if (hdmi->edid.deepcolor & HDMI_DEEP_COLOR_30BITS)
-               pr_info("       30bit\n");
-       if (hdmi->edid.deepcolor & HDMI_DEEP_COLOR_36BITS)
-               pr_info("       36bit\n");
-       if (hdmi->edid.deepcolor & HDMI_DEEP_COLOR_48BITS)
-               pr_info("       48bit\n");
-
-       pr_info("Support audio type:\n");
-       for (i = 0; i < hdmi->edid.audio_num; i++) {
-               audio = &(hdmi->edid.audio[i]);
-               switch (audio->type) {
-               case HDMI_AUDIO_LPCM:
-                       pr_info("       LPCM\n");
-                       break;
-               case HDMI_AUDIO_AC3:
-                       pr_info("       AC3\n");
-                       break;
-               case HDMI_AUDIO_MPEG1:
-                       pr_info("       MPEG1\n");
-                       break;
-               case HDMI_AUDIO_MP3:
-                       pr_info("       MP3\n");
-                       break;
-               case HDMI_AUDIO_MPEG2:
-                       pr_info("       MPEG2\n");
-                       break;
-               case HDMI_AUDIO_AAC_LC:
-                       pr_info("S      AAC\n");
-                       break;
-               case HDMI_AUDIO_DTS:
-                       pr_info("       DTS\n");
-                       break;
-               case HDMI_AUDIO_ATARC:
-                       pr_info("       ATARC\n");
-                       break;
-               case HDMI_AUDIO_DSD:
-                       pr_info("       DSD\n");
-                       break;
-               case HDMI_AUDIO_E_AC3:
-                       pr_info("       E-AC3\n");
-                       break;
-               case HDMI_AUDIO_DTS_HD:
-                       pr_info("       DTS-HD\n");
-                       break;
-               case HDMI_AUDIO_MLP:
-                       pr_info("       MLP\n");
-                       break;
-               case HDMI_AUDIO_DST:
-                       pr_info("       DST\n");
-                       break;
-               case HDMI_AUDIO_WMA_PRO:
-                       pr_info("       WMP-PRO\n");
-                       break;
-               default:
-                       pr_info("       Unkown\n");
-                       break;
-               }
-               pr_info("Support max audio channel is %d\n", audio->channel);
-               pr_info("Support audio sample rate:\n");
-               if (audio->rate & HDMI_AUDIO_FS_32000)
-                       pr_info("       32000\n");
-               if (audio->rate & HDMI_AUDIO_FS_44100)
-                       pr_info("       44100\n");
-               if (audio->rate & HDMI_AUDIO_FS_48000)
-                       pr_info("       48000\n");
-               if (audio->rate & HDMI_AUDIO_FS_88200)
-                       pr_info("       88200\n");
-               if (audio->rate & HDMI_AUDIO_FS_96000)
-                       pr_info("       96000\n");
-               if (audio->rate & HDMI_AUDIO_FS_176400)
-                       pr_info("       176400\n");
-               if (audio->rate & HDMI_AUDIO_FS_192000)
-                       pr_info("       192000\n");
-               pr_info("Support audio word lenght:\n");
-               if (audio->rate & HDMI_AUDIO_WORD_LENGTH_16bit)
-                       pr_info("       16bit\n");
-               if (audio->rate & HDMI_AUDIO_WORD_LENGTH_20bit)
-                       pr_info("       20bit\n");
-               if (audio->rate & HDMI_AUDIO_WORD_LENGTH_24bit)
-                       pr_info("       24bit\n");
-               pr_info("\n");
-       }
-       pr_info("******** Show Sink Info ********\n");
-}
-
 /**
  * hdmi_sort_modelist: sort modelist of edid
  * @edid: edid to be sort
@@ -447,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 &&
@@ -465,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,
@@ -521,17 +1152,18 @@ 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)
 {
        struct list_head *head = &hdmi->edid.modelist;
        struct fb_monspecs *specs = hdmi->edid.specs;
        struct fb_videomode *modedb = NULL, *mode = NULL;
-       int i, pixclock;
+       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;
                hdmi->edid.baseaudio_support = 1;
                hdmi->edid.ycbcr444 = 0;
@@ -542,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];
@@ -557,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;
@@ -570,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) ||
@@ -580,20 +1213,41 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                                    (mode->yres > modedb->yres))
                                        continue;
                        } else {
-                               if (!(hdmi->property->feature & SUPPORT_4K) &&
-                                   mode->xres >= 3840)
-                                       continue;
-                               else if (mode->pixclock > 340000000)
+                               /* If there is no valid information in EDID,
+                                * just list common hdmi foramt.
+                                */
+                               if (mode->xres > 3840 ||
+                                   mode->refresh < 50 ||
+                                   (mode->vmode & FB_VMODE_INTERLACED) ||
+                                   hdmi_mode[i].vic & HDMI_VIDEO_DMT)
                                        continue;
                        }
+                       if ((feature & SUPPORT_TMDS_600M) == 0 &&
+                           mode->pixclock > 340000000)
+                               continue;
+                       if ((feature & SUPPORT_4K) == 0 &&
+                           mode->xres >= 3840)
+                               continue;
+                       if ((feature & SUPPORT_4K_4096) == 0 &&
+                           mode->xres == 4096)
+                               continue;
+                       if ((feature & SUPPORT_1080I) == 0 &&
+                           mode->xres == 1920 &&
+                           (mode->vmode & FB_VMODE_INTERLACED))
+                               continue;
+                       if ((feature & SUPPORT_480I_576I) == 0 &&
+                           mode->xres == 720 &&
+                           (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);
@@ -601,9 +1255,8 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok)
                }
                hdmi_sort_modelist(&hdmi->edid, hdmi->property->feature);
        }
-       hdmi_show_sink_info(hdmi);
 
-       return HDMI_ERROR_SUCESS;
+       return HDMI_ERROR_SUCCESS;
 }
 
 /**
@@ -614,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 &&
@@ -650,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;
 }
@@ -662,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;
@@ -690,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;
@@ -701,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);
        }
 }