1 /* 2 * arch/sh/kernel/time.c 3 * 4 * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka 5 * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> 6 * Copyright (C) 2002 - 2009 Paul Mundt 7 * Copyright (C) 2002 M. R. Brown <mrbrown@linux-sh.org> 8 * 9 * This file is subject to the terms and conditions of the GNU General Public 10 * License. See the file "COPYING" in the main directory of this archive 11 * for more details. 12 */ 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <linux/profile.h> 16 #include <linux/timex.h> 17 #include <linux/sched.h> 18 #include <linux/clockchips.h> 19 #include <linux/platform_device.h> 20 #include <linux/smp.h> 21 #include <linux/rtc.h> 22 #include <asm/clock.h> 23 #include <asm/rtc.h> 24 25 /* Dummy RTC ops */ 26 static void null_rtc_get_time(struct timespec *tv) 27 { 28 tv->tv_sec = mktime(2000, 1, 1, 0, 0, 0); 29 tv->tv_nsec = 0; 30 } 31 32 static int null_rtc_set_time(const time_t secs) 33 { 34 return 0; 35 } 36 37 void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; 38 int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; 39 40 void read_persistent_clock(struct timespec *ts) 41 { 42 rtc_sh_get_time(ts); 43 } 44 45 #ifdef CONFIG_GENERIC_CMOS_UPDATE 46 int update_persistent_clock(struct timespec now) 47 { 48 return rtc_sh_set_time(now.tv_sec); 49 } 50 #endif 51 52 static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm) 53 { 54 struct timespec tv; 55 56 rtc_sh_get_time(&tv); 57 rtc_time_to_tm(tv.tv_sec, tm); 58 return 0; 59 } 60 61 static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm) 62 { 63 unsigned long secs; 64 65 rtc_tm_to_time(tm, &secs); 66 if ((rtc_sh_set_time == null_rtc_set_time) || 67 (rtc_sh_set_time(secs) < 0)) 68 return -EOPNOTSUPP; 69 70 return 0; 71 } 72 73 static const struct rtc_class_ops rtc_generic_ops = { 74 .read_time = rtc_generic_get_time, 75 .set_time = rtc_generic_set_time, 76 }; 77 78 static int __init rtc_generic_init(void) 79 { 80 struct platform_device *pdev; 81 82 if (rtc_sh_get_time == null_rtc_get_time) 83 return -ENODEV; 84 85 pdev = platform_device_register_data(NULL, "rtc-generic", -1, 86 &rtc_generic_ops, 87 sizeof(rtc_generic_ops)); 88 89 90 return PTR_ERR_OR_ZERO(pdev); 91 } 92 device_initcall(rtc_generic_init); 93 94 void (*board_time_init)(void); 95 96 static void __init sh_late_time_init(void) 97 { 98 /* 99 * Make sure all compiled-in early timers register themselves. 100 * 101 * Run probe() for two "earlytimer" devices, these will be the 102 * clockevents and clocksource devices respectively. In the event 103 * that only a clockevents device is available, we -ENODEV on the 104 * clocksource and the jiffies clocksource is used transparently 105 * instead. No error handling is necessary here. 106 */ 107 early_platform_driver_register_all("earlytimer"); 108 early_platform_driver_probe("earlytimer", 2, 0); 109 } 110 111 void __init time_init(void) 112 { 113 if (board_time_init) 114 board_time_init(); 115 116 clk_init(); 117 118 late_time_init = sh_late_time_init; 119 } 120