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