diff options
| author | Ingo Molnar <mingo@elte.hu> | 2006-06-29 05:24:44 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-29 13:26:23 -0400 |
| commit | c0ad90a32fb60f4129d0e24dfd5fd7128e2e09f2 (patch) | |
| tree | 260d99ab74d33a37cbcc3557e2f18a5e96879f4d | |
| parent | 096c8131c573ed37939dc3f1440221c92c87e74b (diff) | |
[PATCH] genirq: add ->retrigger() irq op to consolidate hw_irq_resend()
Add ->retrigger() irq op to consolidate hw_irq_resend() implementations.
(Most architectures had it defined to NOP anyway.)
NOTE: ia64 needs testing. i386 and x86_64 tested.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | arch/i386/kernel/io_apic.c | 9 | ||||
| -rw-r--r-- | arch/ia64/kernel/irq_lsapic.c | 10 | ||||
| -rw-r--r-- | arch/ia64/kernel/perfmon.c | 4 | ||||
| -rw-r--r-- | arch/parisc/kernel/irq.c | 11 | ||||
| -rw-r--r-- | arch/x86_64/kernel/io_apic.c | 9 | ||||
| -rw-r--r-- | include/asm-alpha/hw_irq.h | 2 | ||||
| -rw-r--r-- | include/asm-cris/hw_irq.h | 2 | ||||
| -rw-r--r-- | include/asm-i386/hw_irq.h | 10 | ||||
| -rw-r--r-- | include/asm-ia64/hw_irq.h | 3 | ||||
| -rw-r--r-- | include/asm-m32r/hw_irq.h | 5 | ||||
| -rw-r--r-- | include/asm-mips/hw_irq.h | 8 | ||||
| -rw-r--r-- | include/asm-parisc/hw_irq.h | 9 | ||||
| -rw-r--r-- | include/asm-powerpc/hw_irq.h | 6 | ||||
| -rw-r--r-- | include/asm-sh/hw_irq.h | 5 | ||||
| -rw-r--r-- | include/asm-sh64/hw_irq.h | 1 | ||||
| -rw-r--r-- | include/asm-um/hw_irq.h | 3 | ||||
| -rw-r--r-- | include/asm-v850/hw_irq.h | 4 | ||||
| -rw-r--r-- | include/asm-x86_64/hw_irq.h | 9 | ||||
| -rw-r--r-- | include/asm-xtensa/hw_irq.h | 4 | ||||
| -rw-r--r-- | include/linux/irq.h | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 3 |
21 files changed, 45 insertions, 74 deletions
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index afe54f257c..ec9ea0269d 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
| @@ -2071,6 +2071,13 @@ static void set_ioapic_affinity_vector (unsigned int vector, | |||
| 2071 | #endif | 2071 | #endif |
| 2072 | #endif | 2072 | #endif |
| 2073 | 2073 | ||
| 2074 | static int ioapic_retrigger(unsigned int irq) | ||
| 2075 | { | ||
| 2076 | send_IPI_self(IO_APIC_VECTOR(irq)); | ||
| 2077 | |||
| 2078 | return 1; | ||
| 2079 | } | ||
| 2080 | |||
| 2074 | /* | 2081 | /* |
| 2075 | * Level and edge triggered IO-APIC interrupts need different handling, | 2082 | * Level and edge triggered IO-APIC interrupts need different handling, |
| 2076 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be | 2083 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be |
| @@ -2090,6 +2097,7 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = { | |||
| 2090 | #ifdef CONFIG_SMP | 2097 | #ifdef CONFIG_SMP |
| 2091 | .set_affinity = set_ioapic_affinity, | 2098 | .set_affinity = set_ioapic_affinity, |
| 2092 | #endif | 2099 | #endif |
| 2100 | .retrigger = ioapic_retrigger, | ||
| 2093 | }; | 2101 | }; |
| 2094 | 2102 | ||
| 2095 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { | 2103 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { |
| @@ -2103,6 +2111,7 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = { | |||
| 2103 | #ifdef CONFIG_SMP | 2111 | #ifdef CONFIG_SMP |
| 2104 | .set_affinity = set_ioapic_affinity, | 2112 | .set_affinity = set_ioapic_affinity, |
| 2105 | #endif | 2113 | #endif |
| 2114 | .retrigger = ioapic_retrigger, | ||
| 2106 | }; | 2115 | }; |
| 2107 | 2116 | ||
| 2108 | static inline void init_IO_APIC_traps(void) | 2117 | static inline void init_IO_APIC_traps(void) |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index ea14e6a044..1ab58b09f3 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
| @@ -26,6 +26,13 @@ lsapic_noop (unsigned int irq) | |||
| 26 | /* nuthing to do... */ | 26 | /* nuthing to do... */ |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | static int lsapic_retrigger(unsigned int irq) | ||
| 30 | { | ||
| 31 | ia64_resend_irq(irq); | ||
| 32 | |||
| 33 | return 1; | ||
| 34 | } | ||
| 35 | |||
| 29 | struct hw_interrupt_type irq_type_ia64_lsapic = { | 36 | struct hw_interrupt_type irq_type_ia64_lsapic = { |
| 30 | .typename = "LSAPIC", | 37 | .typename = "LSAPIC", |
| 31 | .startup = lsapic_noop_startup, | 38 | .startup = lsapic_noop_startup, |
| @@ -33,5 +40,6 @@ struct hw_interrupt_type irq_type_ia64_lsapic = { | |||
| 33 | .enable = lsapic_noop, | 40 | .enable = lsapic_noop, |
| 34 | .disable = lsapic_noop, | 41 | .disable = lsapic_noop, |
| 35 | .ack = lsapic_noop, | 42 | .ack = lsapic_noop, |
| 36 | .end = lsapic_noop | 43 | .end = lsapic_noop, |
| 44 | .retrigger = lsapic_retrigger, | ||
| 37 | }; | 45 | }; |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 6d7bc8ff7b..a0055d3d69 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -6165,7 +6165,7 @@ pfm_load_regs (struct task_struct *task) | |||
| 6165 | /* | 6165 | /* |
| 6166 | * will replay the PMU interrupt | 6166 | * will replay the PMU interrupt |
| 6167 | */ | 6167 | */ |
| 6168 | if (need_irq_resend) hw_resend_irq(NULL, IA64_PERFMON_VECTOR); | 6168 | if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR); |
| 6169 | 6169 | ||
| 6170 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; | 6170 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; |
| 6171 | } | 6171 | } |
| @@ -6305,7 +6305,7 @@ pfm_load_regs (struct task_struct *task) | |||
| 6305 | /* | 6305 | /* |
| 6306 | * will replay the PMU interrupt | 6306 | * will replay the PMU interrupt |
| 6307 | */ | 6307 | */ |
| 6308 | if (need_irq_resend) hw_resend_irq(NULL, IA64_PERFMON_VECTOR); | 6308 | if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR); |
| 6309 | 6309 | ||
| 6310 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; | 6310 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; |
| 6311 | } | 6311 | } |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index ea6a55e1a0..82fe6ba297 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -125,6 +125,10 @@ static struct hw_interrupt_type cpu_interrupt_type = { | |||
| 125 | #ifdef CONFIG_SMP | 125 | #ifdef CONFIG_SMP |
| 126 | .set_affinity = cpu_set_affinity_irq, | 126 | .set_affinity = cpu_set_affinity_irq, |
| 127 | #endif | 127 | #endif |
| 128 | /* XXX: Needs to be written. We managed without it so far, but | ||
| 129 | * we really ought to write it. | ||
| 130 | */ | ||
| 131 | .retrigger = NULL, | ||
| 128 | }; | 132 | }; |
| 129 | 133 | ||
| 130 | int show_interrupts(struct seq_file *p, void *v) | 134 | int show_interrupts(struct seq_file *p, void *v) |
| @@ -404,13 +408,6 @@ void __init init_IRQ(void) | |||
| 404 | 408 | ||
| 405 | } | 409 | } |
| 406 | 410 | ||
| 407 | void hw_resend_irq(struct hw_interrupt_type *type, unsigned int irq) | ||
| 408 | { | ||
| 409 | /* XXX: Needs to be written. We managed without it so far, but | ||
| 410 | * we really ought to write it. | ||
| 411 | */ | ||
| 412 | } | ||
| 413 | |||
| 414 | void ack_bad_irq(unsigned int irq) | 411 | void ack_bad_irq(unsigned int irq) |
| 415 | { | 412 | { |
| 416 | printk("unexpected IRQ %d\n", irq); | 413 | printk("unexpected IRQ %d\n", irq); |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 88a8736eb8..401b687fef 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
| @@ -1618,6 +1618,13 @@ static void set_ioapic_affinity_vector (unsigned int vector, | |||
| 1618 | #endif // CONFIG_SMP | 1618 | #endif // CONFIG_SMP |
| 1619 | #endif // CONFIG_PCI_MSI | 1619 | #endif // CONFIG_PCI_MSI |
| 1620 | 1620 | ||
| 1621 | static int ioapic_retrigger(unsigned int irq) | ||
| 1622 | { | ||
| 1623 | send_IPI_self(IO_APIC_VECTOR(irq)); | ||
| 1624 | |||
| 1625 | return 1; | ||
| 1626 | } | ||
| 1627 | |||
| 1621 | /* | 1628 | /* |
| 1622 | * Level and edge triggered IO-APIC interrupts need different handling, | 1629 | * Level and edge triggered IO-APIC interrupts need different handling, |
| 1623 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be | 1630 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be |
| @@ -1638,6 +1645,7 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = { | |||
| 1638 | #ifdef CONFIG_SMP | 1645 | #ifdef CONFIG_SMP |
| 1639 | .set_affinity = set_ioapic_affinity, | 1646 | .set_affinity = set_ioapic_affinity, |
| 1640 | #endif | 1647 | #endif |
| 1648 | .retrigger = ioapic_retrigger, | ||
| 1641 | }; | 1649 | }; |
| 1642 | 1650 | ||
| 1643 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { | 1651 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { |
| @@ -1651,6 +1659,7 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = { | |||
| 1651 | #ifdef CONFIG_SMP | 1659 | #ifdef CONFIG_SMP |
| 1652 | .set_affinity = set_ioapic_affinity, | 1660 | .set_affinity = set_ioapic_affinity, |
| 1653 | #endif | 1661 | #endif |
| 1662 | .retrigger = ioapic_retrigger, | ||
| 1654 | }; | 1663 | }; |
| 1655 | 1664 | ||
| 1656 | static inline void init_IO_APIC_traps(void) | 1665 | static inline void init_IO_APIC_traps(void) |
diff --git a/include/asm-alpha/hw_irq.h b/include/asm-alpha/hw_irq.h index ca9d43b635..a37db0f950 100644 --- a/include/asm-alpha/hw_irq.h +++ b/include/asm-alpha/hw_irq.h | |||
| @@ -2,8 +2,6 @@ | |||
| 2 | #define _ALPHA_HW_IRQ_H | 2 | #define _ALPHA_HW_IRQ_H |
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
| 6 | |||
| 7 | extern volatile unsigned long irq_err_count; | 5 | extern volatile unsigned long irq_err_count; |
| 8 | 6 | ||
| 9 | #ifdef CONFIG_ALPHA_GENERIC | 7 | #ifdef CONFIG_ALPHA_GENERIC |
diff --git a/include/asm-cris/hw_irq.h b/include/asm-cris/hw_irq.h index 341536a234..298066020a 100644 --- a/include/asm-cris/hw_irq.h +++ b/include/asm-cris/hw_irq.h | |||
| @@ -1,7 +1,5 @@ | |||
| 1 | #ifndef _ASM_HW_IRQ_H | 1 | #ifndef _ASM_HW_IRQ_H |
| 2 | #define _ASM_HW_IRQ_H | 2 | #define _ASM_HW_IRQ_H |
| 3 | 3 | ||
| 4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
| 5 | |||
| 6 | #endif | 4 | #endif |
| 7 | 5 | ||
diff --git a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h index a4c0a5a9ff..87e5a351d8 100644 --- a/include/asm-i386/hw_irq.h +++ b/include/asm-i386/hw_irq.h | |||
| @@ -69,14 +69,4 @@ extern atomic_t irq_mis_count; | |||
| 69 | 69 | ||
| 70 | #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) | 70 | #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) |
| 71 | 71 | ||
| 72 | #if defined(CONFIG_X86_IO_APIC) | ||
| 73 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
| 74 | { | ||
| 75 | if (IO_APIC_IRQ(i)) | ||
| 76 | send_IPI_self(IO_APIC_VECTOR(i)); | ||
| 77 | } | ||
| 78 | #else | ||
| 79 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
| 80 | #endif | ||
| 81 | |||
| 82 | #endif /* _ASM_HW_IRQ_H */ | 72 | #endif /* _ASM_HW_IRQ_H */ |
diff --git a/include/asm-ia64/hw_irq.h b/include/asm-ia64/hw_irq.h index ea8b8c407a..27f9df6b91 100644 --- a/include/asm-ia64/hw_irq.h +++ b/include/asm-ia64/hw_irq.h | |||
| @@ -97,8 +97,7 @@ extern int reserve_irq_vector (int vector); | |||
| 97 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); | 97 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); |
| 98 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); | 98 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); |
| 99 | 99 | ||
| 100 | static inline void | 100 | static inline void ia64_resend_irq(unsigned int vector) |
| 101 | hw_resend_irq (struct hw_interrupt_type *h, unsigned int vector) | ||
| 102 | { | 101 | { |
| 103 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); | 102 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); |
| 104 | } | 103 | } |
diff --git a/include/asm-m32r/hw_irq.h b/include/asm-m32r/hw_irq.h index 8d7e9d0e09..7138537cda 100644 --- a/include/asm-m32r/hw_irq.h +++ b/include/asm-m32r/hw_irq.h | |||
| @@ -1,9 +1,4 @@ | |||
| 1 | #ifndef _ASM_M32R_HW_IRQ_H | 1 | #ifndef _ASM_M32R_HW_IRQ_H |
| 2 | #define _ASM_M32R_HW_IRQ_H | 2 | #define _ASM_M32R_HW_IRQ_H |
| 3 | 3 | ||
| 4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
| 5 | { | ||
| 6 | /* Nothing to do */ | ||
| 7 | } | ||
| 8 | |||
| 9 | #endif /* _ASM_M32R_HW_IRQ_H */ | 4 | #endif /* _ASM_M32R_HW_IRQ_H */ |
diff --git a/include/asm-mips/hw_irq.h b/include/asm-mips/hw_irq.h index c854d017c0..458d9fdc76 100644 --- a/include/asm-mips/hw_irq.h +++ b/include/asm-mips/hw_irq.h | |||
| @@ -19,9 +19,9 @@ extern void init_8259A(int aeoi); | |||
| 19 | 19 | ||
| 20 | extern atomic_t irq_err_count; | 20 | extern atomic_t irq_err_count; |
| 21 | 21 | ||
| 22 | /* This may not be apropriate for all machines, we'll see ... */ | 22 | /* |
| 23 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | 23 | * interrupt-retrigger: NOP for now. This may not be apropriate for all |
| 24 | { | 24 | * machines, we'll see ... |
| 25 | } | 25 | */ |
| 26 | 26 | ||
| 27 | #endif /* __ASM_HW_IRQ_H */ | 27 | #endif /* __ASM_HW_IRQ_H */ |
diff --git a/include/asm-parisc/hw_irq.h b/include/asm-parisc/hw_irq.h index 151426e275..6707f7df39 100644 --- a/include/asm-parisc/hw_irq.h +++ b/include/asm-parisc/hw_irq.h | |||
| @@ -3,15 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * linux/include/asm/hw_irq.h | 5 | * linux/include/asm/hw_irq.h |
| 6 | * | ||
| 7 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | ||
| 8 | * | ||
| 9 | * moved some of the old arch/i386/kernel/irq.h to here. VY | ||
| 10 | * | ||
| 11 | * IRQ/IPI changes taken from work by Thomas Radke | ||
| 12 | * <tomsoft@informatik.tu-chemnitz.de> | ||
| 13 | */ | 6 | */ |
| 14 | 7 | ||
| 15 | extern void hw_resend_irq(struct hw_interrupt_type *, unsigned int); | ||
| 16 | |||
| 17 | #endif | 8 | #endif |
diff --git a/include/asm-powerpc/hw_irq.h b/include/asm-powerpc/hw_irq.h index a27ed3feb3..d40359204a 100644 --- a/include/asm-powerpc/hw_irq.h +++ b/include/asm-powerpc/hw_irq.h | |||
| @@ -102,11 +102,11 @@ static inline void local_irq_save_ptr(unsigned long *flags) | |||
| 102 | desc->chip->ack(irq); \ | 102 | desc->chip->ack(irq); \ |
| 103 | }) | 103 | }) |
| 104 | 104 | ||
| 105 | /* Should we handle this via lost interrupts and IPIs or should we don't care like | 105 | /* |
| 106 | * we do now ? --BenH. | 106 | * interrupt-retrigger: should we handle this via lost interrupts and IPIs |
| 107 | * or should we not care like we do now ? --BenH. | ||
| 107 | */ | 108 | */ |
| 108 | struct hw_interrupt_type; | 109 | struct hw_interrupt_type; |
| 109 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
| 110 | 110 | ||
| 111 | #endif /* __KERNEL__ */ | 111 | #endif /* __KERNEL__ */ |
| 112 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | 112 | #endif /* _ASM_POWERPC_HW_IRQ_H */ |
diff --git a/include/asm-sh/hw_irq.h b/include/asm-sh/hw_irq.h index 1d934fb2c5..fed2661696 100644 --- a/include/asm-sh/hw_irq.h +++ b/include/asm-sh/hw_irq.h | |||
| @@ -1,9 +1,4 @@ | |||
| 1 | #ifndef __ASM_SH_HW_IRQ_H | 1 | #ifndef __ASM_SH_HW_IRQ_H |
| 2 | #define __ASM_SH_HW_IRQ_H | 2 | #define __ASM_SH_HW_IRQ_H |
| 3 | 3 | ||
| 4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
| 5 | { | ||
| 6 | /* Nothing to do */ | ||
| 7 | } | ||
| 8 | |||
| 9 | #endif /* __ASM_SH_HW_IRQ_H */ | 4 | #endif /* __ASM_SH_HW_IRQ_H */ |
diff --git a/include/asm-sh64/hw_irq.h b/include/asm-sh64/hw_irq.h index ae718d1f2d..ebb39089b0 100644 --- a/include/asm-sh64/hw_irq.h +++ b/include/asm-sh64/hw_irq.h | |||
| @@ -11,6 +11,5 @@ | |||
| 11 | * Copyright (C) 2000, 2001 Paolo Alberelli | 11 | * Copyright (C) 2000, 2001 Paolo Alberelli |
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | static __inline__ void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { /* Nothing to do */ } | ||
| 15 | 14 | ||
| 16 | #endif /* __ASM_SH64_HW_IRQ_H */ | 15 | #endif /* __ASM_SH64_HW_IRQ_H */ |
diff --git a/include/asm-um/hw_irq.h b/include/asm-um/hw_irq.h index 4ee38c0b6a..1cf84cf5f2 100644 --- a/include/asm-um/hw_irq.h +++ b/include/asm-um/hw_irq.h | |||
| @@ -4,7 +4,4 @@ | |||
| 4 | #include "asm/irq.h" | 4 | #include "asm/irq.h" |
| 5 | #include "asm/archparam.h" | 5 | #include "asm/archparam.h" |
| 6 | 6 | ||
| 7 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
| 8 | {} | ||
| 9 | |||
| 10 | #endif | 7 | #endif |
diff --git a/include/asm-v850/hw_irq.h b/include/asm-v850/hw_irq.h index a8aab43427..043e94bb6b 100644 --- a/include/asm-v850/hw_irq.h +++ b/include/asm-v850/hw_irq.h | |||
| @@ -1,8 +1,4 @@ | |||
| 1 | #ifndef __V850_HW_IRQ_H__ | 1 | #ifndef __V850_HW_IRQ_H__ |
| 2 | #define __V850_HW_IRQ_H__ | 2 | #define __V850_HW_IRQ_H__ |
| 3 | 3 | ||
| 4 | static inline void hw_resend_irq (struct hw_interrupt_type *h, unsigned int i) | ||
| 5 | { | ||
| 6 | } | ||
| 7 | |||
| 8 | #endif /* __V850_HW_IRQ_H__ */ | 4 | #endif /* __V850_HW_IRQ_H__ */ |
diff --git a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h index 9318774627..48a4a5364e 100644 --- a/include/asm-x86_64/hw_irq.h +++ b/include/asm-x86_64/hw_irq.h | |||
| @@ -127,15 +127,6 @@ __asm__( \ | |||
| 127 | "push $~(" #nr ") ; " \ | 127 | "push $~(" #nr ") ; " \ |
| 128 | "jmp common_interrupt"); | 128 | "jmp common_interrupt"); |
| 129 | 129 | ||
| 130 | #if defined(CONFIG_X86_IO_APIC) | ||
| 131 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { | ||
| 132 | if (IO_APIC_IRQ(i)) | ||
| 133 | send_IPI_self(IO_APIC_VECTOR(i)); | ||
| 134 | } | ||
| 135 | #else | ||
| 136 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
| 137 | #endif | ||
| 138 | |||
| 139 | #define platform_legacy_irq(irq) ((irq) < 16) | 130 | #define platform_legacy_irq(irq) ((irq) < 16) |
| 140 | 131 | ||
| 141 | #endif | 132 | #endif |
diff --git a/include/asm-xtensa/hw_irq.h b/include/asm-xtensa/hw_irq.h index ccf436249e..3ddbea759b 100644 --- a/include/asm-xtensa/hw_irq.h +++ b/include/asm-xtensa/hw_irq.h | |||
| @@ -11,8 +11,4 @@ | |||
| 11 | #ifndef _XTENSA_HW_IRQ_H | 11 | #ifndef _XTENSA_HW_IRQ_H |
| 12 | #define _XTENSA_HW_IRQ_H | 12 | #define _XTENSA_HW_IRQ_H |
| 13 | 13 | ||
| 14 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
| 15 | { | ||
| 16 | } | ||
| 17 | |||
| 18 | #endif | 14 | #endif |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 519a1cb7c3..e58cfb9c66 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -53,6 +53,8 @@ struct hw_interrupt_type { | |||
| 53 | void (*ack)(unsigned int irq); | 53 | void (*ack)(unsigned int irq); |
| 54 | void (*end)(unsigned int irq); | 54 | void (*end)(unsigned int irq); |
| 55 | void (*set_affinity)(unsigned int irq, cpumask_t dest); | 55 | void (*set_affinity)(unsigned int irq, cpumask_t dest); |
| 56 | int (*retrigger)(unsigned int irq); | ||
| 57 | |||
| 56 | /* Currently used only by UML, might disappear one day.*/ | 58 | /* Currently used only by UML, might disappear one day.*/ |
| 57 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 59 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
| 58 | void (*release)(unsigned int irq, void *dev_id); | 60 | void (*release)(unsigned int irq, void *dev_id); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 76c8eda672..19b438e09f 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -123,7 +123,8 @@ void enable_irq(unsigned int irq) | |||
| 123 | desc->status = status; | 123 | desc->status = status; |
| 124 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | 124 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { |
| 125 | desc->status = status | IRQ_REPLAY; | 125 | desc->status = status | IRQ_REPLAY; |
| 126 | hw_resend_irq(desc->chip,irq); | 126 | if (desc->chip && desc->chip->retrigger) |
| 127 | desc->chip->retrigger(irq); | ||
| 127 | } | 128 | } |
| 128 | desc->chip->enable(irq); | 129 | desc->chip->enable(irq); |
| 129 | /* fall-through */ | 130 | /* fall-through */ |
