]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/blackfin/kernel/time.c
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
[linux-2.6-omap-h63xx.git] / arch / blackfin / kernel / time.c
index 2ed440b773dca8c656b04e9a9cca1f491b83f2cb..1bbacfbd4c5d7c6198496fa939a7920dc36319d4 100644 (file)
@@ -31,8 +31,8 @@ static struct irqaction bfin_timer_irq = {
 #endif
 };
 
-#ifdef CONFIG_TICK_SOURCE_SYSTMR0
-void setup_system_timer0(void)
+#if defined(CONFIG_TICK_SOURCE_SYSTMR0) || defined(CONFIG_IPIPE)
+void __init setup_system_timer0(void)
 {
        /* Power down the core timer, just to play safe. */
        bfin_write_TCNTL(0);
@@ -49,7 +49,7 @@ void setup_system_timer0(void)
        enable_gptimers(TIMER0bit);
 }
 #else
-void setup_core_timer(void)
+void __init setup_core_timer(void)
 {
        u32 tcount;
 
@@ -71,10 +71,10 @@ void setup_core_timer(void)
 }
 #endif
 
-static void
+static void __init
 time_sched_init(irqreturn_t(*timer_routine) (int, void *))
 {
-#ifdef CONFIG_TICK_SOURCE_SYSTMR0
+#if defined(CONFIG_TICK_SOURCE_SYSTMR0) || defined(CONFIG_IPIPE)
        setup_system_timer0();
        bfin_timer_irq.handler = timer_routine;
        setup_irq(IRQ_TIMER0, &bfin_timer_irq);
@@ -94,7 +94,7 @@ static unsigned long gettimeoffset(void)
        unsigned long offset;
        unsigned long clocks_per_jiffy;
 
-#ifdef CONFIG_TICK_SOURCE_SYSTMR0
+#if defined(CONFIG_TICK_SOURCE_SYSTMR0) || defined(CONFIG_IPIPE)
        clocks_per_jiffy = bfin_read_TIMER0_PERIOD();
        offset = bfin_read_TIMER0_COUNTER() / \
                (((clocks_per_jiffy + 1) * HZ) / USEC_PER_SEC);
@@ -133,7 +133,11 @@ irqreturn_t timer_interrupt(int irq, void *dummy)
        static long last_rtc_update;
 
        write_seqlock(&xtime_lock);
-#ifdef CONFIG_TICK_SOURCE_SYSTMR0
+#if defined(CONFIG_TICK_SOURCE_SYSTMR0) && !defined(CONFIG_IPIPE)
+       /*
+        * TIMIL0 is latched in __ipipe_grab_irq() when the I-Pipe is
+        * enabled.
+        */
        if (get_gptimer_status(0) & TIMER_STATUS_TIMIL0) {
 #endif
                do_timer(1);
@@ -155,13 +159,17 @@ irqreturn_t timer_interrupt(int irq, void *dummy)
                                /* Do it again in 60s. */
                                last_rtc_update = xtime.tv_sec - 600;
                }
-#ifdef CONFIG_TICK_SOURCE_SYSTMR0
+#if defined(CONFIG_TICK_SOURCE_SYSTMR0) && !defined(CONFIG_IPIPE)
                set_gptimer_status(0, TIMER_STATUS_TIMIL0);
        }
 #endif
        write_sequnlock(&xtime_lock);
 
+#ifdef CONFIG_IPIPE
+       update_root_process_times(get_irq_regs());
+#else
        update_process_times(user_mode(get_irq_regs()));
+#endif
        profile_tick(CPU_PROFILING);
 
        return IRQ_HANDLED;