drm/i915: passing drm connector param for load detection
authorZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 30 Mar 2010 06:39:30 +0000 (14:39 +0800)
committerEric Anholt <eric@anholt.net>
Fri, 9 Apr 2010 21:16:38 +0000 (14:16 -0700)
In load detection, connector's encoder assignment must be kept
consistent for proper mode setting, and this makes connector as
explicit parameter for load detect function to not require single
data structure to hold both encoder and connector reference, ease
the transition for splitted encoder/connector model.

Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_tv.c

index 36c4ad7fb3b6bfc7ef4a5e3e9b7a54d4358a628d..b96574ea4707383f3d31672bd603e1c3728d4922 100644 (file)
@@ -406,11 +406,12 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
        if (encoder->crtc && encoder->crtc->enabled) {
                status = intel_crt_load_detect(encoder->crtc, intel_encoder);
        } else {
-               crtc = intel_get_load_detect_pipe(intel_encoder,
+               crtc = intel_get_load_detect_pipe(intel_encoder, connector,
                                                  NULL, &dpms_mode);
                if (crtc) {
                        status = intel_crt_load_detect(crtc, intel_encoder);
-                       intel_release_load_detect_pipe(intel_encoder, dpms_mode);
+                       intel_release_load_detect_pipe(intel_encoder,
+                                                      connector, dpms_mode);
                } else
                        status = connector_status_unknown;
        }
index f9e11e863428b6b98e6e535607f1d4da4d0c2e8d..5a69800820645b2dc2335482a45deff40bfed36c 100644 (file)
@@ -3671,6 +3671,7 @@ static struct drm_display_mode load_detect_mode = {
 };
 
 struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
+                                           struct drm_connector *connector,
                                            struct drm_display_mode *mode,
                                            int *dpms_mode)
 {
@@ -3729,7 +3730,7 @@ struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
        }
 
        encoder->crtc = crtc;
-       intel_encoder->base.encoder = encoder;
+       connector->encoder = encoder;
        intel_encoder->load_detect_temp = true;
 
        intel_crtc = to_intel_crtc(crtc);
@@ -3755,7 +3756,8 @@ struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
        return crtc;
 }
 
-void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, int dpms_mode)
+void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
+                                   struct drm_connector *connector, int dpms_mode)
 {
        struct drm_encoder *encoder = &intel_encoder->enc;
        struct drm_device *dev = encoder->dev;
@@ -3765,7 +3767,7 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, int dpm
 
        if (intel_encoder->load_detect_temp) {
                encoder->crtc = NULL;
-               intel_encoder->base.encoder = NULL;
+               connector->encoder = NULL;
                intel_encoder->load_detect_temp = false;
                crtc->enabled = drm_helper_crtc_in_use(crtc);
                drm_helper_disable_unused_functions(dev);
index 5b2e3b21980155b55ca526982ab3c116c8539153..4741713df74aabd9f974e59f5aebf36a072e1f49 100644 (file)
@@ -199,9 +199,11 @@ int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
 extern void intel_wait_for_vblank(struct drm_device *dev);
 extern struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe);
 extern struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
+                                                  struct drm_connector *connector,
                                                   struct drm_display_mode *mode,
                                                   int *dpms_mode);
 extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
+                                          struct drm_connector *connector,
                                           int dpms_mode);
 
 extern struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB);
index eea593071e496d2ce0632f78e5c48f07c78f7479..dd5e2e84b2b2d54316c3e4dfcb645ca7b1409a63 100644 (file)
@@ -1496,10 +1496,12 @@ intel_tv_detect(struct drm_connector *connector)
        if (encoder->crtc && encoder->crtc->enabled) {
                type = intel_tv_detect_type(encoder->crtc, intel_encoder);
        } else {
-               crtc = intel_get_load_detect_pipe(intel_encoder, &mode, &dpms_mode);
+               crtc = intel_get_load_detect_pipe(intel_encoder, connector,
+                                                 &mode, &dpms_mode);
                if (crtc) {
                        type = intel_tv_detect_type(crtc, intel_encoder);
-                       intel_release_load_detect_pipe(intel_encoder, dpms_mode);
+                       intel_release_load_detect_pipe(intel_encoder, connector,
+                                                      dpms_mode);
                } else
                        type = -1;
        }