Hardware require that MIXER(crtc) should be disabled prior to
HDMI(encoder). It was achieved by disabling crtc from encoder disable
callback, bypassing drm core. As a result drm core tried to call vblank
related routines on disabled crtc. The patch fixes it by simplifying
hdmi_disable routine - now it only cancels hotplug worker. Hardware will
be disabled in proper moment during pipe clock disable.

Signed-off-by: Andrzej Hajda <a.ha...@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_hdmi.c | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c 
b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 5243840..b61fe87 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -1481,8 +1481,6 @@ static void hdmi_enable(struct drm_encoder *encoder)
 static void hdmi_disable(struct drm_encoder *encoder)
 {
        struct hdmi_context *hdata = encoder_to_hdmi(encoder);
-       struct drm_crtc *crtc = encoder->crtc;
-       const struct drm_crtc_helper_funcs *funcs = NULL;
 
        if (!hdata->powered)
                return;
@@ -1493,17 +1491,10 @@ static void hdmi_disable(struct drm_encoder *encoder)
         * to disable TV Subsystem should be as following,
         *      VP -> Mixer -> HDMI
         *
-        * Below codes will try to disable Mixer and VP(if used)
-        * prior to disabling HDMI.
+        * To achieve such sequence HDMI is disabled together with HDMI PHY, via
+        * pipe clock callback.
         */
-       if (crtc)
-               funcs = crtc->helper_private;
-       if (funcs && funcs->disable)
-               (*funcs->disable)(crtc);
-
        cancel_delayed_work(&hdata->hotplug_work);
-
-       hdmiphy_disable(hdata);
 }
 
 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs 
= {
-- 
2.7.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to