drm/exynos: enable dvi mode for dvi monitor
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Tue, 24 Apr 2012 08:39:15 +0000 (17:39 +0900)
committerInki Dae <inki.dae@samsung.com>
Thu, 17 May 2012 11:14:25 +0000 (20:14 +0900)
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>
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/regs-hdmi.h

index ad53c4808bdbabaedbb56218672c1ff3d444ce65..5ca0a9f1f43a1026f2585a4b8009b532274b9f00 100644 (file)
@@ -60,6 +60,7 @@ struct hdmi_context {
        bool                            hpd;
        bool                            powered;
        bool                            is_v13;
+       bool                            dvi_mode;
        struct mutex                    hdmi_mutex;
 
        struct resource                 *regs_res;
@@ -1211,10 +1212,12 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
 
        raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
        if (raw_edid) {
+               hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
                memcpy(edid, raw_edid, min((1 + raw_edid->extensions)
                                        * EDID_LENGTH, len));
-               DRM_DEBUG_KMS("width[%d] x height[%d]\n",
-                               raw_edid->width_cm, raw_edid->height_cm);
+               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);
        } else {
                return -ENODEV;
        }
@@ -1437,10 +1440,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata)
 
 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
 {
-       u32 mod;
-
-       mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
-       if (mod & HDMI_DVI_MODE_EN)
+       if (hdata->dvi_mode)
                return;
 
        hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
@@ -1479,6 +1479,14 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
        /* disable bluescreen */
        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) {
                /* choose bluescreen (fecal) color */
                hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
index 3c04bea842ce4a293b098028287a5a695048f4b4..9cc7c5e9718cfddffa0c1eb171953bc5cf3e2ae3 100644 (file)
 #define HDMI_ASP_MASK                  (1 << 2)
 #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 */
 #define HDMI_PHY_STATUS_READY          (1 << 0)
 
 /* HDMI_MODE_SEL */
 #define HDMI_MODE_HDMI_EN              (1 << 1)
 #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)
 
 /* HDMI_TG_CMD */