Commit ab5ab9db authored by Thomas Petazzoni's avatar Thomas Petazzoni Committed by Jason Cooper

ARM: orion5x: switch to DT interrupts and timer

This commit switches the Orion5x platforms described through DT to use
a DT-defined interrupt controller and timer.

This involves:

 * Describing in the DT the bridge interrupt controller, which is a
   child interrupt controller to the main one, which is used for timer
   and watchdog interrupts.

 * Describing in the DT the timer.

 * Adding in the DT the interrupt specifications for the watchdog.

 * Selecting the ORION_IRQCHIP and ORION_TIMER drivers to be compiled.

 * Change board-dt.c to no longer have an ->init_time() callback,
   since the default callback will work fine: it calls
   clocksource_of_init() and of_clk_init(), as needed.

 * Implement a multi-IRQ handler for non-DT platforms in
   mach-orion5x/irq.c.
Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: default avatarSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Link: https://lkml.kernel.org/r/1398202002-28530-24-git-send-email-thomas.petazzoni@free-electrons.comSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
parent deac3d87
...@@ -78,6 +78,15 @@ uart1: serial@12100 { ...@@ -78,6 +78,15 @@ uart1: serial@12100 {
status = "disabled"; status = "disabled";
}; };
bridge_intc: bridge-interrupt-ctrl@20110 {
compatible = "marvell,orion-bridge-intc";
interrupt-controller;
#interrupt-cells = <1>;
reg = <0x20110 0x8>;
interrupts = <0>;
marvell,#interrupts = <4>;
};
intc: interrupt-controller@20200 { intc: interrupt-controller@20200 {
compatible = "marvell,orion-intc"; compatible = "marvell,orion-intc";
interrupt-controller; interrupt-controller;
...@@ -85,9 +94,19 @@ intc: interrupt-controller@20200 { ...@@ -85,9 +94,19 @@ intc: interrupt-controller@20200 {
reg = <0x20200 0x08>; reg = <0x20200 0x08>;
}; };
timer: timer@20300 {
compatible = "marvell,orion-timer";
reg = <0x20300 0x20>;
interrupt-parent = <&bridge_intc>;
interrupts = <1>, <2>;
clocks = <&core_clk 0>;
};
wdt: wdt@20300 { wdt: wdt@20300 {
compatible = "marvell,orion-wdt"; compatible = "marvell,orion-wdt";
reg = <0x20300 0x28>; reg = <0x20300 0x28>;
interrupt-parent = <&bridge_intc>;
interrupts = <3>;
status = "okay"; status = "okay";
}; };
......
...@@ -6,6 +6,8 @@ config ARCH_ORION5X_DT ...@@ -6,6 +6,8 @@ config ARCH_ORION5X_DT
bool "Marvell Orion5x Flattened Device Tree" bool "Marvell Orion5x Flattened Device Tree"
select USE_OF select USE_OF
select ORION_CLK select ORION_CLK
select ORION_IRQCHIP
select ORION_TIMER
help help
Say 'Y' here if you want your kernel to support the Say 'Y' here if you want your kernel to support the
Marvell Orion5x using flattened device tree. Marvell Orion5x using flattened device tree.
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/mbus.h> #include <linux/mbus.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/clocksource.h>
#include <asm/system_misc.h> #include <asm/system_misc.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -36,17 +37,6 @@ static struct of_dev_auxdata orion5x_auxdata_lookup[] __initdata = { ...@@ -36,17 +37,6 @@ static struct of_dev_auxdata orion5x_auxdata_lookup[] __initdata = {
{}, {},
}; };
static void orion5x_dt_init_early(void)
{
orion_time_set_base(TIMER_VIRT_BASE);
}
static void orion5x_dt_init_time(void)
{
orion5x_timer_init();
of_clk_init(NULL);
}
static void __init orion5x_dt_init(void) static void __init orion5x_dt_init(void)
{ {
char *dev_name; char *dev_name;
...@@ -86,9 +76,6 @@ static const char *orion5x_dt_compat[] = { ...@@ -86,9 +76,6 @@ static const char *orion5x_dt_compat[] = {
DT_MACHINE_START(ORION5X_DT, "Marvell Orion5x (Flattened Device Tree)") DT_MACHINE_START(ORION5X_DT, "Marvell Orion5x (Flattened Device Tree)")
/* Maintainer: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> */ /* Maintainer: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> */
.map_io = orion5x_map_io, .map_io = orion5x_map_io,
.init_early = orion5x_dt_init_early,
.init_irq = orion_dt_init_irq,
.init_time = orion5x_dt_init_time,
.init_machine = orion5x_dt_init, .init_machine = orion5x_dt_init,
.restart = orion5x_restart, .restart = orion5x_restart,
.dt_compat = orion5x_dt_compat, .dt_compat = orion5x_dt_compat,
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#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>
#include <asm/exception.h>
#include "common.h" #include "common.h"
static int __initdata gpio0_irqs[4] = { static int __initdata gpio0_irqs[4] = {
...@@ -25,10 +26,37 @@ static int __initdata gpio0_irqs[4] = { ...@@ -25,10 +26,37 @@ 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
__exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
{
u32 stat;
stat = readl_relaxed(MAIN_IRQ_CAUSE);
stat &= readl_relaxed(MAIN_IRQ_MASK);
if (stat) {
unsigned int hwirq = __fls(stat);
handle_IRQ(hwirq, regs);
return;
}
}
#endif
void __init orion5x_init_irq(void) void __init orion5x_init_irq(void)
{ {
orion_irq_init(0, MAIN_IRQ_MASK); orion_irq_init(0, MAIN_IRQ_MASK);
#ifdef CONFIG_MULTI_IRQ_HANDLER
set_handle_irq(orion5x_legacy_handle_irq);
#endif
/* /*
* Initialize gpiolib for GPIOs 0-31. * Initialize gpiolib for GPIOs 0-31.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment