lkml.org 
[lkml]   [2008]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 24/56] microblaze_v2: time support
    Date
    From: Michal Simek <monstr@monstr.eu>


    Signed-off-by: Michal Simek <monstr@monstr.eu>
    ---
    arch/microblaze/kernel/time.c | 90 ++++++++++++++++++++++++++++++++++++++++
    include/asm-microblaze/delay.h | 33 +++++++++++++++
    include/asm-microblaze/timex.h | 20 +++++++++
    3 files changed, 143 insertions(+), 0 deletions(-)
    create mode 100644 arch/microblaze/kernel/time.c
    create mode 100644 include/asm-microblaze/delay.h
    create mode 100644 include/asm-microblaze/timex.h

    diff --git a/arch/microblaze/kernel/time.c b/arch/microblaze/kernel/time.c
    new file mode 100644
    index 0000000..d5ebdff
    --- /dev/null
    +++ b/arch/microblaze/kernel/time.c
    @@ -0,0 +1,90 @@
    +/*
    + * arch/microblaze/kernel/time.c
    + *
    + * This file is subject to the terms and conditions of the GNU General Public
    + * License. See the file "COPYING" in the main directory of this archive
    + * for more details.
    + *
    + * Copyright (C) 2006 Atmark Techno, Inc.
    + */
    +
    +#include <linux/module.h>
    +#include <linux/kernel.h>
    +#include <linux/param.h>
    +#include <linux/jiffies.h>
    +#include <linux/time.h>
    +#include <linux/hrtimer.h>
    +#include <asm/bug.h>
    +#include <asm/setup.h>
    +
    +void time_init(void)
    +{
    + system_timer_init();
    +}
    +
    +int do_settimeofday(struct timespec *tv)
    +{
    + if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
    + return -EINVAL;
    +
    + write_seqlock_irq(&xtime_lock);
    +
    + /* This is revolting. We need to set the xtime.tv_nsec
    + * correctly. However, the value in this location is
    + * is value at the last tick.
    + * Discover what correction gettimeofday
    + * would have done, and then undo it!
    + */
    +#if 0
    + tv->tv_nsec -= mach_gettimeoffset() * 1000;
    +#endif
    +
    + while (tv->tv_nsec < 0) {
    + tv->tv_nsec += NSEC_PER_SEC;
    + tv->tv_sec--;
    + }
    +
    + xtime.tv_sec = tv->tv_sec;
    + xtime.tv_nsec = tv->tv_nsec;
    +
    + time_adjust = 0;
    + time_status |= STA_UNSYNC;
    + time_maxerror = NTP_PHASE_LIMIT;
    + time_esterror = NTP_PHASE_LIMIT;
    +
    + write_sequnlock_irq(&xtime_lock);
    + clock_was_set();
    + return 0;
    +}
    +EXPORT_SYMBOL(do_settimeofday);
    +
    +/*
    + * This version of gettimeofday has near microsecond resolution.
    + */
    +void do_gettimeofday(struct timeval *tv)
    +{
    + unsigned long seq;
    + unsigned long usec, sec;
    + /* unsigned long max_ntp_tick = tick_usec - tickadj; */
    +
    + do {
    + seq = read_seqbegin(&xtime_lock);
    + usec = do_gettimeoffset();
    + sec = xtime.tv_sec;
    + usec += (xtime.tv_nsec / 1000);
    + } while (read_seqretry(&xtime_lock, seq));
    +
    + while (usec >= 1000000) {
    + usec -= 1000000;
    + sec++;
    + }
    +
    + tv->tv_sec = sec;
    + tv->tv_usec = usec;
    +}
    +EXPORT_SYMBOL(do_gettimeofday);
    +
    +unsigned long long sched_clock(void)
    +{
    + return (unsigned long long)jiffies * (1000000000 / HZ);
    +}
    diff --git a/include/asm-microblaze/delay.h b/include/asm-microblaze/delay.h
    new file mode 100644
    index 0000000..481359c
    --- /dev/null
    +++ b/include/asm-microblaze/delay.h
    @@ -0,0 +1,33 @@
    +/*
    + * include/asm-microblaze/delay.h
    + *
    + * This file is subject to the terms and conditions of the GNU General Public
    + * License. See the file "COPYING" in the main directory of this archive
    + * for more details.
    + *
    + * Copyright (C) 2006 Atmark Techno, Inc.
    + */
    +
    +#ifndef _ASM_MICROBLAZE_DELAY_H
    +#define _ASM_MICROBLAZE_DELAY_H
    +
    +#include <asm/param.h>
    +
    +static inline void __delay(unsigned long loops)
    +{
    + asm volatile ("# __delay \n\t" \
    + "1: addi %0, %0, -1 \t\n" \
    + "bneid %0, 1b \t\n" \
    + "nop \t\n"
    + : "=r" (loops)
    + : "0" (loops));
    +}
    +
    +static inline void udelay(unsigned long usec)
    +{
    + unsigned long long tmp = usec;
    + unsigned long loops = (tmp * 4295 * HZ * loops_per_jiffy) >> 32;
    + __delay(loops);
    +}
    +
    +#endif /* _ASM_MICROBLAZE_DELAY_H */
    diff --git a/include/asm-microblaze/timex.h b/include/asm-microblaze/timex.h
    new file mode 100644
    index 0000000..b3e77ef
    --- /dev/null
    +++ b/include/asm-microblaze/timex.h
    @@ -0,0 +1,20 @@
    +/*
    + * include/asm-microblaze/timex.h
    + *
    + * This file is subject to the terms and conditions of the GNU General Public
    + * License. See the file "COPYING" in the main directory of this archive
    + * for more details.
    + *
    + * Copyright (C) 2006 Atmark Techno, Inc.
    + */
    +
    +#ifndef _ASM_MICROBLAZE_TIMEX_H
    +#define _ASM_MICROBLAZE_TIMEX_H
    +
    +#define CLOCK_TICK_RATE 1000 /* Timer input freq. */
    +
    +typedef unsigned long cycles_t;
    +
    +#define get_cycles() (0)
    +
    +#endif /* _ASM_TIMEX_H */
    --
    1.5.4.GIT


    \
     
     \ /
      Last update: 2008-05-04 17:19    [W:3.102 / U:0.576 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site