ARM: orion: always use MULTI_IRQ_HANDLER
As a preparation for multiplatform support, this enables the MULTI_IRQ_HANDLER code unconditionally on dove and orion5x, and introduces the respective code on mv78xx0, which did not have it so far. The classic entry-macro.S files are removed as they are now obsolete. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
This commit is contained in:
parent
06f3008a6a
commit
b8cd337c8e
|
@ -510,6 +510,7 @@ config ARCH_DOVE
|
||||||
select CPU_PJ4
|
select CPU_PJ4
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select MIGHT_HAVE_PCI
|
select MIGHT_HAVE_PCI
|
||||||
|
select MULTI_IRQ_HANDLER
|
||||||
select MVEBU_MBUS
|
select MVEBU_MBUS
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
select PINCTRL_DOVE
|
select PINCTRL_DOVE
|
||||||
|
@ -523,6 +524,7 @@ config ARCH_MV78XX0
|
||||||
select CPU_FEROCEON
|
select CPU_FEROCEON
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select MVEBU_MBUS
|
select MVEBU_MBUS
|
||||||
|
select MULTI_IRQ_HANDLER
|
||||||
select PCI
|
select PCI
|
||||||
select PLAT_ORION_LEGACY
|
select PLAT_ORION_LEGACY
|
||||||
help
|
help
|
||||||
|
@ -536,6 +538,7 @@ config ARCH_ORION5X
|
||||||
select CPU_FEROCEON
|
select CPU_FEROCEON
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select MVEBU_MBUS
|
select MVEBU_MBUS
|
||||||
|
select MULTI_IRQ_HANDLER
|
||||||
select PCI
|
select PCI
|
||||||
select PLAT_ORION_LEGACY
|
select PLAT_ORION_LEGACY
|
||||||
select MULTI_IRQ_HANDLER
|
select MULTI_IRQ_HANDLER
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-dove/include/mach/entry-macro.S
|
|
||||||
*
|
|
||||||
* Low-level IRQ helper macros for Marvell Dove platforms
|
|
||||||
*
|
|
||||||
* This file is licensed under the terms of the GNU General Public
|
|
||||||
* License version 2. This program is licensed "as is" without any
|
|
||||||
* warranty of any kind, whether express or implied.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <mach/bridge-regs.h>
|
|
||||||
|
|
||||||
.macro get_irqnr_preamble, base, tmp
|
|
||||||
ldr \base, =IRQ_VIRT_BASE
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
|
||||||
@ check low interrupts
|
|
||||||
ldr \irqstat, [\base, #IRQ_CAUSE_LOW_OFF]
|
|
||||||
ldr \tmp, [\base, #IRQ_MASK_LOW_OFF]
|
|
||||||
mov \irqnr, #31
|
|
||||||
ands \irqstat, \irqstat, \tmp
|
|
||||||
|
|
||||||
@ if no low interrupts set, check high interrupts
|
|
||||||
ldreq \irqstat, [\base, #IRQ_CAUSE_HIGH_OFF]
|
|
||||||
ldreq \tmp, [\base, #IRQ_MASK_HIGH_OFF]
|
|
||||||
moveq \irqnr, #63
|
|
||||||
andeqs \irqstat, \irqstat, \tmp
|
|
||||||
|
|
||||||
@ find first active interrupt source
|
|
||||||
clzne \irqstat, \irqstat
|
|
||||||
subne \irqnr, \irqnr, \irqstat
|
|
||||||
.endm
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <asm/exception.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <plat/irq.h>
|
#include <plat/irq.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
@ -109,14 +110,6 @@ static int __initdata gpio2_irqs[4] = {
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
||||||
/*
|
|
||||||
* Compiling with both non-DT and DT support enabled, will
|
|
||||||
* break asm irq handler used by non-DT boards. Therefore,
|
|
||||||
* we provide a C-style irq handler even for non-DT boards,
|
|
||||||
* if MULTI_IRQ_HANDLER is set.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void __iomem *dove_irq_base = IRQ_VIRT_BASE;
|
static void __iomem *dove_irq_base = IRQ_VIRT_BASE;
|
||||||
|
|
||||||
static asmlinkage void
|
static asmlinkage void
|
||||||
|
@ -139,7 +132,6 @@ __exception_irq_entry dove_legacy_handle_irq(struct pt_regs *regs)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void __init dove_init_irq(void)
|
void __init dove_init_irq(void)
|
||||||
{
|
{
|
||||||
|
@ -148,9 +140,7 @@ void __init dove_init_irq(void)
|
||||||
orion_irq_init(1, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
|
orion_irq_init(1, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
|
||||||
orion_irq_init(33, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
|
orion_irq_init(33, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
|
||||||
|
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
||||||
set_handle_irq(dove_legacy_handle_irq);
|
set_handle_irq(dove_legacy_handle_irq);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize gpiolib for GPIOs 0-71.
|
* Initialize gpiolib for GPIOs 0-71.
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-mv78xx0/include/mach/entry-macro.S
|
|
||||||
*
|
|
||||||
* Low-level IRQ helper macros for Marvell MV78xx0 platforms
|
|
||||||
*
|
|
||||||
* This file is licensed under the terms of the GNU General Public
|
|
||||||
* License version 2. This program is licensed "as is" without any
|
|
||||||
* warranty of any kind, whether express or implied.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <mach/bridge-regs.h>
|
|
||||||
|
|
||||||
.macro get_irqnr_preamble, base, tmp
|
|
||||||
ldr \base, =IRQ_VIRT_BASE
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
|
||||||
@ check low interrupts
|
|
||||||
ldr \irqstat, [\base, #IRQ_CAUSE_LOW_OFF]
|
|
||||||
ldr \tmp, [\base, #IRQ_MASK_LOW_OFF]
|
|
||||||
mov \irqnr, #31
|
|
||||||
ands \irqstat, \irqstat, \tmp
|
|
||||||
bne 1001f
|
|
||||||
|
|
||||||
@ if no low interrupts set, check high interrupts
|
|
||||||
ldr \irqstat, [\base, #IRQ_CAUSE_HIGH_OFF]
|
|
||||||
ldr \tmp, [\base, #IRQ_MASK_HIGH_OFF]
|
|
||||||
mov \irqnr, #63
|
|
||||||
ands \irqstat, \irqstat, \tmp
|
|
||||||
bne 1001f
|
|
||||||
|
|
||||||
@ if no high interrupts set, check error interrupts
|
|
||||||
ldr \irqstat, [\base, #IRQ_CAUSE_ERR_OFF]
|
|
||||||
ldr \tmp, [\base, #IRQ_MASK_ERR_OFF]
|
|
||||||
mov \irqnr, #95
|
|
||||||
ands \irqstat, \irqstat, \tmp
|
|
||||||
|
|
||||||
@ find first active interrupt source
|
|
||||||
1001: clzne \irqstat, \irqstat
|
|
||||||
subne \irqnr, \irqnr, \irqstat
|
|
||||||
.endm
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <asm/exception.h>
|
||||||
#include <mach/bridge-regs.h>
|
#include <mach/bridge-regs.h>
|
||||||
#include <plat/orion-gpio.h>
|
#include <plat/orion-gpio.h>
|
||||||
#include <plat/irq.h>
|
#include <plat/irq.h>
|
||||||
|
@ -23,12 +24,44 @@ static int __initdata gpio0_irqs[4] = {
|
||||||
IRQ_MV78XX0_GPIO_24_31,
|
IRQ_MV78XX0_GPIO_24_31,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __iomem *mv78xx0_irq_base = IRQ_VIRT_BASE;
|
||||||
|
|
||||||
|
static asmlinkage void
|
||||||
|
__exception_irq_entry mv78xx0_legacy_handle_irq(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
u32 stat;
|
||||||
|
|
||||||
|
stat = readl_relaxed(mv78xx0_irq_base + IRQ_CAUSE_LOW_OFF);
|
||||||
|
stat &= readl_relaxed(mv78xx0_irq_base + IRQ_MASK_LOW_OFF);
|
||||||
|
if (stat) {
|
||||||
|
unsigned int hwirq = __fls(stat);
|
||||||
|
handle_IRQ(hwirq, regs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stat = readl_relaxed(mv78xx0_irq_base + IRQ_CAUSE_HIGH_OFF);
|
||||||
|
stat &= readl_relaxed(mv78xx0_irq_base + IRQ_MASK_HIGH_OFF);
|
||||||
|
if (stat) {
|
||||||
|
unsigned int hwirq = 32 + __fls(stat);
|
||||||
|
handle_IRQ(hwirq, regs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stat = readl_relaxed(mv78xx0_irq_base + IRQ_CAUSE_ERR_OFF);
|
||||||
|
stat &= readl_relaxed(mv78xx0_irq_base + IRQ_MASK_ERR_OFF);
|
||||||
|
if (stat) {
|
||||||
|
unsigned int hwirq = 64 + __fls(stat);
|
||||||
|
handle_IRQ(hwirq, regs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void __init mv78xx0_init_irq(void)
|
void __init mv78xx0_init_irq(void)
|
||||||
{
|
{
|
||||||
orion_irq_init(0, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
|
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(32, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
|
||||||
orion_irq_init(64, IRQ_VIRT_BASE + IRQ_MASK_ERR_OFF);
|
orion_irq_init(64, IRQ_VIRT_BASE + IRQ_MASK_ERR_OFF);
|
||||||
|
|
||||||
|
set_handle_irq(mv78xx0_legacy_handle_irq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize gpiolib for GPIOs 0-31. (The GPIO interrupt mask
|
* Initialize gpiolib for GPIOs 0-31. (The GPIO interrupt mask
|
||||||
* registers for core #1 are at an offset of 0x18 from those of
|
* registers for core #1 are at an offset of 0x18 from those of
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-orion5x/include/mach/entry-macro.S
|
|
||||||
*
|
|
||||||
* Low-level IRQ helper macros for Orion platforms
|
|
||||||
*
|
|
||||||
* This file is licensed under the terms of the GNU General Public
|
|
||||||
* License version 2. This program is licensed "as is" without any
|
|
||||||
* warranty of any kind, whether express or implied.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <mach/bridge-regs.h>
|
|
||||||
|
|
||||||
.macro get_irqnr_preamble, base, tmp
|
|
||||||
ldr \base, =MAIN_IRQ_CAUSE
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
|
||||||
ldr \irqstat, [\base, #0] @ main cause
|
|
||||||
ldr \tmp, [\base, #(MAIN_IRQ_MASK - MAIN_IRQ_CAUSE)] @ main mask
|
|
||||||
mov \irqnr, #0 @ default irqnr
|
|
||||||
@ find cause bits that are unmasked
|
|
||||||
ands \irqstat, \irqstat, \tmp @ clear Z flag if any
|
|
||||||
clzne \irqnr, \irqstat @ calc irqnr
|
|
||||||
rsbne \irqnr, \irqnr, #31
|
|
||||||
.endm
|
|
|
@ -26,14 +26,6 @@ static int __initdata gpio0_irqs[4] = {
|
||||||
IRQ_ORION5X_GPIO_24_31,
|
IRQ_ORION5X_GPIO_24_31,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
||||||
/*
|
|
||||||
* Compiling with both non-DT and DT support enabled, will
|
|
||||||
* break asm irq handler used by non-DT boards. Therefore,
|
|
||||||
* we provide a C-style irq handler even for non-DT boards,
|
|
||||||
* if MULTI_IRQ_HANDLER is set.
|
|
||||||
*/
|
|
||||||
|
|
||||||
asmlinkage void
|
asmlinkage void
|
||||||
__exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
|
__exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -47,15 +39,12 @@ __exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void __init orion5x_init_irq(void)
|
void __init orion5x_init_irq(void)
|
||||||
{
|
{
|
||||||
orion_irq_init(1, MAIN_IRQ_MASK);
|
orion_irq_init(1, MAIN_IRQ_MASK);
|
||||||
|
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
||||||
set_handle_irq(orion5x_legacy_handle_irq);
|
set_handle_irq(orion5x_legacy_handle_irq);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize gpiolib for GPIOs 0-31.
|
* Initialize gpiolib for GPIOs 0-31.
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include <asm/exception.h>
|
#include <asm/exception.h>
|
||||||
#include <plat/irq.h>
|
#include <plat/irq.h>
|
||||||
#include <plat/orion-gpio.h>
|
#include <plat/orion-gpio.h>
|
||||||
#include <mach/bridge-regs.h>
|
|
||||||
|
|
||||||
void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr)
|
void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <linux/mbus.h>
|
#include <linux/mbus.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <plat/orion-gpio.h>
|
#include <plat/orion-gpio.h>
|
||||||
#include <plat/mpp.h>
|
#include <plat/mpp.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue