Skip to content

Commit

Permalink
irqchip: crossbar: Initialise the crossbar with a safe value
Browse files Browse the repository at this point in the history
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
 torvalds#37: FILE: drivers/irqchip/irq-crossbar.c:37:
 +	void (*write) (int, int);

Signed-off-by: Nishanth Menon <[email protected]>
Signed-off-by: Sricharan R <[email protected]>
Acked-by: Santosh Shilimkar <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Jason Cooper <[email protected]>
  • Loading branch information
nmenon authored and Jason Cooper committed Jun 30, 2014
1 parent 64e0f8b commit a35057d
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
3 changes: 3 additions & 0 deletions Documentation/devicetree/bindings/arm/omap/crossbar.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ Optional properties:
SOC-specific hard-wiring of those irqs which unexpectedly bypasses the
crossbar. These irqs have a crossbar register, but still cannot be used.

- ti,irqs-safe-map: integer which maps to a safe configuration to use
when the interrupt controller irq is unused (when not provided, default is 0)

Examples:
crossbar_mpu: @4a020000 {
compatible = "ti,irq-crossbar";
Expand Down
19 changes: 17 additions & 2 deletions drivers/irqchip/irq-crossbar.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,18 @@

/*
* @int_max: maximum number of supported interrupts
* @safe_map: safe default value to initialize the crossbar
* @irq_map: array of interrupts to crossbar number mapping
* @crossbar_base: crossbar base address
* @register_offsets: offsets for each irq number
*/
struct crossbar_device {
uint int_max;
uint safe_map;
uint *irq_map;
void __iomem *crossbar_base;
int *register_offsets;
void (*write) (int, int);
void (*write)(int, int);
};

static struct crossbar_device *cb;
Expand Down Expand Up @@ -88,8 +90,10 @@ static void crossbar_domain_unmap(struct irq_domain *d, unsigned int irq)
{
irq_hw_number_t hw = irq_get_irq_data(irq)->hwirq;

if (hw > GIC_IRQ_START)
if (hw > GIC_IRQ_START) {
cb->irq_map[hw - GIC_IRQ_START] = IRQ_FREE;
cb->write(hw - GIC_IRQ_START, cb->safe_map);
}
}

static int crossbar_domain_xlate(struct irq_domain *d,
Expand Down Expand Up @@ -214,6 +218,17 @@ static int __init crossbar_of_init(struct device_node *node)
reserved += size;
}

of_property_read_u32(node, "ti,irqs-safe-map", &cb->safe_map);

/* Initialize the crossbar with safe map to start with */
for (i = 0; i < max; i++) {
if (cb->irq_map[i] == IRQ_RESERVED ||
cb->irq_map[i] == IRQ_SKIP)
continue;

cb->write(i, cb->safe_map);
}

register_routable_domain_ops(&routable_irq_domain_ops);
return 0;

Expand Down

0 comments on commit a35057d

Please sign in to comment.