.. | .. |
---|
342 | 342 | * If the interrupt is not yet activated, just store the affinity |
---|
343 | 343 | * mask and do not call the chip driver at all. On activation the |
---|
344 | 344 | * driver has to make sure anyway that the interrupt is in a |
---|
345 | | - * useable state so startup works. |
---|
| 345 | + * usable state so startup works. |
---|
346 | 346 | */ |
---|
347 | 347 | if (!IS_ENABLED(CONFIG_IRQ_DOMAIN_HIERARCHY) || |
---|
348 | 348 | irqd_is_activated(data) || !irqd_affinity_on_activate(data)) |
---|
.. | .. |
---|
1000 | 1000 | * to IRQS_INPROGRESS and the irq line is masked forever. |
---|
1001 | 1001 | * |
---|
1002 | 1002 | * This also serializes the state of shared oneshot handlers |
---|
1003 | | - * versus "desc->threads_onehsot |= action->thread_mask;" in |
---|
| 1003 | + * versus "desc->threads_oneshot |= action->thread_mask;" in |
---|
1004 | 1004 | * irq_wake_thread(). See the comment there which explains the |
---|
1005 | 1005 | * serialization. |
---|
1006 | 1006 | */ |
---|
.. | .. |
---|
1668 | 1668 | irqd_set(&desc->irq_data, IRQD_NO_BALANCING); |
---|
1669 | 1669 | } |
---|
1670 | 1670 | |
---|
1671 | | - if (irq_settings_can_autoenable(desc)) { |
---|
| 1671 | + if (!(new->flags & IRQF_NO_AUTOEN) && |
---|
| 1672 | + irq_settings_can_autoenable(desc)) { |
---|
1672 | 1673 | irq_startup(desc, IRQ_RESEND, IRQ_START_COND); |
---|
1673 | 1674 | } else { |
---|
1674 | 1675 | /* |
---|
.. | .. |
---|
1877 | 1878 | /* Last action releases resources */ |
---|
1878 | 1879 | if (!desc->action) { |
---|
1879 | 1880 | /* |
---|
1880 | | - * Reaquire bus lock as irq_release_resources() might |
---|
| 1881 | + * Reacquire bus lock as irq_release_resources() might |
---|
1881 | 1882 | * require it to deallocate resources over the slow bus. |
---|
1882 | 1883 | */ |
---|
1883 | 1884 | chip_bus_lock(desc); |
---|
.. | .. |
---|
2055 | 2056 | * which interrupt is which (messes up the interrupt freeing |
---|
2056 | 2057 | * logic etc). |
---|
2057 | 2058 | * |
---|
| 2059 | + * Also shared interrupts do not go well with disabling auto enable. |
---|
| 2060 | + * The sharing interrupt might request it while it's still disabled |
---|
| 2061 | + * and then wait for interrupts forever. |
---|
| 2062 | + * |
---|
2058 | 2063 | * Also IRQF_COND_SUSPEND only makes sense for shared interrupts and |
---|
2059 | 2064 | * it cannot be set along with IRQF_NO_SUSPEND. |
---|
2060 | 2065 | */ |
---|
2061 | 2066 | if (((irqflags & IRQF_SHARED) && !dev_id) || |
---|
| 2067 | + ((irqflags & IRQF_SHARED) && (irqflags & IRQF_NO_AUTOEN)) || |
---|
2062 | 2068 | (!(irqflags & IRQF_SHARED) && (irqflags & IRQF_COND_SUSPEND)) || |
---|
2063 | 2069 | ((irqflags & IRQF_NO_SUSPEND) && (irqflags & IRQF_COND_SUSPEND))) |
---|
2064 | 2070 | return -EINVAL; |
---|
.. | .. |
---|
2214 | 2220 | |
---|
2215 | 2221 | desc = irq_to_desc(irq); |
---|
2216 | 2222 | |
---|
2217 | | - if (!desc || irq_settings_can_autoenable(desc) || |
---|
| 2223 | + if (!desc || (irq_settings_can_autoenable(desc) && |
---|
| 2224 | + !(irqflags & IRQF_NO_AUTOEN)) || |
---|
2218 | 2225 | !irq_settings_can_request(desc) || |
---|
2219 | 2226 | WARN_ON(irq_settings_is_per_cpu_devid(desc)) || |
---|
2220 | 2227 | !irq_supports_nmi(desc)) |
---|