Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c80204e5d67d1452ac0b761d980f1651dc2c66dc
Commit:     c80204e5d67d1452ac0b761d980f1651dc2c66dc
Parent:     da2c12a279ae225f3d4696f76cb3b32a5bec5bfb
Author:     Sascha Hauer <[EMAIL PROTECTED]>
AuthorDate: Tue Dec 12 09:21:50 2006 +0100
Committer:  Russell King <[EMAIL PROTECTED]>
CommitDate: Wed Dec 13 14:37:26 2006 +0000

    [ARM] 4012/1: Clocksource for pxa
    
    Add a clocksource driver for pxa2xx systems
    
    Signed-off-by: Luotao Fu <[EMAIL PROTECTED]>
    Signed-off-by: Sascha Hauer <[EMAIL PROTECTED]>
    Signed-off-by: Nicolas Pitre <[EMAIL PROTECTED]>
    Signed-off-by: Russell King <[EMAIL PROTECTED]>
---
 arch/arm/mach-pxa/time.c |   45 +++++++++++++++++++++++----------------------
 1 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c
index b914668..3775b8f 100644
--- a/arch/arm/mach-pxa/time.c
+++ b/arch/arm/mach-pxa/time.c
@@ -18,6 +18,7 @@
 #include <linux/signal.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
+#include <linux/clocksource.h>
 
 #include <asm/system.h>
 #include <asm/hardware.h>
@@ -48,27 +49,6 @@ static int pxa_set_rtc(void)
        return 0;
 }
 
-/* IRQs are disabled before entering here from do_gettimeofday() */
-static unsigned long pxa_gettimeoffset (void)
-{
-       long ticks_to_match, elapsed, usec;
-
-       /* Get ticks before next timer match */
-       ticks_to_match = OSMR0 - OSCR;
-
-       /* We need elapsed ticks since last match */
-       elapsed = LATCH - ticks_to_match;
-
-       /* don't get fooled by the workaround in pxa_timer_interrupt() */
-       if (elapsed <= 0)
-               return 0;
-
-       /* Now convert them to usec */
-       usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
-
-       return usec;
-}
-
 #ifdef CONFIG_NO_IDLE_HZ
 static unsigned long initial_match;
 static int match_posponed;
@@ -121,6 +101,20 @@ static struct irqaction pxa_timer_irq = {
        .handler        = pxa_timer_interrupt,
 };
 
+cycle_t pxa_get_cycles(void)
+{
+       return OSCR;
+}
+
+static struct clocksource clocksource_pxa = {
+       .name           = "pxa_timer",
+       .rating         = 200,
+       .read           = pxa_get_cycles,
+       .mask           = CLOCKSOURCE_MASK(32),
+       .shift          = 20,
+       .is_continuous  = 1,
+};
+
 static void __init pxa_timer_init(void)
 {
        struct timespec tv;
@@ -139,6 +133,14 @@ static void __init pxa_timer_init(void)
        OIER = OIER_E0;         /* enable match on timer 0 to cause interrupts 
*/
        OSMR0 = OSCR + LATCH;   /* set initial match */
        local_irq_restore(flags);
+
+       /* on PXA OSCR runs continiously and is not written to, so we can use it
+        * as clock source directly.
+        */
+       clocksource_pxa.mult =
+               clocksource_hz2mult(CLOCK_TICK_RATE, clocksource_pxa.shift);
+       clocksource_register(&clocksource_pxa);
+
 }
 
 #ifdef CONFIG_NO_IDLE_HZ
@@ -211,7 +213,6 @@ struct sys_timer pxa_timer = {
        .init           = pxa_timer_init,
        .suspend        = pxa_timer_suspend,
        .resume         = pxa_timer_resume,
-       .offset         = pxa_gettimeoffset,
 #ifdef CONFIG_NO_IDLE_HZ
        .dyn_tick       = &pxa_dyn_tick,
 #endif
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to