lkml.org 
[lkml]   [2009]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[patch 04/12] xtensa: implement ccount calibration for s6000
    Date
    From: Oskar Schirmer <os@emlix.com>

    Calculate core frequency from timers at boot time
    instead of assuming a fixed frequency. This is
    useful as the true frequency is set up by the
    boot loader, thus variable.

    Signed-off-by: Oskar Schirmer <os@emlix.com>
    ---
    arch/xtensa/Kconfig | 1 +
    arch/xtensa/variants/s6000/Makefile | 1 +
    arch/xtensa/variants/s6000/delay.c | 27 +++++++++++++++++++++++++++
    3 files changed, 29 insertions(+), 0 deletions(-)
    create mode 100644 arch/xtensa/variants/s6000/delay.c

    diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
    index fa6dc4d..ac02f3c 100644
    --- a/arch/xtensa/Kconfig
    +++ b/arch/xtensa/Kconfig
    @@ -80,6 +80,7 @@ config XTENSA_VARIANT_S6000
    bool "s6000 - Stretch software configurable processor"
    select VARIANT_IRQ_SWITCH
    select ARCH_REQUIRE_GPIOLIB
    + select XTENSA_CALIBRATE_CCOUNT
    endchoice

    config XTENSA_UNALIGNED_USER
    diff --git a/arch/xtensa/variants/s6000/Makefile b/arch/xtensa/variants/s6000/Makefile
    index 03b3975..d83f380 100644
    --- a/arch/xtensa/variants/s6000/Makefile
    +++ b/arch/xtensa/variants/s6000/Makefile
    @@ -1,3 +1,4 @@
    # s6000 Makefile

    obj-y += irq.o gpio.o
    +obj-$(CONFIG_XTENSA_CALIBRATE_CCOUNT) += delay.o
    diff --git a/arch/xtensa/variants/s6000/delay.c b/arch/xtensa/variants/s6000/delay.c
    new file mode 100644
    index 0000000..54b2b57
    --- /dev/null
    +++ b/arch/xtensa/variants/s6000/delay.c
    @@ -0,0 +1,27 @@
    +#include <asm/delay.h>
    +#include <asm/timex.h>
    +#include <asm/io.h>
    +#include <variant/hardware.h>
    +
    +#define LOOPS 10
    +void platform_calibrate_ccount(void)
    +{
    + u32 uninitialized_var(a);
    + u32 uninitialized_var(u);
    + u32 b;
    + u32 tstamp = S6_REG_GREG1 + S6_GREG1_GLOBAL_TIMER;
    + int i = LOOPS+1;
    + do {
    + u32 t = u;
    + asm volatile(
    + "1: l32i %0, %2, 0 ;"
    + " beq %0, %1, 1b ;"
    + : "=&a"(u) : "a"(t), "a"(tstamp));
    + b = xtensa_get_ccount();
    + if (i == LOOPS)
    + a = b;
    + } while (--i >= 0);
    + b -= a;
    + nsec_per_ccount = (LOOPS * 10000) / b;
    + ccount_per_jiffy = b * (100000UL / (LOOPS * HZ));
    +}
    --
    1.6.2.107.ge47ee


    \
     
     \ /
      Last update: 2009-04-14 11:45    [W:4.279 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site