aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c20
-rw-r--r--drivers/gpu/drm/exynos/regs-hdmi.h6
2 files changed, 18 insertions, 8 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);
diff --git a/drivers/gpu/drm/exynos/regs-hdmi.h b/drivers/gpu/drm/exynos/regs-hdmi.h
index 3c04bea842ce..9cc7c5e9718c 100644
--- a/drivers/gpu/drm/exynos/regs-hdmi.h
+++ b/drivers/gpu/drm/exynos/regs-hdmi.h
@@ -138,14 +138,16 @@
138#define HDMI_ASP_MASK (1 << 2) 138#define HDMI_ASP_MASK (1 << 2)
139#define HDMI_EN (1 << 0) 139#define HDMI_EN (1 << 0)
140 140
141/* HDMI_CON_2 */
142#define HDMI_VID_PREAMBLE_DIS (1 << 5)
143#define HDMI_GUARD_BAND_DIS (1 << 1)
144
141/* HDMI_PHY_STATUS */ 145/* HDMI_PHY_STATUS */
142#define HDMI_PHY_STATUS_READY (1 << 0) 146#define HDMI_PHY_STATUS_READY (1 << 0)
143 147
144/* HDMI_MODE_SEL */ 148/* HDMI_MODE_SEL */
145#define HDMI_MODE_HDMI_EN (1 << 1) 149#define HDMI_MODE_HDMI_EN (1 << 1)
146#define HDMI_MODE_DVI_EN (1 << 0) 150#define HDMI_MODE_DVI_EN (1 << 0)
147#define HDMI_DVI_MODE_EN (1)
148#define HDMI_DVI_MODE_DIS (0)
149#define HDMI_MODE_MASK (3 << 0) 151#define HDMI_MODE_MASK (3 << 0)
150 152
151/* HDMI_TG_CMD */ 153/* HDMI_TG_CMD */