License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 21:07:57 +07:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* Generic RTC interface.
|
|
|
|
* This version contains the part of the user interface to the Real Time Clock
|
|
|
|
* service. It is used with both the legacy mc146818 and also EFI
|
|
|
|
* Struct rtc_time and first 12 ioctl by Paul Gortmaker, 1996 - separated out
|
|
|
|
* from <linux/mc146818rtc.h> to this file for 2.4 kernels.
|
2007-05-08 14:33:30 +07:00
|
|
|
*
|
2005-04-17 05:20:36 +07:00
|
|
|
* Copyright (C) 1999 Hewlett-Packard Co.
|
|
|
|
* Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com>
|
|
|
|
*/
|
|
|
|
#ifndef _LINUX_RTC_H_
|
|
|
|
#define _LINUX_RTC_H_
|
|
|
|
|
|
|
|
|
2009-04-01 05:24:48 +07:00
|
|
|
#include <linux/types.h>
|
2006-03-22 15:07:43 +07:00
|
|
|
#include <linux/interrupt.h>
|
2017-07-06 16:42:02 +07:00
|
|
|
#include <linux/nvmem-provider.h>
|
2012-10-13 16:46:48 +07:00
|
|
|
#include <uapi/linux/rtc.h>
|
2006-03-22 15:07:43 +07:00
|
|
|
|
2006-03-27 16:16:34 +07:00
|
|
|
extern int rtc_month_days(unsigned int month, unsigned int year);
|
2006-06-25 19:48:25 +07:00
|
|
|
extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year);
|
2006-03-27 16:16:34 +07:00
|
|
|
extern int rtc_valid_tm(struct rtc_time *tm);
|
2014-11-18 18:15:19 +07:00
|
|
|
extern time64_t rtc_tm_to_time64(struct rtc_time *tm);
|
|
|
|
extern void rtc_time64_to_tm(time64_t time, struct rtc_time *tm);
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
ktime_t rtc_tm_to_ktime(struct rtc_time tm);
|
|
|
|
struct rtc_time rtc_ktime_to_tm(ktime_t kt);
|
|
|
|
|
2015-06-12 09:04:10 +07:00
|
|
|
/*
|
|
|
|
* rtc_tm_sub - Return the difference in seconds.
|
|
|
|
*/
|
|
|
|
static inline time64_t rtc_tm_sub(struct rtc_time *lhs, struct rtc_time *rhs)
|
|
|
|
{
|
|
|
|
return rtc_tm_to_time64(lhs) - rtc_tm_to_time64(rhs);
|
|
|
|
}
|
|
|
|
|
2006-03-27 16:16:37 +07:00
|
|
|
#include <linux/device.h>
|
|
|
|
#include <linux/seq_file.h>
|
|
|
|
#include <linux/cdev.h>
|
|
|
|
#include <linux/poll.h>
|
|
|
|
#include <linux/mutex.h>
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
#include <linux/timerqueue.h>
|
|
|
|
#include <linux/workqueue.h>
|
2006-03-27 16:16:37 +07:00
|
|
|
|
|
|
|
extern struct class *rtc_class;
|
|
|
|
|
2008-07-24 11:30:33 +07:00
|
|
|
/*
|
|
|
|
* For these RTC methods the device parameter is the physical device
|
|
|
|
* on whatever bus holds the hardware (I2C, Platform, SPI, etc), which
|
|
|
|
* was passed to rtc_device_register(). Its driver_data normally holds
|
|
|
|
* device state, including the rtc_device pointer for the RTC.
|
|
|
|
*
|
|
|
|
* Most of these methods are called with rtc_device.ops_lock held,
|
|
|
|
* through the rtc_*(struct rtc_device *, ...) calls.
|
|
|
|
*
|
|
|
|
* The (current) exceptions are mostly filesystem hooks:
|
|
|
|
* - the proc() hook for procfs
|
2019-02-26 03:20:45 +07:00
|
|
|
* - non-ioctl() chardev hooks: open(), release()
|
2008-07-24 11:30:33 +07:00
|
|
|
*
|
|
|
|
* REVISIT those periodic irq calls *do* have ops_lock when they're
|
|
|
|
* issued through ioctl() ...
|
|
|
|
*/
|
2006-03-27 16:16:37 +07:00
|
|
|
struct rtc_class_ops {
|
|
|
|
int (*ioctl)(struct device *, unsigned int, unsigned long);
|
|
|
|
int (*read_time)(struct device *, struct rtc_time *);
|
|
|
|
int (*set_time)(struct device *, struct rtc_time *);
|
|
|
|
int (*read_alarm)(struct device *, struct rtc_wkalrm *);
|
|
|
|
int (*set_alarm)(struct device *, struct rtc_wkalrm *);
|
|
|
|
int (*proc)(struct device *, struct seq_file *);
|
2009-01-05 03:00:54 +07:00
|
|
|
int (*alarm_irq_enable)(struct device *, unsigned int enabled);
|
2016-02-06 03:41:11 +07:00
|
|
|
int (*read_offset)(struct device *, long *offset);
|
|
|
|
int (*set_offset)(struct device *, long offset);
|
2006-03-27 16:16:37 +07:00
|
|
|
};
|
|
|
|
|
2018-12-19 04:11:26 +07:00
|
|
|
struct rtc_device;
|
|
|
|
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
struct rtc_timer {
|
|
|
|
struct timerqueue_node node;
|
|
|
|
ktime_t period;
|
2018-12-19 04:11:26 +07:00
|
|
|
void (*func)(struct rtc_device *rtc);
|
|
|
|
struct rtc_device *rtc;
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
int enabled;
|
|
|
|
};
|
|
|
|
|
2007-11-29 07:22:03 +07:00
|
|
|
/* flags */
|
|
|
|
#define RTC_DEV_BUSY 0
|
|
|
|
|
2015-05-03 16:57:10 +07:00
|
|
|
struct rtc_device {
|
2007-05-08 14:33:40 +07:00
|
|
|
struct device dev;
|
2006-03-27 16:16:37 +07:00
|
|
|
struct module *owner;
|
|
|
|
|
|
|
|
int id;
|
|
|
|
|
2006-10-01 13:28:17 +07:00
|
|
|
const struct rtc_class_ops *ops;
|
2006-03-27 16:16:37 +07:00
|
|
|
struct mutex ops_lock;
|
|
|
|
|
|
|
|
struct cdev char_dev;
|
2007-11-29 07:22:03 +07:00
|
|
|
unsigned long flags;
|
2006-03-27 16:16:37 +07:00
|
|
|
|
|
|
|
unsigned long irq_data;
|
|
|
|
spinlock_t irq_lock;
|
|
|
|
wait_queue_head_t irq_queue;
|
|
|
|
struct fasync_struct *async_queue;
|
|
|
|
|
|
|
|
int irq_freq;
|
2006-06-25 19:48:20 +07:00
|
|
|
int max_user_freq;
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
|
|
|
|
struct timerqueue_head timerqueue;
|
|
|
|
struct rtc_timer aie_timer;
|
|
|
|
struct rtc_timer uie_rtctimer;
|
|
|
|
struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */
|
|
|
|
int pie_enabled;
|
|
|
|
struct work_struct irqwork;
|
2012-03-07 08:16:09 +07:00
|
|
|
/* Some hardware can't support UIE mode */
|
|
|
|
int uie_unsupported;
|
2011-02-12 08:45:40 +07:00
|
|
|
|
2017-10-14 00:54:33 +07:00
|
|
|
/* Number of nsec it takes to set the RTC clock. This influences when
|
|
|
|
* the set ops are called. An offset:
|
|
|
|
* - of 0.5 s will call RTC set for wall clock time 10.0 s at 9.5 s
|
|
|
|
* - of 1.5 s will call RTC set for wall clock time 10.0 s at 8.5 s
|
|
|
|
* - of -0.5 s will call RTC set for wall clock time 10.0 s at 10.5 s
|
|
|
|
*/
|
|
|
|
long set_offset_nsec;
|
|
|
|
|
2017-07-06 16:42:00 +07:00
|
|
|
bool registered;
|
|
|
|
|
2017-07-06 16:42:02 +07:00
|
|
|
/* Old ABI support */
|
|
|
|
bool nvram_old_abi;
|
|
|
|
struct bin_attribute *nvram;
|
|
|
|
|
2018-02-17 20:58:40 +07:00
|
|
|
time64_t range_min;
|
|
|
|
timeu64_t range_max;
|
rtc: Add one offset seconds to expand RTC range
From our investigation for all RTC drivers, 1 driver will be expired before
year 2017, 7 drivers will be expired before year 2038, 23 drivers will be
expired before year 2069, 72 drivers will be expired before 2100 and 104
drivers will be expired before 2106. Especially for these early expired
drivers, we need to expand the RTC range to make the RTC can still work
after the expired year.
So we can expand the RTC range by adding one offset to the time when reading
from hardware, and subtracting it when writing back. For example, if you have
an RTC that can do 100 years, and currently is configured to be based in
Jan 1 1970, so it can represents times from 1970 to 2069. Then if you change
the start year from 1970 to 2000, which means it can represents times from
2000 to 2099. By adding or subtracting the offset produced by moving the wrap
point, all times between 1970 and 1999 from RTC hardware could get interpreted
as times from 2070 to 2099, but the interpretation of dates between 2000 and
2069 would not change.
Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
2018-01-08 13:04:50 +07:00
|
|
|
time64_t start_secs;
|
|
|
|
time64_t offset_secs;
|
|
|
|
bool set_start_time;
|
2018-02-17 20:58:40 +07:00
|
|
|
|
2011-02-12 08:45:40 +07:00
|
|
|
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
|
|
|
|
struct work_struct uie_task;
|
|
|
|
struct timer_list uie_timer;
|
|
|
|
/* Those fields are protected by rtc->irq_lock */
|
|
|
|
unsigned int oldsecs;
|
|
|
|
unsigned int uie_irq_active:1;
|
|
|
|
unsigned int stop_uie_polling:1;
|
|
|
|
unsigned int uie_task_active:1;
|
|
|
|
unsigned int uie_timer_active:1;
|
|
|
|
#endif
|
2006-03-27 16:16:37 +07:00
|
|
|
};
|
2007-05-08 14:33:40 +07:00
|
|
|
#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
|
2006-03-27 16:16:37 +07:00
|
|
|
|
2019-10-20 03:50:34 +07:00
|
|
|
#define rtc_lock(d) mutex_lock(&d->ops_lock)
|
|
|
|
#define rtc_unlock(d) mutex_unlock(&d->ops_lock)
|
|
|
|
|
2018-03-08 06:13:52 +07:00
|
|
|
/* useful timestamps */
|
2019-10-07 20:47:15 +07:00
|
|
|
#define RTC_TIMESTAMP_BEGIN_0000 -62167219200ULL /* 0000-01-01 00:00:00 */
|
2019-03-22 14:26:12 +07:00
|
|
|
#define RTC_TIMESTAMP_BEGIN_1900 -2208988800LL /* 1900-01-01 00:00:00 */
|
2018-03-08 06:13:52 +07:00
|
|
|
#define RTC_TIMESTAMP_BEGIN_2000 946684800LL /* 2000-01-01 00:00:00 */
|
2019-03-21 17:15:56 +07:00
|
|
|
#define RTC_TIMESTAMP_END_2063 2966371199LL /* 2063-12-31 23:59:59 */
|
2019-12-15 05:10:19 +07:00
|
|
|
#define RTC_TIMESTAMP_END_2079 3471292799LL /* 2079-12-31 23:59:59 */
|
2018-03-08 06:13:52 +07:00
|
|
|
#define RTC_TIMESTAMP_END_2099 4102444799LL /* 2099-12-31 23:59:59 */
|
2019-10-17 03:16:22 +07:00
|
|
|
#define RTC_TIMESTAMP_END_2199 7258118399LL /* 2199-12-31 23:59:59 */
|
2019-03-20 18:30:10 +07:00
|
|
|
#define RTC_TIMESTAMP_END_9999 253402300799LL /* 9999-12-31 23:59:59 */
|
2018-03-08 06:13:52 +07:00
|
|
|
|
2013-04-30 06:18:33 +07:00
|
|
|
extern struct rtc_device *devm_rtc_device_register(struct device *dev,
|
|
|
|
const char *name,
|
2013-04-30 06:18:27 +07:00
|
|
|
const struct rtc_class_ops *ops,
|
|
|
|
struct module *owner);
|
2017-07-06 16:42:00 +07:00
|
|
|
struct rtc_device *devm_rtc_allocate_device(struct device *dev);
|
|
|
|
int __rtc_register_device(struct module *owner, struct rtc_device *rtc);
|
2006-03-27 16:16:37 +07:00
|
|
|
|
2007-05-08 14:33:30 +07:00
|
|
|
extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm);
|
|
|
|
extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm);
|
2017-10-14 00:54:33 +07:00
|
|
|
extern int rtc_set_ntp_time(struct timespec64 now, unsigned long *target_nsec);
|
RTC: Initialize kernel state from RTC
Mark Brown pointed out a corner case: that RTC alarms should
be allowed to be persistent across reboots if the hardware
supported it.
The rework of the generic layer to virtualize the RTC alarm
virtualized much of the alarm handling, and removed the
code used to read the alarm time from the hardware.
Mark noted if we want the alarm to be persistent across
reboots, we need to re-read the alarm value into the
virtualized generic layer at boot up, so that the generic
layer properly exposes that value.
This patch restores much of the earlier removed
rtc_read_alarm code and wires it in so that we
set the kernel's alarm value to what we find in the
hardware at boot time.
NOTE: Not all hardware supports persistent RTC alarm state across
system reset. rtc-cmos for example will keep the alarm time, but
disables the AIE mode irq. Applications should not expect the RTC
alarm to be valid after a system reset. We will preserve what
we can, to represent the hardware state at boot, but its not
guarenteed.
Further, in the future, with multiplexed RTC alarms, the
soonest alarm to fire may not be the one set via the /dev/rt
ioctls. So an application may set the alarm with RTC_ALM_SET,
but after a reset find that RTC_ALM_READ returns an earlier
time. Again, we preserve what we can, but applications should
not expect the RTC alarm state to persist across a system reset.
Big thanks to Mark for pointing out the issue!
Thanks also to Marcelo for helping think through the solution.
CC: Mark Brown <broonie@opensource.wolfsonmicro.com>
CC: Marcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: rtc-linux@googlegroups.com
Reported-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
2011-02-22 13:58:51 +07:00
|
|
|
int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm);
|
2007-05-08 14:33:30 +07:00
|
|
|
extern int rtc_read_alarm(struct rtc_device *rtc,
|
2006-03-27 16:16:37 +07:00
|
|
|
struct rtc_wkalrm *alrm);
|
2007-05-08 14:33:30 +07:00
|
|
|
extern int rtc_set_alarm(struct rtc_device *rtc,
|
2006-03-27 16:16:37 +07:00
|
|
|
struct rtc_wkalrm *alrm);
|
2011-03-30 08:00:27 +07:00
|
|
|
extern int rtc_initialize_alarm(struct rtc_device *rtc,
|
|
|
|
struct rtc_wkalrm *alrm);
|
2007-05-08 14:33:30 +07:00
|
|
|
extern void rtc_update_irq(struct rtc_device *rtc,
|
2006-03-27 16:16:37 +07:00
|
|
|
unsigned long num, unsigned long events);
|
|
|
|
|
2013-02-02 02:40:17 +07:00
|
|
|
extern struct rtc_device *rtc_class_open(const char *name);
|
2007-05-08 14:33:30 +07:00
|
|
|
extern void rtc_class_close(struct rtc_device *rtc);
|
2006-03-27 16:16:37 +07:00
|
|
|
|
2018-07-25 20:07:09 +07:00
|
|
|
extern int rtc_irq_set_state(struct rtc_device *rtc, int enabled);
|
|
|
|
extern int rtc_irq_set_freq(struct rtc_device *rtc, int freq);
|
2009-01-05 03:00:54 +07:00
|
|
|
extern int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled);
|
|
|
|
extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled);
|
2011-02-12 08:45:40 +07:00
|
|
|
extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
|
|
|
|
unsigned int enabled);
|
2006-03-27 16:16:37 +07:00
|
|
|
|
2011-02-12 09:15:23 +07:00
|
|
|
void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode);
|
2018-12-19 04:11:26 +07:00
|
|
|
void rtc_aie_update_irq(struct rtc_device *rtc);
|
|
|
|
void rtc_uie_update_irq(struct rtc_device *rtc);
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2018-12-19 04:11:26 +07:00
|
|
|
void rtc_timer_init(struct rtc_timer *timer, void (*f)(struct rtc_device *r),
|
|
|
|
struct rtc_device *rtc);
|
2015-05-03 16:57:10 +07:00
|
|
|
int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
|
|
|
|
ktime_t expires, ktime_t period);
|
2015-05-03 16:57:11 +07:00
|
|
|
void rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer);
|
2016-02-06 03:41:11 +07:00
|
|
|
int rtc_read_offset(struct rtc_device *rtc, long *offset);
|
|
|
|
int rtc_set_offset(struct rtc_device *rtc, long offset);
|
2010-12-14 04:45:48 +07:00
|
|
|
void rtc_timer_do_work(struct work_struct *work);
|
RTC: Rework RTC code to use timerqueue for events
This patch reworks a large portion of the generic RTC code
to in-effect virtualize the rtc interrupt code.
The current RTC interface is very much a raw hardware interface.
Via the proc, /dev/, or sysfs interfaces, applciations can set
the hardware to trigger interrupts in one of three modes:
AIE: Alarm interrupt
UIE: Update interrupt (ie: once per second)
PIE: Periodic interrupt (sub-second irqs)
The problem with this interface is that it limits the RTC hardware
so it can only be used by one application at a time.
The purpose of this patch is to extend the RTC code so that we can
multiplex multiple applications event needs onto a single RTC device.
This is done by utilizing the timerqueue infrastructure to manage
a list of events, which cause the RTC hardware to be programmed
to fire an interrupt for the next event in the list.
In order to preserve the functionality of the exsting proc,/dev/ and
sysfs interfaces, we emulate the different interrupt modes as follows:
AIE: We create a rtc_timer dedicated to AIE mode interrupts. There is
only one per device, so we don't change existing interface semantics.
UIE: Again, a dedicated rtc_timer, set for periodic mode, is used
to emulate UIE interrupts. Again, only one per device.
PIE: Since PIE mode interrupts fire faster then the RTC's clock read
granularity, we emulate PIE mode interrupts using a hrtimer. Again,
one per device.
With this patch, the rtctest.c application in Documentation/rtc.txt
passes fine on x86 hardware. However, there may very well still be
bugs, so greatly I'd appreciate any feedback or testing!
Signed-off-by: John Stultz <john.stultz@linaro.org>
LKML Reference: <1290136329-18291-4-git-send-email-john.stultz@linaro.org>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Richard Cochran <richardcochran@gmail.com>
2010-09-24 05:07:34 +07:00
|
|
|
|
2009-04-01 05:24:48 +07:00
|
|
|
static inline bool is_leap_year(unsigned int year)
|
|
|
|
{
|
|
|
|
return (!(year % 4) && (year % 100)) || !(year % 400);
|
|
|
|
}
|
|
|
|
|
2017-10-14 00:54:33 +07:00
|
|
|
/* Determine if we can call to driver to set the time. Drivers can only be
|
|
|
|
* called to set a second aligned time value, and the field set_offset_nsec
|
|
|
|
* specifies how far away from the second aligned time to call the driver.
|
|
|
|
*
|
|
|
|
* This also computes 'to_set' which is the time we are trying to set, and has
|
|
|
|
* a zero in tv_nsecs, such that:
|
|
|
|
* to_set - set_delay_nsec == now +/- FUZZ
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
static inline bool rtc_tv_nsec_ok(s64 set_offset_nsec,
|
|
|
|
struct timespec64 *to_set,
|
|
|
|
const struct timespec64 *now)
|
|
|
|
{
|
|
|
|
/* Allowed error in tv_nsec, arbitarily set to 5 jiffies in ns. */
|
|
|
|
const unsigned long TIME_SET_NSEC_FUZZ = TICK_NSEC * 5;
|
|
|
|
struct timespec64 delay = {.tv_sec = 0,
|
|
|
|
.tv_nsec = set_offset_nsec};
|
|
|
|
|
|
|
|
*to_set = timespec64_add(*now, delay);
|
|
|
|
|
|
|
|
if (to_set->tv_nsec < TIME_SET_NSEC_FUZZ) {
|
|
|
|
to_set->tv_nsec = 0;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (to_set->tv_nsec > NSEC_PER_SEC - TIME_SET_NSEC_FUZZ) {
|
|
|
|
to_set->tv_sec++;
|
|
|
|
to_set->tv_nsec = 0;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-07-06 16:42:00 +07:00
|
|
|
#define rtc_register_device(device) \
|
|
|
|
__rtc_register_device(THIS_MODULE, device)
|
|
|
|
|
2012-10-05 07:14:12 +07:00
|
|
|
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
|
2010-03-11 06:20:35 +07:00
|
|
|
extern int rtc_hctosys_ret;
|
|
|
|
#else
|
|
|
|
#define rtc_hctosys_ret -ENODEV
|
|
|
|
#endif
|
|
|
|
|
2018-02-13 05:47:19 +07:00
|
|
|
#ifdef CONFIG_RTC_NVMEM
|
|
|
|
int rtc_nvmem_register(struct rtc_device *rtc,
|
|
|
|
struct nvmem_config *nvmem_config);
|
|
|
|
void rtc_nvmem_unregister(struct rtc_device *rtc);
|
|
|
|
#else
|
|
|
|
static inline int rtc_nvmem_register(struct rtc_device *rtc,
|
|
|
|
struct nvmem_config *nvmem_config)
|
|
|
|
{
|
2018-05-17 02:08:42 +07:00
|
|
|
return 0;
|
2018-02-13 05:47:19 +07:00
|
|
|
}
|
|
|
|
static inline void rtc_nvmem_unregister(struct rtc_device *rtc) {}
|
|
|
|
#endif
|
|
|
|
|
2018-09-19 08:13:21 +07:00
|
|
|
#ifdef CONFIG_RTC_INTF_SYSFS
|
|
|
|
int rtc_add_group(struct rtc_device *rtc, const struct attribute_group *grp);
|
|
|
|
int rtc_add_groups(struct rtc_device *rtc, const struct attribute_group **grps);
|
|
|
|
#else
|
|
|
|
static inline
|
|
|
|
int rtc_add_group(struct rtc_device *rtc, const struct attribute_group *grp)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline
|
|
|
|
int rtc_add_groups(struct rtc_device *rtc, const struct attribute_group **grps)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
2005-04-17 05:20:36 +07:00
|
|
|
#endif /* _LINUX_RTC_H_ */
|