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/module.h>
  15#include <linux/init.h>
  16#include <linux/profile.h>
  17#include <linux/timex.h>
  18#include <linux/sched.h>
  19#include <linux/clockchips.h>
  20#include <linux/platform_device.h>
  21#include <linux/smp.h>
  22#include <linux/rtc.h>
  23#include <asm/clock.h>
  24#include <asm/hwblk.h>
  25#include <asm/rtc.h>
  26
  27/* Dummy RTC ops */
  28static void null_rtc_get_time(struct timespec *tv)
  29{
  30        tv->tv_sec = mktime(2000, 1, 1, 0, 0, 0);
  31        tv->tv_nsec = 0;
  32}
  33
  34static int null_rtc_set_time(const time_t secs)
  35{
  36        return 0;
  37}
  38
  39void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
  40int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
  41
  42void read_persistent_clock(struct timespec *ts)
  43{
  44        rtc_sh_get_time(ts);
  45}
  46
  47#ifdef CONFIG_GENERIC_CMOS_UPDATE
  48int update_persistent_clock(struct timespec now)
  49{
  50        return rtc_sh_set_time(now.tv_sec);
  51}
  52#endif
  53
  54unsigned int get_rtc_time(struct rtc_time *tm)
  55{
  56        if (rtc_sh_get_time != null_rtc_get_time) {
  57                struct timespec tv;
  58
  59                rtc_sh_get_time(&tv);
  60                rtc_time_to_tm(tv.tv_sec, tm);
  61        }
  62
  63        return RTC_24H;
  64}
  65EXPORT_SYMBOL(get_rtc_time);
  66
  67int set_rtc_time(struct rtc_time *tm)
  68{
  69        unsigned long secs;
  70
  71        rtc_tm_to_time(tm, &secs);
  72        return rtc_sh_set_time(secs);
  73}
  74EXPORT_SYMBOL(set_rtc_time);
  75
  76static int __init rtc_generic_init(void)
  77{
  78        struct platform_device *pdev;
  79
  80        if (rtc_sh_get_time == null_rtc_get_time)
  81                return -ENODEV;
  82
  83        pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
  84        if (IS_ERR(pdev))
  85                return PTR_ERR(pdev);
  86
  87        return 0;
  88}
  89module_init(rtc_generic_init);
  90
  91void (*board_time_init)(void);
  92
  93static void __init sh_late_time_init(void)
  94{
  95        /*
  96         * Make sure all compiled-in early timers register themselves.
  97         *
  98         * Run probe() for two "earlytimer" devices, these will be the
  99         * clockevents and clocksource devices respectively. In the event
 100         * that only a clockevents device is available, we -ENODEV on the
 101         * clocksource and the jiffies clocksource is used transparently
 102         * instead. No error handling is necessary here.
 103         */
 104        early_platform_driver_register_all("earlytimer");
 105        early_platform_driver_probe("earlytimer", 2, 0);
 106}
 107
 108void __init time_init(void)
 109{
 110        if (board_time_init)
 111                board_time_init();
 112
 113        hwblk_init();
 114        clk_init();
 115
 116        late_time_init = sh_late_time_init;
 117}
 118