aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYingjoe Chen <[email protected]>2014-11-13 23:37:05 +0800
committerThomas Gleixner <[email protected]>2014-11-23 13:01:46 +0100
commit56e8abab615e0c5858cfb9fa0015a44641762b9d (patch)
treeb901401d90577e00ff7a11bd31c291f14720c8a3
parent85f08c17de26f117be6ca7aa260d2ec02a2248ba (diff)
genirq: Add more helper functions to support stacked irq_chip
Add more helper function for stacked irq_chip to just call parent's function. Signed-off-by: Yingjoe Chen <[email protected]> Cc: Rob Herring <[email protected]> Cc: Pawel Moll <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Matthias Brugger <[email protected]> Cc: Russell King <[email protected]> Cc: Jason Cooper <[email protected]> Cc: Gran Likely <[email protected]> Cc: Boris BREZILLON <[email protected]> Cc: <[email protected]> Cc: Bjorn Helgaas <[email protected]> Cc: Yijing Wang <[email protected]> Cc: <[email protected]> Cc: <[email protected]> Cc: <[email protected]> Cc: <[email protected]> Cc: <[email protected]> Cc: <[email protected]> Cc: Sascha Hauer <[email protected]> Cc: Jiang Liu <[email protected]> Cc: Marc Zyngier <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Thomas Gleixner <[email protected]>
-rw-r--r--include/linux/irq.h6
-rw-r--r--kernel/irq/chip.c48
2 files changed, 54 insertions, 0 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 0adcbbbf2e87..fad4bf6f15f6 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -446,6 +446,12 @@ 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);
+extern void irq_chip_mask_parent(struct irq_data *data);
+extern void irq_chip_unmask_parent(struct irq_data *data);
+extern void irq_chip_eoi_parent(struct irq_data *data);
+extern int irq_chip_set_affinity_parent(struct irq_data *data,
+ const struct cpumask *dest,
+ bool force);
#endif
/* Handling of unhandled and spurious interrupts: */
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index dd1d3c4c93a2..47f4c6469a43 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -863,6 +863,54 @@ void irq_chip_ack_parent(struct irq_data *data)
}
/**
+ * irq_chip_mask_parent - Mask the parent interrupt
+ * @data: Pointer to interrupt specific data
+ */
+void irq_chip_mask_parent(struct irq_data *data)
+{
+ data = data->parent_data;
+ data->chip->irq_mask(data);
+}
+
+/**
+ * irq_chip_unmask_parent - Unmask the parent interrupt
+ * @data: Pointer to interrupt specific data
+ */
+void irq_chip_unmask_parent(struct irq_data *data)
+{
+ data = data->parent_data;
+ data->chip->irq_unmask(data);
+}
+
+/**
+ * irq_chip_eoi_parent - Invoke EOI on the parent interrupt
+ * @data: Pointer to interrupt specific data
+ */
+void irq_chip_eoi_parent(struct irq_data *data)
+{
+ data = data->parent_data;
+ data->chip->irq_eoi(data);
+}
+
+/**
+ * irq_chip_set_affinity_parent - Set affinity on the parent interrupt
+ * @data: Pointer to interrupt specific data
+ * @dest: The affinity mask to set
+ * @force: Flag to enforce setting (disable online checks)
+ *
+ * Conditinal, as the underlying parent chip might not implement it.
+ */
+int irq_chip_set_affinity_parent(struct irq_data *data,
+ const struct cpumask *dest, bool force)
+{
+ data = data->parent_data;
+ if (data->chip->irq_set_affinity)
+ return data->chip->irq_set_affinity(data, dest, force);
+
+ return -ENOSYS;
+}
+
+/**
* irq_chip_retrigger_hierarchy - Retrigger an interrupt in hardware
* @data: Pointer to interrupt specific data
*