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: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Link: https://lkml.kernel.org/r/1398202002-28530-24-git-send-email-thomas.petazzoni@free-electrons.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
This commit is contained in:
Thomas Petazzoni 2014-04-22 23:26:27 +02:00 committed by Jason Cooper
parent deac3d874e
commit ab5ab9dbe6
4 changed files with 50 additions and 14 deletions

View file

@ -78,6 +78,15 @@
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 @@
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";
}; };

View file

@ -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.

View file

@ -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 = {
{}, {},
}; };
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[] = {
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,

View file

@ -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] = {
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.
*/ */