drm/exynos: do hdmi power control by crtc DPMS
authorJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 3 Jun 2014 05:43:42 +0000 (14:43 +0900)
committerChanho Park <chanho61.park@samsung.com>
Thu, 7 Aug 2014 05:27:20 +0000 (14:27 +0900)
The hdmi should turn off after mixer turns off by H/W limitation.
Otherwise, the TV power domain is not disabled. Generally, first it's
called DPMS function of encoder than DPMS function of crtc at from DPMS
off to DPMS on. It can be solution about the H/W dependency to control
hdmi power by crtc DPMS instead of encoder DPMS.

Change-Id: I86e39c438453af5bcc19b7109d2e3569d629d52f
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/exynos/exynos_mixer.h

index 337e4d6..539d6a7 100644 (file)
@@ -1925,7 +1925,6 @@ static struct exynos_drm_display_ops hdmi_display_ops = {
        .create_connector = hdmi_create_connector,
        .mode_fixup     = hdmi_mode_fixup,
        .mode_set       = hdmi_mode_set,
-       .dpms           = hdmi_dpms,
        .commit         = hdmi_commit,
 };
 
@@ -1934,6 +1933,11 @@ static struct exynos_drm_display hdmi_display = {
        .ops = &hdmi_display_ops,
 };
 
+void hdmi_dpms_from_mixer(int mode)
+{
+       hdmi_dpms(&hdmi_display, mode);
+}
+
 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
 {
        struct hdmi_context *hdata = arg;
index 5c1ebba..d0627da 100644 (file)
@@ -1107,6 +1107,12 @@ static void mixer_dpms(struct exynos_drm_manager *mgr, int mode)
                DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
                break;
        }
+
+       /*
+        * The hdmi should turn off after mixer turns off by H/W limitation.
+        * Otherwise, the TV power domain is not disabled.
+        */
+       hdmi_dpms_from_mixer(mode);
 }
 
 /* Only valid for Mixer version 16.0.33.0 */
index 3811e41..c5db9f4 100644 (file)
@@ -16,5 +16,6 @@
 
 /* This function returns 0 if the given timing is valid for the mixer */
 int mixer_check_mode(struct drm_display_mode *mode);
+extern void hdmi_dpms_from_mixer(int mode);
 
 #endif