xref: /openbmc/u-boot/drivers/rtc/mc13xxx-rtc.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
24e8b7544SFabio Estevam /*
34e8b7544SFabio Estevam  * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
44e8b7544SFabio Estevam  */
54e8b7544SFabio Estevam 
64e8b7544SFabio Estevam #include <common.h>
74e8b7544SFabio Estevam #include <rtc.h>
84e8b7544SFabio Estevam #include <spi.h>
9c7336815SŁukasz Majewski #include <power/pmic.h>
104e8b7544SFabio Estevam #include <fsl_pmic.h>
114e8b7544SFabio Estevam 
rtc_get(struct rtc_time * rtc)124e8b7544SFabio Estevam int rtc_get(struct rtc_time *rtc)
134e8b7544SFabio Estevam {
144e8b7544SFabio Estevam 	u32 day1, day2, time;
154e8b7544SFabio Estevam 	int tim, i = 0;
16c7336815SŁukasz Majewski 	struct pmic *p = pmic_get("FSL_PMIC");
174e8b7544SFabio Estevam 	int ret;
184e8b7544SFabio Estevam 
19c7336815SŁukasz Majewski 	if (!p)
20c7336815SŁukasz Majewski 		return -1;
214e8b7544SFabio Estevam 	do {
224e8b7544SFabio Estevam 		ret = pmic_reg_read(p, REG_RTC_DAY, &day1);
234e8b7544SFabio Estevam 		if (ret < 0)
244e8b7544SFabio Estevam 			return -1;
254e8b7544SFabio Estevam 
264e8b7544SFabio Estevam 		ret = pmic_reg_read(p, REG_RTC_TIME, &time);
274e8b7544SFabio Estevam 		if (ret < 0)
284e8b7544SFabio Estevam 			return -1;
294e8b7544SFabio Estevam 
304e8b7544SFabio Estevam 		ret = pmic_reg_read(p, REG_RTC_DAY, &day2);
314e8b7544SFabio Estevam 		if (ret < 0)
324e8b7544SFabio Estevam 			return -1;
334e8b7544SFabio Estevam 
344e8b7544SFabio Estevam 	} while (day1 != day2 && i++ < 3);
354e8b7544SFabio Estevam 
364e8b7544SFabio Estevam 	tim = day1 * 86400 + time;
374e8b7544SFabio Estevam 
389f9276c3SSimon Glass 	rtc_to_tm(tim, rtc);
394e8b7544SFabio Estevam 
404e8b7544SFabio Estevam 	rtc->tm_yday = 0;
414e8b7544SFabio Estevam 	rtc->tm_isdst = 0;
424e8b7544SFabio Estevam 
434e8b7544SFabio Estevam 	return 0;
444e8b7544SFabio Estevam }
454e8b7544SFabio Estevam 
rtc_set(struct rtc_time * rtc)464e8b7544SFabio Estevam int rtc_set(struct rtc_time *rtc)
474e8b7544SFabio Estevam {
484e8b7544SFabio Estevam 	u32 time, day;
49c7336815SŁukasz Majewski 	struct pmic *p = pmic_get("FSL_PMIC");
50c7336815SŁukasz Majewski 	if (!p)
51c7336815SŁukasz Majewski 		return -1;
524e8b7544SFabio Estevam 
5371420983SSimon Glass 	time = rtc_mktime(rtc);
544e8b7544SFabio Estevam 	day = time / 86400;
554e8b7544SFabio Estevam 	time %= 86400;
564e8b7544SFabio Estevam 
574e8b7544SFabio Estevam 	pmic_reg_write(p, REG_RTC_DAY, day);
584e8b7544SFabio Estevam 	pmic_reg_write(p, REG_RTC_TIME, time);
594e8b7544SFabio Estevam 
604e8b7544SFabio Estevam 	return 0;
614e8b7544SFabio Estevam }
624e8b7544SFabio Estevam 
rtc_reset(void)634e8b7544SFabio Estevam void rtc_reset(void)
644e8b7544SFabio Estevam {
654e8b7544SFabio Estevam }
66