summaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/irq-crossbar.c
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2014-06-26 03:10:22 -0400
committerJason Cooper <jason@lakedaemon.net>2014-06-30 15:11:20 -0400
commita35057d1dcb11ae67c9347ef7987cf65ac743c36 (patch)
treeb338c3dcaf1ffae0d5e59c0f29040150c38a8865 /drivers/irqchip/irq-crossbar.c
parent64e0f8ba5cae74471f72e0cb218c67915e365f47 (diff)
irqchip: crossbar: Initialise the crossbar with a safe value
Since crossbar is s/w configurable, the initial settings of the crossbar cannot be assumed to be sane. This implies that: a) On initialization all un-reserved crossbars must be initialized to a known 'safe' value. b) When unmapping the interrupt, the safe value must be written to ensure that the crossbar mapping matches with interrupt controller usage. So provide a safe value in the dt data to map if '0' is not safe for the platform and use it during init and unmap While at this, fix the below checkpatch warning. Fixes checkpatch warning: WARNING: Unnecessary space before function pointer arguments #37: FILE: drivers/irqchip/irq-crossbar.c:37: + void (*write) (int, int); Signed-off-by: Nishanth Menon <nm@ti.com> Signed-off-by: Sricharan R <r.sricharan@ti.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Link: https://lkml.kernel.org/r/1403766634-18543-5-git-send-email-r.sricharan@ti.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'drivers/irqchip/irq-crossbar.c')
-rw-r--r--drivers/irqchip/irq-crossbar.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/irqchip/irq-crossbar.c b/drivers/irqchip/irq-crossbar.c
index 0533a71fa86f..4be30c00f041 100644
--- a/drivers/irqchip/irq-crossbar.c
+++ b/drivers/irqchip/irq-crossbar.c
@@ -23,16 +23,18 @@
23 23
24/* 24/*
25 * @int_max: maximum number of supported interrupts 25 * @int_max: maximum number of supported interrupts
26 * @safe_map: safe default value to initialize the crossbar
26 * @irq_map: array of interrupts to crossbar number mapping 27 * @irq_map: array of interrupts to crossbar number mapping
27 * @crossbar_base: crossbar base address 28 * @crossbar_base: crossbar base address
28 * @register_offsets: offsets for each irq number 29 * @register_offsets: offsets for each irq number
29 */ 30 */
30struct crossbar_device { 31struct crossbar_device {
31 uint int_max; 32 uint int_max;
33 uint safe_map;
32 uint *irq_map; 34 uint *irq_map;
33 void __iomem *crossbar_base; 35 void __iomem *crossbar_base;
34 int *register_offsets; 36 int *register_offsets;
35 void (*write) (int, int); 37 void (*write)(int, int);
36}; 38};
37 39
38static struct crossbar_device *cb; 40static struct crossbar_device *cb;
@@ -88,8 +90,10 @@ static void crossbar_domain_unmap(struct irq_domain *d, unsigned int irq)
88{ 90{
89 irq_hw_number_t hw = irq_get_irq_data(irq)->hwirq; 91 irq_hw_number_t hw = irq_get_irq_data(irq)->hwirq;
90 92
91 if (hw > GIC_IRQ_START) 93 if (hw > GIC_IRQ_START) {
92 cb->irq_map[hw - GIC_IRQ_START] = IRQ_FREE; 94 cb->irq_map[hw - GIC_IRQ_START] = IRQ_FREE;
95 cb->write(hw - GIC_IRQ_START, cb->safe_map);
96 }
93} 97}
94 98
95static int crossbar_domain_xlate(struct irq_domain *d, 99static int crossbar_domain_xlate(struct irq_domain *d,
@@ -214,6 +218,17 @@ static int __init crossbar_of_init(struct device_node *node)
214 reserved += size; 218 reserved += size;
215 } 219 }
216 220
221 of_property_read_u32(node, "ti,irqs-safe-map", &cb->safe_map);
222
223 /* Initialize the crossbar with safe map to start with */
224 for (i = 0; i < max; i++) {
225 if (cb->irq_map[i] == IRQ_RESERVED ||
226 cb->irq_map[i] == IRQ_SKIP)
227 continue;
228
229 cb->write(i, cb->safe_map);
230 }
231
217 register_routable_domain_ops(&routable_irq_domain_ops); 232 register_routable_domain_ops(&routable_irq_domain_ops);
218 return 0; 233 return 0;
219 234