time.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. static inline int set_rtc_mmss(unsigned long nowtime)
  26. {
  27. if (mach_set_clock_mmss)
  28. return mach_set_clock_mmss (nowtime);
  29. return -1;
  30. }
  31. /*
  32. * timer_interrupt() needs to keep up the real-time clock,
  33. * as well as call the "do_timer()" routine every clocktick
  34. */
  35. irqreturn_t arch_timer_interrupt(int irq, void *dummy)
  36. {
  37. if (current->pid)
  38. profile_tick(CPU_PROFILING);
  39. write_seqlock(&xtime_lock);
  40. do_timer(1);
  41. write_sequnlock(&xtime_lock);
  42. #ifndef CONFIG_SMP
  43. update_process_times(user_mode(get_irq_regs()));
  44. #endif
  45. return(IRQ_HANDLED);
  46. }
  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. else
  53. year = mon = day = hour = min = sec = 0;
  54. if ((year += 1900) < 1970)
  55. year += 100;
  56. return mktime(year, mon, day, hour, min, sec);;
  57. }
  58. unsigned long read_persistent_clock(void)
  59. {
  60. return read_rtc_mmss();
  61. }
  62. int update_persistent_clock(struct timespec now)
  63. {
  64. return set_rtc_mmss(now.tv_sec);
  65. }
  66. void time_init(void)
  67. {
  68. hw_timer_init();
  69. }