genirq: Introduce helper functions to support stacked irq_chip
authorJiang Liu <jiang.liu@linux.intel.com>
Thu, 6 Nov 2014 14:20:16 +0000 (22:20 +0800)
committerThomas Gleixner <tglx@linutronix.de>
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 <jiang.liu@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Yingjoe Chen <yingjoe.chen@mediatek.com>
Cc: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
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