iop: implement sched_clock()
authorMikael Pettersson <mikpe@it.uu.se>
Thu, 29 Oct 2009 18:46:56 +0000 (11:46 -0700)
committerDan Williams <dan.j.williams@intel.com>
Thu, 29 Oct 2009 18:46:56 +0000 (11:46 -0700)
This adds a better sched_clock() to the IOP platform,
implemented using its new clocksource support.

Tested on n2100, compile-tested for all plat-iop machines.

[dan.j.williams@intel.com: allow early cp6 access]
Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
arch/arm/mm/proc-xsc3.S
arch/arm/plat-iop/time.c

index 2028f37..fab134e 100644 (file)
@@ -396,7 +396,7 @@ __xsc3_setup:
        orr     r4, r4, #0x18                   @ cache the page table in L2
        mcr     p15, 0, r4, c2, c0, 0           @ load page table pointer
 
-       mov     r0, #0                          @ don't allow CP access
+       mov     r0, #1 << 6                     @ cp6 access for early sched_clock
        mcr     p15, 0, r0, c15, c1, 0          @ write CP access register
 
        mrc     p15, 0, r0, c1, c0, 1           @ get auxiliary control reg
index aaaef3b..6c8a02a 100644 (file)
@@ -66,6 +66,17 @@ static void __init iop_clocksource_set_hz(struct clocksource *cs, unsigned int h
 }
 
 /*
+ * IOP sched_clock() implementation via its clocksource.
+ */
+unsigned long long sched_clock(void)
+{
+       cycle_t cyc = iop_clocksource_read(NULL);
+       struct clocksource *cs = &iop_clocksource;
+
+       return clocksource_cyc2ns(cyc, cs->mult, cs->shift);
+}
+
+/*
  * IOP clockevents (interrupting timer 0).
  */
 static int iop_set_next_event(unsigned long delta,