diff options
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/cell/interrupt.c | 45 |
1 files changed, 13 insertions, 32 deletions
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 449c08c15862..4469be609a31 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -192,50 +192,31 @@ struct irq_host *iic_get_irq_host(int node) | |||
192 | } | 192 | } |
193 | EXPORT_SYMBOL_GPL(iic_get_irq_host); | 193 | EXPORT_SYMBOL_GPL(iic_get_irq_host); |
194 | 194 | ||
195 | static irqreturn_t iic_ipi_action(int irq, void *dev_id) | 195 | static void iic_request_ipi(int ipi) |
196 | { | ||
197 | int ipi = (int)(long)dev_id; | ||
198 | |||
199 | switch(ipi) { | ||
200 | case PPC_MSG_CALL_FUNCTION: | ||
201 | generic_smp_call_function_interrupt(); | ||
202 | break; | ||
203 | case PPC_MSG_RESCHEDULE: | ||
204 | scheduler_ipi(); | ||
205 | break; | ||
206 | case PPC_MSG_CALL_FUNC_SINGLE: | ||
207 | generic_smp_call_function_single_interrupt(); | ||
208 | break; | ||
209 | case PPC_MSG_DEBUGGER_BREAK: | ||
210 | debug_ipi_action(0, NULL); | ||
211 | break; | ||
212 | } | ||
213 | return IRQ_HANDLED; | ||
214 | } | ||
215 | static void iic_request_ipi(int ipi, const char *name) | ||
216 | { | 196 | { |
217 | int virq; | 197 | int virq; |
218 | 198 | ||
219 | virq = irq_create_mapping(iic_host, iic_ipi_to_irq(ipi)); | 199 | virq = irq_create_mapping(iic_host, iic_ipi_to_irq(ipi)); |
220 | if (virq == NO_IRQ) { | 200 | if (virq == NO_IRQ) { |
221 | printk(KERN_ERR | 201 | printk(KERN_ERR |
222 | "iic: failed to map IPI %s\n", name); | 202 | "iic: failed to map IPI %s\n", smp_ipi_name[ipi]); |
223 | return; | 203 | return; |
224 | } | 204 | } |
225 | if (request_irq(virq, iic_ipi_action, IRQF_DISABLED, name, | 205 | |
226 | (void *)(long)ipi)) | 206 | /* |
227 | printk(KERN_ERR | 207 | * If smp_request_message_ipi encounters an error it will notify |
228 | "iic: failed to request IPI %s\n", name); | 208 | * the error. If a message is not needed it will return non-zero. |
209 | */ | ||
210 | if (smp_request_message_ipi(virq, ipi)) | ||
211 | irq_dispose_mapping(virq); | ||
229 | } | 212 | } |
230 | 213 | ||
231 | void iic_request_IPIs(void) | 214 | void iic_request_IPIs(void) |
232 | { | 215 | { |
233 | iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call"); | 216 | iic_request_ipi(PPC_MSG_CALL_FUNCTION); |
234 | iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched"); | 217 | iic_request_ipi(PPC_MSG_RESCHEDULE); |
235 | iic_request_ipi(PPC_MSG_CALL_FUNC_SINGLE, "IPI-call-single"); | 218 | iic_request_ipi(PPC_MSG_CALL_FUNC_SINGLE); |
236 | #ifdef CONFIG_DEBUGGER | 219 | iic_request_ipi(PPC_MSG_DEBUGGER_BREAK); |
237 | iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); | ||
238 | #endif /* CONFIG_DEBUGGER */ | ||
239 | } | 220 | } |
240 | 221 | ||
241 | #endif /* CONFIG_SMP */ | 222 | #endif /* CONFIG_SMP */ |