| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | *  linux/arch/m68knommu/kernel/time.c | 
|  | 3 | * | 
|  | 4 | *  Copyright (C) 1991, 1992, 1995  Linus Torvalds | 
|  | 5 | * | 
|  | 6 | * This file contains the m68k-specific time handling details. | 
|  | 7 | * Most of the stuff is located in the machine specific files. | 
|  | 8 | * | 
|  | 9 | * 1997-09-10	Updated NTP code according to technical memorandum Jan '96 | 
|  | 10 | *		"A Kernel Model for Precision Timekeeping" by Dave Mills | 
|  | 11 | */ | 
|  | 12 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | #include <linux/errno.h> | 
|  | 14 | #include <linux/module.h> | 
|  | 15 | #include <linux/sched.h> | 
|  | 16 | #include <linux/kernel.h> | 
|  | 17 | #include <linux/param.h> | 
|  | 18 | #include <linux/string.h> | 
|  | 19 | #include <linux/mm.h> | 
|  | 20 | #include <linux/profile.h> | 
|  | 21 | #include <linux/time.h> | 
|  | 22 | #include <linux/timex.h> | 
|  | 23 |  | 
|  | 24 | #include <asm/machdep.h> | 
| Greg Ungerer | 1f95e49 | 2007-02-07 11:35:29 +1000 | [diff] [blame] | 25 | #include <asm/irq_regs.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 |  | 
|  | 27 | #define	TICK_SIZE (tick_nsec / 1000) | 
|  | 28 |  | 
| Greg Ungerer | 361a541 | 2011-10-19 21:37:08 +1000 | [diff] [blame] | 29 | /* machine dependent timer functions */ | 
|  | 30 | void (*mach_gettod)(int*, int*, int*, int*, int*, int*); | 
|  | 31 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 | static inline int set_rtc_mmss(unsigned long nowtime) | 
|  | 33 | { | 
|  | 34 | if (mach_set_clock_mmss) | 
|  | 35 | return mach_set_clock_mmss (nowtime); | 
|  | 36 | return -1; | 
|  | 37 | } | 
|  | 38 |  | 
| Sebastian Siewior | 2b9a698 | 2008-04-28 11:43:04 +0200 | [diff] [blame] | 39 | #ifndef CONFIG_GENERIC_CLOCKEVENTS | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 40 | /* | 
|  | 41 | * timer_interrupt() needs to keep up the real-time clock, | 
| Torben Hohn | e53f276 | 2011-01-27 16:00:06 +0100 | [diff] [blame] | 42 | * as well as call the "xtime_update()" routine every clocktick | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 43 | */ | 
|  | 44 | irqreturn_t arch_timer_interrupt(int irq, void *dummy) | 
|  | 45 | { | 
|  | 46 |  | 
|  | 47 | if (current->pid) | 
|  | 48 | profile_tick(CPU_PROFILING); | 
|  | 49 |  | 
| Torben Hohn | e53f276 | 2011-01-27 16:00:06 +0100 | [diff] [blame] | 50 | xtime_update(1); | 
| Peter Zijlstra | aa02cd2 | 2008-02-13 21:33:16 +0100 | [diff] [blame] | 51 |  | 
| Peter Zijlstra | aa02cd2 | 2008-02-13 21:33:16 +0100 | [diff] [blame] | 52 | update_process_times(user_mode(get_irq_regs())); | 
| Christian Dietrich | 5bc5a70 | 2010-08-04 14:41:45 +0200 | [diff] [blame] | 53 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 | return(IRQ_HANDLED); | 
|  | 55 | } | 
| Sebastian Siewior | 2b9a698 | 2008-04-28 11:43:04 +0200 | [diff] [blame] | 56 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 57 |  | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 58 | static unsigned long read_rtc_mmss(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | { | 
|  | 60 | unsigned int year, mon, day, hour, min, sec; | 
|  | 61 |  | 
| Philippe De Muyter | 4742225 | 2010-08-06 17:47:13 +0200 | [diff] [blame] | 62 | if (mach_gettod) { | 
| Greg Ungerer | 2f2c267 | 2007-10-23 14:37:54 +1000 | [diff] [blame] | 63 | mach_gettod(&year, &mon, &day, &hour, &min, &sec); | 
| Philippe De Muyter | 4742225 | 2010-08-06 17:47:13 +0200 | [diff] [blame] | 64 | if ((year += 1900) < 1970) | 
|  | 65 | year += 100; | 
|  | 66 | } else { | 
|  | 67 | year = 1970; | 
|  | 68 | mon = day = 1; | 
|  | 69 | hour = min = sec = 0; | 
|  | 70 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 71 |  | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 72 |  | 
| Joe Perches | c573b29 | 2009-07-02 14:08:03 +1000 | [diff] [blame] | 73 | return  mktime(year, mon, day, hour, min, sec); | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 74 | } | 
|  | 75 |  | 
| Martin Schwidefsky | d4f587c | 2009-08-14 15:47:31 +0200 | [diff] [blame] | 76 | void read_persistent_clock(struct timespec *ts) | 
| Sebastian Siewior | 0df185f | 2008-04-28 11:43:00 +0200 | [diff] [blame] | 77 | { | 
| Martin Schwidefsky | d4f587c | 2009-08-14 15:47:31 +0200 | [diff] [blame] | 78 | ts->tv_sec = read_rtc_mmss(); | 
|  | 79 | ts->tv_nsec = 0; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 80 | } | 
|  | 81 |  | 
| Sebastian Siewior | 95469bd | 2008-04-28 11:43:01 +0200 | [diff] [blame] | 82 | int update_persistent_clock(struct timespec now) | 
|  | 83 | { | 
|  | 84 | return set_rtc_mmss(now.tv_sec); | 
|  | 85 | } | 
|  | 86 |  | 
|  | 87 | void time_init(void) | 
|  | 88 | { | 
|  | 89 | hw_timer_init(); | 
|  | 90 | } |