From: Michal Simek <monstr@xxxxxxxxx> Signed-off-by: Michal Simek <monstr@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html