aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-06-27 11:52:12 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-01 05:14:57 -0400
commit10a504de56f0451c828a9207e36c5610d5b0209a (patch)
tree6e3a00f156573d3af544003b3d809072be60d657 /drivers/gpu/drm
parent22062dbacf7ccc325c8b0ccc3fb90bf487be5c5c (diff)
drm/i915: fold the hpd_irq_setup call into intel_hpd_irq_handler
We already have a vfunc for this (and other parts of the hpd storm handling code already use it). v2: Rebase on top of the i965g/gm sdvo hpd fix. Cc: Egbert Eich <eich@suse.de> Reviewed-by: Egbert Eich <eich@suse.de> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 378ade0d8c9f..c1e9b0a0861c 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -79,9 +79,6 @@ static const u32 hpd_status_i915[] = { /* i915 and valleyview are the same */
79 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS 79 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
80}; 80};
81 81
82static void ibx_hpd_irq_setup(struct drm_device *dev);
83static void i915_hpd_irq_setup(struct drm_device *dev);
84
85/* For display hotplug interrupt */ 82/* For display hotplug interrupt */
86static void 83static void
87ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask) 84ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
@@ -875,14 +872,14 @@ static void gen6_queue_rps_work(struct drm_i915_private *dev_priv,
875#define HPD_STORM_DETECT_PERIOD 1000 872#define HPD_STORM_DETECT_PERIOD 1000
876#define HPD_STORM_THRESHOLD 5 873#define HPD_STORM_THRESHOLD 5
877 874
878static inline bool intel_hpd_irq_handler(struct drm_device *dev, 875static inline void intel_hpd_irq_handler(struct drm_device *dev,
879 u32 hotplug_trigger, 876 u32 hotplug_trigger,
880 const u32 *hpd) 877 const u32 *hpd)
881{ 878{
882 drm_i915_private_t *dev_priv = dev->dev_private; 879 drm_i915_private_t *dev_priv = dev->dev_private;
883 unsigned long irqflags; 880 unsigned long irqflags;
884 int i; 881 int i;
885 bool ret = false; 882 bool storm_detected = false;
886 883
887 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 884 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
888 885
@@ -902,7 +899,7 @@ static inline bool intel_hpd_irq_handler(struct drm_device *dev,
902 dev_priv->hpd_stats[i].hpd_mark = HPD_MARK_DISABLED; 899 dev_priv->hpd_stats[i].hpd_mark = HPD_MARK_DISABLED;
903 dev_priv->hpd_event_bits &= ~(1 << i); 900 dev_priv->hpd_event_bits &= ~(1 << i);
904 DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", i); 901 DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", i);
905 ret = true; 902 storm_detected = true;
906 } else { 903 } else {
907 dev_priv->hpd_stats[i].hpd_cnt++; 904 dev_priv->hpd_stats[i].hpd_cnt++;
908 } 905 }
@@ -910,7 +907,8 @@ static inline bool intel_hpd_irq_handler(struct drm_device *dev,
910 907
911 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 908 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
912 909
913 return ret; 910 if (storm_detected)
911 dev_priv->display.hpd_irq_setup(dev);
914} 912}
915 913
916static void gmbus_irq_handler(struct drm_device *dev) 914static void gmbus_irq_handler(struct drm_device *dev)
@@ -1018,8 +1016,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
1018 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", 1016 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
1019 hotplug_status); 1017 hotplug_status);
1020 if (hotplug_trigger) { 1018 if (hotplug_trigger) {
1021 if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915)) 1019 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915);
1022 i915_hpd_irq_setup(dev);
1023 queue_work(dev_priv->wq, 1020 queue_work(dev_priv->wq,
1024 &dev_priv->hotplug_work); 1021 &dev_priv->hotplug_work);
1025 } 1022 }
@@ -1049,8 +1046,7 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
1049 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; 1046 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
1050 1047
1051 if (hotplug_trigger) { 1048 if (hotplug_trigger) {
1052 if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx)) 1049 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
1053 ibx_hpd_irq_setup(dev);
1054 queue_work(dev_priv->wq, &dev_priv->hotplug_work); 1050 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
1055 } 1051 }
1056 if (pch_iir & SDE_AUDIO_POWER_MASK) { 1052 if (pch_iir & SDE_AUDIO_POWER_MASK) {
@@ -1154,8 +1150,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
1154 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; 1150 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
1155 1151
1156 if (hotplug_trigger) { 1152 if (hotplug_trigger) {
1157 if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt)) 1153 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
1158 ibx_hpd_irq_setup(dev);
1159 queue_work(dev_priv->wq, &dev_priv->hotplug_work); 1154 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
1160 } 1155 }
1161 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { 1156 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
@@ -3232,8 +3227,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
3232 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", 3227 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
3233 hotplug_status); 3228 hotplug_status);
3234 if (hotplug_trigger) { 3229 if (hotplug_trigger) {
3235 if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915)) 3230 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915);
3236 i915_hpd_irq_setup(dev);
3237 queue_work(dev_priv->wq, 3231 queue_work(dev_priv->wq,
3238 &dev_priv->hotplug_work); 3232 &dev_priv->hotplug_work);
3239 } 3233 }
@@ -3473,9 +3467,8 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
3473 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", 3467 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
3474 hotplug_status); 3468 hotplug_status);
3475 if (hotplug_trigger) { 3469 if (hotplug_trigger) {
3476 if (intel_hpd_irq_handler(dev, hotplug_trigger, 3470 intel_hpd_irq_handler(dev, hotplug_trigger,
3477 IS_G4X(dev) ? hpd_status_gen4 : hpd_status_i915)) 3471 IS_G4X(dev) ? hpd_status_gen4 : hpd_status_i915);
3478 i915_hpd_irq_setup(dev);
3479 queue_work(dev_priv->wq, 3472 queue_work(dev_priv->wq,
3480 &dev_priv->hotplug_work); 3473 &dev_priv->hotplug_work);
3481 } 3474 }