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        update_process_times(user_mode(get_irq_regs()));
  54
  55        return(IRQ_HANDLED);
  56}
  57#endif
  58
  59static unsigned long read_rtc_mmss(void)
  60{
  61        unsigned int year, mon, day, hour, min, sec;
  62
  63        if (mach_gettod) {
  64                mach_gettod(&year, &mon, &day, &hour, &min, &sec);
  65                if ((year += 1900) < 1970)
  66                        year += 100;
  67        } else {
  68                year = 1970;
  69                mon = day = 1;
  70                hour = min = sec = 0;
  71        }
  72
  73
  74        return  mktime(year, mon, day, hour, min, sec);
  75}
  76
  77void read_persistent_clock(struct timespec *ts)
  78{
  79        ts->tv_sec = read_rtc_mmss();
  80        ts->tv_nsec = 0;
  81}
  82
  83int update_persistent_clock(struct timespec now)
  84{
  85        return set_rtc_mmss(now.tv_sec);
  86}
  87
  88void time_init(void)
  89{
  90        hw_timer_init();
  91}
  92