|
@@ -1334,11 +1334,19 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|
|
if (new->flags & IRQF_ONESHOT)
|
|
|
desc->istate |= IRQS_ONESHOT;
|
|
|
|
|
|
- if (irq_settings_can_autoenable(desc))
|
|
|
+ if (irq_settings_can_autoenable(desc)) {
|
|
|
irq_startup(desc, true);
|
|
|
- else
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * Shared interrupts do not go well with disabling
|
|
|
+ * auto enable. The sharing interrupt might request
|
|
|
+ * it while it's still disabled and then wait for
|
|
|
+ * interrupts forever.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(new->flags & IRQF_SHARED);
|
|
|
/* Undo nested disables: */
|
|
|
desc->depth = 1;
|
|
|
+ }
|
|
|
|
|
|
/* Exclude IRQ from balancing if requested */
|
|
|
if (new->flags & IRQF_NOBALANCING) {
|