ARM: tegra: init irq from device-tree
Mayuresh Kulkarni [Wed, 12 Dec 2012 07:32:32 +0000 (12:32 +0530)]
- enable the intc node
- hook irq init via device-tree for boards that support DT
- for non-DT boards, fallback to non-dt method
- deprecate tegra_init_irq and change tegra_dt_init_irq
to check if dtb is passed. If passed, use it to init irq
otherwise fall-back to non-dt path

bug 1164943

Change-Id: Idd87945df250c3cdef38226a9dbf2d6ffd34ce48
Signed-off-by: Mayuresh Kulkarni <mkulkarni@nvidia.com>
Reviewed-on: http://git-master/r/147496
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/board-curacao.c
arch/arm/mach-tegra/board-dalmore.c
arch/arm/mach-tegra/board-pluto.c
arch/arm/mach-tegra/board-roth.c
arch/arm/mach-tegra/board.h
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/gic.c
arch/arm/mach-tegra/gic.h
arch/arm/mach-tegra/irq.c

index bfb0865..aa6929f 100644 (file)
@@ -633,7 +633,7 @@ MACHINE_START(CURACAO, CURACAO_BOARD_NAME)
        .map_io         = tegra_map_common_io,
        .reserve        = tegra_curacao_reserve,
        .init_early     = tegra11x_init_early,
-       .init_irq       = tegra_init_irq,
+       .init_irq       = tegra_dt_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
        .init_machine   = tegra_curacao_dt_init,
index 1c0b9a9..5ce7c08 100644 (file)
@@ -844,7 +844,7 @@ MACHINE_START(DALMORE, "dalmore")
        .map_io         = tegra_map_common_io,
        .reserve        = tegra_dalmore_reserve,
        .init_early     = tegra11x_init_early,
-       .init_irq       = tegra_init_irq,
+       .init_irq       = tegra_dt_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
        .init_machine   = tegra_dalmore_dt_init,
index 207d0af..fb26ff9 100644 (file)
@@ -1080,7 +1080,7 @@ MACHINE_START(TEGRA_PLUTO, "tegra_pluto")
        .map_io         = tegra_map_common_io,
        .reserve        = tegra_pluto_reserve,
        .init_early     = tegra11x_init_early,
-       .init_irq       = tegra_init_irq,
+       .init_irq       = tegra_dt_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
        .init_machine   = tegra_pluto_dt_init,
index ab67a61..746a86c 100644 (file)
@@ -617,7 +617,7 @@ MACHINE_START(ROTH, "roth")
        .map_io         = tegra_map_common_io,
        .reserve        = tegra_roth_reserve,
        .init_early     = tegra11x_init_early,
-       .init_irq       = tegra_init_irq,
+       .init_irq       = tegra_dt_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
        .init_machine   = tegra_roth_dt_init,
index 1e3a2aa..a31ad38 100644 (file)
@@ -90,7 +90,6 @@ void __init tegra20_init_early(void);
 void __init tegra30_init_early(void);
 void __init tegra11x_init_early(void);
 void __init tegra_map_common_io(void);
-void __init tegra_init_irq(void);
 void __init tegra_dt_init_irq(void);
 void __init tegra_reserve(unsigned long carveout_size, unsigned long fb_size,
        unsigned long fb2_size);
index 85df750..0e515d4 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/io.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
-#include <linux/irqchip.h>
 #include <linux/clk/tegra.h>
 #include <linux/highmem.h>
 #include <linux/memblock.h>
@@ -150,16 +149,6 @@ u32 tegra_uart_config[4] = {
        0,
 };
 
-#ifdef CONFIG_OF
-void __init tegra_dt_init_irq(void)
-{
-       tegra_clocks_init();
-       tegra_pmc_init();
-       tegra_init_irq();
-       irqchip_init();
-}
-#endif
-
 #define NEVER_RESET 0
 
 void tegra_assert_system_reset(char mode, const char *cmd)
@@ -583,6 +572,7 @@ void __init tegra20_init_early(void)
        tegra_perf_init();
        tegra_init_fuse();
        tegra_init_cache(true);
+       tegra_pmc_init();
        tegra_powergate_init();
        tegra20_hotplug_init();
        tegra_init_power();
index 3f8aedc..44e017c 100644 (file)
@@ -153,7 +153,7 @@ u32 tegra_gic_version(void)
        return gic_version;
 }
 
-void __init tegra_gic_init(void)
+void __init tegra_gic_init(bool is_dt)
 {
        u32 midr;
 
@@ -166,8 +166,9 @@ void __init tegra_gic_init(void)
        else
                tegra_gic_cpu_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100);
 
-       gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE),
-                tegra_gic_cpu_base);
+       if (!is_dt)
+               gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE),
+                       tegra_gic_cpu_base);
 
        gic_version = readl(IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE)+0xFE8);
        gic_version = (gic_version & 0xF0) >> 4;
index 3ed4904..d5ea028 100644 (file)
@@ -44,6 +44,6 @@ void tegra_gic_affinity_to_cpu0(void);
 #endif
 
 u32 tegra_gic_version(void);
-void __init tegra_gic_init(void);
+void __init tegra_gic_init(bool is_dt);
 
 #endif /* _MACH_TEGRA_GIC_H_ */
index fa8d643..5027a6e 100644 (file)
@@ -23,7 +23,9 @@
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/irqchip/arm-gic.h>
+#include <linux/irqchip.h>
 #include <linux/syscore_ops.h>
+#include <linux/clk/tegra.h>
 
 #include <mach/legacy_irq.h>
 
@@ -247,10 +249,13 @@ subsys_initcall(tegra_legacy_irq_syscore_init);
 #define tegra_set_wake NULL
 #endif
 
-void __init tegra_init_irq(void)
+void __init tegra_dt_init_irq(void)
 {
        int i;
        void __iomem *distbase;
+       bool is_dt = false;
+
+       tegra_clocks_init();
 
        distbase = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE);
        num_ictlrs = readl_relaxed(distbase + GIC_DIST_CTR) & 0x1f;
@@ -277,7 +282,16 @@ void __init tegra_init_irq(void)
        gic_arch_extn.irq_set_wake = tegra_set_wake;
        gic_arch_extn.flags = IRQCHIP_MASK_ON_SUSPEND;
 
-       tegra_gic_init();
+       /* check if DT is passed */
+       is_dt = of_have_populated_dt();
+
+       tegra_gic_init(is_dt);
+
+#ifdef CONFIG_OF
+       /* If DT is passed, init the irq via DT */
+       if (is_dt)
+               irqchip_init();
+#endif
 }
 
 void tegra_init_legacy_irq_cop(void)