as3722_regulator.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2017 Google, Inc
  4. * Written by Simon Glass <sjg@chromium.org>
  5. *
  6. * Placeholder regulator driver for as3722.
  7. */
  8. #include <common.h>
  9. #include <dm.h>
  10. #include <errno.h>
  11. #include <log.h>
  12. #include <power/as3722.h>
  13. #include <power/pmic.h>
  14. #include <power/regulator.h>
  15. #define AS3722_LDO_CONTROL0_MAX_INDEX 7
  16. static int stepdown_get_value(struct udevice *dev)
  17. {
  18. return -ENOSYS;
  19. }
  20. static int stepdown_set_value(struct udevice *dev, int uvolt)
  21. {
  22. return -ENOSYS;
  23. }
  24. static int stepdown_set_enable(struct udevice *dev, bool enable)
  25. {
  26. struct udevice *pmic = dev_get_parent(dev);
  27. int sd = dev->driver_data;
  28. int ret;
  29. ret = pmic_clrsetbits(pmic, AS3722_SD_CONTROL, 0, 1 << sd);
  30. if (ret < 0) {
  31. debug("%s: failed to write SD control register: %d", __func__,
  32. ret);
  33. return ret;
  34. }
  35. return 0;
  36. }
  37. static int stepdown_get_enable(struct udevice *dev)
  38. {
  39. struct udevice *pmic = dev_get_parent(dev);
  40. int sd = dev->driver_data;
  41. int ret;
  42. ret = pmic_reg_read(pmic, AS3722_SD_CONTROL);
  43. if (ret < 0) {
  44. debug("%s: failed to read SD control register: %d", __func__,
  45. ret);
  46. return ret;
  47. }
  48. return ret & (1 << sd) ? true : false;
  49. }
  50. static int ldo_get_value(struct udevice *dev)
  51. {
  52. return -ENOSYS;
  53. }
  54. static int ldo_set_value(struct udevice *dev, int uvolt)
  55. {
  56. return -ENOSYS;
  57. }
  58. static int ldo_set_enable(struct udevice *dev, bool enable)
  59. {
  60. struct udevice *pmic = dev_get_parent(dev);
  61. u8 ctrl_reg = AS3722_LDO_CONTROL0;
  62. int ldo = dev->driver_data;
  63. int ret;
  64. if (ldo > AS3722_LDO_CONTROL0_MAX_INDEX) {
  65. ctrl_reg = AS3722_LDO_CONTROL1;
  66. ldo -= 8;
  67. }
  68. ret = pmic_clrsetbits(pmic, ctrl_reg, !enable << ldo, enable << ldo);
  69. if (ret < 0) {
  70. debug("%s: failed to write LDO control register: %d", __func__,
  71. ret);
  72. return ret;
  73. }
  74. return 0;
  75. }
  76. static int ldo_get_enable(struct udevice *dev)
  77. {
  78. struct udevice *pmic = dev_get_parent(dev);
  79. u8 ctrl_reg = AS3722_LDO_CONTROL0;
  80. int ldo = dev->driver_data;
  81. int ret;
  82. if (ldo > AS3722_LDO_CONTROL0_MAX_INDEX) {
  83. ctrl_reg = AS3722_LDO_CONTROL1;
  84. ldo -= 8;
  85. }
  86. ret = pmic_reg_read(pmic, ctrl_reg);
  87. if (ret < 0) {
  88. debug("%s: failed to read SD control register: %d", __func__,
  89. ret);
  90. return ret;
  91. }
  92. return ret & (1 << ldo) ? true : false;
  93. }
  94. static int as3722_stepdown_probe(struct udevice *dev)
  95. {
  96. struct dm_regulator_uclass_plat *uc_pdata;
  97. uc_pdata = dev_get_uclass_plat(dev);
  98. uc_pdata->type = REGULATOR_TYPE_BUCK;
  99. return 0;
  100. }
  101. static int as3722_ldo_probe(struct udevice *dev)
  102. {
  103. struct dm_regulator_uclass_plat *uc_pdata;
  104. uc_pdata = dev_get_uclass_plat(dev);
  105. uc_pdata->type = REGULATOR_TYPE_LDO;
  106. return 0;
  107. }
  108. static const struct dm_regulator_ops as3722_stepdown_ops = {
  109. .get_value = stepdown_get_value,
  110. .set_value = stepdown_set_value,
  111. .get_enable = stepdown_get_enable,
  112. .set_enable = stepdown_set_enable,
  113. };
  114. static const struct dm_regulator_ops as3722_ldo_ops = {
  115. .get_value = ldo_get_value,
  116. .set_value = ldo_set_value,
  117. .get_enable = ldo_get_enable,
  118. .set_enable = ldo_set_enable,
  119. };
  120. U_BOOT_DRIVER(as3722_stepdown) = {
  121. .name = "as3722_stepdown",
  122. .id = UCLASS_REGULATOR,
  123. .ops = &as3722_stepdown_ops,
  124. .probe = as3722_stepdown_probe,
  125. };
  126. U_BOOT_DRIVER(as3722_ldo) = {
  127. .name = "as3722_ldo",
  128. .id = UCLASS_REGULATOR,
  129. .ops = &as3722_ldo_ops,
  130. .probe = as3722_ldo_probe,
  131. };