diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/rtc/ds3231.c | 17 | ||||
| -rw-r--r-- | drivers/rtc/stm32_rtc.c | 9 | 
3 files changed, 30 insertions, 2 deletions
| diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 860b73d3690..8778cc7b264 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -31,6 +31,12 @@ config TPL_DM_RTC  	  drivers to perform the actual functions. See rtc.h for a  	  description of the API. +config RTC_ENABLE_32KHZ_OUTPUT +	bool "Enable RTC 32Khz output" +	help +	   Some real-time clocks support the output of 32kHz square waves (such as ds3231), +	   the config symbol choose Real Time Clock device 32Khz output feature. +  config RTC_PCF2127  	bool "Enable PCF2127 driver"  	depends on DM_RTC diff --git a/drivers/rtc/ds3231.c b/drivers/rtc/ds3231.c index 79b026af4b9..fde4d860ec1 100644 --- a/drivers/rtc/ds3231.c +++ b/drivers/rtc/ds3231.c @@ -148,11 +148,13 @@ void rtc_reset (void)  /*   * Enable 32KHz output   */ +#ifdef CONFIG_RTC_ENABLE_32KHZ_OUTPUT  void rtc_enable_32khz_output(void)  {  	rtc_write(RTC_STAT_REG_ADDR,  		  RTC_STAT_BIT_BB32KHZ | RTC_STAT_BIT_EN32KHZ);  } +#endif  /*   * Helper functions @@ -251,6 +253,21 @@ static int ds3231_probe(struct udevice *dev)  	return 0;  } +#ifdef CONFIG_RTC_ENABLE_32KHZ_OUTPUT +int rtc_enable_32khz_output(int busnum, int chip_addr) +{ +	int ret; +	struct udevice *dev; + +	ret = i2c_get_chip_for_busnum(busnum, chip_addr, 1, &dev); +	if (!ret) +		ret = dm_i2c_reg_write(dev, RTC_STAT_REG_ADDR, +				       RTC_STAT_BIT_BB32KHZ | +				       RTC_STAT_BIT_EN32KHZ); +	return ret; +} +#endif +  static const struct rtc_ops ds3231_rtc_ops = {  	.get = ds3231_rtc_get,  	.set = ds3231_rtc_set, diff --git a/drivers/rtc/stm32_rtc.c b/drivers/rtc/stm32_rtc.c index abd339076ad..26747144425 100644 --- a/drivers/rtc/stm32_rtc.c +++ b/drivers/rtc/stm32_rtc.c @@ -72,7 +72,8 @@ static int stm32_rtc_get(struct udevice *dev, struct rtc_time *tm)  	tm->tm_mday = bcd2bin((dr & STM32_RTC_DATE) >> STM32_RTC_DATE_SHIFT);  	tm->tm_mon = bcd2bin((dr & STM32_RTC_MONTH) >> STM32_RTC_MONTH_SHIFT); -	tm->tm_year = bcd2bin((dr & STM32_RTC_YEAR) >> STM32_RTC_YEAR_SHIFT); +	tm->tm_year = 2000 + +		      bcd2bin((dr & STM32_RTC_YEAR) >> STM32_RTC_YEAR_SHIFT);  	tm->tm_wday = bcd2bin((dr & STM32_RTC_WDAY) >> STM32_RTC_WDAY_SHIFT);  	tm->tm_yday = 0;  	tm->tm_isdst = 0; @@ -174,6 +175,9 @@ static int stm32_rtc_set(struct udevice *dev, const struct rtc_time *tm)  		tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,  		tm->tm_hour, tm->tm_min, tm->tm_sec); +	if (tm->tm_year < 2000 || tm->tm_year > 2099) +		return -EINVAL; +  	/* Time in BCD format */  	t = (bin2bcd(tm->tm_sec) << STM32_RTC_SEC_SHIFT) & STM32_RTC_SEC;  	t |= (bin2bcd(tm->tm_min) << STM32_RTC_MIN_SHIFT) & STM32_RTC_MIN; @@ -182,7 +186,8 @@ static int stm32_rtc_set(struct udevice *dev, const struct rtc_time *tm)  	/* Date in BCD format */  	d = (bin2bcd(tm->tm_mday) << STM32_RTC_DATE_SHIFT) & STM32_RTC_DATE;  	d |= (bin2bcd(tm->tm_mon) << STM32_RTC_MONTH_SHIFT) & STM32_RTC_MONTH; -	d |= (bin2bcd(tm->tm_year) << STM32_RTC_YEAR_SHIFT) & STM32_RTC_YEAR; +	d |= (bin2bcd(tm->tm_year - 2000) << STM32_RTC_YEAR_SHIFT) & +	      STM32_RTC_YEAR;  	d |= (bin2bcd(tm->tm_wday) << STM32_RTC_WDAY_SHIFT) & STM32_RTC_WDAY;  	return stm32_rtc_set_time(dev, t, d); | 
