Commit 872d20d6 authored by Seung-Woo Kim's avatar Seung-Woo Kim Committed by Inki Dae

drm/exynos: enable dvi mode for dvi monitor

Hdmi monitor and dvi monitor can be distinguished with edid.
This patch enables dvi mode if dvi monitor is connected and does
not enable audio feature for dvi mode because dvi has no audio
feature.
Signed-off-by: default avatarSeung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 8379e482
...@@ -60,6 +60,7 @@ struct hdmi_context { ...@@ -60,6 +60,7 @@ struct hdmi_context {
bool hpd; bool hpd;
bool powered; bool powered;
bool is_v13; bool is_v13;
bool dvi_mode;
struct mutex hdmi_mutex; struct mutex hdmi_mutex;
struct resource *regs_res; struct resource *regs_res;
...@@ -1211,9 +1212,11 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector, ...@@ -1211,9 +1212,11 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter); raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
if (raw_edid) { if (raw_edid) {
hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
memcpy(edid, raw_edid, min((1 + raw_edid->extensions) memcpy(edid, raw_edid, min((1 + raw_edid->extensions)
* EDID_LENGTH, len)); * EDID_LENGTH, len));
DRM_DEBUG_KMS("width[%d] x height[%d]\n", DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
raw_edid->width_cm, raw_edid->height_cm); raw_edid->width_cm, raw_edid->height_cm);
} else { } else {
return -ENODEV; return -ENODEV;
...@@ -1437,10 +1440,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata) ...@@ -1437,10 +1440,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata)
static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
{ {
u32 mod; if (hdata->dvi_mode)
mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
if (mod & HDMI_DVI_MODE_EN)
return; return;
hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0); hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
...@@ -1479,6 +1479,14 @@ static void hdmi_conf_init(struct hdmi_context *hdata) ...@@ -1479,6 +1479,14 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
/* disable bluescreen */ /* disable bluescreen */
hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN); hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
if (hdata->dvi_mode) {
/* choose DVI mode */
hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
hdmi_reg_writeb(hdata, HDMI_CON_2,
HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
}
if (hdata->is_v13) { if (hdata->is_v13) {
/* choose bluescreen (fecal) color */ /* choose bluescreen (fecal) color */
hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12); hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
......
...@@ -138,14 +138,16 @@ ...@@ -138,14 +138,16 @@
#define HDMI_ASP_MASK (1 << 2) #define HDMI_ASP_MASK (1 << 2)
#define HDMI_EN (1 << 0) #define HDMI_EN (1 << 0)
/* HDMI_CON_2 */
#define HDMI_VID_PREAMBLE_DIS (1 << 5)
#define HDMI_GUARD_BAND_DIS (1 << 1)
/* HDMI_PHY_STATUS */ /* HDMI_PHY_STATUS */
#define HDMI_PHY_STATUS_READY (1 << 0) #define HDMI_PHY_STATUS_READY (1 << 0)
/* HDMI_MODE_SEL */ /* HDMI_MODE_SEL */
#define HDMI_MODE_HDMI_EN (1 << 1) #define HDMI_MODE_HDMI_EN (1 << 1)
#define HDMI_MODE_DVI_EN (1 << 0) #define HDMI_MODE_DVI_EN (1 << 0)
#define HDMI_DVI_MODE_EN (1)
#define HDMI_DVI_MODE_DIS (0)
#define HDMI_MODE_MASK (3 << 0) #define HDMI_MODE_MASK (3 << 0)
/* HDMI_TG_CMD */ /* HDMI_TG_CMD */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment