]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/exynos: add HDMI version 1.4 support
authorJoonyoung Shim <jy0922.shim@samsung.com>
Fri, 16 Mar 2012 09:47:03 +0000 (18:47 +0900)
committerDave Airlie <airlied@redhat.com>
Tue, 20 Mar 2012 09:40:20 +0000 (09:40 +0000)
Later Exynos series from Exynos4X12 support HDMI version 1.4. We will
distinguish to use which version via platform data. This patch supports
only default features of HDMI version 1.4(The 3D, sound and etc don't
support yet)

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_hdmi.h
drivers/gpu/drm/exynos/regs-hdmi.h
include/drm/exynos_drm.h

index 3429d3fd93f3265d31cb3cad101b87eccc74964d..1cfe86e5d10ea427c0a35e691ca9232a20f6a439 100644 (file)
 #define HDMI_OVERLAY_NUMBER    3
 #define get_hdmi_context(dev)  platform_get_drvdata(to_platform_device(dev))
 
-static const u8 hdmiphy_conf27[32] = {
+/* HDMI Version 1.3 */
+static const u8 hdmiphy_v13_conf27[32] = {
        0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
        0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
        0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
 };
 
-static const u8 hdmiphy_conf27_027[32] = {
+static const u8 hdmiphy_v13_conf27_027[32] = {
        0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
        0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
        0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
 };
 
-static const u8 hdmiphy_conf74_175[32] = {
+static const u8 hdmiphy_v13_conf74_175[32] = {
        0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
        0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
        0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
 };
 
-static const u8 hdmiphy_conf74_25[32] = {
+static const u8 hdmiphy_v13_conf74_25[32] = {
        0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
        0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
        0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
        0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
 };
 
-static const u8 hdmiphy_conf148_5[32] = {
+static const u8 hdmiphy_v13_conf148_5[32] = {
        0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
        0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
        0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
        0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
 };
 
-struct hdmi_tg_regs {
+struct hdmi_v13_tg_regs {
        u8 cmd;
        u8 h_fsz_l;
        u8 h_fsz_h;
@@ -110,7 +111,7 @@ struct hdmi_tg_regs {
        u8 field_bot_hdmi_h;
 };
 
-struct hdmi_core_regs {
+struct hdmi_v13_core_regs {
        u8 h_blank[2];
        u8 v_blank[3];
        u8 h_v_line[3];
@@ -123,12 +124,21 @@ struct hdmi_core_regs {
        u8 v_sync_gen3[3];
 };
 
-struct hdmi_preset_conf {
-       struct hdmi_core_regs core;
-       struct hdmi_tg_regs tg;
+struct hdmi_v13_preset_conf {
+       struct hdmi_v13_core_regs core;
+       struct hdmi_v13_tg_regs tg;
+};
+
+struct hdmi_v13_conf {
+       int width;
+       int height;
+       int vrefresh;
+       bool interlace;
+       const u8 *hdmiphy_data;
+       const struct hdmi_v13_preset_conf *conf;
 };
 
-static const struct hdmi_preset_conf hdmi_conf_480p = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_480p = {
        .core = {
                .h_blank = {0x8a, 0x00},
                .v_blank = {0x0d, 0x6a, 0x01},
@@ -154,7 +164,7 @@ static const struct hdmi_preset_conf hdmi_conf_480p = {
        },
 };
 
-static const struct hdmi_preset_conf hdmi_conf_720p60 = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_720p60 = {
        .core = {
                .h_blank = {0x72, 0x01},
                .v_blank = {0xee, 0xf2, 0x00},
@@ -182,7 +192,7 @@ static const struct hdmi_preset_conf hdmi_conf_720p60 = {
        },
 };
 
-static const struct hdmi_preset_conf hdmi_conf_1080i50 = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i50 = {
        .core = {
                .h_blank = {0xd0, 0x02},
                .v_blank = {0x32, 0xB2, 0x00},
@@ -210,7 +220,7 @@ static const struct hdmi_preset_conf hdmi_conf_1080i50 = {
        },
 };
 
-static const struct hdmi_preset_conf hdmi_conf_1080p50 = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p50 = {
        .core = {
                .h_blank = {0xd0, 0x02},
                .v_blank = {0x65, 0x6c, 0x01},
@@ -238,7 +248,7 @@ static const struct hdmi_preset_conf hdmi_conf_1080p50 = {
        },
 };
 
-static const struct hdmi_preset_conf hdmi_conf_1080i60 = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i60 = {
        .core = {
                .h_blank = {0x18, 0x01},
                .v_blank = {0x32, 0xB2, 0x00},
@@ -266,7 +276,7 @@ static const struct hdmi_preset_conf hdmi_conf_1080i60 = {
        },
 };
 
-static const struct hdmi_preset_conf hdmi_conf_1080p60 = {
+static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p60 = {
        .core = {
                .h_blank = {0x18, 0x01},
                .v_blank = {0x65, 0x6c, 0x01},
@@ -294,13 +304,530 @@ static const struct hdmi_preset_conf hdmi_conf_1080p60 = {
        },
 };
 
+static const struct hdmi_v13_conf hdmi_v13_confs[] = {
+       { 1280, 720, 60, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
+       { 1280, 720, 50, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
+       { 720, 480, 60, false, hdmiphy_v13_conf27_027, &hdmi_v13_conf_480p },
+       { 1920, 1080, 50, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i50 },
+       { 1920, 1080, 50, false, hdmiphy_v13_conf148_5,
+                                &hdmi_v13_conf_1080p50 },
+       { 1920, 1080, 60, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i60 },
+       { 1920, 1080, 60, false, hdmiphy_v13_conf148_5,
+                                &hdmi_v13_conf_1080p60 },
+};
+
+/* HDMI Version 1.4 */
+static const u8 hdmiphy_conf27_027[32] = {
+       0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
+       0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
+       0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
+       0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
+};
+
+static const u8 hdmiphy_conf74_25[32] = {
+       0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
+       0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
+       0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
+       0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
+};
+
+static const u8 hdmiphy_conf148_5[32] = {
+       0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
+       0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
+       0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
+       0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
+};
+
+struct hdmi_tg_regs {
+       u8 cmd;
+       u8 h_fsz_l;
+       u8 h_fsz_h;
+       u8 hact_st_l;
+       u8 hact_st_h;
+       u8 hact_sz_l;
+       u8 hact_sz_h;
+       u8 v_fsz_l;
+       u8 v_fsz_h;
+       u8 vsync_l;
+       u8 vsync_h;
+       u8 vsync2_l;
+       u8 vsync2_h;
+       u8 vact_st_l;
+       u8 vact_st_h;
+       u8 vact_sz_l;
+       u8 vact_sz_h;
+       u8 field_chg_l;
+       u8 field_chg_h;
+       u8 vact_st2_l;
+       u8 vact_st2_h;
+       u8 vact_st3_l;
+       u8 vact_st3_h;
+       u8 vact_st4_l;
+       u8 vact_st4_h;
+       u8 vsync_top_hdmi_l;
+       u8 vsync_top_hdmi_h;
+       u8 vsync_bot_hdmi_l;
+       u8 vsync_bot_hdmi_h;
+       u8 field_top_hdmi_l;
+       u8 field_top_hdmi_h;
+       u8 field_bot_hdmi_l;
+       u8 field_bot_hdmi_h;
+       u8 tg_3d;
+};
+
+struct hdmi_core_regs {
+       u8 h_blank[2];
+       u8 v2_blank[2];
+       u8 v1_blank[2];
+       u8 v_line[2];
+       u8 h_line[2];
+       u8 hsync_pol[1];
+       u8 vsync_pol[1];
+       u8 int_pro_mode[1];
+       u8 v_blank_f0[2];
+       u8 v_blank_f1[2];
+       u8 h_sync_start[2];
+       u8 h_sync_end[2];
+       u8 v_sync_line_bef_2[2];
+       u8 v_sync_line_bef_1[2];
+       u8 v_sync_line_aft_2[2];
+       u8 v_sync_line_aft_1[2];
+       u8 v_sync_line_aft_pxl_2[2];
+       u8 v_sync_line_aft_pxl_1[2];
+       u8 v_blank_f2[2]; /* for 3D mode */
+       u8 v_blank_f3[2]; /* for 3D mode */
+       u8 v_blank_f4[2]; /* for 3D mode */
+       u8 v_blank_f5[2]; /* for 3D mode */
+       u8 v_sync_line_aft_3[2];
+       u8 v_sync_line_aft_4[2];
+       u8 v_sync_line_aft_5[2];
+       u8 v_sync_line_aft_6[2];
+       u8 v_sync_line_aft_pxl_3[2];
+       u8 v_sync_line_aft_pxl_4[2];
+       u8 v_sync_line_aft_pxl_5[2];
+       u8 v_sync_line_aft_pxl_6[2];
+       u8 vact_space_1[2];
+       u8 vact_space_2[2];
+       u8 vact_space_3[2];
+       u8 vact_space_4[2];
+       u8 vact_space_5[2];
+       u8 vact_space_6[2];
+};
+
+struct hdmi_preset_conf {
+       struct hdmi_core_regs core;
+       struct hdmi_tg_regs tg;
+};
+
+struct hdmi_conf {
+       int width;
+       int height;
+       int vrefresh;
+       bool interlace;
+       const u8 *hdmiphy_data;
+       const struct hdmi_preset_conf *conf;
+};
+
+static const struct hdmi_preset_conf hdmi_conf_480p60 = {
+       .core = {
+               .h_blank = {0x8a, 0x00},
+               .v2_blank = {0x0d, 0x02},
+               .v1_blank = {0x2d, 0x00},
+               .v_line = {0x0d, 0x02},
+               .h_line = {0x5a, 0x03},
+               .hsync_pol = {0x01},
+               .vsync_pol = {0x01},
+               .int_pro_mode = {0x00},
+               .v_blank_f0 = {0xff, 0xff},
+               .v_blank_f1 = {0xff, 0xff},
+               .h_sync_start = {0x0e, 0x00},
+               .h_sync_end = {0x4c, 0x00},
+               .v_sync_line_bef_2 = {0x0f, 0x00},
+               .v_sync_line_bef_1 = {0x09, 0x00},
+               .v_sync_line_aft_2 = {0xff, 0xff},
+               .v_sync_line_aft_1 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_2 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_1 = {0xff, 0xff},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x5a, 0x03, /* h_fsz */
+               0x8a, 0x00, 0xd0, 0x02, /* hact */
+               0x0d, 0x02, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x2d, 0x00, 0xe0, 0x01, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x48, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_720p50 = {
+       .core = {
+               .h_blank = {0xbc, 0x02},
+               .v2_blank = {0xee, 0x02},
+               .v1_blank = {0x1e, 0x00},
+               .v_line = {0xee, 0x02},
+               .h_line = {0xbc, 0x07},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x00},
+               .v_blank_f0 = {0xff, 0xff},
+               .v_blank_f1 = {0xff, 0xff},
+               .h_sync_start = {0xb6, 0x01},
+               .h_sync_end = {0xde, 0x01},
+               .v_sync_line_bef_2 = {0x0a, 0x00},
+               .v_sync_line_bef_1 = {0x05, 0x00},
+               .v_sync_line_aft_2 = {0xff, 0xff},
+               .v_sync_line_aft_1 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_2 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_1 = {0xff, 0xff},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0xbc, 0x07, /* h_fsz */
+               0xbc, 0x02, 0x00, 0x05, /* hact */
+               0xee, 0x02, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x1e, 0x00, 0xd0, 0x02, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x48, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_720p60 = {
+       .core = {
+               .h_blank = {0x72, 0x01},
+               .v2_blank = {0xee, 0x02},
+               .v1_blank = {0x1e, 0x00},
+               .v_line = {0xee, 0x02},
+               .h_line = {0x72, 0x06},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x00},
+               .v_blank_f0 = {0xff, 0xff},
+               .v_blank_f1 = {0xff, 0xff},
+               .h_sync_start = {0x6c, 0x00},
+               .h_sync_end = {0x94, 0x00},
+               .v_sync_line_bef_2 = {0x0a, 0x00},
+               .v_sync_line_bef_1 = {0x05, 0x00},
+               .v_sync_line_aft_2 = {0xff, 0xff},
+               .v_sync_line_aft_1 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_2 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_1 = {0xff, 0xff},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x72, 0x06, /* h_fsz */
+               0x72, 0x01, 0x00, 0x05, /* hact */
+               0xee, 0x02, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x1e, 0x00, 0xd0, 0x02, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x48, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_1080i50 = {
+       .core = {
+               .h_blank = {0xd0, 0x02},
+               .v2_blank = {0x32, 0x02},
+               .v1_blank = {0x16, 0x00},
+               .v_line = {0x65, 0x04},
+               .h_line = {0x50, 0x0a},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x01},
+               .v_blank_f0 = {0x49, 0x02},
+               .v_blank_f1 = {0x65, 0x04},
+               .h_sync_start = {0x0e, 0x02},
+               .h_sync_end = {0x3a, 0x02},
+               .v_sync_line_bef_2 = {0x07, 0x00},
+               .v_sync_line_bef_1 = {0x02, 0x00},
+               .v_sync_line_aft_2 = {0x39, 0x02},
+               .v_sync_line_aft_1 = {0x34, 0x02},
+               .v_sync_line_aft_pxl_2 = {0x38, 0x07},
+               .v_sync_line_aft_pxl_1 = {0x38, 0x07},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x50, 0x0a, /* h_fsz */
+               0xd0, 0x02, 0x80, 0x07, /* hact */
+               0x65, 0x04, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x16, 0x00, 0x1c, 0x02, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x49, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_1080i60 = {
+       .core = {
+               .h_blank = {0x18, 0x01},
+               .v2_blank = {0x32, 0x02},
+               .v1_blank = {0x16, 0x00},
+               .v_line = {0x65, 0x04},
+               .h_line = {0x98, 0x08},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x01},
+               .v_blank_f0 = {0x49, 0x02},
+               .v_blank_f1 = {0x65, 0x04},
+               .h_sync_start = {0x56, 0x00},
+               .h_sync_end = {0x82, 0x00},
+               .v_sync_line_bef_2 = {0x07, 0x00},
+               .v_sync_line_bef_1 = {0x02, 0x00},
+               .v_sync_line_aft_2 = {0x39, 0x02},
+               .v_sync_line_aft_1 = {0x34, 0x02},
+               .v_sync_line_aft_pxl_2 = {0xa4, 0x04},
+               .v_sync_line_aft_pxl_1 = {0xa4, 0x04},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x98, 0x08, /* h_fsz */
+               0x18, 0x01, 0x80, 0x07, /* hact */
+               0x65, 0x04, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x16, 0x00, 0x1c, 0x02, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x49, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_1080p50 = {
+       .core = {
+               .h_blank = {0xd0, 0x02},
+               .v2_blank = {0x65, 0x04},
+               .v1_blank = {0x2d, 0x00},
+               .v_line = {0x65, 0x04},
+               .h_line = {0x50, 0x0a},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x00},
+               .v_blank_f0 = {0xff, 0xff},
+               .v_blank_f1 = {0xff, 0xff},
+               .h_sync_start = {0x0e, 0x02},
+               .h_sync_end = {0x3a, 0x02},
+               .v_sync_line_bef_2 = {0x09, 0x00},
+               .v_sync_line_bef_1 = {0x04, 0x00},
+               .v_sync_line_aft_2 = {0xff, 0xff},
+               .v_sync_line_aft_1 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_2 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_1 = {0xff, 0xff},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               .vact_space_1 = {0xff, 0xff},
+               .vact_space_2 = {0xff, 0xff},
+               .vact_space_3 = {0xff, 0xff},
+               .vact_space_4 = {0xff, 0xff},
+               .vact_space_5 = {0xff, 0xff},
+               .vact_space_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x50, 0x0a, /* h_fsz */
+               0xd0, 0x02, 0x80, 0x07, /* hact */
+               0x65, 0x04, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x2d, 0x00, 0x38, 0x04, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x48, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
+static const struct hdmi_preset_conf hdmi_conf_1080p60 = {
+       .core = {
+               .h_blank = {0x18, 0x01},
+               .v2_blank = {0x65, 0x04},
+               .v1_blank = {0x2d, 0x00},
+               .v_line = {0x65, 0x04},
+               .h_line = {0x98, 0x08},
+               .hsync_pol = {0x00},
+               .vsync_pol = {0x00},
+               .int_pro_mode = {0x00},
+               .v_blank_f0 = {0xff, 0xff},
+               .v_blank_f1 = {0xff, 0xff},
+               .h_sync_start = {0x56, 0x00},
+               .h_sync_end = {0x82, 0x00},
+               .v_sync_line_bef_2 = {0x09, 0x00},
+               .v_sync_line_bef_1 = {0x04, 0x00},
+               .v_sync_line_aft_2 = {0xff, 0xff},
+               .v_sync_line_aft_1 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_2 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_1 = {0xff, 0xff},
+               .v_blank_f2 = {0xff, 0xff},
+               .v_blank_f3 = {0xff, 0xff},
+               .v_blank_f4 = {0xff, 0xff},
+               .v_blank_f5 = {0xff, 0xff},
+               .v_sync_line_aft_3 = {0xff, 0xff},
+               .v_sync_line_aft_4 = {0xff, 0xff},
+               .v_sync_line_aft_5 = {0xff, 0xff},
+               .v_sync_line_aft_6 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_3 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_4 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_5 = {0xff, 0xff},
+               .v_sync_line_aft_pxl_6 = {0xff, 0xff},
+               /* other don't care */
+       },
+       .tg = {
+               0x00, /* cmd */
+               0x98, 0x08, /* h_fsz */
+               0x18, 0x01, 0x80, 0x07, /* hact */
+               0x65, 0x04, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x2d, 0x00, 0x38, 0x04, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x48, 0x02, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x00, /* 3d FP */
+       },
+};
+
 static const struct hdmi_conf hdmi_confs[] = {
+       { 720, 480, 60, false, hdmiphy_conf27_027, &hdmi_conf_480p60 },
+       { 1280, 720, 50, false, hdmiphy_conf74_25, &hdmi_conf_720p50 },
        { 1280, 720, 60, false, hdmiphy_conf74_25, &hdmi_conf_720p60 },
-       { 1280, 720, 50, false, hdmiphy_conf74_25, &hdmi_conf_720p60 },
-       { 720, 480, 60, false, hdmiphy_conf27_027, &hdmi_conf_480p },
        { 1920, 1080, 50, true, hdmiphy_conf74_25, &hdmi_conf_1080i50 },
-       { 1920, 1080, 50, false, hdmiphy_conf148_5, &hdmi_conf_1080p50 },
        { 1920, 1080, 60, true, hdmiphy_conf74_25, &hdmi_conf_1080i60 },
+       { 1920, 1080, 50, false, hdmiphy_conf148_5, &hdmi_conf_1080p50 },
        { 1920, 1080, 60, false, hdmiphy_conf148_5, &hdmi_conf_1080p60 },
 };
 
@@ -324,7 +851,7 @@ static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
        writel(value, hdata->regs + reg_id);
 }
 
-static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
+static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
 {
 #define DUMPREG(reg_id) \
        DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
@@ -333,6 +860,101 @@ static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
        DUMPREG(HDMI_INTC_FLAG);
        DUMPREG(HDMI_INTC_CON);
        DUMPREG(HDMI_HPD_STATUS);
+       DUMPREG(HDMI_V13_PHY_RSTOUT);
+       DUMPREG(HDMI_V13_PHY_VPLL);
+       DUMPREG(HDMI_V13_PHY_CMU);
+       DUMPREG(HDMI_V13_CORE_RSTOUT);
+
+       DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
+       DUMPREG(HDMI_CON_0);
+       DUMPREG(HDMI_CON_1);
+       DUMPREG(HDMI_CON_2);
+       DUMPREG(HDMI_SYS_STATUS);
+       DUMPREG(HDMI_V13_PHY_STATUS);
+       DUMPREG(HDMI_STATUS_EN);
+       DUMPREG(HDMI_HPD);
+       DUMPREG(HDMI_MODE_SEL);
+       DUMPREG(HDMI_V13_HPD_GEN);
+       DUMPREG(HDMI_V13_DC_CONTROL);
+       DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
+
+       DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
+       DUMPREG(HDMI_H_BLANK_0);
+       DUMPREG(HDMI_H_BLANK_1);
+       DUMPREG(HDMI_V13_V_BLANK_0);
+       DUMPREG(HDMI_V13_V_BLANK_1);
+       DUMPREG(HDMI_V13_V_BLANK_2);
+       DUMPREG(HDMI_V13_H_V_LINE_0);
+       DUMPREG(HDMI_V13_H_V_LINE_1);
+       DUMPREG(HDMI_V13_H_V_LINE_2);
+       DUMPREG(HDMI_VSYNC_POL);
+       DUMPREG(HDMI_INT_PRO_MODE);
+       DUMPREG(HDMI_V13_V_BLANK_F_0);
+       DUMPREG(HDMI_V13_V_BLANK_F_1);
+       DUMPREG(HDMI_V13_V_BLANK_F_2);
+       DUMPREG(HDMI_V13_H_SYNC_GEN_0);
+       DUMPREG(HDMI_V13_H_SYNC_GEN_1);
+       DUMPREG(HDMI_V13_H_SYNC_GEN_2);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
+       DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
+
+       DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
+       DUMPREG(HDMI_TG_CMD);
+       DUMPREG(HDMI_TG_H_FSZ_L);
+       DUMPREG(HDMI_TG_H_FSZ_H);
+       DUMPREG(HDMI_TG_HACT_ST_L);
+       DUMPREG(HDMI_TG_HACT_ST_H);
+       DUMPREG(HDMI_TG_HACT_SZ_L);
+       DUMPREG(HDMI_TG_HACT_SZ_H);
+       DUMPREG(HDMI_TG_V_FSZ_L);
+       DUMPREG(HDMI_TG_V_FSZ_H);
+       DUMPREG(HDMI_TG_VSYNC_L);
+       DUMPREG(HDMI_TG_VSYNC_H);
+       DUMPREG(HDMI_TG_VSYNC2_L);
+       DUMPREG(HDMI_TG_VSYNC2_H);
+       DUMPREG(HDMI_TG_VACT_ST_L);
+       DUMPREG(HDMI_TG_VACT_ST_H);
+       DUMPREG(HDMI_TG_VACT_SZ_L);
+       DUMPREG(HDMI_TG_VACT_SZ_H);
+       DUMPREG(HDMI_TG_FIELD_CHG_L);
+       DUMPREG(HDMI_TG_FIELD_CHG_H);
+       DUMPREG(HDMI_TG_VACT_ST2_L);
+       DUMPREG(HDMI_TG_VACT_ST2_H);
+       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
+       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
+       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
+       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
+       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
+       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
+       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
+       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
+#undef DUMPREG
+}
+
+static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
+{
+       int i;
+
+#define DUMPREG(reg_id) \
+       DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
+       readl(hdata->regs + reg_id))
+
+       DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
+       DUMPREG(HDMI_INTC_CON);
+       DUMPREG(HDMI_INTC_FLAG);
+       DUMPREG(HDMI_HPD_STATUS);
+       DUMPREG(HDMI_INTC_CON_1);
+       DUMPREG(HDMI_INTC_FLAG_1);
+       DUMPREG(HDMI_PHY_STATUS_0);
+       DUMPREG(HDMI_PHY_STATUS_PLL);
+       DUMPREG(HDMI_PHY_CON_0);
        DUMPREG(HDMI_PHY_RSTOUT);
        DUMPREG(HDMI_PHY_VPLL);
        DUMPREG(HDMI_PHY_CMU);
@@ -343,40 +965,93 @@ static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
        DUMPREG(HDMI_CON_1);
        DUMPREG(HDMI_CON_2);
        DUMPREG(HDMI_SYS_STATUS);
-       DUMPREG(HDMI_PHY_STATUS);
+       DUMPREG(HDMI_PHY_STATUS_0);
        DUMPREG(HDMI_STATUS_EN);
        DUMPREG(HDMI_HPD);
        DUMPREG(HDMI_MODE_SEL);
-       DUMPREG(HDMI_HPD_GEN);
+       DUMPREG(HDMI_ENC_EN);
        DUMPREG(HDMI_DC_CONTROL);
        DUMPREG(HDMI_VIDEO_PATTERN_GEN);
 
        DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
        DUMPREG(HDMI_H_BLANK_0);
        DUMPREG(HDMI_H_BLANK_1);
-       DUMPREG(HDMI_V_BLANK_0);
-       DUMPREG(HDMI_V_BLANK_1);
-       DUMPREG(HDMI_V_BLANK_2);
-       DUMPREG(HDMI_H_V_LINE_0);
-       DUMPREG(HDMI_H_V_LINE_1);
-       DUMPREG(HDMI_H_V_LINE_2);
+       DUMPREG(HDMI_V2_BLANK_0);
+       DUMPREG(HDMI_V2_BLANK_1);
+       DUMPREG(HDMI_V1_BLANK_0);
+       DUMPREG(HDMI_V1_BLANK_1);
+       DUMPREG(HDMI_V_LINE_0);
+       DUMPREG(HDMI_V_LINE_1);
+       DUMPREG(HDMI_H_LINE_0);
+       DUMPREG(HDMI_H_LINE_1);
+       DUMPREG(HDMI_HSYNC_POL);
+
        DUMPREG(HDMI_VSYNC_POL);
        DUMPREG(HDMI_INT_PRO_MODE);
-       DUMPREG(HDMI_V_BLANK_F_0);
-       DUMPREG(HDMI_V_BLANK_F_1);
-       DUMPREG(HDMI_V_BLANK_F_2);
-       DUMPREG(HDMI_H_SYNC_GEN_0);
-       DUMPREG(HDMI_H_SYNC_GEN_1);
-       DUMPREG(HDMI_H_SYNC_GEN_2);
-       DUMPREG(HDMI_V_SYNC_GEN_1_0);
-       DUMPREG(HDMI_V_SYNC_GEN_1_1);
-       DUMPREG(HDMI_V_SYNC_GEN_1_2);
-       DUMPREG(HDMI_V_SYNC_GEN_2_0);
-       DUMPREG(HDMI_V_SYNC_GEN_2_1);
-       DUMPREG(HDMI_V_SYNC_GEN_2_2);
-       DUMPREG(HDMI_V_SYNC_GEN_3_0);
-       DUMPREG(HDMI_V_SYNC_GEN_3_1);
-       DUMPREG(HDMI_V_SYNC_GEN_3_2);
+       DUMPREG(HDMI_V_BLANK_F0_0);
+       DUMPREG(HDMI_V_BLANK_F0_1);
+       DUMPREG(HDMI_V_BLANK_F1_0);
+       DUMPREG(HDMI_V_BLANK_F1_1);
+
+       DUMPREG(HDMI_H_SYNC_START_0);
+       DUMPREG(HDMI_H_SYNC_START_1);
+       DUMPREG(HDMI_H_SYNC_END_0);
+       DUMPREG(HDMI_H_SYNC_END_1);
+
+       DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
+       DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
+       DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
+       DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
+
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
+
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
+
+       DUMPREG(HDMI_V_BLANK_F2_0);
+       DUMPREG(HDMI_V_BLANK_F2_1);
+       DUMPREG(HDMI_V_BLANK_F3_0);
+       DUMPREG(HDMI_V_BLANK_F3_1);
+       DUMPREG(HDMI_V_BLANK_F4_0);
+       DUMPREG(HDMI_V_BLANK_F4_1);
+       DUMPREG(HDMI_V_BLANK_F5_0);
+       DUMPREG(HDMI_V_BLANK_F5_1);
+
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
+
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
+       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
+
+       DUMPREG(HDMI_VACT_SPACE_1_0);
+       DUMPREG(HDMI_VACT_SPACE_1_1);
+       DUMPREG(HDMI_VACT_SPACE_2_0);
+       DUMPREG(HDMI_VACT_SPACE_2_1);
+       DUMPREG(HDMI_VACT_SPACE_3_0);
+       DUMPREG(HDMI_VACT_SPACE_3_1);
+       DUMPREG(HDMI_VACT_SPACE_4_0);
+       DUMPREG(HDMI_VACT_SPACE_4_1);
+       DUMPREG(HDMI_VACT_SPACE_5_0);
+       DUMPREG(HDMI_VACT_SPACE_5_1);
+       DUMPREG(HDMI_VACT_SPACE_6_0);
+       DUMPREG(HDMI_VACT_SPACE_6_1);
 
        DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
        DUMPREG(HDMI_TG_CMD);
@@ -400,6 +1075,10 @@ static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
        DUMPREG(HDMI_TG_FIELD_CHG_H);
        DUMPREG(HDMI_TG_VACT_ST2_L);
        DUMPREG(HDMI_TG_VACT_ST2_H);
+       DUMPREG(HDMI_TG_VACT_ST3_L);
+       DUMPREG(HDMI_TG_VACT_ST3_H);
+       DUMPREG(HDMI_TG_VACT_ST4_L);
+       DUMPREG(HDMI_TG_VACT_ST4_H);
        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
        DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
@@ -408,10 +1087,49 @@ static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
        DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
+       DUMPREG(HDMI_TG_3D);
+
+       DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
+       DUMPREG(HDMI_AVI_CON);
+       DUMPREG(HDMI_AVI_HEADER0);
+       DUMPREG(HDMI_AVI_HEADER1);
+       DUMPREG(HDMI_AVI_HEADER2);
+       DUMPREG(HDMI_AVI_CHECK_SUM);
+       DUMPREG(HDMI_VSI_CON);
+       DUMPREG(HDMI_VSI_HEADER0);
+       DUMPREG(HDMI_VSI_HEADER1);
+       DUMPREG(HDMI_VSI_HEADER2);
+       for (i = 0; i < 7; ++i)
+               DUMPREG(HDMI_VSI_DATA(i));
+
 #undef DUMPREG
 }
 
-static int hdmi_conf_index(struct drm_display_mode *mode)
+static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
+{
+       if (hdata->is_v13)
+               hdmi_v13_regs_dump(hdata, prefix);
+       else
+               hdmi_v14_regs_dump(hdata, prefix);
+}
+
+static int hdmi_v13_conf_index(struct drm_display_mode *mode)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
+               if (hdmi_v13_confs[i].width == mode->hdisplay &&
+                               hdmi_v13_confs[i].height == mode->vdisplay &&
+                               hdmi_v13_confs[i].vrefresh == mode->vrefresh &&
+                               hdmi_v13_confs[i].interlace ==
+                               ((mode->flags & DRM_MODE_FLAG_INTERLACE) ?
+                                true : false))
+                       return i;
+
+       return -1;
+}
+
+static int hdmi_v14_conf_index(struct drm_display_mode *mode)
 {
        int i;
 
@@ -427,6 +1145,15 @@ static int hdmi_conf_index(struct drm_display_mode *mode)
        return -1;
 }
 
+static int hdmi_conf_index(struct hdmi_context *hdata,
+                          struct drm_display_mode *mode)
+{
+       if (hdata->is_v13)
+               return hdmi_v13_conf_index(mode);
+       else
+               return hdmi_v14_conf_index(mode);
+}
+
 static bool hdmi_is_connected(void *ctx)
 {
        struct hdmi_context *hdata = (struct hdmi_context *)ctx;
@@ -462,16 +1189,25 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
        return 0;
 }
 
-static int hdmi_check_timing(void *ctx, void *timing)
+static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
 {
-       struct fb_videomode *check_timing = timing;
        int i;
 
-       DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+       for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
+               if (hdmi_v13_confs[i].width == check_timing->xres &&
+                       hdmi_v13_confs[i].height == check_timing->yres &&
+                       hdmi_v13_confs[i].vrefresh == check_timing->refresh &&
+                       hdmi_v13_confs[i].interlace ==
+                       ((check_timing->vmode & FB_VMODE_INTERLACED) ?
+                        true : false))
+                       return 0;
 
-       DRM_DEBUG_KMS("[%d]x[%d] [%d]Hz [%x]\n", check_timing->xres,
-                       check_timing->yres, check_timing->refresh,
-                       check_timing->vmode);
+       return -EINVAL;
+}
+
+static int hdmi_v14_check_timing(struct fb_videomode *check_timing)
+{
+       int i;
 
        for (i = 0; i < ARRAY_SIZE(hdmi_confs); ++i)
                if (hdmi_confs[i].width == check_timing->xres &&
@@ -485,6 +1221,23 @@ static int hdmi_check_timing(void *ctx, void *timing)
        return -EINVAL;
 }
 
+static int hdmi_check_timing(void *ctx, void *timing)
+{
+       struct hdmi_context *hdata = (struct hdmi_context *)ctx;
+       struct fb_videomode *check_timing = timing;
+
+       DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+       DRM_DEBUG_KMS("[%d]x[%d] [%d]Hz [%x]\n", check_timing->xres,
+                       check_timing->yres, check_timing->refresh,
+                       check_timing->vmode);
+
+       if (hdata->is_v13)
+               return hdmi_v13_check_timing(check_timing);
+       else
+               return hdmi_v14_check_timing(check_timing);
+}
+
 static int hdmi_display_power_on(void *ctx, int mode)
 {
        DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
@@ -516,13 +1269,20 @@ static struct exynos_hdmi_display_ops display_ops = {
 
 static void hdmi_conf_reset(struct hdmi_context *hdata)
 {
+       u32 reg;
+
        /* disable hpd handle for drm */
        hdata->hpd_handle = false;
 
+       if (hdata->is_v13)
+               reg = HDMI_V13_CORE_RSTOUT;
+       else
+               reg = HDMI_CORE_RSTOUT;
+
        /* resetting HDMI core */
-       hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT,  0, HDMI_CORE_SW_RSTOUT);
+       hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT);
        mdelay(10);
-       hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, HDMI_CORE_SW_RSTOUT);
+       hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
        mdelay(10);
 
        /* enable hpd handle for drm */
@@ -546,27 +1306,126 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
                HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
        /* disable bluescreen */
        hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
-       /* choose bluescreen (fecal) color */
-       hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_0, 0x12);
-       hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_1, 0x34);
-       hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_2, 0x56);
-       /* enable AVI packet every vsync, fixes purple line problem */
-       hdmi_reg_writeb(hdata, HDMI_AVI_CON, 0x02);
-       /* force RGB, look to CEA-861-D, table 7 for more detail */
-       hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(0), 0 << 5);
-       hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
-
-       hdmi_reg_writeb(hdata, HDMI_SPD_CON, 0x02);
-       hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
-       hdmi_reg_writeb(hdata, HDMI_ACR_CON, 0x04);
+
+       if (hdata->is_v13) {
+               /* choose bluescreen (fecal) color */
+               hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
+               hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
+               hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
+
+               /* enable AVI packet every vsync, fixes purple line problem */
+               hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
+               /* force RGB, look to CEA-861-D, table 7 for more detail */
+               hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
+               hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
+
+               hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
+               hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
+               hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
+       } else {
+               /* enable AVI packet every vsync, fixes purple line problem */
+               hdmi_reg_writeb(hdata, HDMI_AVI_CON, 0x02);
+               hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 2 << 5);
+               hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
+       }
 
        /* enable hpd handle for drm */
        hdata->hpd_handle = true;
 }
 
-static void hdmi_timing_apply(struct hdmi_context *hdata,
-                                const struct hdmi_preset_conf *conf)
+static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
 {
+       const struct hdmi_v13_preset_conf *conf =
+               hdmi_v13_confs[hdata->cur_conf].conf;
+       const struct hdmi_v13_core_regs *core = &conf->core;
+       const struct hdmi_v13_tg_regs *tg = &conf->tg;
+       int tries;
+
+       /* setting core registers */
+       hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
+       hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
+       hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
+       hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
+       hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
+       /* Timing generator registers */
+       hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi_h);
+
+       /* waiting for HDMIPHY's PLL to get to steady state */
+       for (tries = 100; tries; --tries) {
+               u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
+               if (val & HDMI_PHY_STATUS_READY)
+                       break;
+               mdelay(1);
+       }
+       /* steady state not achieved */
+       if (tries == 0) {
+               DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
+               hdmi_regs_dump(hdata, "timing apply");
+       }
+
+       clk_disable(hdata->res.sclk_hdmi);
+       clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
+       clk_enable(hdata->res.sclk_hdmi);
+
+       /* enable HDMI and timing generator */
+       hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
+       if (core->int_pro_mode[0])
+               hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
+                               HDMI_FIELD_EN);
+       else
+               hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
+}
+
+static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
+{
+       const struct hdmi_preset_conf *conf = hdmi_confs[hdata->cur_conf].conf;
        const struct hdmi_core_regs *core = &conf->core;
        const struct hdmi_tg_regs *tg = &conf->tg;
        int tries;
@@ -574,29 +1433,102 @@ static void hdmi_timing_apply(struct hdmi_context *hdata,
        /* setting core registers */
        hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
        hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_0, core->v_blank[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_1, core->v_blank[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_2, core->v_blank[2]);
-       hdmi_reg_writeb(hdata, HDMI_H_V_LINE_0, core->h_v_line[0]);
-       hdmi_reg_writeb(hdata, HDMI_H_V_LINE_1, core->h_v_line[1]);
-       hdmi_reg_writeb(hdata, HDMI_H_V_LINE_2, core->h_v_line[2]);
+       hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
+       hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
+       hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
+       hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
+       hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
+       hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
+       hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
        hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
        hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F_0, core->v_blank_f[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F_1, core->v_blank_f[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F_2, core->v_blank_f[2]);
-       hdmi_reg_writeb(hdata, HDMI_H_SYNC_GEN_0, core->h_sync_gen[0]);
-       hdmi_reg_writeb(hdata, HDMI_H_SYNC_GEN_1, core->h_sync_gen[1]);
-       hdmi_reg_writeb(hdata, HDMI_H_SYNC_GEN_2, core->h_sync_gen[2]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
-       hdmi_reg_writeb(hdata, HDMI_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
+       hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
+       hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
+       hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
+       hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
+                       core->v_sync_line_bef_2[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
+                       core->v_sync_line_bef_2[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
+                       core->v_sync_line_bef_1[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
+                       core->v_sync_line_bef_1[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
+                       core->v_sync_line_aft_2[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
+                       core->v_sync_line_aft_2[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
+                       core->v_sync_line_aft_1[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
+                       core->v_sync_line_aft_1[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
+                       core->v_sync_line_aft_pxl_2[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
+                       core->v_sync_line_aft_pxl_2[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
+                       core->v_sync_line_aft_pxl_1[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
+                       core->v_sync_line_aft_pxl_1[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
+                       core->v_sync_line_aft_3[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
+                       core->v_sync_line_aft_3[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
+                       core->v_sync_line_aft_4[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
+                       core->v_sync_line_aft_4[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
+                       core->v_sync_line_aft_5[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
+                       core->v_sync_line_aft_5[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
+                       core->v_sync_line_aft_6[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
+                       core->v_sync_line_aft_6[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
+                       core->v_sync_line_aft_pxl_3[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
+                       core->v_sync_line_aft_pxl_3[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
+                       core->v_sync_line_aft_pxl_4[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
+                       core->v_sync_line_aft_pxl_4[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
+                       core->v_sync_line_aft_pxl_5[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
+                       core->v_sync_line_aft_pxl_5[1]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
+                       core->v_sync_line_aft_pxl_6[0]);
+       hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
+                       core->v_sync_line_aft_pxl_6[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
+       hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
+
        /* Timing generator registers */
        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz_l);
        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz_h);
@@ -618,6 +1550,10 @@ static void hdmi_timing_apply(struct hdmi_context *hdata,
        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg_h);
        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2_l);
        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4_l);
+       hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4_h);
        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi_l);
        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi_h);
        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi_l);
@@ -626,10 +1562,11 @@ static void hdmi_timing_apply(struct hdmi_context *hdata,
        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi_h);
        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi_l);
        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi_h);
+       hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d);
 
        /* waiting for HDMIPHY's PLL to get to steady state */
        for (tries = 100; tries; --tries) {
-               u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS);
+               u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
                if (val & HDMI_PHY_STATUS_READY)
                        break;
                mdelay(1);
@@ -653,9 +1590,18 @@ static void hdmi_timing_apply(struct hdmi_context *hdata,
                hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
 }
 
+static void hdmi_timing_apply(struct hdmi_context *hdata)
+{
+       if (hdata->is_v13)
+               hdmi_v13_timing_apply(hdata);
+       else
+               hdmi_v14_timing_apply(hdata);
+}
+
 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
 {
        u8 buffer[2];
+       u32 reg;
 
        clk_disable(hdata->res.sclk_hdmi);
        clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_pixel);
@@ -668,15 +1614,21 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata)
        if (hdata->hdmiphy_port)
                i2c_master_send(hdata->hdmiphy_port, buffer, 2);
 
+       if (hdata->is_v13)
+               reg = HDMI_V13_PHY_RSTOUT;
+       else
+               reg = HDMI_PHY_RSTOUT;
+
        /* reset hdmiphy */
-       hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
+       hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
        mdelay(10);
-       hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT,  0, HDMI_PHY_SW_RSTOUT);
+       hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
        mdelay(10);
 }
 
 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
 {
+       const u8 *hdmiphy_data;
        u8 buffer[32];
        u8 operation[2];
        u8 read_buffer[32] = {0, };
@@ -689,7 +1641,12 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
        }
 
        /* pixel clock */
-       memcpy(buffer, hdmi_confs[hdata->cur_conf].hdmiphy_data, 32);
+       if (hdata->is_v13)
+               hdmiphy_data = hdmi_v13_confs[hdata->cur_conf].hdmiphy_data;
+       else
+               hdmiphy_data = hdmi_confs[hdata->cur_conf].hdmiphy_data;
+
+       memcpy(buffer, hdmiphy_data, 32);
        ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
        if (ret != 32) {
                DRM_ERROR("failed to configure HDMIPHY via I2C\n");
@@ -721,9 +1678,6 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
 
 static void hdmi_conf_apply(struct hdmi_context *hdata)
 {
-       const struct hdmi_preset_conf *conf =
-                 hdmi_confs[hdata->cur_conf].conf;
-
        DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
        hdmiphy_conf_reset(hdata);
@@ -733,7 +1687,7 @@ static void hdmi_conf_apply(struct hdmi_context *hdata)
        hdmi_conf_init(hdata);
 
        /* setting core registers */
-       hdmi_timing_apply(hdata, conf);
+       hdmi_timing_apply(hdata);
 
        hdmi_regs_dump(hdata, "start");
 }
@@ -745,8 +1699,8 @@ static void hdmi_mode_set(void *ctx, void *mode)
 
        DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
-       conf_idx = hdmi_conf_index(mode);
-       if (conf_idx >= 0 && conf_idx < ARRAY_SIZE(hdmi_confs))
+       conf_idx = hdmi_conf_index(hdata, mode);
+       if (conf_idx >= 0)
                hdata->cur_conf = conf_idx;
        else
                DRM_DEBUG_KMS("not supported mode\n");
@@ -926,7 +1880,6 @@ static void hdmi_resource_poweron(struct hdmi_context *hdata)
        hdmiphy_conf_reset(hdata);
        hdmi_conf_reset(hdata);
        hdmi_conf_init(hdata);
-
 }
 
 static void hdmi_resource_poweroff(struct hdmi_context *hdata)
@@ -1022,6 +1975,7 @@ static int __devinit hdmi_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, drm_hdmi_ctx);
 
+       hdata->is_v13 = pdata->is_v13;
        hdata->default_win = pdata->default_win;
        hdata->default_timing = &pdata->timing;
        hdata->default_bpp = pdata->bpp;
index 31d6cf84c1aa554eb44c052acc0339d9256a2bf1..040ecadb912eb07cc36924dfc0a9f2fd1a801e0d 100644 (file)
 #ifndef _EXYNOS_HDMI_H_
 #define _EXYNOS_HDMI_H_
 
-struct hdmi_conf {
-       int width;
-       int height;
-       int vrefresh;
-       bool interlace;
-       const u8 *hdmiphy_data;
-       const struct hdmi_preset_conf *conf;
-};
-
 struct hdmi_resources {
        struct clk *hdmi;
        struct clk *sclk_hdmi;
@@ -51,6 +42,7 @@ struct hdmi_context {
        struct device                   *dev;
        struct drm_device               *drm_dev;
        struct fb_videomode             *default_timing;
+       unsigned int                    is_v13:1;
        unsigned int                    default_win;
        unsigned int                    default_bpp;
        bool                            hpd_handle;
index 72e6b52be74060bf88afbe8808b6dabca1d13804..6b287158f76ebc04af679a22ad7663f533d9c848 100644 (file)
@@ -19,6 +19,7 @@
  * Register part
 */
 
+/* HDMI Version 1.3 & Common */
 #define HDMI_CTRL_BASE(x)              ((x) + 0x00000000)
 #define HDMI_CORE_BASE(x)              ((x) + 0x00010000)
 #define HDMI_TG_BASE(x)                        ((x) + 0x00050000)
 #define HDMI_INTC_CON                  HDMI_CTRL_BASE(0x0000)
 #define HDMI_INTC_FLAG                 HDMI_CTRL_BASE(0x0004)
 #define HDMI_HPD_STATUS                        HDMI_CTRL_BASE(0x000C)
-#define HDMI_PHY_RSTOUT                        HDMI_CTRL_BASE(0x0014)
-#define HDMI_PHY_VPLL                  HDMI_CTRL_BASE(0x0018)
-#define HDMI_PHY_CMU                   HDMI_CTRL_BASE(0x001C)
-#define HDMI_CORE_RSTOUT               HDMI_CTRL_BASE(0x0020)
+#define HDMI_V13_PHY_RSTOUT            HDMI_CTRL_BASE(0x0014)
+#define HDMI_V13_PHY_VPLL              HDMI_CTRL_BASE(0x0018)
+#define HDMI_V13_PHY_CMU               HDMI_CTRL_BASE(0x001C)
+#define HDMI_V13_CORE_RSTOUT           HDMI_CTRL_BASE(0x0020)
 
 /* Core registers */
 #define HDMI_CON_0                     HDMI_CORE_BASE(0x0000)
 #define HDMI_CON_1                     HDMI_CORE_BASE(0x0004)
 #define HDMI_CON_2                     HDMI_CORE_BASE(0x0008)
 #define HDMI_SYS_STATUS                        HDMI_CORE_BASE(0x0010)
-#define HDMI_PHY_STATUS                        HDMI_CORE_BASE(0x0014)
+#define HDMI_V13_PHY_STATUS            HDMI_CORE_BASE(0x0014)
 #define HDMI_STATUS_EN                 HDMI_CORE_BASE(0x0020)
 #define HDMI_HPD                       HDMI_CORE_BASE(0x0030)
 #define HDMI_MODE_SEL                  HDMI_CORE_BASE(0x0040)
-#define HDMI_BLUE_SCREEN_0             HDMI_CORE_BASE(0x0050)
-#define HDMI_BLUE_SCREEN_1             HDMI_CORE_BASE(0x0054)
-#define HDMI_BLUE_SCREEN_2             HDMI_CORE_BASE(0x0058)
+#define HDMI_ENC_EN                    HDMI_CORE_BASE(0x0044)
+#define HDMI_V13_BLUE_SCREEN_0         HDMI_CORE_BASE(0x0050)
+#define HDMI_V13_BLUE_SCREEN_1         HDMI_CORE_BASE(0x0054)
+#define HDMI_V13_BLUE_SCREEN_2         HDMI_CORE_BASE(0x0058)
 #define HDMI_H_BLANK_0                 HDMI_CORE_BASE(0x00A0)
 #define HDMI_H_BLANK_1                 HDMI_CORE_BASE(0x00A4)
-#define HDMI_V_BLANK_0                 HDMI_CORE_BASE(0x00B0)
-#define HDMI_V_BLANK_1                 HDMI_CORE_BASE(0x00B4)
-#define HDMI_V_BLANK_2                 HDMI_CORE_BASE(0x00B8)
-#define HDMI_H_V_LINE_0                        HDMI_CORE_BASE(0x00C0)
-#define HDMI_H_V_LINE_1                        HDMI_CORE_BASE(0x00C4)
-#define HDMI_H_V_LINE_2                        HDMI_CORE_BASE(0x00C8)
+#define HDMI_V13_V_BLANK_0             HDMI_CORE_BASE(0x00B0)
+#define HDMI_V13_V_BLANK_1             HDMI_CORE_BASE(0x00B4)
+#define HDMI_V13_V_BLANK_2             HDMI_CORE_BASE(0x00B8)
+#define HDMI_V13_H_V_LINE_0            HDMI_CORE_BASE(0x00C0)
+#define HDMI_V13_H_V_LINE_1            HDMI_CORE_BASE(0x00C4)
+#define HDMI_V13_H_V_LINE_2            HDMI_CORE_BASE(0x00C8)
 #define HDMI_VSYNC_POL                 HDMI_CORE_BASE(0x00E4)
 #define HDMI_INT_PRO_MODE              HDMI_CORE_BASE(0x00E8)
-#define HDMI_V_BLANK_F_0               HDMI_CORE_BASE(0x0110)
-#define HDMI_V_BLANK_F_1               HDMI_CORE_BASE(0x0114)
-#define HDMI_V_BLANK_F_2               HDMI_CORE_BASE(0x0118)
-#define HDMI_H_SYNC_GEN_0              HDMI_CORE_BASE(0x0120)
-#define HDMI_H_SYNC_GEN_1              HDMI_CORE_BASE(0x0124)
-#define HDMI_H_SYNC_GEN_2              HDMI_CORE_BASE(0x0128)
-#define HDMI_V_SYNC_GEN_1_0            HDMI_CORE_BASE(0x0130)
-#define HDMI_V_SYNC_GEN_1_1            HDMI_CORE_BASE(0x0134)
-#define HDMI_V_SYNC_GEN_1_2            HDMI_CORE_BASE(0x0138)
-#define HDMI_V_SYNC_GEN_2_0            HDMI_CORE_BASE(0x0140)
-#define HDMI_V_SYNC_GEN_2_1            HDMI_CORE_BASE(0x0144)
-#define HDMI_V_SYNC_GEN_2_2            HDMI_CORE_BASE(0x0148)
-#define HDMI_V_SYNC_GEN_3_0            HDMI_CORE_BASE(0x0150)
-#define HDMI_V_SYNC_GEN_3_1            HDMI_CORE_BASE(0x0154)
-#define HDMI_V_SYNC_GEN_3_2            HDMI_CORE_BASE(0x0158)
-#define HDMI_ACR_CON                   HDMI_CORE_BASE(0x0180)
-#define HDMI_AVI_CON                   HDMI_CORE_BASE(0x0300)
-#define HDMI_AVI_BYTE(n)               HDMI_CORE_BASE(0x0320 + 4 * (n))
-#define HDMI_DC_CONTROL                        HDMI_CORE_BASE(0x05C0)
-#define HDMI_VIDEO_PATTERN_GEN         HDMI_CORE_BASE(0x05C4)
-#define HDMI_HPD_GEN                   HDMI_CORE_BASE(0x05C8)
-#define HDMI_AUI_CON                   HDMI_CORE_BASE(0x0360)
-#define HDMI_SPD_CON                   HDMI_CORE_BASE(0x0400)
+#define HDMI_V13_V_BLANK_F_0           HDMI_CORE_BASE(0x0110)
+#define HDMI_V13_V_BLANK_F_1           HDMI_CORE_BASE(0x0114)
+#define HDMI_V13_V_BLANK_F_2           HDMI_CORE_BASE(0x0118)
+#define HDMI_V13_H_SYNC_GEN_0          HDMI_CORE_BASE(0x0120)
+#define HDMI_V13_H_SYNC_GEN_1          HDMI_CORE_BASE(0x0124)
+#define HDMI_V13_H_SYNC_GEN_2          HDMI_CORE_BASE(0x0128)
+#define HDMI_V13_V_SYNC_GEN_1_0                HDMI_CORE_BASE(0x0130)
+#define HDMI_V13_V_SYNC_GEN_1_1                HDMI_CORE_BASE(0x0134)
+#define HDMI_V13_V_SYNC_GEN_1_2                HDMI_CORE_BASE(0x0138)
+#define HDMI_V13_V_SYNC_GEN_2_0                HDMI_CORE_BASE(0x0140)
+#define HDMI_V13_V_SYNC_GEN_2_1                HDMI_CORE_BASE(0x0144)
+#define HDMI_V13_V_SYNC_GEN_2_2                HDMI_CORE_BASE(0x0148)
+#define HDMI_V13_V_SYNC_GEN_3_0                HDMI_CORE_BASE(0x0150)
+#define HDMI_V13_V_SYNC_GEN_3_1                HDMI_CORE_BASE(0x0154)
+#define HDMI_V13_V_SYNC_GEN_3_2                HDMI_CORE_BASE(0x0158)
+#define HDMI_V13_ACR_CON               HDMI_CORE_BASE(0x0180)
+#define HDMI_V13_AVI_CON               HDMI_CORE_BASE(0x0300)
+#define HDMI_V13_AVI_BYTE(n)           HDMI_CORE_BASE(0x0320 + 4 * (n))
+#define HDMI_V13_DC_CONTROL            HDMI_CORE_BASE(0x05C0)
+#define HDMI_V13_VIDEO_PATTERN_GEN     HDMI_CORE_BASE(0x05C4)
+#define HDMI_V13_HPD_GEN               HDMI_CORE_BASE(0x05C8)
+#define HDMI_V13_AUI_CON               HDMI_CORE_BASE(0x0360)
+#define HDMI_V13_SPD_CON               HDMI_CORE_BASE(0x0400)
 
 /* Timing generator registers */
 #define HDMI_TG_CMD                    HDMI_TG_BASE(0x0000)
 #define HDMI_TG_EN                     (1 << 0)
 #define HDMI_FIELD_EN                  (1 << 1)
 
+
+/* HDMI Version 1.4 */
+/* Control registers */
+/* #define HDMI_INTC_CON               HDMI_CTRL_BASE(0x0000) */
+/* #define HDMI_INTC_FLAG              HDMI_CTRL_BASE(0x0004) */
+#define HDMI_HDCP_KEY_LOAD             HDMI_CTRL_BASE(0x0008)
+/* #define HDMI_HPD_STATUS             HDMI_CTRL_BASE(0x000C) */
+#define HDMI_INTC_CON_1                        HDMI_CTRL_BASE(0x0010)
+#define HDMI_INTC_FLAG_1               HDMI_CTRL_BASE(0x0014)
+#define HDMI_PHY_STATUS_0              HDMI_CTRL_BASE(0x0020)
+#define HDMI_PHY_STATUS_CMU            HDMI_CTRL_BASE(0x0024)
+#define HDMI_PHY_STATUS_PLL            HDMI_CTRL_BASE(0x0028)
+#define HDMI_PHY_CON_0                 HDMI_CTRL_BASE(0x0030)
+#define HDMI_HPD_CTRL                  HDMI_CTRL_BASE(0x0040)
+#define HDMI_HPD_ST                    HDMI_CTRL_BASE(0x0044)
+#define HDMI_HPD_TH_X                  HDMI_CTRL_BASE(0x0050)
+#define HDMI_AUDIO_CLKSEL              HDMI_CTRL_BASE(0x0070)
+#define HDMI_PHY_RSTOUT                        HDMI_CTRL_BASE(0x0074)
+#define HDMI_PHY_VPLL                  HDMI_CTRL_BASE(0x0078)
+#define HDMI_PHY_CMU                   HDMI_CTRL_BASE(0x007C)
+#define HDMI_CORE_RSTOUT               HDMI_CTRL_BASE(0x0080)
+
+/* Video related registers */
+#define HDMI_YMAX                      HDMI_CORE_BASE(0x0060)
+#define HDMI_YMIN                      HDMI_CORE_BASE(0x0064)
+#define HDMI_CMAX                      HDMI_CORE_BASE(0x0068)
+#define HDMI_CMIN                      HDMI_CORE_BASE(0x006C)
+
+#define HDMI_V2_BLANK_0                        HDMI_CORE_BASE(0x00B0)
+#define HDMI_V2_BLANK_1                        HDMI_CORE_BASE(0x00B4)
+#define HDMI_V1_BLANK_0                        HDMI_CORE_BASE(0x00B8)
+#define HDMI_V1_BLANK_1                        HDMI_CORE_BASE(0x00BC)
+
+#define HDMI_V_LINE_0                  HDMI_CORE_BASE(0x00C0)
+#define HDMI_V_LINE_1                  HDMI_CORE_BASE(0x00C4)
+#define HDMI_H_LINE_0                  HDMI_CORE_BASE(0x00C8)
+#define HDMI_H_LINE_1                  HDMI_CORE_BASE(0x00CC)
+
+#define HDMI_HSYNC_POL                 HDMI_CORE_BASE(0x00E0)
+
+#define HDMI_V_BLANK_F0_0              HDMI_CORE_BASE(0x0110)
+#define HDMI_V_BLANK_F0_1              HDMI_CORE_BASE(0x0114)
+#define HDMI_V_BLANK_F1_0              HDMI_CORE_BASE(0x0118)
+#define HDMI_V_BLANK_F1_1              HDMI_CORE_BASE(0x011C)
+
+#define HDMI_H_SYNC_START_0            HDMI_CORE_BASE(0x0120)
+#define HDMI_H_SYNC_START_1            HDMI_CORE_BASE(0x0124)
+#define HDMI_H_SYNC_END_0              HDMI_CORE_BASE(0x0128)
+#define HDMI_H_SYNC_END_1              HDMI_CORE_BASE(0x012C)
+
+#define HDMI_V_SYNC_LINE_BEF_2_0       HDMI_CORE_BASE(0x0130)
+#define HDMI_V_SYNC_LINE_BEF_2_1       HDMI_CORE_BASE(0x0134)
+#define HDMI_V_SYNC_LINE_BEF_1_0       HDMI_CORE_BASE(0x0138)
+#define HDMI_V_SYNC_LINE_BEF_1_1       HDMI_CORE_BASE(0x013C)
+
+#define HDMI_V_SYNC_LINE_AFT_2_0       HDMI_CORE_BASE(0x0140)
+#define HDMI_V_SYNC_LINE_AFT_2_1       HDMI_CORE_BASE(0x0144)
+#define HDMI_V_SYNC_LINE_AFT_1_0       HDMI_CORE_BASE(0x0148)
+#define HDMI_V_SYNC_LINE_AFT_1_1       HDMI_CORE_BASE(0x014C)
+
+#define HDMI_V_SYNC_LINE_AFT_PXL_2_0   HDMI_CORE_BASE(0x0150)
+#define HDMI_V_SYNC_LINE_AFT_PXL_2_1   HDMI_CORE_BASE(0x0154)
+#define HDMI_V_SYNC_LINE_AFT_PXL_1_0   HDMI_CORE_BASE(0x0158)
+#define HDMI_V_SYNC_LINE_AFT_PXL_1_1   HDMI_CORE_BASE(0x015C)
+
+#define HDMI_V_BLANK_F2_0              HDMI_CORE_BASE(0x0160)
+#define HDMI_V_BLANK_F2_1              HDMI_CORE_BASE(0x0164)
+#define HDMI_V_BLANK_F3_0              HDMI_CORE_BASE(0x0168)
+#define HDMI_V_BLANK_F3_1              HDMI_CORE_BASE(0x016C)
+#define HDMI_V_BLANK_F4_0              HDMI_CORE_BASE(0x0170)
+#define HDMI_V_BLANK_F4_1              HDMI_CORE_BASE(0x0174)
+#define HDMI_V_BLANK_F5_0              HDMI_CORE_BASE(0x0178)
+#define HDMI_V_BLANK_F5_1              HDMI_CORE_BASE(0x017C)
+
+#define HDMI_V_SYNC_LINE_AFT_3_0       HDMI_CORE_BASE(0x0180)
+#define HDMI_V_SYNC_LINE_AFT_3_1       HDMI_CORE_BASE(0x0184)
+#define HDMI_V_SYNC_LINE_AFT_4_0       HDMI_CORE_BASE(0x0188)
+#define HDMI_V_SYNC_LINE_AFT_4_1       HDMI_CORE_BASE(0x018C)
+#define HDMI_V_SYNC_LINE_AFT_5_0       HDMI_CORE_BASE(0x0190)
+#define HDMI_V_SYNC_LINE_AFT_5_1       HDMI_CORE_BASE(0x0194)
+#define HDMI_V_SYNC_LINE_AFT_6_0       HDMI_CORE_BASE(0x0198)
+#define HDMI_V_SYNC_LINE_AFT_6_1       HDMI_CORE_BASE(0x019C)
+
+#define HDMI_V_SYNC_LINE_AFT_PXL_3_0   HDMI_CORE_BASE(0x01A0)
+#define HDMI_V_SYNC_LINE_AFT_PXL_3_1   HDMI_CORE_BASE(0x01A4)
+#define HDMI_V_SYNC_LINE_AFT_PXL_4_0   HDMI_CORE_BASE(0x01A8)
+#define HDMI_V_SYNC_LINE_AFT_PXL_4_1   HDMI_CORE_BASE(0x01AC)
+#define HDMI_V_SYNC_LINE_AFT_PXL_5_0   HDMI_CORE_BASE(0x01B0)
+#define HDMI_V_SYNC_LINE_AFT_PXL_5_1   HDMI_CORE_BASE(0x01B4)
+#define HDMI_V_SYNC_LINE_AFT_PXL_6_0   HDMI_CORE_BASE(0x01B8)
+#define HDMI_V_SYNC_LINE_AFT_PXL_6_1   HDMI_CORE_BASE(0x01BC)
+
+#define HDMI_VACT_SPACE_1_0            HDMI_CORE_BASE(0x01C0)
+#define HDMI_VACT_SPACE_1_1            HDMI_CORE_BASE(0x01C4)
+#define HDMI_VACT_SPACE_2_0            HDMI_CORE_BASE(0x01C8)
+#define HDMI_VACT_SPACE_2_1            HDMI_CORE_BASE(0x01CC)
+#define HDMI_VACT_SPACE_3_0            HDMI_CORE_BASE(0x01D0)
+#define HDMI_VACT_SPACE_3_1            HDMI_CORE_BASE(0x01D4)
+#define HDMI_VACT_SPACE_4_0            HDMI_CORE_BASE(0x01D8)
+#define HDMI_VACT_SPACE_4_1            HDMI_CORE_BASE(0x01DC)
+#define HDMI_VACT_SPACE_5_0            HDMI_CORE_BASE(0x01E0)
+#define HDMI_VACT_SPACE_5_1            HDMI_CORE_BASE(0x01E4)
+#define HDMI_VACT_SPACE_6_0            HDMI_CORE_BASE(0x01E8)
+#define HDMI_VACT_SPACE_6_1            HDMI_CORE_BASE(0x01EC)
+
+#define HDMI_GCP_CON                   HDMI_CORE_BASE(0x0200)
+#define HDMI_GCP_BYTE1                 HDMI_CORE_BASE(0x0210)
+#define HDMI_GCP_BYTE2                 HDMI_CORE_BASE(0x0214)
+#define HDMI_GCP_BYTE3                 HDMI_CORE_BASE(0x0218)
+
+/* Audio related registers */
+#define HDMI_ASP_CON                   HDMI_CORE_BASE(0x0300)
+#define HDMI_ASP_SP_FLAT               HDMI_CORE_BASE(0x0304)
+#define HDMI_ASP_CHCFG0                        HDMI_CORE_BASE(0x0310)
+#define HDMI_ASP_CHCFG1                        HDMI_CORE_BASE(0x0314)
+#define HDMI_ASP_CHCFG2                        HDMI_CORE_BASE(0x0318)
+#define HDMI_ASP_CHCFG3                        HDMI_CORE_BASE(0x031C)
+
+#define HDMI_ACR_CON                   HDMI_CORE_BASE(0x0400)
+#define HDMI_ACR_MCTS0                 HDMI_CORE_BASE(0x0410)
+#define HDMI_ACR_MCTS1                 HDMI_CORE_BASE(0x0414)
+#define HDMI_ACR_MCTS2                 HDMI_CORE_BASE(0x0418)
+#define HDMI_ACR_N0                    HDMI_CORE_BASE(0x0430)
+#define HDMI_ACR_N1                    HDMI_CORE_BASE(0x0434)
+#define HDMI_ACR_N2                    HDMI_CORE_BASE(0x0438)
+
+/* Packet related registers */
+#define HDMI_ACP_CON                   HDMI_CORE_BASE(0x0500)
+#define HDMI_ACP_TYPE                  HDMI_CORE_BASE(0x0514)
+#define HDMI_ACP_DATA(n)               HDMI_CORE_BASE(0x0520 + 4 * (n))
+
+#define HDMI_ISRC_CON                  HDMI_CORE_BASE(0x0600)
+#define HDMI_ISRC1_HEADER1             HDMI_CORE_BASE(0x0614)
+#define HDMI_ISRC1_DATA(n)             HDMI_CORE_BASE(0x0620 + 4 * (n))
+#define HDMI_ISRC2_DATA(n)             HDMI_CORE_BASE(0x06A0 + 4 * (n))
+
+#define HDMI_AVI_CON                   HDMI_CORE_BASE(0x0700)
+#define HDMI_AVI_HEADER0               HDMI_CORE_BASE(0x0710)
+#define HDMI_AVI_HEADER1               HDMI_CORE_BASE(0x0714)
+#define HDMI_AVI_HEADER2               HDMI_CORE_BASE(0x0718)
+#define HDMI_AVI_CHECK_SUM             HDMI_CORE_BASE(0x071C)
+#define HDMI_AVI_BYTE(n)               HDMI_CORE_BASE(0x0720 + 4 * (n))
+
+#define HDMI_AUI_CON                   HDMI_CORE_BASE(0x0800)
+#define HDMI_AUI_HEADER0               HDMI_CORE_BASE(0x0810)
+#define HDMI_AUI_HEADER1               HDMI_CORE_BASE(0x0814)
+#define HDMI_AUI_HEADER2               HDMI_CORE_BASE(0x0818)
+#define HDMI_AUI_CHECK_SUM             HDMI_CORE_BASE(0x081C)
+#define HDMI_AUI_BYTE(n)               HDMI_CORE_BASE(0x0820 + 4 * (n))
+
+#define HDMI_MPG_CON                   HDMI_CORE_BASE(0x0900)
+#define HDMI_MPG_CHECK_SUM             HDMI_CORE_BASE(0x091C)
+#define HDMI_MPG_DATA(n)               HDMI_CORE_BASE(0x0920 + 4 * (n))
+
+#define HDMI_SPD_CON                   HDMI_CORE_BASE(0x0A00)
+#define HDMI_SPD_HEADER0               HDMI_CORE_BASE(0x0A10)
+#define HDMI_SPD_HEADER1               HDMI_CORE_BASE(0x0A14)
+#define HDMI_SPD_HEADER2               HDMI_CORE_BASE(0x0A18)
+#define HDMI_SPD_DATA(n)               HDMI_CORE_BASE(0x0A20 + 4 * (n))
+
+#define HDMI_GAMUT_CON                 HDMI_CORE_BASE(0x0B00)
+#define HDMI_GAMUT_HEADER0             HDMI_CORE_BASE(0x0B10)
+#define HDMI_GAMUT_HEADER1             HDMI_CORE_BASE(0x0B14)
+#define HDMI_GAMUT_HEADER2             HDMI_CORE_BASE(0x0B18)
+#define HDMI_GAMUT_METADATA(n)         HDMI_CORE_BASE(0x0B20 + 4 * (n))
+
+#define HDMI_VSI_CON                   HDMI_CORE_BASE(0x0C00)
+#define HDMI_VSI_HEADER0               HDMI_CORE_BASE(0x0C10)
+#define HDMI_VSI_HEADER1               HDMI_CORE_BASE(0x0C14)
+#define HDMI_VSI_HEADER2               HDMI_CORE_BASE(0x0C18)
+#define HDMI_VSI_DATA(n)               HDMI_CORE_BASE(0x0C20 + 4 * (n))
+
+#define HDMI_DC_CONTROL                        HDMI_CORE_BASE(0x0D00)
+#define HDMI_VIDEO_PATTERN_GEN         HDMI_CORE_BASE(0x0D04)
+
+#define HDMI_AN_SEED_SEL               HDMI_CORE_BASE(0x0E48)
+#define HDMI_AN_SEED_0                 HDMI_CORE_BASE(0x0E58)
+#define HDMI_AN_SEED_1                 HDMI_CORE_BASE(0x0E5C)
+#define HDMI_AN_SEED_2                 HDMI_CORE_BASE(0x0E60)
+#define HDMI_AN_SEED_3                 HDMI_CORE_BASE(0x0E64)
+
+/* HDCP related registers */
+#define HDMI_HDCP_SHA1(n)              HDMI_CORE_BASE(0x7000 + 4 * (n))
+#define HDMI_HDCP_KSV_LIST(n)          HDMI_CORE_BASE(0x7050 + 4 * (n))
+
+#define HDMI_HDCP_KSV_LIST_CON         HDMI_CORE_BASE(0x7064)
+#define HDMI_HDCP_SHA_RESULT           HDMI_CORE_BASE(0x7070)
+#define HDMI_HDCP_CTRL1                        HDMI_CORE_BASE(0x7080)
+#define HDMI_HDCP_CTRL2                        HDMI_CORE_BASE(0x7084)
+#define HDMI_HDCP_CHECK_RESULT         HDMI_CORE_BASE(0x7090)
+#define HDMI_HDCP_BKSV(n)              HDMI_CORE_BASE(0x70A0 + 4 * (n))
+#define HDMI_HDCP_AKSV(n)              HDMI_CORE_BASE(0x70C0 + 4 * (n))
+#define HDMI_HDCP_AN(n)                        HDMI_CORE_BASE(0x70E0 + 4 * (n))
+
+#define HDMI_HDCP_BCAPS                        HDMI_CORE_BASE(0x7100)
+#define HDMI_HDCP_BSTATUS_0            HDMI_CORE_BASE(0x7110)
+#define HDMI_HDCP_BSTATUS_1            HDMI_CORE_BASE(0x7114)
+#define HDMI_HDCP_RI_0                 HDMI_CORE_BASE(0x7140)
+#define HDMI_HDCP_RI_1                 HDMI_CORE_BASE(0x7144)
+#define HDMI_HDCP_I2C_INT              HDMI_CORE_BASE(0x7180)
+#define HDMI_HDCP_AN_INT               HDMI_CORE_BASE(0x7190)
+#define HDMI_HDCP_WDT_INT              HDMI_CORE_BASE(0x71A0)
+#define HDMI_HDCP_RI_INT               HDMI_CORE_BASE(0x71B0)
+#define HDMI_HDCP_RI_COMPARE_0         HDMI_CORE_BASE(0x71D0)
+#define HDMI_HDCP_RI_COMPARE_1         HDMI_CORE_BASE(0x71D4)
+#define HDMI_HDCP_FRAME_COUNT          HDMI_CORE_BASE(0x71E0)
+
+#define HDMI_RGB_ROUND_EN              HDMI_CORE_BASE(0xD500)
+#define HDMI_VACT_SPACE_R_0            HDMI_CORE_BASE(0xD504)
+#define HDMI_VACT_SPACE_R_1            HDMI_CORE_BASE(0xD508)
+#define HDMI_VACT_SPACE_G_0            HDMI_CORE_BASE(0xD50C)
+#define HDMI_VACT_SPACE_G_1            HDMI_CORE_BASE(0xD510)
+#define HDMI_VACT_SPACE_B_0            HDMI_CORE_BASE(0xD514)
+#define HDMI_VACT_SPACE_B_1            HDMI_CORE_BASE(0xD518)
+
+#define HDMI_BLUE_SCREEN_B_0           HDMI_CORE_BASE(0xD520)
+#define HDMI_BLUE_SCREEN_B_1           HDMI_CORE_BASE(0xD524)
+#define HDMI_BLUE_SCREEN_G_0           HDMI_CORE_BASE(0xD528)
+#define HDMI_BLUE_SCREEN_G_1           HDMI_CORE_BASE(0xD52C)
+#define HDMI_BLUE_SCREEN_R_0           HDMI_CORE_BASE(0xD530)
+#define HDMI_BLUE_SCREEN_R_1           HDMI_CORE_BASE(0xD534)
+
+/* Timing generator registers */
+/* TG configure/status registers */
+#define HDMI_TG_VACT_ST3_L             HDMI_TG_BASE(0x0068)
+#define HDMI_TG_VACT_ST3_H             HDMI_TG_BASE(0x006c)
+#define HDMI_TG_VACT_ST4_L             HDMI_TG_BASE(0x0070)
+#define HDMI_TG_VACT_ST4_H             HDMI_TG_BASE(0x0074)
+#define HDMI_TG_3D                     HDMI_TG_BASE(0x00F0)
+
 #endif /* SAMSUNG_REGS_HDMI_H */
index 1ed3aae893a5b2224554820cdbe3e7c9ad9d6ed4..aff2313c12746aed7b87f78db760aa36c30746d7 100644 (file)
@@ -147,11 +147,13 @@ struct exynos_drm_common_hdmi_pd {
  * @timing: default video mode for initializing
  * @default_win: default window layer number to be used for UI.
  * @bpp: default bit per pixel.
+ * @is_v13: set if hdmi version 13 is.
  */
 struct exynos_drm_hdmi_pdata {
        struct fb_videomode             timing;
        unsigned int                    default_win;
        unsigned int                    bpp;
+       unsigned int                    is_v13:1;
 };
 
 #endif /* __KERNEL__ */