aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_display.c38
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
2 files changed, 38 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 04bec4bd0ac..82aaded6713 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3209,13 +3209,16 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+ struct intel_encoder *encoder;
int pipe = intel_crtc->pipe;
int plane = intel_crtc->plane;
u32 temp;
bool is_pch_port;
+ /* XXX: For compatability with the crtc helper code, call the encoder's
+ * enable function unconditionally for now. */
if (intel_crtc->active)
- return;
+ goto encoders;
intel_crtc->active = true;
intel_update_watermarks(dev);
@@ -3262,6 +3265,12 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
mutex_unlock(&dev->struct_mutex);
intel_crtc_update_cursor(crtc, true);
+
+encoders:
+ for_each_encoder_on_crtc(dev, crtc, encoder) {
+ if (encoder->enable)
+ encoder->enable(encoder);
+ }
}
static void ironlake_crtc_disable(struct drm_crtc *crtc)
@@ -3269,10 +3278,18 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+ struct intel_encoder *encoder;
int pipe = intel_crtc->pipe;
int plane = intel_crtc->plane;
u32 reg, temp;
+ /* XXX: For compatability with the crtc helper code, call the encoder's
+ * disable function unconditionally for now. */
+ for_each_encoder_on_crtc(dev, crtc, encoder) {
+ if (encoder->disable)
+ encoder->disable(encoder);
+ }
+
if (!intel_crtc->active)
return;
@@ -3371,11 +3388,14 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+ struct intel_encoder *encoder;
int pipe = intel_crtc->pipe;
int plane = intel_crtc->plane;
+ /* XXX: For compatability with the crtc helper code, call the encoder's
+ * enable function unconditionally for now. */
if (intel_crtc->active)
- return;
+ goto encoders;
intel_crtc->active = true;
intel_update_watermarks(dev);
@@ -3390,6 +3410,12 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
/* Give the overlay scaler a chance to enable if it's on this pipe */
intel_crtc_dpms_overlay(intel_crtc, true);
intel_crtc_update_cursor(crtc, true);
+
+encoders:
+ for_each_encoder_on_crtc(dev, crtc, encoder) {
+ if (encoder->enable)
+ encoder->enable(encoder);
+ }
}
static void i9xx_crtc_disable(struct drm_crtc *crtc)
@@ -3397,9 +3423,17 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+ struct intel_encoder *encoder;
int pipe = intel_crtc->pipe;
int plane = intel_crtc->plane;
+ /* XXX: For compatability with the crtc helper code, call the encoder's
+ * disable function unconditionally for now. */
+ for_each_encoder_on_crtc(dev, crtc, encoder) {
+ if (encoder->disable)
+ encoder->disable(encoder);
+ }
+
if (!intel_crtc->active)
return;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 95f635b70b5..9a5adcc35bd 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -141,6 +141,8 @@ struct intel_encoder {
*/
bool cloneable;
void (*hot_plug)(struct intel_encoder *);
+ void (*enable)(struct intel_encoder *);
+ void (*disable)(struct intel_encoder *);
int crtc_mask;
};