linux/arch/m68knommu/kernel/time.c
<<
>>
Prefs
   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
  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>
  25#include <asm/irq_regs.h>
  26
  27#define TICK_SIZE (tick_nsec / 1000)
  28
  29static inline int set_rtc_mmss(unsigned long nowtime)
  30{
  31        if (mach_set_clock_mmss)
  32                return mach_set_clock_mmss (nowtime);
  33        return -1;
  34}
  35
  36#ifndef CONFIG_GENERIC_CLOCKEVENTS
  37/*
  38 * timer_interrupt() needs to keep up the real-time clock,
  39 * as well as call the "do_timer()" routine every clocktick
  40 */
  41irqreturn_t arch_timer_interrupt(int irq, void *dummy)
  42{
  43
  44        if (current->pid)
  45                profile_tick(CPU_PROFILING);
  46
  47        write_seqlock(&xtime_lock);
  48
  49        do_timer(1);
  50
  51        write_sequnlock(&xtime_lock);
  52
  53#ifndef CONFIG_SMP
  54        update_process_times(user_mode(get_irq_regs()));
  55#endif
  56        return(IRQ_HANDLED);
  57}
  58#endif
  59
  60static unsigned long read_rtc_mmss(void)
  61{
  62        unsigned int year, mon, day, hour, min, sec;
  63
  64        if (mach_gettod)
  65                mach_gettod(&year, &mon, &day, &hour, &min, &sec);
  66        else
  67                year = mon = day = hour = min = sec = 0;
  68
  69        if ((year += 1900) < 1970)
  70                year += 100;
  71
  72        return  mktime(year, mon, day, hour, min, sec);
  73}
  74
  75void read_persistent_clock(struct timespec *ts)
  76{
  77        ts->tv_sec = read_rtc_mmss();
  78        ts->tv_nsec = 0;
  79}
  80
  81int update_persistent_clock(struct timespec now)
  82{
  83        return set_rtc_mmss(now.tv_sec);
  84}
  85
  86void time_init(void)
  87{
  88        hw_timer_init();
  89}
  90