14e8b7544SFabio Estevam /*
24e8b7544SFabio Estevam * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
34e8b7544SFabio Estevam *
41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
54e8b7544SFabio Estevam */
64e8b7544SFabio Estevam
74e8b7544SFabio Estevam #include <common.h>
84e8b7544SFabio Estevam #include <rtc.h>
94e8b7544SFabio Estevam #include <spi.h>
10c7336815SŁukasz Majewski #include <power/pmic.h>
114e8b7544SFabio Estevam #include <fsl_pmic.h>
124e8b7544SFabio Estevam
rtc_get(struct rtc_time * rtc)134e8b7544SFabio Estevam int rtc_get(struct rtc_time *rtc)
144e8b7544SFabio Estevam {
154e8b7544SFabio Estevam u32 day1, day2, time;
164e8b7544SFabio Estevam int tim, i = 0;
17c7336815SŁukasz Majewski struct pmic *p = pmic_get("FSL_PMIC");
184e8b7544SFabio Estevam int ret;
194e8b7544SFabio Estevam
20c7336815SŁukasz Majewski if (!p)
21c7336815SŁukasz Majewski return -1;
224e8b7544SFabio Estevam do {
234e8b7544SFabio Estevam ret = pmic_reg_read(p, REG_RTC_DAY, &day1);
244e8b7544SFabio Estevam if (ret < 0)
254e8b7544SFabio Estevam return -1;
264e8b7544SFabio Estevam
274e8b7544SFabio Estevam ret = pmic_reg_read(p, REG_RTC_TIME, &time);
284e8b7544SFabio Estevam if (ret < 0)
294e8b7544SFabio Estevam return -1;
304e8b7544SFabio Estevam
314e8b7544SFabio Estevam ret = pmic_reg_read(p, REG_RTC_DAY, &day2);
324e8b7544SFabio Estevam if (ret < 0)
334e8b7544SFabio Estevam return -1;
344e8b7544SFabio Estevam
354e8b7544SFabio Estevam } while (day1 != day2 && i++ < 3);
364e8b7544SFabio Estevam
374e8b7544SFabio Estevam tim = day1 * 86400 + time;
384e8b7544SFabio Estevam
399f9276c3SSimon Glass rtc_to_tm(tim, rtc);
404e8b7544SFabio Estevam
414e8b7544SFabio Estevam rtc->tm_yday = 0;
424e8b7544SFabio Estevam rtc->tm_isdst = 0;
434e8b7544SFabio Estevam
444e8b7544SFabio Estevam return 0;
454e8b7544SFabio Estevam }
464e8b7544SFabio Estevam
rtc_set(struct rtc_time * rtc)474e8b7544SFabio Estevam int rtc_set(struct rtc_time *rtc)
484e8b7544SFabio Estevam {
494e8b7544SFabio Estevam u32 time, day;
50c7336815SŁukasz Majewski struct pmic *p = pmic_get("FSL_PMIC");
51c7336815SŁukasz Majewski if (!p)
52c7336815SŁukasz Majewski return -1;
534e8b7544SFabio Estevam
54*71420983SSimon Glass time = rtc_mktime(rtc);
554e8b7544SFabio Estevam day = time / 86400;
564e8b7544SFabio Estevam time %= 86400;
574e8b7544SFabio Estevam
584e8b7544SFabio Estevam pmic_reg_write(p, REG_RTC_DAY, day);
594e8b7544SFabio Estevam pmic_reg_write(p, REG_RTC_TIME, time);
604e8b7544SFabio Estevam
614e8b7544SFabio Estevam return 0;
624e8b7544SFabio Estevam }
634e8b7544SFabio Estevam
rtc_reset(void)644e8b7544SFabio Estevam void rtc_reset(void)
654e8b7544SFabio Estevam {
664e8b7544SFabio Estevam }
67