Revert "Revert "clocksource: tegra: use the device_node pointer passed to init""
Ajay Nandakumar [Thu, 26 Sep 2013 20:48:19 +0000 (01:48 +0530)]
This reverts commit 0e653907ac1d0be9172419c884b820c11864b567.

We've already matched the node, so use the node pointer passed in.
The rtc init was intermingled with the timer init, so split this out
to a separate init function.

Bug 1379817

Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com>
Change-Id: I239269bacad3c7e7f0c3fdc63e4d018d53b542a4
Reviewed-on: http://git-master/r/299023
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>

16 files changed:
arch/arm/boot/dts/tegra114.dtsi
arch/arm/boot/dts/tegra124-soc.dtsi
arch/arm/mach-tegra/board-ardbeg.c
arch/arm/mach-tegra/board-bonaire.c
arch/arm/mach-tegra/board-dalmore.c
arch/arm/mach-tegra/board-loki.c
arch/arm/mach-tegra/board-macallan.c
arch/arm/mach-tegra/board-pismo.c
arch/arm/mach-tegra/board-pluto.c
arch/arm/mach-tegra/board-roth.c
arch/arm/mach-tegra/board-vcm30_t124.c
arch/arm/mach-tegra/board.h
drivers/clocksource/tegra-nvtimers.c
drivers/clocksource/tegra-tsc-timer.c
drivers/clocksource/tegra-wakeup-nvtimers.c
include/linux/tegra-timer.h

index 239cbe1..aa65a62 100644 (file)
        };
 
        timer@60005000 {
-               compatible = "nvidia,tegra114-timer", "nvidia,tegra20-timer";
+               compatible = "nvidia,tegra-nvtimer";
                reg = <0x60005000 0x400>;
                interrupts = <0 0 0x04
                              0 1 0x04
                              0 41 0x04
                              0 42 0x04
                              0 121 0x04
+                             0 151 0x04
+                             0 152 0x04
+                             0 153 0x04
+                             0 154 0x04
+                             0 155 0x04
                              0 122 0x04>;
                clocks = <&tegra_car 5>;
        };
 
+       timer@700f0000 {
+               compatible = "nvidia,tegra-rtc";
+               reg = <0x700f0000 0x00010000>;
+       };
+
        tegra_car: clock {
                compatible = "nvidia,tegra114-car";
                reg = <0x60006000 0x1000>;
        };
 
        rtc {
-               compatible = "nvidia,tegra114-rtc", "nvidia,tegra20-rtc";
+               compatible = "nvidia,tegra-rtc";
                reg = <0x7000e000 0x100>;
                interrupts = <0 2 0x04>;
                clocks = <&tegra_car 4>;
index 5fc05a9..92c19c3 100644 (file)
                        clock-frequency = <32768>;
                };
        };
+
+       timer@60005000 {
+               compatible = "nvidia,tegra-nvtimer";
+               reg = <0x60005000 0x400>;
+               interrupts = <0 0 0x04
+                             0 1 0x04
+                             0 41 0x04
+                             0 42 0x04
+                             0 121 0x04
+                             0 151 0x04
+                             0 152 0x04
+                             0 153 0x04
+                             0 154 0x04
+                             0 155 0x04
+                             0 122 0x04>;
+               clocks = <&tegra_car 5>;
+       };
+
+       timer@700f0000 {
+               compatible = "nvidia,tegra-rtc";
+               reg = <0x700f0000 0x00010000>;
+       };
+
+       rtc {
+               compatible = "nvidia,tegra-rtc";
+               reg = <0x7000e000 0x100>;
+               interrupts = <0 2 0x04>;
+               clocks = <&tegra_car 4>;
+       };
 };
index f93d20d..49405bb 100644 (file)
@@ -55,6 +55,7 @@
 #include <linux/mfd/palmas.h>
 #include <linux/clk/tegra.h>
 #include <media/tegra_dtv.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pci.h>
@@ -1171,7 +1172,7 @@ DT_MACHINE_START(LAGUNA, "laguna")
        .reserve        = tegra_ardbeg_reserve,
        .init_early     = tegra_ardbeg_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_ardbeg_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = laguna_dt_board_compat,
@@ -1185,7 +1186,7 @@ DT_MACHINE_START(TN8, "tn8")
        .reserve        = tegra_ardbeg_reserve,
        .init_early     = tegra_ardbeg_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_ardbeg_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = tn8_dt_board_compat,
@@ -1199,7 +1200,7 @@ DT_MACHINE_START(ARDBEG, "ardbeg")
        .reserve        = tegra_ardbeg_reserve,
        .init_early     = tegra_ardbeg_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_ardbeg_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = ardbeg_dt_board_compat,
index ef88bd1..050e0e3 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/clk/tegra.h>
 #include <linux/tegra-soc.h>
 #include <linux/usb/tegra_usb_phy.h>
+#include <linux/clocksource.h>
 
 #include <mach/gpio-tegra.h>
 
@@ -650,6 +651,6 @@ MACHINE_START(BONAIRE, "bonaire")
        .init_early     = tegra12x_init_early,
        .init_irq       = tegra_dt_init_irq,
        .init_machine   = tegra_bonaire_dt_init,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .dt_compat      = bonaire_dt_board_compat,
 MACHINE_END
index 464a626..f752b92 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/edp.h>
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pinmux.h>
@@ -835,7 +836,7 @@ MACHINE_START(DALMORE, "dalmore")
        .reserve        = tegra_dalmore_reserve,
        .init_early     = tegra11x_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_dalmore_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = dalmore_dt_board_compat,
index c81c558..9000f8c 100644 (file)
@@ -53,6 +53,7 @@
 #include <linux/mfd/palmas.h>
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pci.h>
@@ -874,7 +875,7 @@ DT_MACHINE_START(LOKI, "loki")
        .reserve        = tegra_loki_reserve,
        .init_early     = tegra_loki_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_loki_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = loki_dt_board_compat,
index 3527efb..0f8276d 100644 (file)
@@ -48,6 +48,7 @@
 #include <linux/edp.h>
 #include <linux/clk/tegra.h>
 #include <linux/tegra-soc.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pinmux.h>
@@ -721,7 +722,7 @@ MACHINE_START(MACALLAN, "macallan")
        .reserve        = tegra_macallan_reserve,
        .init_early     = tegra11x_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_macallan_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = macallan_dt_board_compat,
index 6639441..bc7598a 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/edp.h>
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pinmux.h>
@@ -765,7 +766,7 @@ MACHINE_START(PISMO, "pismo")
        .reserve        = tegra_pismo_reserve,
        .init_early     = tegra11x_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_pismo_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = pismo_dt_board_compat,
index 62721e2..7ec5ff9 100644 (file)
@@ -53,6 +53,7 @@
 #include <linux/mfd/tlv320aic3xxx-core.h>
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
+#include <linux/clocksource.h>
 
 #include <mach/irqs.h>
 #include <mach/pinmux.h>
@@ -1406,7 +1407,7 @@ MACHINE_START(TEGRA_PLUTO, "tegra_pluto")
        .reserve        = tegra_pluto_reserve,
        .init_early     = tegra11x_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_pluto_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = pluto_dt_board_compat,
index 967b646..46497f9 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/of_platform.h>
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
+#include <linux/clocksource.h>
 
 #include <asm/system_info.h>
 
@@ -744,7 +745,7 @@ MACHINE_START(ROTH, "roth")
        .reserve        = tegra_roth_reserve,
        .init_early     = tegra11x_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_roth_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = roth_dt_board_compat,
index 6f5e380..a4af20e 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/spi/spi-tegra.h>
 #include <linux/of_platform.h>
 #include <linux/kernel.h>
+#include <linux/clocksource.h>
 
 #include <mach/tegra_asoc_pdata.h>
 #include <mach/pci.h>
@@ -558,7 +559,7 @@ DT_MACHINE_START(VCM30_T124, "vcm30_t124")
        .reserve        = tegra_vcm30_t124_reserve,
        .init_early     = tegra12x_init_early,
        .init_irq       = tegra_dt_init_irq,
-        .init_time      = tegra_init_timer,
+        .init_time      = clocksource_of_init,
        .init_machine   = tegra_vcm30_t124_dt_init,
        .restart        = tegra_assert_system_reset,
        .dt_compat      = vcm30_t124_dt_board_compat,
index 6c9313c..ad81934 100644 (file)
@@ -186,8 +186,6 @@ static inline int harmony_pcie_init(void) { return 0; }
 
 void __init tegra_paz00_wifikill_init(void);
 
-extern void tegra_init_timer(void);
-
 enum board_fab {
        BOARD_FAB_A = 0,
        BOARD_FAB_B,
index d6ff844..1f29f6c 100644 (file)
@@ -31,6 +31,9 @@
 #include <linux/io.h>
 #include <linux/syscore_ops.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+#include <linux/tegra-soc.h>
 #include <linux/tegra-timer.h>
 
 #include <asm/mach/time.h>
 #include <asm/localtimer.h>
 #endif
 
-#include "../../arch/arm/mach-tegra/iomap.h"
-#include <linux/tegra-soc.h>
-
-static void __iomem *timer_reg_base = IO_ADDRESS(TEGRA_TMR1_BASE);
-static void __iomem *rtc_base = IO_ADDRESS(TEGRA_RTC_BASE);
+void __iomem *timer_reg_base;
+static void __iomem *rtc_base;
 
 static u64 persistent_ms, last_persistent_ms;
 static struct timespec persistent_ts;
@@ -60,11 +60,6 @@ static u32 system_timer = 0;
 #if !defined(CONFIG_ARM_ARCH_TIMER) && !defined(CONFIG_HAVE_ARM_TWD)
 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
 
-#define TIMER3_OFFSET (TEGRA_TMR3_BASE-TEGRA_TMR1_BASE)
-#define TIMER4_OFFSET (TEGRA_TMR4_BASE-TEGRA_TMR1_BASE)
-#define TIMER5_OFFSET (TEGRA_TMR5_BASE-TEGRA_TMR1_BASE)
-#define TIMER6_OFFSET (TEGRA_TMR6_BASE-TEGRA_TMR1_BASE)
-
 struct tegra_clock_event_device {
        struct clock_event_device *evt;
        char name[15];
@@ -256,11 +251,6 @@ static struct irqaction tegra_timer_irq = {
        .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_HIGH,
        .handler        = tegra_timer_interrupt,
        .dev_id         = &tegra_clockevent,
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
-       .irq            = INT_TMR3,
-#else
-       .irq            = INT_TMR1,
-#endif
 };
 
 static int tegra_timer_suspend(void)
@@ -409,7 +399,22 @@ void __init tegra_init_timer(struct device_node *np)
        int ret;
        unsigned long rate;
 
-       clk = clk_get_sys("timer", NULL);
+       timer_reg_base = of_iomap(np, 0);
+       if (!timer_reg_base) {
+               pr_err("%s:Can't map timer registers\n", __func__);
+               BUG();
+       }
+
+       tegra_timer_irq.irq = irq_of_parse_and_map(np, 0);
+       if (tegra_timer_irq.irq <= 0) {
+               pr_err("%s:Failed to map timer IRQ\n", __func__);
+               BUG();
+       }
+
+       clk = of_clk_get(np, 0);
+       if (IS_ERR(clk))
+               clk = clk_get_sys("timer", NULL);
+
        if (IS_ERR(clk)) {
                pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");
                rate = 12000000;
@@ -418,16 +423,6 @@ void __init tegra_init_timer(struct device_node *np)
                rate = clk_get_rate(clk);
        }
 
-       /*
-        * rtc registers are used by read_persistent_clock, keep the rtc clock
-        * enabled
-        */
-       clk = clk_get_sys("rtc-tegra", NULL);
-       if (IS_ERR(clk))
-               pr_warn("Unable to get rtc-tegra clock\n");
-       else
-               clk_prepare_enable(clk);
-
        switch (rate) {
        case 12000000:
                timer_writel(0x000b, TIMERUS_USEC_CFG);
@@ -460,6 +455,8 @@ void __init tegra_init_timer(struct device_node *np)
                WARN(1, "Unknown clock rate");
        }
 
+       hotplug_cpu_register(np);
+       of_node_put(np);
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
        tegra20_init_timer();
 #else
@@ -505,11 +502,36 @@ void __init tegra_init_timer(struct device_node *np)
 
        late_time_init = tegra_init_late_timer;
 
-#ifndef CONFIG_ARM64 /* FIXME */
-       register_persistent_clock(NULL, tegra_read_persistent_clock);
-#endif
-
        //arm_delay_ops.delay           = __tegra_delay;
        //arm_delay_ops.const_udelay    = __tegra_const_udelay;
        //arm_delay_ops.udelay          = __tegra_udelay;
 }
+CLOCKSOURCE_OF_DECLARE(tegra_timer, "nvidia,tegra-nvtimer", tegra_init_timer);
+
+static void __init tegra_init_rtc(struct device_node *np)
+{
+       struct clk *clk;
+       /*
+        * rtc registers are used by read_persistent_clock, keep the rtc clock
+        * enabled
+        */
+       rtc_base = of_iomap(np, 0);
+       if (!rtc_base) {
+               pr_err("%s: Can't map RTC registers", __func__);
+               BUG();
+       }
+
+       clk = of_clk_get(np, 0);
+       if (IS_ERR(clk))
+               clk = clk_get_sys("rtc-tegra", NULL);
+
+       of_node_put(np);
+
+       if (IS_ERR(clk))
+               pr_warn("Unable to get rtc-tegra clock\n");
+       else
+               clk_prepare_enable(clk);
+
+       register_persistent_clock(NULL, tegra_read_persistent_clock);
+}
+CLOCKSOURCE_OF_DECLARE(tegra_rtc, "nvidia,tegra-rtc", tegra_init_rtc);
index 77a2d3f..cc4e74c 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/cpu_pm.h>
 #include <linux/of.h>
 #include <linux/tegra-timer.h>
+#include <linux/tegra-soc.h>
+#include <linux/of_address.h>
 
 #include <asm/mach/time.h>
 #include <asm/cputype.h>
@@ -47,7 +49,7 @@ static struct delay_timer arch_delay_timer;
 #ifdef CONFIG_TEGRA_PRE_SILICON_SUPPORT
 #ifndef CONFIG_TRUSTED_FOUNDATIONS
 /* Time Stamp Counter (TSC) base address */
-static void __iomem *tsc = IO_ADDRESS(TEGRA_TSC_BASE);
+static void __iomem *tsc;
 #endif
 
 #define TSC_CNTCR              0               /* TSC control registers */
@@ -196,8 +198,6 @@ int __init tegra_init_arch_timer(void)
        if (!local_timer_is_architected())
                return -ENODEV;
 
-       clocksource_of_init();
-
        register_cpu_notifier(&arch_timer_cpu_nb);
        cpu_pm_register_notifier(&arch_timer_cpu_pm_nb);
        arch_timer_initialized = true;
@@ -222,3 +222,17 @@ int tegra_cpu_timer_get_remain(s64 *time)
 
        return ret;
 }
+
+
+#if defined(CONFIG_TEGRA_PRE_SILICON_SUPPORT) && \
+                       !defined(CONFIG_TRUSTED_FOUNDATIONS)
+static void __init tegra_init_tsc(struct device_node *np)
+{
+       tsc = of_iomap(np, 0);
+       if (!tsc) {
+               pr_err("%s: Can't map tsc registers", __func__);
+               BUG();
+       }
+}
+CLOCKSOURCE_OF_DECLARE(tegra_tsc, "nvidia,tegra-tsc", tegra_init_tsc);
+#endif
index 3ee4e83..11b60f5 100644 (file)
@@ -36,6 +36,9 @@
 #include <linux/tegra-timer.h>
 #include <linux/tegra-cpuidle.h>
 
+#include <linux/of.h>
+#include <linux/of_irq.h>
+
 #include <asm/mach/time.h>
 #include <asm/localtimer.h>
 #include <asm/sched_clock.h>
@@ -43,7 +46,6 @@
 
 #include <mach/irqs.h>
 
-#include <../../arch/arm/mach-tegra/iomap.h>
 
 #if defined(CONFIG_ARM_ARCH_TIMER) || defined(CONFIG_HAVE_ARM_TWD)
 
  * TMR10 - watchdog, suspend/resume recovery
 */
 
-#define TIMER1_OFFSET (TEGRA_TMR1_BASE-TEGRA_TMR1_BASE)
-#define TIMER2_OFFSET (TEGRA_TMR2_BASE-TEGRA_TMR1_BASE)
-#define TIMER3_OFFSET (TEGRA_TMR3_BASE-TEGRA_TMR1_BASE)
-#define TIMER4_OFFSET (TEGRA_TMR4_BASE-TEGRA_TMR1_BASE)
-#define TIMER5_OFFSET (TEGRA_TMR5_BASE-TEGRA_TMR1_BASE)
-#define TIMER6_OFFSET (TEGRA_TMR6_BASE-TEGRA_TMR1_BASE)
-
 #if defined(CONFIG_PM_SLEEP)
 static cpumask_t wake_timer_canceled;
 static cpumask_t wake_timer_ready;
@@ -95,19 +90,19 @@ static irqreturn_t tegra_lp2wake_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-#define LP2_TIMER_IRQ_ACTION(cpu, irqnum) {                    \
+#define LP2_TIMER_IRQ_ACTION(cpu) {                            \
        .name           = "tmr_lp2wake_cpu" __stringify(cpu),   \
        .flags          = IRQF_DISABLED,                        \
        .handler        = tegra_lp2wake_interrupt,              \
        .dev_id         = (void*)cpu,                           \
-       .irq            = irqnum }
+       }
 
 static struct irqaction tegra_lp2wake_irq[] = {
-       LP2_TIMER_IRQ_ACTION(0, INT_TMR3),
+       LP2_TIMER_IRQ_ACTION(0),
 #ifdef CONFIG_SMP
-       LP2_TIMER_IRQ_ACTION(1, INT_TMR4),
-       LP2_TIMER_IRQ_ACTION(2, INT_TMR5),
-       LP2_TIMER_IRQ_ACTION(3, INT_TMR6),
+       LP2_TIMER_IRQ_ACTION(1),
+       LP2_TIMER_IRQ_ACTION(2),
+       LP2_TIMER_IRQ_ACTION(3),
 #endif
 };
 
@@ -275,10 +270,19 @@ static struct notifier_block __cpuinitdata hotplug_notifier_block = {
        .notifier_call = hotplug_notify,
 };
 
-static int __init hotplug_cpu_register(void)
+int __init hotplug_cpu_register(struct device_node *np)
 {
+       int cpu;
+       for (cpu = 0;cpu < 4;cpu++) {
+               tegra_lp2wake_irq[cpu].irq =
+                               irq_of_parse_and_map(np, cpu + 2);
+
+       if (tegra_lp2wake_irq[cpu].irq <= 0) {
+                       pr_err("Failed to map wakeup timer IRQ\n");
+                       BUG();
+               }
+       }
        return register_cpu_notifier(&hotplug_notifier_block);
 }
-early_initcall(hotplug_cpu_register);
 #endif
 #endif
index 32a3ef2..f580a12 100644 (file)
 #define TIMERUS_USEC_CFG       0x14
 #define TIMERUS_CNTR_FREEZE    0x4c
 
-#define TIMER1_BASE            0x0
-#define TIMER2_BASE            0x8
-#define TIMER3_BASE            0x50
-#define TIMER4_BASE            0x58
+#define TIMER1_OFFSET          0x0
+#define TIMER2_OFFSET          0x8
+#define TIMER3_OFFSET          0x50
+#define TIMER4_OFFSET          0x58
+#define TIMER5_OFFSET          0x60
+#define TIMER6_OFFSET          0x68
+#define TIMER7_OFFSET          0x70
+#define TIMER8_OFFSET          0x78
+#define TIMER9_OFFSET          0x80
+#define TIMER10_OFFSET         0x88
 
 #define TIMER_PTV              0x0
 #define TIMER_PCR              0x4
@@ -45,10 +51,11 @@ struct tegra_twd_context {
        u32 twd_cnt;
 };
 
+extern void __iomem *timer_reg_base;
 #define timer_writel(value, reg) \
-       __raw_writel(value, IO_ADDRESS(TEGRA_TMR1_BASE) + (reg))
+       __raw_writel(value, timer_reg_base + (reg))
 #define timer_readl(reg) \
-       __raw_readl(IO_ADDRESS(TEGRA_TMR1_BASE) + (reg))
+       __raw_readl(timer_reg_base + (reg))
 
 #ifdef CONFIG_ARM_ARCH_TIMER
 int __init tegra_init_arch_timer(void);
@@ -90,4 +97,5 @@ static inline void tegra_tsc_wait_for_resume(void) {};
 
 u64 tegra_rtc_read_ms(void);
 
+int hotplug_cpu_register(struct device_node *);
 #endif /* _MACH_TEGRA_TIMER_H_ */