time_no.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #include <linux/errno.h>
  13. #include <linux/module.h>
  14. #include <linux/sched.h>
  15. #include <linux/kernel.h>
  16. #include <linux/param.h>
  17. #include <linux/string.h>
  18. #include <linux/mm.h>
  19. #include <linux/profile.h>
  20. #include <linux/time.h>
  21. #include <linux/timex.h>
  22. #include <asm/machdep.h>
  23. #include <asm/irq_regs.h>
  24. #define TICK_SIZE (tick_nsec / 1000)
  25. /* machine dependent timer functions */
  26. void (*mach_gettod)(int*, int*, int*, int*, int*, int*);
  27. static inline int set_rtc_mmss(unsigned long nowtime)
  28. {
  29. if (mach_set_clock_mmss)
  30. return mach_set_clock_mmss (nowtime);
  31. return -1;
  32. }
  33. #ifndef CONFIG_GENERIC_CLOCKEVENTS
  34. /*
  35. * timer_interrupt() needs to keep up the real-time clock,
  36. * as well as call the "xtime_update()" routine every clocktick
  37. */
  38. irqreturn_t arch_timer_interrupt(int irq, void *dummy)
  39. {
  40. if (current->pid)
  41. profile_tick(CPU_PROFILING);
  42. xtime_update(1);
  43. update_process_times(user_mode(get_irq_regs()));
  44. return(IRQ_HANDLED);
  45. }
  46. #endif
  47. static unsigned long read_rtc_mmss(void)
  48. {
  49. unsigned int year, mon, day, hour, min, sec;
  50. if (mach_gettod) {
  51. mach_gettod(&year, &mon, &day, &hour, &min, &sec);
  52. if ((year += 1900) < 1970)
  53. year += 100;
  54. } else {
  55. year = 1970;
  56. mon = day = 1;
  57. hour = min = sec = 0;
  58. }
  59. return mktime(year, mon, day, hour, min, sec);
  60. }
  61. void read_persistent_clock(struct timespec *ts)
  62. {
  63. ts->tv_sec = read_rtc_mmss();
  64. ts->tv_nsec = 0;
  65. }
  66. int update_persistent_clock(struct timespec now)
  67. {
  68. return set_rtc_mmss(now.tv_sec);
  69. }
  70. void time_init(void)
  71. {
  72. hw_timer_init();
  73. }