diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-06-22 18:39:43 +0100 |
---|---|---|
committer | Gregory CLEMENT <gregory.clement@free-electrons.com> | 2015-06-24 11:05:57 +0200 |
commit | 5d6bed2a9c8bc161bff4cc7cede00f2e0e27a7e7 (patch) | |
tree | 4db5a813dac35086638df74e6b02b99e9dddcca8 /arch/arm/mach-dove/irq.c | |
parent | 2f5bc307be2480ba89e4c5d118f406f04a4a7299 (diff) | |
download | linux-stable-5d6bed2a9c8bc161bff4cc7cede00f2e0e27a7e7.tar.gz linux-stable-5d6bed2a9c8bc161bff4cc7cede00f2e0e27a7e7.tar.bz2 linux-stable-5d6bed2a9c8bc161bff4cc7cede00f2e0e27a7e7.zip |
ARM: dove: fix legacy dove IRQ numbers
v3.18 changed handle_IRQ() to call __handle_domain_irq(), which now
rejects attempts to deliver IRQ0. Since IRQ 0 is used as the timer
interrupt (just like the PIT on x86), this causes boot to fail as the
bogomips calibration never completes.
Fix this by shuffling all interrupts up by one.
Fixes: a71b092a9c68 ("ARM: Convert handle_IRQ to use __handle_domain_irq")
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Diffstat (limited to 'arch/arm/mach-dove/irq.c')
-rw-r--r-- | arch/arm/mach-dove/irq.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/arm/mach-dove/irq.c b/arch/arm/mach-dove/irq.c index 4a5a7aedcb76..df0223f76fa9 100644 --- a/arch/arm/mach-dove/irq.c +++ b/arch/arm/mach-dove/irq.c @@ -126,14 +126,14 @@ __exception_irq_entry dove_legacy_handle_irq(struct pt_regs *regs) stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_LOW_OFF); stat &= readl_relaxed(dove_irq_base + IRQ_MASK_LOW_OFF); if (stat) { - unsigned int hwirq = __fls(stat); + unsigned int hwirq = 1 + __fls(stat); handle_IRQ(hwirq, regs); return; } stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_HIGH_OFF); stat &= readl_relaxed(dove_irq_base + IRQ_MASK_HIGH_OFF); if (stat) { - unsigned int hwirq = 32 + __fls(stat); + unsigned int hwirq = 33 + __fls(stat); handle_IRQ(hwirq, regs); return; } @@ -144,8 +144,8 @@ void __init dove_init_irq(void) { int i; - orion_irq_init(0, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF); - orion_irq_init(32, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF); + orion_irq_init(1, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF); + orion_irq_init(33, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF); #ifdef CONFIG_MULTI_IRQ_HANDLER set_handle_irq(dove_legacy_handle_irq); |