diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 6879202afe9a..b385878c6e80 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -216,6 +216,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 216 | { | 216 | { |
| 217 | struct irq_desc *desc = irq_desc + irq; | 217 | struct irq_desc *desc = irq_desc + irq; |
| 218 | struct irqaction *old, **p; | 218 | struct irqaction *old, **p; |
| 219 | const char *old_name = NULL; | ||
| 219 | unsigned long flags; | 220 | unsigned long flags; |
| 220 | int shared = 0; | 221 | int shared = 0; |
| 221 | 222 | ||
| @@ -255,8 +256,10 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 255 | * set the trigger type must match. | 256 | * set the trigger type must match. |
| 256 | */ | 257 | */ |
| 257 | if (!((old->flags & new->flags) & IRQF_SHARED) || | 258 | if (!((old->flags & new->flags) & IRQF_SHARED) || |
| 258 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) | 259 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) { |
| 260 | old_name = old->name; | ||
| 259 | goto mismatch; | 261 | goto mismatch; |
| 262 | } | ||
| 260 | 263 | ||
| 261 | #if defined(CONFIG_IRQ_PER_CPU) | 264 | #if defined(CONFIG_IRQ_PER_CPU) |
| 262 | /* All handlers must agree on per-cpuness */ | 265 | /* All handlers must agree on per-cpuness */ |
| @@ -322,11 +325,13 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 322 | return 0; | 325 | return 0; |
| 323 | 326 | ||
| 324 | mismatch: | 327 | mismatch: |
| 325 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 326 | if (!(new->flags & IRQF_PROBE_SHARED)) { | 328 | if (!(new->flags & IRQF_PROBE_SHARED)) { |
| 327 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); | 329 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); |
| 330 | if (old_name) | ||
| 331 | printk(KERN_ERR "current handler: %s\n", old_name); | ||
| 328 | dump_stack(); | 332 | dump_stack(); |
| 329 | } | 333 | } |
| 334 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 330 | return -EBUSY; | 335 | return -EBUSY; |
| 331 | } | 336 | } |
| 332 | 337 | ||
