diff options
Diffstat (limited to 'drivers/irqchip/irq-versatile-fpga.c')
| -rw-r--r-- | drivers/irqchip/irq-versatile-fpga.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c index 47a52ab580d8..3ae2bb8d9cf2 100644 --- a/drivers/irqchip/irq-versatile-fpga.c +++ b/drivers/irqchip/irq-versatile-fpga.c @@ -9,6 +9,7 @@  #include <linux/module.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/exception.h>  #include <asm/mach/irq.h> @@ -167,8 +168,12 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,  			f->used_irqs++;  		} -	pr_info("FPGA IRQ chip %d \"%s\" @ %p, %u irqs\n", +	pr_info("FPGA IRQ chip %d \"%s\" @ %p, %u irqs",  		fpga_irq_id, name, base, f->used_irqs); +	if (parent_irq != -1) +		pr_cont(", parent IRQ: %d\n", parent_irq); +	else +		pr_cont("\n");  	fpga_irq_id++;  } @@ -180,6 +185,7 @@ int __init fpga_irq_of_init(struct device_node *node,  	void __iomem *base;  	u32 clear_mask;  	u32 valid_mask; +	int parent_irq;  	if (WARN_ON(!node))  		return -ENODEV; @@ -193,7 +199,12 @@ int __init fpga_irq_of_init(struct device_node *node,  	if (of_property_read_u32(node, "valid-mask", &valid_mask))  		valid_mask = 0; -	fpga_irq_init(base, node->name, 0, -1, valid_mask, node); +	/* Some chips are cascaded from a parent IRQ */ +	parent_irq = irq_of_parse_and_map(node, 0); +	if (!parent_irq) +		parent_irq = -1; + +	fpga_irq_init(base, node->name, 0, parent_irq, valid_mask, node);  	writel(clear_mask, base + IRQ_ENABLE_CLEAR);  	writel(clear_mask, base + FIQ_ENABLE_CLEAR);  |