rtc.h 9.1 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
L
Linus Torvalds 已提交
2 3 4 5 6 7
/*
 * 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.
8
 *
L
Linus Torvalds 已提交
9 10 11 12 13 14 15
 * Copyright (C) 1999 Hewlett-Packard Co.
 * Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com>
 */
#ifndef _LINUX_RTC_H_
#define _LINUX_RTC_H_


16
#include <linux/types.h>
J
Joe Korty 已提交
17
#include <linux/interrupt.h>
18
#include <linux/nvmem-provider.h>
19
#include <uapi/linux/rtc.h>
J
Joe Korty 已提交
20

21
extern int rtc_month_days(unsigned int month, unsigned int year);
22
extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year);
23
extern int rtc_valid_tm(struct rtc_time *tm);
24 25
extern time64_t rtc_tm_to_time64(struct rtc_time *tm);
extern void rtc_time64_to_tm(time64_t time, struct rtc_time *tm);
26 27 28
ktime_t rtc_tm_to_ktime(struct rtc_time tm);
struct rtc_time rtc_ktime_to_tm(ktime_t kt);

29 30 31 32 33 34 35 36
/*
 * 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);
}

37 38 39 40 41 42 43 44 45 46 47
static inline void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
{
	rtc_time64_to_tm(time, tm);
}

static inline int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time)
{
	*time = rtc_tm_to_time64(tm);

	return 0;
}
48

A
Alessandro Zummo 已提交
49 50 51 52 53
#include <linux/device.h>
#include <linux/seq_file.h>
#include <linux/cdev.h>
#include <linux/poll.h>
#include <linux/mutex.h>
54 55
#include <linux/timerqueue.h>
#include <linux/workqueue.h>
A
Alessandro Zummo 已提交
56 57 58

extern struct class *rtc_class;

D
David Brownell 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/*
 * 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
 *   - non-ioctl() chardev hooks:  open(), release(), read_callback()
 *
 * REVISIT those periodic irq calls *do* have ops_lock when they're
 * issued through ioctl() ...
 */
A
Alessandro Zummo 已提交
75 76 77 78 79 80 81
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 *);
82
	int (*set_mmss64)(struct device *, time64_t secs);
A
Alessandro Zummo 已提交
83 84
	int (*set_mmss)(struct device *, unsigned long secs);
	int (*read_callback)(struct device *, int data);
85
	int (*alarm_irq_enable)(struct device *, unsigned int enabled);
86 87
	int (*read_offset)(struct device *, long *offset);
	int (*set_offset)(struct device *, long offset);
A
Alessandro Zummo 已提交
88 89
};

90 91 92
struct rtc_timer {
	struct timerqueue_node node;
	ktime_t period;
A
Alexandre Belloni 已提交
93 94
	void (*func)(void *private_data);
	void *private_data;
95 96 97
	int enabled;
};

A
Alessandro Zummo 已提交
98

J
Jiri Kosina 已提交
99 100 101
/* flags */
#define RTC_DEV_BUSY 0

102
struct rtc_device {
103
	struct device dev;
A
Alessandro Zummo 已提交
104 105 106 107
	struct module *owner;

	int id;

108
	const struct rtc_class_ops *ops;
A
Alessandro Zummo 已提交
109 110 111
	struct mutex ops_lock;

	struct cdev char_dev;
J
Jiri Kosina 已提交
112
	unsigned long flags;
A
Alessandro Zummo 已提交
113 114 115 116 117 118 119

	unsigned long irq_data;
	spinlock_t irq_lock;
	wait_queue_head_t irq_queue;
	struct fasync_struct *async_queue;

	int irq_freq;
120
	int max_user_freq;
121 122 123 124 125 126 127

	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;
128 129
	/* Some hardware can't support UIE mode */
	int uie_unsupported;
J
John Stultz 已提交
130

131 132 133 134 135 136 137 138
	/* 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;

139 140
	bool registered;

141 142 143 144 145
	struct nvmem_device *nvmem;
	/* Old ABI support */
	bool nvram_old_abi;
	struct bin_attribute *nvram;

A
Alexandre Belloni 已提交
146 147
	time64_t range_min;
	timeu64_t range_max;
148 149 150
	time64_t start_secs;
	time64_t offset_secs;
	bool set_start_time;
A
Alexandre Belloni 已提交
151

J
John Stultz 已提交
152 153 154 155 156 157 158 159 160 161
#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
A
Alessandro Zummo 已提交
162
};
163
#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
A
Alessandro Zummo 已提交
164

165 166 167 168 169
/* useful timestamps */
#define RTC_TIMESTAMP_BEGIN_1900	-2208989361LL /* 1900-01-01 00:00:00 */
#define RTC_TIMESTAMP_BEGIN_2000	946684800LL /* 2000-01-01 00:00:00 */
#define RTC_TIMESTAMP_END_2099		4102444799LL /* 2099-12-31 23:59:59 */

170 171
extern struct rtc_device *devm_rtc_device_register(struct device *dev,
					const char *name,
172 173
					const struct rtc_class_ops *ops,
					struct module *owner);
174 175
struct rtc_device *devm_rtc_allocate_device(struct device *dev);
int __rtc_register_device(struct module *owner, struct rtc_device *rtc);
176 177
extern void devm_rtc_device_unregister(struct device *dev,
					struct rtc_device *rtc);
A
Alessandro Zummo 已提交
178

179 180
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);
181
extern int rtc_set_ntp_time(struct timespec64 now, unsigned long *target_nsec);
182
int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm);
183
extern int rtc_read_alarm(struct rtc_device *rtc,
A
Alessandro Zummo 已提交
184
			struct rtc_wkalrm *alrm);
185
extern int rtc_set_alarm(struct rtc_device *rtc,
A
Alessandro Zummo 已提交
186
				struct rtc_wkalrm *alrm);
187 188
extern int rtc_initialize_alarm(struct rtc_device *rtc,
				struct rtc_wkalrm *alrm);
189
extern void rtc_update_irq(struct rtc_device *rtc,
A
Alessandro Zummo 已提交
190 191
			unsigned long num, unsigned long events);

192
extern struct rtc_device *rtc_class_open(const char *name);
193
extern void rtc_class_close(struct rtc_device *rtc);
A
Alessandro Zummo 已提交
194

195 196
extern int rtc_irq_set_state(struct rtc_device *rtc, int enabled);
extern int rtc_irq_set_freq(struct rtc_device *rtc, int freq);
197 198
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);
J
John Stultz 已提交
199 200
extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
						unsigned int enabled);
A
Alessandro Zummo 已提交
201

202
void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode);
203 204 205
void rtc_aie_update_irq(void *private);
void rtc_uie_update_irq(void *private);
enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
L
Linus Torvalds 已提交
206

207 208 209
void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data);
int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
		    ktime_t expires, ktime_t period);
210
void rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer);
211 212
int rtc_read_offset(struct rtc_device *rtc, long *offset);
int rtc_set_offset(struct rtc_device *rtc, long offset);
T
Thomas Gleixner 已提交
213
void rtc_timer_do_work(struct work_struct *work);
214

215 216 217 218 219
static inline bool is_leap_year(unsigned int year)
{
	return (!(year % 4) && (year % 100)) || !(year % 400);
}

220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
/* 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;
}

253 254 255
#define rtc_register_device(device) \
	__rtc_register_device(THIS_MODULE, device)

256
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
257 258 259 260 261
extern int rtc_hctosys_ret;
#else
#define rtc_hctosys_ret -ENODEV
#endif

262 263 264 265 266 267 268 269
#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)
{
270
	return 0;
271 272 273 274
}
static inline void rtc_nvmem_unregister(struct rtc_device *rtc) {}
#endif

275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
#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
L
Linus Torvalds 已提交
291
#endif /* _LINUX_RTC_H_ */