#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_VIDEO_DEFAULT_MODE;
+ 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))
/* screen type & face */
screen->type = SCREEN_HDMI;
- screen->color_mode = COLOR_YCBCR;
- if (hdmi->vic & HDMI_VIDEO_YUV420)
- screen->face = OUT_YUV_420;
+ if (hdmi->video.color_input == HDMI_COLOR_RGB_0_255)
+ screen->color_mode = COLOR_RGB;
else
- screen->face = hdmi_mode[i].interface;
+ screen->color_mode = COLOR_YCBCR;
+ 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
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;
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 =
}
}
}
- 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_VIDEO_DEFAULT_MODE;
- /*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:
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_VIDEO_DEFAULT_MODE;
-
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;
}
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;
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;
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
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_TMDS_600M) == 0 &&
- !(modelist->vic & HDMI_VIDEO_YUV420) &&
- hdmi_mode[i].mode.pixclock > 340000000 &&
- edid->maxtmdsclock < 340000000)
- continue;
if ((feature & SUPPORT_4K) == 0 &&
hdmi_mode[i].mode.xres >= 3840)
continue;
if ((feature & SUPPORT_4K_4096) == 0 &&
hdmi_mode[i].mode.xres == 4096)
continue;
+ if ((feature & SUPPORT_TMDS_600M) == 0 &&
+ !(modelist->vic & HDMI_VIDEO_YUV420) &&
+ hdmi_mode[i].mode.pixclock > 340000000)
+ continue;
if ((modelist->vic & HDMI_VIDEO_YUV420) &&
(feature & SUPPORT_YUV420) == 0)
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,
}
}
fb_destroy_modelist(head);
-
- edid->modelist = head_new;
- edid->modelist.prev->next = &edid->modelist;
+ if (head_new.next == &head_new) {
+ pr_info("There is no available video mode in EDID.\n");
+ INIT_LIST_HEAD(&edid->modelist);
+ } else {
+ edid->modelist = head_new;
+ edid->modelist.prev->next = &edid->modelist;
+ edid->modelist.next->prev = &edid->modelist;
+ }
}
/**
* 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;
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];
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;
}
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) ||
(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.
+ */
+ if (specs && specs->modedb_len) {
+ for (i = 0; i < specs->modedb_len; i++) {
+ modedb = &specs->modedb[i];
+ pixclock = hdmi_videomode_to_vic(modedb);
+ if (pixclock)
+ hdmi_add_vic(pixclock, head);
+ }
+ }
hdmi_sort_modelist(&hdmi->edid, hdmi->property->feature);
}
- hdmi_show_sink_info(hdmi);
- return HDMI_ERROR_SUCESS;
+ return HDMI_ERROR_SUCCESS;
}
/**
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 &&
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;
}
*/
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;
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;
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);
}
}