rtc-uclass.c 1.6 KB

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