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>
This commit is contained in:
@@ -79,9 +79,6 @@ static const u32 hpd_status_i915[] = { /* i915 and valleyview are the same */
|
|||||||
[HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
|
[HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ibx_hpd_irq_setup(struct drm_device *dev);
|
|
||||||
static void i915_hpd_irq_setup(struct drm_device *dev);
|
|
||||||
|
|
||||||
/* For display hotplug interrupt */
|
/* For display hotplug interrupt */
|
||||||
static void
|
static void
|
||||||
ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
|
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,
|
|||||||
#define HPD_STORM_DETECT_PERIOD 1000
|
#define HPD_STORM_DETECT_PERIOD 1000
|
||||||
#define HPD_STORM_THRESHOLD 5
|
#define HPD_STORM_THRESHOLD 5
|
||||||
|
|
||||||
static inline bool intel_hpd_irq_handler(struct drm_device *dev,
|
static inline void intel_hpd_irq_handler(struct drm_device *dev,
|
||||||
u32 hotplug_trigger,
|
u32 hotplug_trigger,
|
||||||
const u32 *hpd)
|
const u32 *hpd)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
int i;
|
int i;
|
||||||
bool ret = false;
|
bool storm_detected = false;
|
||||||
|
|
||||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||||
|
|
||||||
@@ -902,7 +899,7 @@ static inline bool intel_hpd_irq_handler(struct drm_device *dev,
|
|||||||
dev_priv->hpd_stats[i].hpd_mark = HPD_MARK_DISABLED;
|
dev_priv->hpd_stats[i].hpd_mark = HPD_MARK_DISABLED;
|
||||||
dev_priv->hpd_event_bits &= ~(1 << i);
|
dev_priv->hpd_event_bits &= ~(1 << i);
|
||||||
DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", i);
|
DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", i);
|
||||||
ret = true;
|
storm_detected = true;
|
||||||
} else {
|
} else {
|
||||||
dev_priv->hpd_stats[i].hpd_cnt++;
|
dev_priv->hpd_stats[i].hpd_cnt++;
|
||||||
}
|
}
|
||||||
@@ -910,7 +907,8 @@ static inline bool intel_hpd_irq_handler(struct drm_device *dev,
|
|||||||
|
|
||||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||||
|
|
||||||
return ret;
|
if (storm_detected)
|
||||||
|
dev_priv->display.hpd_irq_setup(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gmbus_irq_handler(struct drm_device *dev)
|
static void gmbus_irq_handler(struct drm_device *dev)
|
||||||
@@ -1018,8 +1016,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
|
|||||||
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
||||||
hotplug_status);
|
hotplug_status);
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915))
|
intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915);
|
||||||
i915_hpd_irq_setup(dev);
|
|
||||||
queue_work(dev_priv->wq,
|
queue_work(dev_priv->wq,
|
||||||
&dev_priv->hotplug_work);
|
&dev_priv->hotplug_work);
|
||||||
}
|
}
|
||||||
@@ -1049,8 +1046,7 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
|
|||||||
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
|
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
|
||||||
|
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx))
|
intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
|
||||||
ibx_hpd_irq_setup(dev);
|
|
||||||
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
||||||
}
|
}
|
||||||
if (pch_iir & SDE_AUDIO_POWER_MASK) {
|
if (pch_iir & SDE_AUDIO_POWER_MASK) {
|
||||||
@@ -1154,8 +1150,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
|
|||||||
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
|
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
|
||||||
|
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt))
|
intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
|
||||||
ibx_hpd_irq_setup(dev);
|
|
||||||
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
||||||
}
|
}
|
||||||
if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
|
if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
|
||||||
@@ -3232,8 +3227,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
|
|||||||
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
||||||
hotplug_status);
|
hotplug_status);
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915))
|
intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915);
|
||||||
i915_hpd_irq_setup(dev);
|
|
||||||
queue_work(dev_priv->wq,
|
queue_work(dev_priv->wq,
|
||||||
&dev_priv->hotplug_work);
|
&dev_priv->hotplug_work);
|
||||||
}
|
}
|
||||||
@@ -3473,9 +3467,8 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
|
|||||||
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
|
||||||
hotplug_status);
|
hotplug_status);
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
if (intel_hpd_irq_handler(dev, hotplug_trigger,
|
intel_hpd_irq_handler(dev, hotplug_trigger,
|
||||||
IS_G4X(dev) ? hpd_status_gen4 : hpd_status_i915))
|
IS_G4X(dev) ? hpd_status_gen4 : hpd_status_i915);
|
||||||
i915_hpd_irq_setup(dev);
|
|
||||||
queue_work(dev_priv->wq,
|
queue_work(dev_priv->wq,
|
||||||
&dev_priv->hotplug_work);
|
&dev_priv->hotplug_work);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user