xref: /rk3399_rockchip-uboot/include/rtc.h (revision 47bc0dad56f5a93b28a4a644068fb9424cfc5975)
1a6840a6eSwdenk /*
2a6840a6eSwdenk  * (C) Copyright 2001
3a6840a6eSwdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4a6840a6eSwdenk  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
6a6840a6eSwdenk  */
7a6840a6eSwdenk 
8a6840a6eSwdenk /*
9a6840a6eSwdenk  * Generic RTC interface.
10a6840a6eSwdenk  */
11a6840a6eSwdenk #ifndef _RTC_H_
12a6840a6eSwdenk #define _RTC_H_
13a6840a6eSwdenk 
14885fc78cSAlbin Tonnerre /* bcd<->bin functions are needed by almost all the RTC drivers, let's include
15885fc78cSAlbin Tonnerre  * it there instead of in evey single driver */
16885fc78cSAlbin Tonnerre 
17885fc78cSAlbin Tonnerre #include <bcd.h>
18aac51198SSimon Glass #include <rtc_def.h>
19a6840a6eSwdenk 
20dbeda5b2SSimon Glass #ifdef CONFIG_DM_RTC
21dbeda5b2SSimon Glass 
22dbeda5b2SSimon Glass struct rtc_ops {
23dbeda5b2SSimon Glass 	/**
24dbeda5b2SSimon Glass 	 * get() - get the current time
25dbeda5b2SSimon Glass 	 *
26dbeda5b2SSimon Glass 	 * Returns the current time read from the RTC device. The driver
27dbeda5b2SSimon Glass 	 * is responsible for setting up every field in the structure.
28dbeda5b2SSimon Glass 	 *
29dbeda5b2SSimon Glass 	 * @dev:	Device to read from
30dbeda5b2SSimon Glass 	 * @time:	Place to put the time that is read
31dbeda5b2SSimon Glass 	 */
32dbeda5b2SSimon Glass 	int (*get)(struct udevice *dev, struct rtc_time *time);
33dbeda5b2SSimon Glass 
34dbeda5b2SSimon Glass 	/**
35dbeda5b2SSimon Glass 	 * set() - set the current time
36dbeda5b2SSimon Glass 	 *
37dbeda5b2SSimon Glass 	 * Sets the time in the RTC device. The driver can expect every
38dbeda5b2SSimon Glass 	 * field to be set correctly.
39dbeda5b2SSimon Glass 	 *
40dbeda5b2SSimon Glass 	 * @dev:	Device to read from
41dbeda5b2SSimon Glass 	 * @time:	Time to write
42dbeda5b2SSimon Glass 	 */
43dbeda5b2SSimon Glass 	int (*set)(struct udevice *dev, const struct rtc_time *time);
44dbeda5b2SSimon Glass 
45dbeda5b2SSimon Glass 	/**
46dbeda5b2SSimon Glass 	 * reset() - reset the RTC to a known-good state
47dbeda5b2SSimon Glass 	 *
48dbeda5b2SSimon Glass 	 * This function resets the RTC to a known-good state. The time may
49dbeda5b2SSimon Glass 	 * be unset by this method, so should be set after this method is
50dbeda5b2SSimon Glass 	 * called.
51dbeda5b2SSimon Glass 	 *
52dbeda5b2SSimon Glass 	 * @dev:	Device to read from
53dbeda5b2SSimon Glass 	 * @return 0 if OK, -ve on error
54dbeda5b2SSimon Glass 	 */
55dbeda5b2SSimon Glass 	int (*reset)(struct udevice *dev);
56dbeda5b2SSimon Glass 
57dbeda5b2SSimon Glass 	/**
58dbeda5b2SSimon Glass 	 * read8() - Read an 8-bit register
59dbeda5b2SSimon Glass 	 *
60dbeda5b2SSimon Glass 	 * @dev:	Device to read from
61dbeda5b2SSimon Glass 	 * @reg:	Register to read
62dbeda5b2SSimon Glass 	 * @return value read, or -ve on error
63dbeda5b2SSimon Glass 	 */
64dbeda5b2SSimon Glass 	int (*read8)(struct udevice *dev, unsigned int reg);
65dbeda5b2SSimon Glass 
66dbeda5b2SSimon Glass 	/**
67dbeda5b2SSimon Glass 	* write8() - Write an 8-bit register
68dbeda5b2SSimon Glass 	*
69dbeda5b2SSimon Glass 	* @dev:		Device to write to
70dbeda5b2SSimon Glass 	* @reg:		Register to write
71dbeda5b2SSimon Glass 	* @value:	Value to write
72dbeda5b2SSimon Glass 	* @return 0 if OK, -ve on error
73dbeda5b2SSimon Glass 	*/
74dbeda5b2SSimon Glass 	int (*write8)(struct udevice *dev, unsigned int reg, int val);
75*47bc0dadSElaine Zhang 
76*47bc0dadSElaine Zhang 	/**
77*47bc0dadSElaine Zhang 	 * alarm_trigger()
78*47bc0dadSElaine Zhang 	 * @dev:		Device to write to
79*47bc0dadSElaine Zhang 	 * @return 1 if rtc alarm trigger boot on
80*47bc0dadSElaine Zhang 	 */
81*47bc0dadSElaine Zhang 	int (*alarm_trigger)(struct udevice *dev);
82dbeda5b2SSimon Glass };
83dbeda5b2SSimon Glass 
84dbeda5b2SSimon Glass /* Access the operations for an RTC device */
85dbeda5b2SSimon Glass #define rtc_get_ops(dev)	((struct rtc_ops *)(dev)->driver->ops)
86dbeda5b2SSimon Glass 
87dbeda5b2SSimon Glass /**
88dbeda5b2SSimon Glass  * dm_rtc_get() - Read the time from an RTC
89dbeda5b2SSimon Glass  *
90dbeda5b2SSimon Glass  * @dev:	Device to read from
91dbeda5b2SSimon Glass  * @time:	Place to put the current time
92dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
93dbeda5b2SSimon Glass  */
94dbeda5b2SSimon Glass int dm_rtc_get(struct udevice *dev, struct rtc_time *time);
95dbeda5b2SSimon Glass 
96dbeda5b2SSimon Glass /**
97dbeda5b2SSimon Glass  * dm_rtc_put() - Write a time to an RTC
98dbeda5b2SSimon Glass  *
99dbeda5b2SSimon Glass  * @dev:	Device to read from
100dbeda5b2SSimon Glass  * @time:	Time to write into the RTC
101dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
102dbeda5b2SSimon Glass  */
103dbeda5b2SSimon Glass int dm_rtc_set(struct udevice *dev, struct rtc_time *time);
104dbeda5b2SSimon Glass 
105dbeda5b2SSimon Glass /**
106dbeda5b2SSimon Glass  * dm_rtc_reset() - reset the RTC to a known-good state
107dbeda5b2SSimon Glass  *
108dbeda5b2SSimon Glass  * If the RTC appears to be broken (e.g. it is not counting up in seconds)
109dbeda5b2SSimon Glass  * it may need to be reset to a known good state. This function achieves this.
110dbeda5b2SSimon Glass  * After resetting the RTC the time should then be set to a known value by
111dbeda5b2SSimon Glass  * the caller.
112dbeda5b2SSimon Glass  *
113dbeda5b2SSimon Glass  * @dev:	Device to read from
114dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
115dbeda5b2SSimon Glass  */
116dbeda5b2SSimon Glass int dm_rtc_reset(struct udevice *dev);
117dbeda5b2SSimon Glass 
118dbeda5b2SSimon Glass /**
119dbeda5b2SSimon Glass  * rtc_read8() - Read an 8-bit register
120dbeda5b2SSimon Glass  *
121dbeda5b2SSimon Glass  * @dev:	Device to read from
122dbeda5b2SSimon Glass  * @reg:	Register to read
123dbeda5b2SSimon Glass  * @return value read, or -ve on error
124dbeda5b2SSimon Glass  */
125dbeda5b2SSimon Glass int rtc_read8(struct udevice *dev, unsigned int reg);
126dbeda5b2SSimon Glass 
127dbeda5b2SSimon Glass /**
128dbeda5b2SSimon Glass  * rtc_write8() - Write an 8-bit register
129dbeda5b2SSimon Glass  *
130dbeda5b2SSimon Glass  * @dev:	Device to write to
131dbeda5b2SSimon Glass  * @reg:	Register to write
132dbeda5b2SSimon Glass  * @value:	Value to write
133dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
134dbeda5b2SSimon Glass  */
135dbeda5b2SSimon Glass int rtc_write8(struct udevice *dev, unsigned int reg, int val);
136dbeda5b2SSimon Glass 
137dbeda5b2SSimon Glass /**
138d24c7fbcSBin Meng  * rtc_read16() - Read a 16-bit value from the RTC
139d24c7fbcSBin Meng  *
140d24c7fbcSBin Meng  * @dev:	Device to read from
141d24c7fbcSBin Meng  * @reg:	Offset to start reading from
142d24c7fbcSBin Meng  * @valuep:	Place to put the value that is read
143d24c7fbcSBin Meng  * @return 0 if OK, -ve on error
144d24c7fbcSBin Meng  */
145d24c7fbcSBin Meng int rtc_read16(struct udevice *dev, unsigned int reg, u16 *valuep);
146d24c7fbcSBin Meng 
147d24c7fbcSBin Meng /**
148d24c7fbcSBin Meng  * rtc_write16() - Write a 16-bit value to the RTC
149d24c7fbcSBin Meng  *
150d24c7fbcSBin Meng  * @dev:	Device to write to
151d24c7fbcSBin Meng  * @reg:	Register to start writing to
152d24c7fbcSBin Meng  * @value:	Value to write
153d24c7fbcSBin Meng  * @return 0 if OK, -ve on error
154d24c7fbcSBin Meng  */
155d24c7fbcSBin Meng int rtc_write16(struct udevice *dev, unsigned int reg, u16 value);
156d24c7fbcSBin Meng 
157d24c7fbcSBin Meng /**
158dbeda5b2SSimon Glass  * rtc_read32() - Read a 32-bit value from the RTC
159dbeda5b2SSimon Glass  *
160dbeda5b2SSimon Glass  * @dev:	Device to read from
161dbeda5b2SSimon Glass  * @reg:	Offset to start reading from
162dbeda5b2SSimon Glass  * @valuep:	Place to put the value that is read
163dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
164dbeda5b2SSimon Glass  */
165dbeda5b2SSimon Glass int rtc_read32(struct udevice *dev, unsigned int reg, u32 *valuep);
166dbeda5b2SSimon Glass 
167dbeda5b2SSimon Glass /**
168dbeda5b2SSimon Glass  * rtc_write32() - Write a 32-bit value to the RTC
169dbeda5b2SSimon Glass  *
170dbeda5b2SSimon Glass  * @dev:	Device to write to
171dbeda5b2SSimon Glass  * @reg:	Register to start writing to
172dbeda5b2SSimon Glass  * @value:	Value to write
173dbeda5b2SSimon Glass  * @return 0 if OK, -ve on error
174dbeda5b2SSimon Glass  */
175dbeda5b2SSimon Glass int rtc_write32(struct udevice *dev, unsigned int reg, u32 value);
176dbeda5b2SSimon Glass 
177*47bc0dadSElaine Zhang /**
178*47bc0dadSElaine Zhang  * rtc_alarm_trigger()
179*47bc0dadSElaine Zhang  *
180*47bc0dadSElaine Zhang  * @dev:	Device to write to
181*47bc0dadSElaine Zhang  * @return 1 if rtc alarm trigger boot on
182*47bc0dadSElaine Zhang  */
183*47bc0dadSElaine Zhang int rtc_alarm_trigger(struct udevice *dev);
184dbeda5b2SSimon Glass #else
185b73a19e1SYuri Tikhonov int rtc_get (struct rtc_time *);
186d1e23194SJean-Christophe PLAGNIOL-VILLARD int rtc_set (struct rtc_time *);
187a6840a6eSwdenk void rtc_reset (void);
188c340941eSPriyanka Jain void rtc_enable_32khz_output(void);
189a6840a6eSwdenk 
190c6577f72SSimon Glass /**
191fc4860c0SSimon Glass  * rtc_read8() - Read an 8-bit register
192fc4860c0SSimon Glass  *
193fc4860c0SSimon Glass  * @reg:	Register to read
194fc4860c0SSimon Glass  * @return value read
195fc4860c0SSimon Glass  */
196fc4860c0SSimon Glass int rtc_read8(int reg);
197fc4860c0SSimon Glass 
198fc4860c0SSimon Glass /**
199fc4860c0SSimon Glass  * rtc_write8() - Write an 8-bit register
200fc4860c0SSimon Glass  *
201fc4860c0SSimon Glass  * @reg:	Register to write
202fc4860c0SSimon Glass  * @value:	Value to write
203fc4860c0SSimon Glass  */
204fc4860c0SSimon Glass void rtc_write8(int reg, uchar val);
205fc4860c0SSimon Glass 
206fc4860c0SSimon Glass /**
207fc4860c0SSimon Glass  * rtc_read32() - Read a 32-bit value from the RTC
208fc4860c0SSimon Glass  *
209fc4860c0SSimon Glass  * @reg:	Offset to start reading from
210fc4860c0SSimon Glass  * @return value read
211fc4860c0SSimon Glass  */
212fc4860c0SSimon Glass u32 rtc_read32(int reg);
213fc4860c0SSimon Glass 
214fc4860c0SSimon Glass /**
215fc4860c0SSimon Glass  * rtc_write32() - Write a 32-bit value to the RTC
216fc4860c0SSimon Glass  *
217fc4860c0SSimon Glass  * @reg:	Register to start writing to
218fc4860c0SSimon Glass  * @value:	Value to write
219fc4860c0SSimon Glass  */
220fc4860c0SSimon Glass void rtc_write32(int reg, u32 value);
221fc4860c0SSimon Glass 
222fc4860c0SSimon Glass /**
223c6577f72SSimon Glass  * rtc_init() - Set up the real time clock ready for use
224c6577f72SSimon Glass  */
225c6577f72SSimon Glass void rtc_init(void);
226dbeda5b2SSimon Glass #endif
227c6577f72SSimon Glass 
228199e87c3SSimon Glass /**
229199e87c3SSimon Glass  * rtc_calc_weekday() - Work out the weekday from a time
230199e87c3SSimon Glass  *
231199e87c3SSimon Glass  * This only works for the Gregorian calendar - i.e. after 1752 (in the UK).
232199e87c3SSimon Glass  * It sets time->tm_wdaay to the correct day of the week.
233199e87c3SSimon Glass  *
234199e87c3SSimon Glass  * @time:	Time to inspect. tm_wday is updated
235199e87c3SSimon Glass  * @return 0 if OK, -EINVAL if the weekday could not be determined
236199e87c3SSimon Glass  */
237199e87c3SSimon Glass int rtc_calc_weekday(struct rtc_time *time);
238199e87c3SSimon Glass 
2399f9276c3SSimon Glass /**
2409f9276c3SSimon Glass  * rtc_to_tm() - Convert a time_t value into a broken-out time
2419f9276c3SSimon Glass  *
2429f9276c3SSimon Glass  * The following fields are set up by this function:
2439f9276c3SSimon Glass  *	tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday
2449f9276c3SSimon Glass  *
2459f9276c3SSimon Glass  * Note that tm_yday and tm_isdst are set to 0.
2469f9276c3SSimon Glass  *
2479f9276c3SSimon Glass  * @time_t:	Number of seconds since 1970-01-01 00:00:00
2489f9276c3SSimon Glass  * @time:	Place to put the broken-out time
2499f9276c3SSimon Glass  * @return 0 if OK, -EINVAL if the weekday could not be determined
2509f9276c3SSimon Glass  */
2519f9276c3SSimon Glass int rtc_to_tm(int time_t, struct rtc_time *time);
2529f9276c3SSimon Glass 
25371420983SSimon Glass /**
25471420983SSimon Glass  * rtc_mktime() - Convert a broken-out time into a time_t value
25571420983SSimon Glass  *
25671420983SSimon Glass  * The following fields need to be valid for this function to work:
25771420983SSimon Glass  *	tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year
25871420983SSimon Glass  *
25971420983SSimon Glass  * Note that tm_wday and tm_yday are ignored.
26071420983SSimon Glass  *
26171420983SSimon Glass  * @time:	Broken-out time to convert
26271420983SSimon Glass  * @return corresponding time_t value, seconds since 1970-01-01 00:00:00
26371420983SSimon Glass  */
26471420983SSimon Glass unsigned long rtc_mktime(const struct rtc_time *time);
26571420983SSimon Glass 
266a6840a6eSwdenk #endif	/* _RTC_H_ */
267