diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-27 11:52:12 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-01 05:14:57 -0400 |
commit | 10a504de56f0451c828a9207e36c5610d5b0209a (patch) | |
tree | 6e3a00f156573d3af544003b3d809072be60d657 /drivers/gpu/drm | |
parent | 22062dbacf7ccc325c8b0ccc3fb90bf487be5c5c (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.c | 29 |
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 | ||
82 | static void ibx_hpd_irq_setup(struct drm_device *dev); | ||
83 | static void i915_hpd_irq_setup(struct drm_device *dev); | ||
84 | |||
85 | /* For display hotplug interrupt */ | 82 | /* For display hotplug interrupt */ |
86 | static void | 83 | static void |
87 | ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask) | 84 | ironlake_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 | ||
878 | static inline bool intel_hpd_irq_handler(struct drm_device *dev, | 875 | static 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 | ||
916 | static void gmbus_irq_handler(struct drm_device *dev) | 914 | static 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 | } |