aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_hdmi.c
diff options
context:
space:
mode:
authorSeung-Woo Kim <sw0312.kim@samsung.com>2012-04-24 04:39:15 -0400
committerInki Dae <inki.dae@samsung.com>2012-05-17 07:14:25 -0400
commit872d20d66c0b7de0787675dce8569a61e4d9bc00 (patch)
tree0c92f03714e8a0c84e2b21a9202bd59872167dbd /drivers/gpu/drm/exynos/exynos_hdmi.c
parent8379e4823d04e2552e1395c2410fc16733e28c6e (diff)
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: Seung-Woo Kim <sw0312.kim@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_hdmi.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index ad53c4808bdb..5ca0a9f1f43a 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -60,6 +60,7 @@ struct hdmi_context {
60 bool hpd; 60 bool hpd;
61 bool powered; 61 bool powered;
62 bool is_v13; 62 bool is_v13;
63 bool dvi_mode;
63 struct mutex hdmi_mutex; 64 struct mutex hdmi_mutex;
64 65
65 struct resource *regs_res; 66 struct resource *regs_res;
@@ -1211,10 +1212,12 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
1211 1212
1212 raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter); 1213 raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
1213 if (raw_edid) { 1214 if (raw_edid) {
1215 hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
1214 memcpy(edid, raw_edid, min((1 + raw_edid->extensions) 1216 memcpy(edid, raw_edid, min((1 + raw_edid->extensions)
1215 * EDID_LENGTH, len)); 1217 * EDID_LENGTH, len));
1216 DRM_DEBUG_KMS("width[%d] x height[%d]\n", 1218 DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
1217 raw_edid->width_cm, raw_edid->height_cm); 1219 (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
1220 raw_edid->width_cm, raw_edid->height_cm);
1218 } else { 1221 } else {
1219 return -ENODEV; 1222 return -ENODEV;
1220 } 1223 }
@@ -1437,10 +1440,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata)
1437 1440
1438static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) 1441static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1439{ 1442{
1440 u32 mod; 1443 if (hdata->dvi_mode)
1441
1442 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
1443 if (mod & HDMI_DVI_MODE_EN)
1444 return; 1444 return;
1445 1445
1446 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0); 1446 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
@@ -1479,6 +1479,14 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
1479 /* disable bluescreen */ 1479 /* disable bluescreen */
1480 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN); 1480 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1481 1481
1482 if (hdata->dvi_mode) {
1483 /* choose DVI mode */
1484 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1485 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1486 hdmi_reg_writeb(hdata, HDMI_CON_2,
1487 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1488 }
1489
1482 if (hdata->is_v13) { 1490 if (hdata->is_v13) {
1483 /* choose bluescreen (fecal) color */ 1491 /* choose bluescreen (fecal) color */
1484 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12); 1492 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);