aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_runtime_pm.c
diff options
context:
space:
mode:
authorLyude <cpaul@redhat.com>2016-06-21 17:03:42 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-07-14 16:06:11 -0400
commit9504a89247595b6c066c68aea0c34af1fc78d021 (patch)
treecce50fac2df3f2ea00e87b0aa551637c906b57f4 /drivers/gpu/drm/i915/intel_runtime_pm.c
parent28cf71ce3e206db1c3f30b3da31e7b48b2269e4c (diff)
drm/i915/vlv: Reset the ADPA in vlv_display_power_well_init()
While VGA hotplugging worked(ish) before, it looks like that was mainly because we'd unintentionally enable it in valleyview_crt_detect_hotplug() when we did a force trigger. This doesn't work reliably enough because whenever the display powerwell on vlv gets disabled, the values set in VLV_ADPA get cleared and consequently VGA hotplugging gets disabled. This causes bugs such as one we found on an Intel NUC, where doing the following sequence of hotplugs: - Disconnect all monitors - Connect VGA - Disconnect VGA - Connect HDMI Would result in VGA hotplugging becoming disabled, due to the powerwells getting toggled in the process of connecting HDMI. Changes since v3: - Expose intel_crt_reset() through intel_drv.h and call that in vlv_display_power_well_init() instead of encoder->base.funcs->reset(&encoder->base); Changes since v2: - Use intel_encoder structs instead of drm_encoder structs Changes since v1: - Instead of handling the register writes ourself, we just reuse intel_crt_detect() - Instead of resetting the ADPA during display IRQ installation, we now reset them in vlv_display_power_well_init() Cc: stable@vger.kernel.org Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Lyude <cpaul@redhat.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> [danvet: Rebase over dev_priv/drm_device embedding.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6b78295f53db..b089ec89363d 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -1078,6 +1078,7 @@ static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
1078 1078
1079static void vlv_display_power_well_init(struct drm_i915_private *dev_priv) 1079static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
1080{ 1080{
1081 struct intel_encoder *encoder;
1081 enum pipe pipe; 1082 enum pipe pipe;
1082 1083
1083 /* 1084 /*
@@ -1113,6 +1114,12 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
1113 1114
1114 intel_hpd_init(dev_priv); 1115 intel_hpd_init(dev_priv);
1115 1116
1117 /* Re-enable the ADPA, if we have one */
1118 for_each_intel_encoder(&dev_priv->drm, encoder) {
1119 if (encoder->type == INTEL_OUTPUT_ANALOG)
1120 intel_crt_reset(&encoder->base);
1121 }
1122
1116 i915_redisable_vga_power_on(&dev_priv->drm); 1123 i915_redisable_vga_power_on(&dev_priv->drm);
1117} 1124}
1118 1125