diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 1417660a93ec..b1fe0edda955 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -510,7 +510,7 @@ out: | |||
510 | return ret; | 510 | return ret; |
511 | } | 511 | } |
512 | 512 | ||
513 | static void pch_irq_handler(struct drm_device *dev, u32 pch_iir) | 513 | static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) |
514 | { | 514 | { |
515 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 515 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
516 | int pipe; | 516 | int pipe; |
@@ -550,6 +550,35 @@ static void pch_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
550 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); | 550 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); |
551 | } | 551 | } |
552 | 552 | ||
553 | static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) | ||
554 | { | ||
555 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
556 | int pipe; | ||
557 | |||
558 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) | ||
559 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", | ||
560 | (pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> | ||
561 | SDE_AUDIO_POWER_SHIFT_CPT); | ||
562 | |||
563 | if (pch_iir & SDE_AUX_MASK_CPT) | ||
564 | DRM_DEBUG_DRIVER("AUX channel interrupt\n"); | ||
565 | |||
566 | if (pch_iir & SDE_GMBUS_CPT) | ||
567 | DRM_DEBUG_DRIVER("PCH GMBUS interrupt\n"); | ||
568 | |||
569 | if (pch_iir & SDE_AUDIO_CP_REQ_CPT) | ||
570 | DRM_DEBUG_DRIVER("Audio CP request interrupt\n"); | ||
571 | |||
572 | if (pch_iir & SDE_AUDIO_CP_CHG_CPT) | ||
573 | DRM_DEBUG_DRIVER("Audio CP change interrupt\n"); | ||
574 | |||
575 | if (pch_iir & SDE_FDI_MASK_CPT) | ||
576 | for_each_pipe(pipe) | ||
577 | DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n", | ||
578 | pipe_name(pipe), | ||
579 | I915_READ(FDI_RX_IIR(pipe))); | ||
580 | } | ||
581 | |||
553 | static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | 582 | static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) |
554 | { | 583 | { |
555 | struct drm_device *dev = (struct drm_device *) arg; | 584 | struct drm_device *dev = (struct drm_device *) arg; |
@@ -591,7 +620,7 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | |||
591 | 620 | ||
592 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) | 621 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) |
593 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); | 622 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
594 | pch_irq_handler(dev, pch_iir); | 623 | cpt_irq_handler(dev, pch_iir); |
595 | 624 | ||
596 | /* clear PCH hotplug event before clear CPU irq */ | 625 | /* clear PCH hotplug event before clear CPU irq */ |
597 | I915_WRITE(SDEIIR, pch_iir); | 626 | I915_WRITE(SDEIIR, pch_iir); |
@@ -684,7 +713,10 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | |||
684 | if (de_iir & DE_PCH_EVENT) { | 713 | if (de_iir & DE_PCH_EVENT) { |
685 | if (pch_iir & hotplug_mask) | 714 | if (pch_iir & hotplug_mask) |
686 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); | 715 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
687 | pch_irq_handler(dev, pch_iir); | 716 | if (HAS_PCH_CPT(dev)) |
717 | cpt_irq_handler(dev, pch_iir); | ||
718 | else | ||
719 | ibx_irq_handler(dev, pch_iir); | ||
688 | } | 720 | } |
689 | 721 | ||
690 | if (de_iir & DE_PCU_EVENT) { | 722 | if (de_iir & DE_PCU_EVENT) { |