linux/arch/sh/kernel/time.c
<<
>>
Prefs
   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 */
  26static 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
  32static int null_rtc_set_time(const time_t secs)
  33{
  34        return 0;
  35}
  36
  37void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
  38int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
  39
  40void read_persistent_clock(struct timespec *ts)
  41{
  42        rtc_sh_get_time(ts);
  43}
  44
  45#ifdef CONFIG_GENERIC_CMOS_UPDATE
  46int update_persistent_clock(struct timespec now)
  47{
  48        return rtc_sh_set_time(now.tv_sec);
  49}
  50#endif
  51
  52static 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
  61static 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
  73static const struct rtc_class_ops rtc_generic_ops = {
  74        .read_time = rtc_generic_get_time,
  75        .set_time = rtc_generic_set_time,
  76};
  77
  78static 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}
  92device_initcall(rtc_generic_init);
  93
  94void (*board_time_init)(void);
  95
  96static 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
 111void __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