Keep all the platform output selection in intel_output_setup(), and don't scatter it around. As a useful side effect, do not try to enable LVDS on HSW or VLV. Some checks are done in a slightly different order than before, and on some platforms VGA is now initialized before LVDS. Signed-off-by: Jani Nikula <jani.nikula at intel.com> --- I took this out of the VLV series to give it the attention it needs. --- drivers/gpu/drm/i915/intel_display.c | 25 ++++++++++++++++++++----- drivers/gpu/drm/i915/intel_lvds.c | 24 ------------------------ 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d75c6a0..a1fb320 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -8198,12 +8198,19 @@ static void intel_setup_outputs(struct drm_device *dev) struct drm_i915_private *dev_priv = dev->dev_private; struct intel_encoder *encoder; bool dpd_is_edp = false; - bool has_lvds; - has_lvds = intel_lvds_init(dev); - if (!has_lvds && !HAS_PCH_SPLIT(dev)) { - /* disable the panel fitter on everything but LVDS */ - I915_WRITE(PFIT_CONTROL, 0); + if (!HAS_PCH_SPLIT(dev)) { + bool has_lvds = false; + + /* Prior to PCH split LVDS was only attached to mobile products, + * except for the inglorious 830gm */ + if (IS_MOBILE(dev) && !IS_I830(dev)) + has_lvds = intel_lvds_init(dev); + + if (!has_lvds) { + /* disable the panel fitter on everything but LVDS */ + I915_WRITE(PFIT_CONTROL, 0); + } } if (!(HAS_DDI(dev) && (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES))) @@ -8230,6 +8237,14 @@ static void intel_setup_outputs(struct drm_device *dev) intel_ddi_init(dev, PORT_D); } else if (HAS_PCH_SPLIT(dev)) { int found; + + if (I915_READ(PCH_LVDS) & LVDS_DETECTED) { + if (dev_priv->edp.support) + DRM_DEBUG_KMS("disable LVDS for eDP support\n"); + else + intel_lvds_init(dev); + } + dpd_is_edp = intel_dpd_is_edp(dev); if (has_edp_a(dev)) diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 7e4ec63..3c76e91 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -1024,18 +1024,6 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP; } -static bool intel_lvds_supported(struct drm_device *dev) -{ - /* With the introduction of the PCH we gained a dedicated - * LVDS presence pin, use it. */ - if (HAS_PCH_SPLIT(dev)) - return true; - - /* Otherwise LVDS was only attached to mobile products, - * except for the inglorious 830gm */ - return IS_MOBILE(dev) && !IS_I830(dev); -} - /** * intel_lvds_init - setup LVDS connectors on this device * @dev: drm device @@ -1060,9 +1048,6 @@ bool intel_lvds_init(struct drm_device *dev) int pipe; u8 pin; - if (!intel_lvds_supported(dev)) - return false; - /* Skip init on machines we know falsely report LVDS */ if (dmi_check_system(intel_no_lvds)) return false; @@ -1073,15 +1058,6 @@ bool intel_lvds_init(struct drm_device *dev) return false; } - if (HAS_PCH_SPLIT(dev)) { - if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) - return false; - if (dev_priv->edp.support) { - DRM_DEBUG_KMS("disable LVDS for eDP support\n"); - return false; - } - } - lvds_encoder = kzalloc(sizeof(struct intel_lvds_encoder), GFP_KERNEL); if (!lvds_encoder) return false; -- 1.7.10.4