From: Joonyoung Shim <jy0922.s...@samsung.com>

Signed-off-by: Joonyoung Shim <jy0922.shim at samsung.com>
Signed-off-by: Inki Dae <inki.dae at samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
---
 drivers/gpu/drm/exynos/exynos_hdmi.c | 1152 +++++++++++++++++++++++++++++++---
 drivers/gpu/drm/exynos/exynos_hdmi.h |   10 +-
 drivers/gpu/drm/exynos/regs-hdmi.h   |  306 ++++++++--
 include/drm/exynos_drm.h             |    2 +
 4 files changed, 1325 insertions(+), 145 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c 
b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 3429d3f..733b9ec 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -43,42 +43,43 @@
 #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 = {0xdc, 0x05},
+               .v1_blank = {0x1e, 0x00},
+               .v_line = {0xdc, 0x05},
+               .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 = {0xee, 0x02},
+               .vact_space_2 = {0x0c, 0x03},
+               .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 */
+               0xdc, 0x05, /* v_fsz */
+               0x01, 0x00, 0x33, 0x02, /* vsync */
+               0x1e, 0x00, 0x00, 0x2d, /* vact */
+               0x33, 0x02, /* field_chg */
+               0x0c, 0x03, /* vact_st2 */
+               0x00, 0x00, /* vact_st3 */
+               0x00, 0x00, /* vact_st4 */
+               0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
+               0x01, 0x00, 0x33, 0x02, /* field top/bot */
+               0x01, /* 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;
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.h 
b/drivers/gpu/drm/exynos/exynos_hdmi.h
index 31d6cf8..040ecad 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.h
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.h
@@ -28,15 +28,6 @@
 #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;
diff --git a/drivers/gpu/drm/exynos/regs-hdmi.h 
b/drivers/gpu/drm/exynos/regs-hdmi.h
index 72e6b52..6b28715 100644
--- a/drivers/gpu/drm/exynos/regs-hdmi.h
+++ b/drivers/gpu/drm/exynos/regs-hdmi.h
@@ -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)
@@ -27,56 +28,57 @@
 #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)
@@ -144,4 +146,234 @@
 #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 */
diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
index 5e120f1..c530637 100644
--- a/include/drm/exynos_drm.h
+++ b/include/drm/exynos_drm.h
@@ -132,11 +132,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
-- 
1.7.4.1

Reply via email to