X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=qemu%2Froms%2Fu-boot%2Farch%2Farm%2Fcpu%2Fpxa%2Ftimer.c;fp=qemu%2Froms%2Fu-boot%2Farch%2Farm%2Fcpu%2Fpxa%2Ftimer.c;h=c4717de6a9c4ccdd3d551c1e5acd8016d93f840a;hb=e44e3482bdb4d0ebde2d8b41830ac2cdb07948fb;hp=0000000000000000000000000000000000000000;hpb=9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00;p=kvmfornfv.git diff --git a/qemu/roms/u-boot/arch/arm/cpu/pxa/timer.c b/qemu/roms/u-boot/arch/arm/cpu/pxa/timer.c new file mode 100644 index 000000000..c4717de6a --- /dev/null +++ b/qemu/roms/u-boot/arch/arm/cpu/pxa/timer.c @@ -0,0 +1,85 @@ +/* + * Marvell PXA2xx/3xx timer driver + * + * Copyright (C) 2011 Marek Vasut + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define TIMER_LOAD_VAL 0xffffffff + +#define timestamp (gd->arch.tbl) +#define lastinc (gd->arch.lastinc) + +#if defined(CONFIG_CPU_PXA27X) || defined(CONFIG_CPU_MONAHANS) +#define TIMER_FREQ_HZ 3250000 +#elif defined(CONFIG_CPU_PXA25X) +#define TIMER_FREQ_HZ 3686400 +#else +#error "Timer frequency unknown - please config PXA CPU type" +#endif + +static unsigned long long tick_to_time(unsigned long long tick) +{ + return lldiv(tick * CONFIG_SYS_HZ, TIMER_FREQ_HZ); +} + +static unsigned long long us_to_tick(unsigned long long us) +{ + return lldiv(us * TIMER_FREQ_HZ, 1000000); +} + +int timer_init(void) +{ + writel(0, OSCR); + return 0; +} + +unsigned long long get_ticks(void) +{ + /* Current tick value */ + uint32_t now = readl(OSCR); + + if (now >= lastinc) { + /* + * Normal mode (non roll) + * Move stamp forward with absolute diff ticks + */ + timestamp += (now - lastinc); + } else { + /* We have rollover of incrementer */ + timestamp += (TIMER_LOAD_VAL - lastinc) + now; + } + + lastinc = now; + return timestamp; +} + +ulong get_timer(ulong base) +{ + return tick_to_time(get_ticks()) - base; +} + +void __udelay(unsigned long usec) +{ + unsigned long long tmp; + ulong tmo; + + tmo = us_to_tick(usec); + tmp = get_ticks() + tmo; /* get current timestamp */ + + while (get_ticks() < tmp) /* loop till event */ + /*NOP*/; +} + +ulong get_tbclk(void) +{ + return TIMER_FREQ_HZ; +}