 a03fdb7612
			
		
	
	
	a03fdb7612
	
	
	
		
			
			* 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (34 commits) time: Prevent 32 bit overflow with set_normalized_timespec() clocksource: Delay clocksource down rating to late boot clocksource: clocksource_select must be called with mutex locked clocksource: Resolve cpu hotplug dead lock with TSC unstable, fix crash timers: Drop a function prototype clocksource: Resolve cpu hotplug dead lock with TSC unstable timer.c: Fix S/390 comments timekeeping: Fix invalid getboottime() value timekeeping: Fix up read_persistent_clock() breakage on sh timekeeping: Increase granularity of read_persistent_clock(), build fix time: Introduce CLOCK_REALTIME_COARSE x86: Do not unregister PIT clocksource on PIT oneshot setup/shutdown clocksource: Avoid clocksource watchdog circular locking dependency clocksource: Protect the watchdog rating changes with clocksource_mutex clocksource: Call clocksource_change_rating() outside of watchdog_lock timekeeping: Introduce read_boot_clock timekeeping: Increase granularity of read_persistent_clock() timekeeping: Update clocksource with stop_machine timekeeping: Add timekeeper read_clock helper functions timekeeping: Move NTP adjusted clock multiplier to struct timekeeper ... Fix trivial conflict due to MIPS lemote -> loongson renaming.
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  linux/arch/m68knommu/kernel/time.c
 | |
|  *
 | |
|  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
 | |
|  *
 | |
|  * This file contains the m68k-specific time handling details.
 | |
|  * Most of the stuff is located in the machine specific files.
 | |
|  *
 | |
|  * 1997-09-10	Updated NTP code according to technical memorandum Jan '96
 | |
|  *		"A Kernel Model for Precision Timekeeping" by Dave Mills
 | |
|  */
 | |
| 
 | |
| #include <linux/errno.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/sched.h>
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/param.h>
 | |
| #include <linux/string.h>
 | |
| #include <linux/mm.h>
 | |
| #include <linux/profile.h>
 | |
| #include <linux/time.h>
 | |
| #include <linux/timex.h>
 | |
| 
 | |
| #include <asm/machdep.h>
 | |
| #include <asm/irq_regs.h>
 | |
| 
 | |
| #define	TICK_SIZE (tick_nsec / 1000)
 | |
| 
 | |
| static inline int set_rtc_mmss(unsigned long nowtime)
 | |
| {
 | |
| 	if (mach_set_clock_mmss)
 | |
| 		return mach_set_clock_mmss (nowtime);
 | |
| 	return -1;
 | |
| }
 | |
| 
 | |
| #ifndef CONFIG_GENERIC_CLOCKEVENTS
 | |
| /*
 | |
|  * timer_interrupt() needs to keep up the real-time clock,
 | |
|  * as well as call the "do_timer()" routine every clocktick
 | |
|  */
 | |
| irqreturn_t arch_timer_interrupt(int irq, void *dummy)
 | |
| {
 | |
| 
 | |
| 	if (current->pid)
 | |
| 		profile_tick(CPU_PROFILING);
 | |
| 
 | |
| 	write_seqlock(&xtime_lock);
 | |
| 
 | |
| 	do_timer(1);
 | |
| 
 | |
| 	write_sequnlock(&xtime_lock);
 | |
| 
 | |
| #ifndef CONFIG_SMP
 | |
| 	update_process_times(user_mode(get_irq_regs()));
 | |
| #endif
 | |
| 	return(IRQ_HANDLED);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static unsigned long read_rtc_mmss(void)
 | |
| {
 | |
| 	unsigned int year, mon, day, hour, min, sec;
 | |
| 
 | |
| 	if (mach_gettod)
 | |
| 		mach_gettod(&year, &mon, &day, &hour, &min, &sec);
 | |
| 	else
 | |
| 		year = mon = day = hour = min = sec = 0;
 | |
| 
 | |
| 	if ((year += 1900) < 1970)
 | |
| 		year += 100;
 | |
| 
 | |
| 	return  mktime(year, mon, day, hour, min, sec);
 | |
| }
 | |
| 
 | |
| void read_persistent_clock(struct timespec *ts)
 | |
| {
 | |
| 	ts->tv_sec = read_rtc_mmss();
 | |
| 	ts->tv_nsec = 0;
 | |
| }
 | |
| 
 | |
| int update_persistent_clock(struct timespec now)
 | |
| {
 | |
| 	return set_rtc_mmss(now.tv_sec);
 | |
| }
 | |
| 
 | |
| void time_init(void)
 | |
| {
 | |
| 	hw_timer_init();
 | |
| }
 |