ge_rtc.c 906 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2017 General Electric Company
  4. */
  5. #include <common.h>
  6. #include <env.h>
  7. #include <dm/uclass.h>
  8. #include <rtc.h>
  9. void check_time(void)
  10. {
  11. struct udevice *dev;
  12. int ret, i;
  13. struct rtc_time tm;
  14. u8 retry = 3;
  15. ret = uclass_get_device(UCLASS_RTC, 0, &dev);
  16. if (ret) {
  17. env_set("rtc_status", "FAIL");
  18. return;
  19. }
  20. for (i = 0; i < retry; i++) {
  21. ret = dm_rtc_get(dev, &tm);
  22. if (!ret || ret == -EINVAL)
  23. break;
  24. }
  25. if (!ret && tm.tm_year > 2037) {
  26. tm.tm_sec = 0;
  27. tm.tm_min = 0;
  28. tm.tm_hour = 0;
  29. tm.tm_mday = 1;
  30. tm.tm_wday = 2;
  31. tm.tm_mon = 1;
  32. tm.tm_year = 2036;
  33. for (i = 0; i < retry; i++) {
  34. ret = dm_rtc_set(dev, &tm);
  35. if (!ret)
  36. break;
  37. }
  38. if (ret >= 0)
  39. ret = 2038;
  40. }
  41. if (ret < 0)
  42. env_set("rtc_status", "FAIL");
  43. else if (ret == 2038)
  44. env_set("rtc_status", "2038");
  45. else
  46. env_set("rtc_status", "OK");
  47. }