summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorChenhui Zhao <chenhui.zhao@freescale.com>2010-11-11 23:50:00 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-03-31 18:59:10 (GMT)
commitd6c4a975da18a95198dcca0d6c9cd92dc6cbc173 (patch)
treec3f63bd2834160f4dbf17d8cdb4abea49d93d49f /arch
parent4333167f3e6f071905e841aa71377b0d14d55f35 (diff)
downloadlinux-fsl-qoriq-d6c4a975da18a95198dcca0d6c9cd92dc6cbc173.tar.xz
powerpc/mpic: supply a .disable callback
Currently MPIC provides .mask, but not .disable. This means that effectively disable_irq() soft-disables the interrupt, and you get a .mask call if an interrupt actually occurs. I'm not sure if this was intended as a performance benefit (it seems common to omit .disable on powerpc interrupt controllers, but nowhere else), but it interacts badly with threaded/workqueue interrupts (including KVM reflection). In such cases, where the real interrupt handler does a disable_irq_nosync(), schedules defered handling, and returns, we get two interrupts for every real interrupt. The second interrupt does nothing but see that IRQ_DISABLED is set, and decide that it would be a good idea to actually call .mask. In the sleep case, disable all irqs of IP blocks using .disable() when entering sleep. Change-Id: I8f57e20a87acae115d0a8a006d31ffdedb42c295 Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Chenhui Zhao <chenhui.zhao@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/10507 Reviewed-by: Yang Li <LeoLi@freescale.com> Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Dongsheng Wang <dongsheng.wang@freescale.com> Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/sysdev/mpic.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index 9152dbf..494b498 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -975,6 +975,7 @@ void mpic_set_destination(unsigned int virq, unsigned int cpuid)
}
static struct irq_chip mpic_irq_chip = {
+ .irq_disable = mpic_mask_irq,
.irq_mask = mpic_mask_irq,
.irq_unmask = mpic_unmask_irq,
.irq_eoi = mpic_end_irq,
@@ -991,6 +992,7 @@ static struct irq_chip mpic_ipi_chip = {
#endif /* CONFIG_SMP */
static struct irq_chip mpic_tm_chip = {
+ .irq_disable = mpic_mask_tm,
.irq_mask = mpic_mask_tm,
.irq_unmask = mpic_unmask_tm,
.irq_eoi = mpic_end_irq,
@@ -1001,6 +1003,7 @@ static struct irq_chip mpic_tm_chip = {
static struct irq_chip mpic_irq_ht_chip = {
.irq_startup = mpic_startup_ht_irq,
.irq_shutdown = mpic_shutdown_ht_irq,
+ .irq_disable = mpic_mask_irq,
.irq_mask = mpic_mask_irq,
.irq_unmask = mpic_unmask_ht_irq,
.irq_eoi = mpic_end_ht_irq,