mc13xxx-rtc.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <rtc.h>
  8. #include <spi.h>
  9. #include <power/pmic.h>
  10. #include <fsl_pmic.h>
  11. int rtc_get(struct rtc_time *rtc)
  12. {
  13. u32 day1, day2, time;
  14. int tim, i = 0;
  15. struct pmic *p = pmic_get("FSL_PMIC");
  16. int ret;
  17. if (!p)
  18. return -1;
  19. do {
  20. ret = pmic_reg_read(p, REG_RTC_DAY, &day1);
  21. if (ret < 0)
  22. return -1;
  23. ret = pmic_reg_read(p, REG_RTC_TIME, &time);
  24. if (ret < 0)
  25. return -1;
  26. ret = pmic_reg_read(p, REG_RTC_DAY, &day2);
  27. if (ret < 0)
  28. return -1;
  29. } while (day1 != day2 && i++ < 3);
  30. tim = day1 * 86400 + time;
  31. rtc_to_tm(tim, rtc);
  32. rtc->tm_yday = 0;
  33. rtc->tm_isdst = 0;
  34. return 0;
  35. }
  36. int rtc_set(struct rtc_time *rtc)
  37. {
  38. u32 time, day;
  39. struct pmic *p = pmic_get("FSL_PMIC");
  40. if (!p)
  41. return -1;
  42. time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
  43. rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
  44. day = time / 86400;
  45. time %= 86400;
  46. pmic_reg_write(p, REG_RTC_DAY, day);
  47. pmic_reg_write(p, REG_RTC_TIME, time);
  48. return 0;
  49. }
  50. void rtc_reset(void)
  51. {
  52. }