|
@@ -696,3 +696,61 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)
|
|
|
|
|
|
irq_put_desc_unlock(desc, flags);
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * irq_cpu_online - Invoke all irq_cpu_online functions.
|
|
|
+ *
|
|
|
+ * Iterate through all irqs and invoke the chip.irq_cpu_online()
|
|
|
+ * for each.
|
|
|
+ */
|
|
|
+void irq_cpu_online(void)
|
|
|
+{
|
|
|
+ struct irq_desc *desc;
|
|
|
+ struct irq_chip *chip;
|
|
|
+ unsigned long flags;
|
|
|
+ unsigned int irq;
|
|
|
+
|
|
|
+ for_each_active_irq(irq) {
|
|
|
+ desc = irq_to_desc(irq);
|
|
|
+ if (!desc)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
+
|
|
|
+ chip = irq_data_get_irq_chip(&desc->irq_data);
|
|
|
+
|
|
|
+ if (chip && chip->irq_cpu_online)
|
|
|
+ chip->irq_cpu_online(&desc->irq_data);
|
|
|
+
|
|
|
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * irq_cpu_offline - Invoke all irq_cpu_offline functions.
|
|
|
+ *
|
|
|
+ * Iterate through all irqs and invoke the chip.irq_cpu_offline()
|
|
|
+ * for each.
|
|
|
+ */
|
|
|
+void irq_cpu_offline(void)
|
|
|
+{
|
|
|
+ struct irq_desc *desc;
|
|
|
+ struct irq_chip *chip;
|
|
|
+ unsigned long flags;
|
|
|
+ unsigned int irq;
|
|
|
+
|
|
|
+ for_each_active_irq(irq) {
|
|
|
+ desc = irq_to_desc(irq);
|
|
|
+ if (!desc)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
+
|
|
|
+ chip = irq_data_get_irq_chip(&desc->irq_data);
|
|
|
+
|
|
|
+ if (chip && chip->irq_cpu_offline)
|
|
|
+ chip->irq_cpu_offline(&desc->irq_data);
|
|
|
+
|
|
|
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
+ }
|
|
|
+}
|