~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/kernel/time.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/arm/kernel/time.c (Architecture ppc) and /arch/m68k/kernel/time.c (Architecture m68k)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*                                                  2 /*
  3  *  linux/arch/arm/kernel/time.c               !!   3  *  linux/arch/m68k/kernel/time.c
  4  *                                                  4  *
  5  *  Copyright (C) 1991, 1992, 1995  Linus Torv      5  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
  6  *  Modifications for ARM (C) 1994-2001 Russel << 
  7  *                                                  6  *
  8  *  This file contains the ARM-specific time h !!   7  * This file contains the m68k-specific time handling details.
  9  *  reading the RTC at bootup, etc...          !!   8  * Most of the stuff is located in the machine specific files.
                                                   >>   9  *
                                                   >>  10  * 1997-09-10   Updated NTP code according to technical memorandum Jan '96
                                                   >>  11  *              "A Kernel Model for Precision Timekeeping" by Dave Mills
 10  */                                                12  */
 11 #include <linux/clockchips.h>                  !!  13 
 12 #include <linux/clocksource.h>                 << 
 13 #include <linux/errno.h>                           14 #include <linux/errno.h>
 14 #include <linux/export.h>                          15 #include <linux/export.h>
 15 #include <linux/init.h>                        !!  16 #include <linux/module.h>
 16 #include <linux/interrupt.h>                   << 
 17 #include <linux/irq.h>                         << 
 18 #include <linux/kernel.h>                      << 
 19 #include <linux/of_clk.h>                      << 
 20 #include <linux/profile.h>                     << 
 21 #include <linux/sched.h>                           17 #include <linux/sched.h>
 22 #include <linux/sched_clock.h>                 !!  18 #include <linux/sched/loadavg.h>
 23 #include <linux/smp.h>                         !!  19 #include <linux/kernel.h>
                                                   >>  20 #include <linux/param.h>
                                                   >>  21 #include <linux/string.h>
                                                   >>  22 #include <linux/mm.h>
                                                   >>  23 #include <linux/rtc.h>
                                                   >>  24 #include <linux/platform_device.h>
                                                   >>  25 
                                                   >>  26 #include <asm/machdep.h>
                                                   >>  27 #include <asm/io.h>
                                                   >>  28 #include <asm/irq_regs.h>
                                                   >>  29 
 24 #include <linux/time.h>                            30 #include <linux/time.h>
 25 #include <linux/timex.h>                           31 #include <linux/timex.h>
 26 #include <linux/timer.h>                       !!  32 #include <linux/profile.h>
 27                                                    33 
 28 #include <asm/mach/arch.h>                     << 
 29 #include <asm/mach/time.h>                     << 
 30 #include <asm/stacktrace.h>                    << 
 31 #include <asm/thread_info.h>                   << 
 32                                                    34 
 33 #if defined(CONFIG_RTC_DRV_CMOS) || defined(CO !!  35 unsigned long (*mach_random_get_entropy)(void);
 34     defined(CONFIG_NVRAM) || defined(CONFIG_NV !!  36 EXPORT_SYMBOL_GPL(mach_random_get_entropy);
 35 /* this needs a better home */                 << 
 36 DEFINE_SPINLOCK(rtc_lock);                     << 
 37 EXPORT_SYMBOL(rtc_lock);                       << 
 38 #endif  /* pc-style 'CMOS' RTC support */      << 
 39                                                    37 
 40 /* change this if you have some constant time  !!  38 #ifdef CONFIG_HEARTBEAT
 41 #define USECS_PER_JIFFY (1000000/HZ)           !!  39 void timer_heartbeat(void)
                                                   >>  40 {
                                                   >>  41         /* use power LED as a heartbeat instead -- much more useful
                                                   >>  42            for debugging -- based on the version for PReP by Cort */
                                                   >>  43         /* acts like an actual heart beat -- ie thump-thump-pause... */
                                                   >>  44         if (mach_heartbeat) {
                                                   >>  45             static unsigned cnt = 0, period = 0, dist = 0;
                                                   >>  46 
                                                   >>  47             if (cnt == 0 || cnt == dist)
                                                   >>  48                 mach_heartbeat( 1 );
                                                   >>  49             else if (cnt == 7 || cnt == dist+7)
                                                   >>  50                 mach_heartbeat( 0 );
                                                   >>  51 
                                                   >>  52             if (++cnt > period) {
                                                   >>  53                 cnt = 0;
                                                   >>  54                 /* The hyperbolic function below modifies the heartbeat period
                                                   >>  55                  * length in dependency of the current (5min) load. It goes
                                                   >>  56                  * through the points f(0)=126, f(1)=86, f(5)=51,
                                                   >>  57                  * f(inf)->30. */
                                                   >>  58                 period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30;
                                                   >>  59                 dist = period / 4;
                                                   >>  60             }
                                                   >>  61         }
                                                   >>  62 }
                                                   >>  63 #endif /* CONFIG_HEARTBEAT */
 42                                                    64 
 43 #ifdef CONFIG_SMP                              !!  65 #ifdef CONFIG_M68KCLASSIC
 44 unsigned long profile_pc(struct pt_regs *regs) !!  66 /* machine dependent timer functions */
                                                   >>  67 int (*mach_hwclk) (int, struct rtc_time*);
                                                   >>  68 EXPORT_SYMBOL(mach_hwclk);
                                                   >>  69 
                                                   >>  70 int (*mach_get_rtc_pll)(struct rtc_pll_info *);
                                                   >>  71 int (*mach_set_rtc_pll)(struct rtc_pll_info *);
                                                   >>  72 EXPORT_SYMBOL(mach_get_rtc_pll);
                                                   >>  73 EXPORT_SYMBOL(mach_set_rtc_pll);
                                                   >>  74 
                                                   >>  75 #if !IS_BUILTIN(CONFIG_RTC_DRV_GENERIC)
                                                   >>  76 void read_persistent_clock64(struct timespec64 *ts)
 45 {                                                  77 {
 46         struct stackframe frame;               !!  78         struct rtc_time time;
                                                   >>  79 
                                                   >>  80         ts->tv_sec = 0;
                                                   >>  81         ts->tv_nsec = 0;
 47                                                    82 
 48         if (!in_lock_functions(regs->ARM_pc))  !!  83         if (!mach_hwclk)
 49                 return regs->ARM_pc;           !!  84                 return;
 50                                                    85 
 51         arm_get_current_stackframe(regs, &fram !!  86         mach_hwclk(0, &time);
 52         do {                                   << 
 53                 int ret = unwind_frame(&frame) << 
 54                 if (ret < 0)                   << 
 55                         return 0;              << 
 56         } while (in_lock_functions(frame.pc)); << 
 57                                                    87 
 58         return frame.pc;                       !!  88         ts->tv_sec = mktime64(time.tm_year + 1900, time.tm_mon + 1, time.tm_mday,
                                                   >>  89                               time.tm_hour, time.tm_min, time.tm_sec);
 59 }                                                  90 }
 60 EXPORT_SYMBOL(profile_pc);                     << 
 61 #endif                                             91 #endif
 62                                                    92 
 63 static void dummy_clock_access(struct timespec !!  93 #if IS_ENABLED(CONFIG_RTC_DRV_GENERIC)
                                                   >>  94 static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm)
 64 {                                                  95 {
 65         ts->tv_sec = 0;                        !!  96         mach_hwclk(0, tm);
 66         ts->tv_nsec = 0;                       !!  97         return 0;
 67 }                                                  98 }
 68                                                    99 
 69 static clock_access_fn __read_persistent_clock !! 100 static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
 70                                                << 
 71 void read_persistent_clock64(struct timespec64 << 
 72 {                                                 101 {
 73         __read_persistent_clock(ts);           !! 102         if (mach_hwclk(1, tm) < 0)
                                                   >> 103                 return -EOPNOTSUPP;
                                                   >> 104         return 0;
 74 }                                                 105 }
 75                                                   106 
 76 int __init register_persistent_clock(clock_acc !! 107 static int rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 77 {                                                 108 {
 78         /* Only allow the clockaccess function !! 109         struct rtc_pll_info pll;
 79         if (__read_persistent_clock == dummy_c !! 110         struct rtc_pll_info __user *argp = (void __user *)arg;
 80                 if (read_persistent)           !! 111 
 81                         __read_persistent_cloc !! 112         switch (cmd) {
 82                 return 0;                      !! 113         case RTC_PLL_GET:
                                                   >> 114                 if (!mach_get_rtc_pll || mach_get_rtc_pll(&pll))
                                                   >> 115                         return -EINVAL;
                                                   >> 116                 return copy_to_user(argp, &pll, sizeof pll) ? -EFAULT : 0;
                                                   >> 117 
                                                   >> 118         case RTC_PLL_SET:
                                                   >> 119                 if (!mach_set_rtc_pll)
                                                   >> 120                         return -EINVAL;
                                                   >> 121                 if (!capable(CAP_SYS_TIME))
                                                   >> 122                         return -EACCES;
                                                   >> 123                 if (copy_from_user(&pll, argp, sizeof(pll)))
                                                   >> 124                         return -EFAULT;
                                                   >> 125                 return mach_set_rtc_pll(&pll);
 83         }                                         126         }
 84                                                   127 
 85         return -EINVAL;                        !! 128         return -ENOIOCTLCMD;
                                                   >> 129 }
                                                   >> 130 
                                                   >> 131 static const struct rtc_class_ops generic_rtc_ops = {
                                                   >> 132         .ioctl = rtc_ioctl,
                                                   >> 133         .read_time = rtc_generic_get_time,
                                                   >> 134         .set_time = rtc_generic_set_time,
                                                   >> 135 };
                                                   >> 136 
                                                   >> 137 static int __init rtc_init(void)
                                                   >> 138 {
                                                   >> 139         struct platform_device *pdev;
                                                   >> 140 
                                                   >> 141         if (!mach_hwclk)
                                                   >> 142                 return -ENODEV;
                                                   >> 143 
                                                   >> 144         pdev = platform_device_register_data(NULL, "rtc-generic", -1,
                                                   >> 145                                              &generic_rtc_ops,
                                                   >> 146                                              sizeof(generic_rtc_ops));
                                                   >> 147         return PTR_ERR_OR_ZERO(pdev);
 86 }                                                 148 }
 87                                                   149 
                                                   >> 150 module_init(rtc_init);
                                                   >> 151 #endif /* CONFIG_RTC_DRV_GENERIC */
                                                   >> 152 #endif /* CONFIG M68KCLASSIC */
                                                   >> 153 
 88 void __init time_init(void)                       154 void __init time_init(void)
 89 {                                                 155 {
 90         if (machine_desc->init_time) {         !! 156         mach_sched_init();
 91                 machine_desc->init_time();     << 
 92         } else {                               << 
 93 #ifdef CONFIG_COMMON_CLK                       << 
 94                 of_clk_init(NULL);             << 
 95 #endif                                         << 
 96                 timer_probe();                 << 
 97                 tick_setup_hrtimer_broadcast() << 
 98         }                                      << 
 99 }                                                 157 }
100                                                   158 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php