drm/i915: Initialize LVDS and eDP outputs before anything else
authorAdam Jackson <ajax@redhat.com>
Fri, 16 Jul 2010 18:46:29 +0000 (14:46 -0400)
committerEric Anholt <eric@anholt.net>
Mon, 2 Aug 2010 02:38:00 +0000 (19:38 -0700)
This makes them sort to the front in X, which makes them likely to be
the primary outputs if you haven't specified a preference in your DE,
which is likely to be what you want.

Signed-off-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_drv.h

index 30d89111f55963ac314db1ff9583c7037bcc46d6..82d1b91bdfa61e4b157ca4baba27b7112134b4bb 100644 (file)
@@ -5111,19 +5111,26 @@ static void intel_setup_outputs(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_encoder *encoder;
+       bool dpd_is_edp = false;
 
-       intel_crt_init(dev);
-
-       /* Set up integrated LVDS */
        if (IS_MOBILE(dev) && !IS_I830(dev))
                intel_lvds_init(dev);
 
        if (HAS_PCH_SPLIT(dev)) {
-               int found;
+               dpd_is_edp = intel_dpd_is_edp(dev);
 
                if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED))
                        intel_dp_init(dev, DP_A);
 
+               if (dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED))
+                       intel_dp_init(dev, PCH_DP_D);
+       }
+
+       intel_crt_init(dev);
+
+       if (HAS_PCH_SPLIT(dev)) {
+               int found;
+
                if (I915_READ(HDMIB) & PORT_DETECTED) {
                        /* PCH SDVOB multiplex with HDMIB */
                        found = intel_sdvo_init(dev, PCH_SDVOB);
@@ -5142,7 +5149,7 @@ static void intel_setup_outputs(struct drm_device *dev)
                if (I915_READ(PCH_DP_C) & DP_DETECTED)
                        intel_dp_init(dev, PCH_DP_C);
 
-               if (I915_READ(PCH_DP_D) & DP_DETECTED)
+               if (!dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED))
                        intel_dp_init(dev, PCH_DP_D);
 
        } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) {
index 016a9237a0207489acd1913957544db3cfb514bf..f7410cffa8c90015bea54cbb0d3812d3d92931e8 100644 (file)
@@ -1464,7 +1464,7 @@ intel_trans_dp_port_sel (struct drm_crtc *crtc)
 }
 
 /* check the VBT to see whether the eDP is on DP-D port */
-static bool intel_dpd_is_edp(struct drm_device *dev)
+bool intel_dpd_is_edp(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct child_device_config *p_child;
index 8c941da8ca3815deb26e6098d6fc49816dce16bd..296933a8d39581191eaf5adc2049c02b38bdca29 100644 (file)
@@ -180,6 +180,7 @@ void
 intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
                 struct drm_display_mode *adjusted_mode);
 extern bool intel_pch_has_edp(struct drm_crtc *crtc);
+extern bool intel_dpd_is_edp(struct drm_device *dev);
 extern void intel_edp_link_config (struct intel_encoder *, int *, int *);