ARM: mxs: retrieve timer irq from device tree
authorShawn Guo <shawn.guo@linaro.org>
Mon, 20 Aug 2012 00:51:45 +0000 (08:51 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Mon, 3 Sep 2012 01:31:50 +0000 (09:31 +0800)
Rather than using the static timer irq definition, we should retrieve
timer irq from device tree for better.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
arch/arm/boot/dts/imx23.dtsi
arch/arm/boot/dts/imx28.dtsi
arch/arm/mach-mxs/include/mach/common.h
arch/arm/mach-mxs/timer.c
drivers/clk/mxs/clk-imx23.c
drivers/clk/mxs/clk-imx28.c

index e613831..573066b 100644 (file)
                        };
 
                        timrot@80068000 {
+                               compatible = "fsl,imx23-timrot", "fsl,timrot";
                                reg = <0x80068000 0x2000>;
-                               status = "disabled";
+                               interrupts = <28 29 30 31>;
                        };
 
                        auart0: serial@8006c000 {
index 3fa6d19..183fc65 100644 (file)
                        };
 
                        timrot@80068000 {
+                               compatible = "fsl,imx28-timrot", "fsl,timrot";
                                reg = <0x80068000 0x2000>;
-                               status = "disabled";
+                               interrupts = <48 49 50 51>;
                        };
 
                        auart0: serial@8006a000 {
index de6c7ba..a7416c8 100644 (file)
@@ -13,7 +13,7 @@
 
 extern const u32 *mxs_get_ocotp(void);
 extern int mxs_reset_block(void __iomem *);
-extern void mxs_timer_init(int);
+extern void mxs_timer_init(void);
 extern void mxs_restart(char, const char *);
 extern int mxs_saif_clkmux_select(unsigned int clkmux);
 
index 02d36de..7c37926 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/irq.h>
 #include <linux/clockchips.h>
 #include <linux/clk.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
 
 #include <asm/mach/time.h>
 #include <mach/mxs.h>
@@ -244,9 +246,17 @@ static int __init mxs_clocksource_init(struct clk *timer_clk)
        return 0;
 }
 
-void __init mxs_timer_init(int irq)
+void __init mxs_timer_init(void)
 {
+       struct device_node *np;
        struct clk *timer_clk;
+       int irq;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,timrot");
+       if (!np) {
+               pr_err("%s: failed find timrot node\n", __func__);
+               return;
+       }
 
        timer_clk = clk_get_sys("timrot", NULL);
        if (IS_ERR(timer_clk)) {
@@ -295,5 +305,6 @@ void __init mxs_timer_init(int irq)
        mxs_clockevent_init(timer_clk);
 
        /* Make irqs happen */
+       irq = irq_of_parse_and_map(np, 0);
        setup_irq(irq, &mxs_timer_irq);
 }
index 844043a..e0dc3f8 100644 (file)
@@ -200,7 +200,7 @@ int __init mx23_clocks_init(void)
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);
 
-       mxs_timer_init(MX23_INT_TIMER0);
+       mxs_timer_init();
 
        return 0;
 }
index e3aab67..9df864d 100644 (file)
@@ -337,7 +337,7 @@ int __init mx28_clocks_init(void)
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);
 
-       mxs_timer_init(MX28_INT_TIMER0);
+       mxs_timer_init();
 
        return 0;
 }