|
@@ -911,6 +911,33 @@ static int irq_thread(void *data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * irq_wake_thread - wake the irq thread for the action identified by dev_id
|
|
|
+ * @irq: Interrupt line
|
|
|
+ * @dev_id: Device identity for which the thread should be woken
|
|
|
+ *
|
|
|
+ */
|
|
|
+void irq_wake_thread(unsigned int irq, void *dev_id)
|
|
|
+{
|
|
|
+ struct irq_desc *desc = irq_to_desc(irq);
|
|
|
+ struct irqaction *action;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ if (!desc || WARN_ON(irq_settings_is_per_cpu_devid(desc)))
|
|
|
+ return;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
+ for (action = desc->action; action; action = action->next) {
|
|
|
+ if (action->dev_id == dev_id) {
|
|
|
+ if (action->thread)
|
|
|
+ __irq_wake_thread(desc, action);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(irq_wake_thread);
|
|
|
+
|
|
|
static void irq_setup_forced_threading(struct irqaction *new)
|
|
|
{
|
|
|
if (!force_irqthreads)
|