|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
|
#include <linux/random.h>
|
|
#include <linux/random.h>
|
|
|
#include <linux/interrupt.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
|
+#include <linux/irqdomain.h>
|
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
|
#include <linux/sched/rt.h>
|
|
#include <linux/sched/rt.h>
|
|
@@ -1619,6 +1620,7 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id)
|
|
|
/* If this was the last handler, shut down the IRQ line: */
|
|
/* If this was the last handler, shut down the IRQ line: */
|
|
|
if (!desc->action) {
|
|
if (!desc->action) {
|
|
|
irq_settings_clr_disable_unlazy(desc);
|
|
irq_settings_clr_disable_unlazy(desc);
|
|
|
|
|
+ /* Only shutdown. Deactivate after synchronize_hardirq() */
|
|
|
irq_shutdown(desc);
|
|
irq_shutdown(desc);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1688,6 +1690,14 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id)
|
|
|
* require it to deallocate resources over the slow bus.
|
|
* require it to deallocate resources over the slow bus.
|
|
|
*/
|
|
*/
|
|
|
chip_bus_lock(desc);
|
|
chip_bus_lock(desc);
|
|
|
|
|
+ /*
|
|
|
|
|
+ * There is no interrupt on the fly anymore. Deactivate it
|
|
|
|
|
+ * completely.
|
|
|
|
|
+ */
|
|
|
|
|
+ raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
|
|
+ irq_domain_deactivate_irq(&desc->irq_data);
|
|
|
|
|
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
|
|
+
|
|
|
irq_release_resources(desc);
|
|
irq_release_resources(desc);
|
|
|
chip_bus_sync_unlock(desc);
|
|
chip_bus_sync_unlock(desc);
|
|
|
irq_remove_timings(desc);
|
|
irq_remove_timings(desc);
|