2 * SPDX-License-Identifier: GPL-2.0-or-later
4 * rtc.c - Use /dev/rtc for clock access
11 #include <sys/ioctl.h>
12 #include <sys/select.h>
17 #include "monotonic.h"
23 * Get defines for rtc stuff.
25 * Getting the rtc defines is nontrivial. The obvious way is by including
26 * <linux/mc146818rtc.h> but that again includes <asm/io.h> which again
27 * includes ... and on sparc and alpha this gives compilation errors for
28 * many kernel versions. So, we give the defines ourselves here. Moreover,
29 * some Sparc person decided to be incompatible, and used a struct rtc_time
30 * different from that used in mc146818rtc.h.
34 * On Sparcs, there is a <asm/rtc.h> that defines different ioctls (that are
35 * required on my machine). However, this include file does not exist on
36 * other architectures.
44 /* The following is roughly equivalent */
47 int sec
; /* Seconds 0-59 */
48 int min
; /* Minutes 0-59 */
49 int hour
; /* Hour 0-23 */
50 int dow
; /* Day of the week 1-7 */
51 int dom
; /* Day of the month 1-31 */
52 int month
; /* Month of year 1-12 */
53 int year
; /* Year 0-99 */
55 #define RTCGET _IOR('p', 20, struct sparc_rtc_time)
56 #define RTCSET _IOW('p', 21, struct sparc_rtc_time)
60 * struct rtc_time is present since 1.3.99.
61 * Earlier (since 1.3.89), a struct tm was used.
63 struct linux_rtc_time
{
75 /* RTC_RD_TIME etc have this definition since 1.99.9 (pre2.0-9) */
77 # define RTC_RD_TIME _IOR('p', 0x09, struct linux_rtc_time)
78 # define RTC_SET_TIME _IOW('p', 0x0a, struct linux_rtc_time)
79 # define RTC_UIE_ON _IO('p', 0x03) /* Update int. enable on */
80 # define RTC_UIE_OFF _IO('p', 0x04) /* Update int. enable off */
83 /* RTC_EPOCH_READ and RTC_EPOCH_SET are present since 2.0.34 and 2.1.89 */
84 #ifndef RTC_EPOCH_READ
85 # define RTC_EPOCH_READ _IOR('p', 0x0d, unsigned long) /* Read epoch */
86 # define RTC_EPOCH_SET _IOW('p', 0x0e, unsigned long) /* Set epoch */
90 * /dev/rtc is conventionally chardev 10/135
91 * ia64 uses /dev/efirtc, chardev 10/136
92 * devfs (obsolete) used /dev/misc/... for miscdev
93 * new RTC framework + udev uses dynamic major and /dev/rtc0.../dev/rtcN
94 * ... so we need an overridable default
97 /* default or user defined dev (by hwclock --rtc=<path>) */
98 static const char *rtc_dev_name
;
99 static int rtc_dev_fd
= -1;
101 static void close_rtc(void)
103 if (rtc_dev_fd
!= -1)
108 static int open_rtc(const struct hwclock_control
*ctl
)
110 static const char *fls
[] = {
121 if (rtc_dev_fd
!= -1)
124 /* --rtc option has been given */
125 if (ctl
->rtc_dev_name
) {
126 rtc_dev_name
= ctl
->rtc_dev_name
;
127 rtc_dev_fd
= open(rtc_dev_name
, O_RDONLY
);
129 for (i
= 0; i
< ARRAY_SIZE(fls
); i
++) {
131 printf(_("Trying to open: %s\n"), fls
[i
]);
132 rtc_dev_fd
= open(fls
[i
], O_RDONLY
);
134 if (rtc_dev_fd
< 0) {
135 if (errno
== ENOENT
|| errno
== ENODEV
)
138 warn(_("cannot open %s"), fls
[i
]);
140 rtc_dev_name
= fls
[i
];
144 rtc_dev_name
= *fls
; /* default for error messages */
146 if (rtc_dev_fd
!= -1)
151 static int open_rtc_or_exit(const struct hwclock_control
*ctl
)
153 int rtc_fd
= open_rtc(ctl
);
156 warn(_("cannot open rtc device"));
157 hwclock_exit(ctl
, EXIT_FAILURE
);
162 static int do_rtc_read_ioctl(int rtc_fd
, struct tm
*tm
)
167 /* some but not all sparcs use a different ioctl and struct */
168 struct sparc_rtc_time stm
;
171 ioctlname
= "RTC_RD_TIME";
172 rc
= ioctl(rtc_fd
, RTC_RD_TIME
, tm
);
175 if (rc
== -1) { /* sparc sbus */
176 ioctlname
= "RTCGET";
177 rc
= ioctl(rtc_fd
, RTCGET
, &stm
);
179 tm
->tm_sec
= stm
.sec
;
180 tm
->tm_min
= stm
.min
;
181 tm
->tm_hour
= stm
.hour
;
182 tm
->tm_mday
= stm
.dom
;
183 tm
->tm_mon
= stm
.month
- 1;
184 tm
->tm_year
= stm
.year
- 1900;
185 tm
->tm_wday
= stm
.dow
- 1;
186 tm
->tm_yday
= -1; /* day in the year */
192 warn(_("ioctl(%s) to %s to read the time failed"),
193 ioctlname
, rtc_dev_name
);
197 tm
->tm_isdst
= -1; /* don't know whether it's dst */
202 * Wait for the top of a clock tick by reading /dev/rtc in a busy loop
203 * until we see it. This function is used for rtc drivers without ioctl
204 * interrupts. This is typical on an Alpha, where the Hardware Clock
205 * interrupts are used by the kernel for the system clock, so aren't at
206 * the user's disposal.
208 static int busywait_for_rtc_clock_tick(const struct hwclock_control
*ctl
,
211 struct tm start_time
;
212 /* The time when we were called (and started waiting) */
215 struct timeval begin
, now
;
218 printf("ioctl(%d, RTC_UIE_ON, 0): %s\n",
219 rtc_fd
, strerror(errno
));
220 printf(_("Waiting in loop for time from %s to change\n"),
224 if (do_rtc_read_ioctl(rtc_fd
, &start_time
))
228 * Wait for change. Should be within a second, but in case
229 * something weird happens, we have a time limit (1.5s) on this loop
230 * to reduce the impact of this failure.
232 gettime_monotonic(&begin
);
234 rc
= do_rtc_read_ioctl(rtc_fd
, &nowtime
);
235 if (rc
|| start_time
.tm_sec
!= nowtime
.tm_sec
)
237 gettime_monotonic(&now
);
238 if (time_diff(now
, begin
) > 1.5) {
239 warnx(_("Timed out waiting for time change."));
250 * Same as synchronize_to_clock_tick(), but just for /dev/rtc.
252 static int synchronize_to_clock_tick_rtc(const struct hwclock_control
*ctl
)
254 int rtc_fd
; /* File descriptor of /dev/rtc */
257 rtc_fd
= open_rtc(ctl
);
259 warn(_("cannot open rtc device"));
262 /* Turn on update interrupts (one per second) */
263 int rc
= ioctl(rtc_fd
, RTC_UIE_ON
, 0);
267 * Just reading rtc_fd fails on broken hardware: no
268 * update interrupt comes and a bootscript with a
275 * Wait up to ten seconds for the next update
279 FD_SET(rtc_fd
, &rfds
);
282 rc
= select(rtc_fd
+ 1, &rfds
, NULL
, NULL
, &tv
);
286 warnx(_("select() to %s to wait for clock tick timed out"),
289 warn(_("select() to %s to wait for clock tick failed"),
291 /* Turn off update interrupts */
292 rc
= ioctl(rtc_fd
, RTC_UIE_OFF
, 0);
294 warn(_("ioctl() to %s to turn off update interrupts failed"),
296 } else if (errno
== ENOTTY
|| errno
== EINVAL
) {
297 /* rtc ioctl interrupts are unimplemented */
298 ret
= busywait_for_rtc_clock_tick(ctl
, rtc_fd
);
300 warn(_("ioctl(%d, RTC_UIE_ON, 0) to %s failed"),
301 rtc_fd
, rtc_dev_name
);
306 static int read_hardware_clock_rtc(const struct hwclock_control
*ctl
,
311 rtc_fd
= open_rtc_or_exit(ctl
);
313 /* Read the RTC time/date, return answer via tm */
314 rc
= do_rtc_read_ioctl(rtc_fd
, tm
);
320 * Set the Hardware Clock to the broken down time <new_broken_time>. Use
321 * ioctls to "rtc" device /dev/rtc.
323 static int set_hardware_clock_rtc(const struct hwclock_control
*ctl
,
324 const struct tm
*new_broken_time
)
330 rtc_fd
= open_rtc_or_exit(ctl
);
332 ioctlname
= "RTC_SET_TIME";
333 rc
= ioctl(rtc_fd
, RTC_SET_TIME
, new_broken_time
);
336 if (rc
== -1) { /* sparc sbus */
337 struct sparc_rtc_time stm
;
339 stm
.sec
= new_broken_time
->tm_sec
;
340 stm
.min
= new_broken_time
->tm_min
;
341 stm
.hour
= new_broken_time
->tm_hour
;
342 stm
.dom
= new_broken_time
->tm_mday
;
343 stm
.month
= new_broken_time
->tm_mon
+ 1;
344 stm
.year
= new_broken_time
->tm_year
+ 1900;
345 stm
.dow
= new_broken_time
->tm_wday
+ 1;
347 ioctlname
= "RTCSET";
348 rc
= ioctl(rtc_fd
, RTCSET
, &stm
);
353 warn(_("ioctl(%s) to %s to set the time failed"),
354 ioctlname
, rtc_dev_name
);
355 hwclock_exit(ctl
, EXIT_FAILURE
);
359 printf(_("ioctl(%s) was successful.\n"), ioctlname
);
364 static int get_permissions_rtc(void)
369 static const char *get_device_path(void)
374 static struct clock_ops rtc_interface
= {
375 N_("Using the rtc interface to the clock."),
377 read_hardware_clock_rtc
,
378 set_hardware_clock_rtc
,
379 synchronize_to_clock_tick_rtc
,
383 /* return &rtc if /dev/rtc can be opened, NULL otherwise */
384 struct clock_ops
*probe_for_rtc_clock(const struct hwclock_control
*ctl
)
386 const int rtc_fd
= open_rtc(ctl
);
390 return &rtc_interface
;
395 * Get the Hardware Clock epoch setting from the kernel.
397 int get_epoch_rtc(const struct hwclock_control
*ctl
, unsigned long *epoch_p
)
401 rtc_fd
= open_rtc(ctl
);
403 warn(_("cannot open %s"), rtc_dev_name
);
407 if (ioctl(rtc_fd
, RTC_EPOCH_READ
, epoch_p
) == -1) {
408 warn(_("ioctl(%d, RTC_EPOCH_READ, epoch_p) to %s failed"),
409 rtc_fd
, rtc_dev_name
);
414 printf(_("ioctl(%d, RTC_EPOCH_READ, epoch_p) to %s succeeded.\n"),
415 rtc_fd
, rtc_dev_name
);
421 * Set the Hardware Clock epoch in the kernel.
423 int set_epoch_rtc(const struct hwclock_control
*ctl
)
428 epoch
= strtoul(ctl
->epoch_option
, NULL
, 10);
430 /* There were no RTC clocks before 1900. */
431 if (epoch
< 1900 || epoch
== ULONG_MAX
) {
432 warnx(_("invalid epoch '%s'."), ctl
->epoch_option
);
436 rtc_fd
= open_rtc(ctl
);
438 warn(_("cannot open %s"), rtc_dev_name
);
442 if (ioctl(rtc_fd
, RTC_EPOCH_SET
, epoch
) == -1) {
443 warn(_("ioctl(%d, RTC_EPOCH_SET, %lu) to %s failed"),
444 rtc_fd
, epoch
, rtc_dev_name
);
449 printf(_("ioctl(%d, RTC_EPOCH_SET, %lu) to %s succeeded.\n"),
450 rtc_fd
, epoch
, rtc_dev_name
);
454 #endif /* __alpha__ */