rtc-uclass.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2015 Google, Inc
  4. * Written by Simon Glass <sjg@chromium.org>
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <errno.h>
  9. #include <rtc.h>
  10. int dm_rtc_get(struct udevice *dev, struct rtc_time *time)
  11. {
  12. struct rtc_ops *ops = rtc_get_ops(dev);
  13. assert(ops);
  14. if (!ops->get)
  15. return -ENOSYS;
  16. return ops->get(dev, time);
  17. }
  18. int dm_rtc_set(struct udevice *dev, struct rtc_time *time)
  19. {
  20. struct rtc_ops *ops = rtc_get_ops(dev);
  21. assert(ops);
  22. if (!ops->set)
  23. return -ENOSYS;
  24. return ops->set(dev, time);
  25. }
  26. int dm_rtc_reset(struct udevice *dev)
  27. {
  28. struct rtc_ops *ops = rtc_get_ops(dev);
  29. assert(ops);
  30. if (!ops->reset)
  31. return -ENOSYS;
  32. return ops->reset(dev);
  33. }
  34. int rtc_read8(struct udevice *dev, unsigned int reg)
  35. {
  36. struct rtc_ops *ops = rtc_get_ops(dev);
  37. assert(ops);
  38. if (!ops->read8)
  39. return -ENOSYS;
  40. return ops->read8(dev, reg);
  41. }
  42. int rtc_write8(struct udevice *dev, unsigned int reg, int val)
  43. {
  44. struct rtc_ops *ops = rtc_get_ops(dev);
  45. assert(ops);
  46. if (!ops->write8)
  47. return -ENOSYS;
  48. return ops->write8(dev, reg, val);
  49. }
  50. int rtc_read16(struct udevice *dev, unsigned int reg, u16 *valuep)
  51. {
  52. u16 value = 0;
  53. int ret;
  54. int i;
  55. for (i = 0; i < sizeof(value); i++) {
  56. ret = rtc_read8(dev, reg + i);
  57. if (ret < 0)
  58. return ret;
  59. value |= ret << (i << 3);
  60. }
  61. *valuep = value;
  62. return 0;
  63. }
  64. int rtc_write16(struct udevice *dev, unsigned int reg, u16 value)
  65. {
  66. int i, ret;
  67. for (i = 0; i < sizeof(value); i++) {
  68. ret = rtc_write8(dev, reg + i, (value >> (i << 3)) & 0xff);
  69. if (ret)
  70. return ret;
  71. }
  72. return 0;
  73. }
  74. int rtc_read32(struct udevice *dev, unsigned int reg, u32 *valuep)
  75. {
  76. u32 value = 0;
  77. int ret;
  78. int i;
  79. for (i = 0; i < sizeof(value); i++) {
  80. ret = rtc_read8(dev, reg + i);
  81. if (ret < 0)
  82. return ret;
  83. value |= ret << (i << 3);
  84. }
  85. *valuep = value;
  86. return 0;
  87. }
  88. int rtc_write32(struct udevice *dev, unsigned int reg, u32 value)
  89. {
  90. int i, ret;
  91. for (i = 0; i < sizeof(value); i++) {
  92. ret = rtc_write8(dev, reg + i, (value >> (i << 3)) & 0xff);
  93. if (ret)
  94. return ret;
  95. }
  96. return 0;
  97. }
  98. UCLASS_DRIVER(rtc) = {
  99. .name = "rtc",
  100. .id = UCLASS_RTC,
  101. };