diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/include/asm/dbell.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/dbell.c | 10 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 4 |
3 files changed, 13 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/dbell.h b/arch/powerpc/include/asm/dbell.h index ced7e487ca27..0893ab9343a6 100644 --- a/arch/powerpc/include/asm/dbell.h +++ b/arch/powerpc/include/asm/dbell.h | |||
@@ -29,6 +29,7 @@ enum ppc_dbell { | |||
29 | 29 | ||
30 | extern void doorbell_message_pass(int target, int msg); | 30 | extern void doorbell_message_pass(int target, int msg); |
31 | extern void doorbell_exception(struct pt_regs *regs); | 31 | extern void doorbell_exception(struct pt_regs *regs); |
32 | extern void doorbell_check_self(void); | ||
32 | extern void doorbell_setup_this_cpu(void); | 33 | extern void doorbell_setup_this_cpu(void); |
33 | 34 | ||
34 | static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) | 35 | static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) |
diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c index f7b518894c80..3307a52d797f 100644 --- a/arch/powerpc/kernel/dbell.c +++ b/arch/powerpc/kernel/dbell.c | |||
@@ -81,6 +81,16 @@ out: | |||
81 | set_irq_regs(old_regs); | 81 | set_irq_regs(old_regs); |
82 | } | 82 | } |
83 | 83 | ||
84 | void doorbell_check_self(void) | ||
85 | { | ||
86 | struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info); | ||
87 | |||
88 | if (!info->messages) | ||
89 | return; | ||
90 | |||
91 | ppc_msgsnd(PPC_DBELL, 0, info->tag); | ||
92 | } | ||
93 | |||
84 | #else /* CONFIG_SMP */ | 94 | #else /* CONFIG_SMP */ |
85 | void doorbell_exception(struct pt_regs *regs) | 95 | void doorbell_exception(struct pt_regs *regs) |
86 | { | 96 | { |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 2f6dc7faf6de..8f96d3198905 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -156,8 +156,8 @@ notrace void raw_local_irq_restore(unsigned long en) | |||
156 | return; | 156 | return; |
157 | 157 | ||
158 | #if defined(CONFIG_BOOKE) && defined(CONFIG_SMP) | 158 | #if defined(CONFIG_BOOKE) && defined(CONFIG_SMP) |
159 | /* Check for pending doorbell interrupts on SMP */ | 159 | /* Check for pending doorbell interrupts and resend to ourself */ |
160 | doorbell_exception(NULL); | 160 | doorbell_check_self(); |
161 | #endif | 161 | #endif |
162 | 162 | ||
163 | /* | 163 | /* |