]> Git Repo - linux.git/commitdiff
genirq: Introduce helper functions to support stacked irq_chip
authorJiang Liu <[email protected]>
Thu, 6 Nov 2014 14:20:16 +0000 (22:20 +0800)
committerThomas Gleixner <[email protected]>
Sun, 23 Nov 2014 12:01:46 +0000 (13:01 +0100)
Now we already support hierarchy irq_data, so introduce several helpers
to support stacked irq_chips.

Signed-off-by: Jiang Liu <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: Grant Likely <[email protected]>
Cc: Marc Zyngier <[email protected]>
Cc: Yingjoe Chen <[email protected]>
Cc: Yijing Wang <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
include/linux/irq.h
kernel/irq/chip.c

index 13ba412ce3a0186366aeca0eca5ce292bac14bf2..0adcbbbf2e874ffc51ea4e2afd46a285720ce27d 100644 (file)
@@ -443,6 +443,11 @@ extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_nested_irq(unsigned int irq);
 
+#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
+extern void irq_chip_ack_parent(struct irq_data *data);
+extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
+#endif
+
 /* Handling of unhandled and spurious interrupts: */
 extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
                           irqreturn_t action_ret);
index 72a93086216bd32b24cc0c8a11de129f98aa555b..dd1d3c4c93a28f3b50909f1df9d1f0b6f4371214 100644 (file)
@@ -850,3 +850,31 @@ void irq_cpu_offline(void)
                raw_spin_unlock_irqrestore(&desc->lock, flags);
        }
 }
+
+#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
+/**
+ * irq_chip_ack_parent - Acknowledge the parent interrupt
+ * @data:      Pointer to interrupt specific data
+ */
+void irq_chip_ack_parent(struct irq_data *data)
+{
+       data = data->parent_data;
+       data->chip->irq_ack(data);
+}
+
+/**
+ * irq_chip_retrigger_hierarchy - Retrigger an interrupt in hardware
+ * @data:      Pointer to interrupt specific data
+ *
+ * Iterate through the domain hierarchy of the interrupt and check
+ * whether a hw retrigger function exists. If yes, invoke it.
+ */
+int irq_chip_retrigger_hierarchy(struct irq_data *data)
+{
+       for (data = data->parent_data; data; data = data->parent_data)
+               if (data->chip && data->chip->irq_retrigger)
+                       return data->chip->irq_retrigger(data);
+
+       return -ENOSYS;
+}
+#endif
This page took 0.059772 seconds and 4 git commands to generate.