drm/i915: add encoder->pre_enable/post_disable
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 6 Sep 2012 20:15:40 +0000 (22:15 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 20 Sep 2012 12:23:02 +0000 (14:23 +0200)
The cpu eDP encoder has some horrible hacks to set up the DP pll at
the right time. To be able to move them to the right place, add some
more encoder callbacks so that this can happen at the right time.

LVDS has some similar funky hacks, but that would require more work
(we need to move around the pll setup a bit). Hence for now only
wire these new callbacks up for ilk+ - we only have cpu eDP on these
platforms.

v2: Bikeshed the vtable ordering, requested by Chris Wilson.

Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h

index d771f2f3767894cc6a6bc7d3472bfa52f9853632..ea707fcbc40a60704fc3c256d7caa24d6dc6cb80 100644 (file)
@@ -3242,6 +3242,10 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
        else
                ironlake_fdi_disable(crtc);
 
+       for_each_encoder_on_crtc(dev, crtc, encoder)
+               if (encoder->pre_enable)
+                       encoder->pre_enable(encoder);
+
        /* Enable panel fitting for LVDS */
        if (dev_priv->pch_pf_size &&
            (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) {
@@ -3311,6 +3315,10 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
        I915_WRITE(PF_CTL(pipe), 0);
        I915_WRITE(PF_WIN_SZ(pipe), 0);
 
+       for_each_encoder_on_crtc(dev, crtc, encoder)
+               if (encoder->post_disable)
+                       encoder->post_disable(encoder);
+
        ironlake_fdi_disable(crtc);
 
        /* This is a horrible layering violation; we should be doing this in
index 4f2b2d6a2489db7ffd02b94be941cf5ea0e99b97..351fd7179cd723bdd261449e3d4965340722adea 100644 (file)
@@ -152,8 +152,10 @@ struct intel_encoder {
        bool cloneable;
        bool connectors_active;
        void (*hot_plug)(struct intel_encoder *);
+       void (*pre_enable)(struct intel_encoder *);
        void (*enable)(struct intel_encoder *);
        void (*disable)(struct intel_encoder *);
+       void (*post_disable)(struct intel_encoder *);
        /* Read out the current hw state of this connector, returning true if
         * the encoder is active. If the encoder is enabled it also set the pipe
         * it is connected to in the pipe parameter. */