2005-04-16 15:20:36 -07:00
/*
* 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>
2007-02-07 11:35:29 +10:00
# include <asm/irq_regs.h>
2005-04-16 15:20:36 -07:00
# 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 ;
}
2008-04-28 11:43:04 +02:00
# ifndef CONFIG_GENERIC_CLOCKEVENTS
2008-04-28 11:43:00 +02:00
/*
* 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 ) ;
2005-04-16 15:20:36 -07:00
write_sequnlock ( & xtime_lock ) ;
2008-02-13 21:33:16 +01:00
update_process_times ( user_mode ( get_irq_regs ( ) ) ) ;
2010-08-04 14:41:45 +02:00
2005-04-16 15:20:36 -07:00
return ( IRQ_HANDLED ) ;
}
2008-04-28 11:43:04 +02:00
# endif
2005-04-16 15:20:36 -07:00
2008-04-28 11:43:00 +02:00
static unsigned long read_rtc_mmss ( void )
2005-04-16 15:20:36 -07:00
{
unsigned int year , mon , day , hour , min , sec ;
2010-08-06 17:47:13 +02:00
if ( mach_gettod ) {
2007-10-23 14:37:54 +10:00
mach_gettod ( & year , & mon , & day , & hour , & min , & sec ) ;
2010-08-06 17:47:13 +02:00
if ( ( year + = 1900 ) < 1970 )
year + = 100 ;
} else {
year = 1970 ;
mon = day = 1 ;
hour = min = sec = 0 ;
}
2005-04-16 15:20:36 -07:00
2008-04-28 11:43:00 +02:00
2009-07-02 14:08:03 +10:00
return mktime ( year , mon , day , hour , min , sec ) ;
2008-04-28 11:43:00 +02:00
}
2009-08-14 15:47:31 +02:00
void read_persistent_clock ( struct timespec * ts )
2008-04-28 11:43:01 +02:00
{
2009-08-14 15:47:31 +02:00
ts - > tv_sec = read_rtc_mmss ( ) ;
ts - > tv_nsec = 0 ;
2008-04-28 11:43:01 +02:00
}
int update_persistent_clock ( struct timespec now )
2008-04-28 11:43:00 +02:00
{
2008-04-28 11:43:01 +02:00
return set_rtc_mmss ( now . tv_sec ) ;
}
2005-04-16 15:20:36 -07:00
2008-04-28 11:43:01 +02:00
void time_init ( void )
{
2007-10-23 14:37:54 +10:00
hw_timer_init ( ) ;
2005-04-16 15:20:36 -07:00
}