stm32-vrefbuf.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
  4. * Author: Fabrice Gasnier <fabrice.gasnier@st.com>
  5. *
  6. * Originally based on the Linux kernel v4.16 drivers/regulator/stm32-vrefbuf.c
  7. */
  8. #include <common.h>
  9. #include <clk.h>
  10. #include <dm.h>
  11. #include <asm/io.h>
  12. #include <linux/iopoll.h>
  13. #include <linux/kernel.h>
  14. #include <power/regulator.h>
  15. /* STM32 VREFBUF registers */
  16. #define STM32_VREFBUF_CSR 0x00
  17. /* STM32 VREFBUF CSR bitfields */
  18. #define STM32_VRS GENMASK(6, 4)
  19. #define STM32_VRS_SHIFT 4
  20. #define STM32_VRR BIT(3)
  21. #define STM32_HIZ BIT(1)
  22. #define STM32_ENVR BIT(0)
  23. struct stm32_vrefbuf {
  24. void __iomem *base;
  25. struct clk clk;
  26. struct udevice *vdda_supply;
  27. };
  28. static const unsigned int stm32_vrefbuf_voltages[] = {
  29. /* Matches resp. VRS = 000b, 001b, 010b, 011b */
  30. 2500000, 2048000, 1800000, 1500000,
  31. };
  32. static int stm32_vrefbuf_set_enable(struct udevice *dev, bool enable)
  33. {
  34. struct stm32_vrefbuf *priv = dev_get_priv(dev);
  35. u32 val;
  36. int ret;
  37. clrsetbits_le32(priv->base + STM32_VREFBUF_CSR, STM32_HIZ | STM32_ENVR,
  38. enable ? STM32_ENVR : STM32_HIZ);
  39. if (!enable)
  40. return 0;
  41. /*
  42. * Vrefbuf startup time depends on external capacitor: wait here for
  43. * VRR to be set. That means output has reached expected value.
  44. * ~650us sleep should be enough for caps up to 1.5uF. Use 10ms as
  45. * arbitrary timeout.
  46. */
  47. ret = readl_poll_timeout(priv->base + STM32_VREFBUF_CSR, val,
  48. val & STM32_VRR, 10000);
  49. if (ret < 0) {
  50. dev_err(dev, "stm32 vrefbuf timed out: %d\n", ret);
  51. clrsetbits_le32(priv->base + STM32_VREFBUF_CSR, STM32_ENVR,
  52. STM32_HIZ);
  53. return ret;
  54. }
  55. return 0;
  56. }
  57. static int stm32_vrefbuf_get_enable(struct udevice *dev)
  58. {
  59. struct stm32_vrefbuf *priv = dev_get_priv(dev);
  60. return readl(priv->base + STM32_VREFBUF_CSR) & STM32_ENVR;
  61. }
  62. static int stm32_vrefbuf_set_value(struct udevice *dev, int uV)
  63. {
  64. struct stm32_vrefbuf *priv = dev_get_priv(dev);
  65. unsigned int i;
  66. for (i = 0; i < ARRAY_SIZE(stm32_vrefbuf_voltages); i++) {
  67. if (uV == stm32_vrefbuf_voltages[i]) {
  68. clrsetbits_le32(priv->base + STM32_VREFBUF_CSR,
  69. STM32_VRS, i << STM32_VRS_SHIFT);
  70. return 0;
  71. }
  72. }
  73. return -EINVAL;
  74. }
  75. static int stm32_vrefbuf_get_value(struct udevice *dev)
  76. {
  77. struct stm32_vrefbuf *priv = dev_get_priv(dev);
  78. u32 val;
  79. val = readl(priv->base + STM32_VREFBUF_CSR) & STM32_VRS;
  80. val >>= STM32_VRS_SHIFT;
  81. return stm32_vrefbuf_voltages[val];
  82. }
  83. static const struct dm_regulator_ops stm32_vrefbuf_ops = {
  84. .get_value = stm32_vrefbuf_get_value,
  85. .set_value = stm32_vrefbuf_set_value,
  86. .get_enable = stm32_vrefbuf_get_enable,
  87. .set_enable = stm32_vrefbuf_set_enable,
  88. };
  89. static int stm32_vrefbuf_probe(struct udevice *dev)
  90. {
  91. struct stm32_vrefbuf *priv = dev_get_priv(dev);
  92. int ret;
  93. priv->base = dev_read_addr_ptr(dev);
  94. ret = clk_get_by_index(dev, 0, &priv->clk);
  95. if (ret) {
  96. dev_err(dev, "Can't get clock: %d\n", ret);
  97. return ret;
  98. }
  99. ret = clk_enable(&priv->clk);
  100. if (ret) {
  101. dev_err(dev, "Can't enable clock: %d\n", ret);
  102. return ret;
  103. }
  104. ret = device_get_supply_regulator(dev, "vdda-supply",
  105. &priv->vdda_supply);
  106. if (ret) {
  107. dev_dbg(dev, "No vdda-supply: %d\n", ret);
  108. return 0;
  109. }
  110. ret = regulator_set_enable(priv->vdda_supply, true);
  111. if (ret) {
  112. dev_err(dev, "Can't enable vdda-supply: %d\n", ret);
  113. clk_disable(&priv->clk);
  114. }
  115. return ret;
  116. }
  117. static const struct udevice_id stm32_vrefbuf_ids[] = {
  118. { .compatible = "st,stm32-vrefbuf" },
  119. { }
  120. };
  121. U_BOOT_DRIVER(stm32_vrefbuf) = {
  122. .name = "stm32-vrefbuf",
  123. .id = UCLASS_REGULATOR,
  124. .of_match = stm32_vrefbuf_ids,
  125. .probe = stm32_vrefbuf_probe,
  126. .ops = &stm32_vrefbuf_ops,
  127. .priv_auto_alloc_size = sizeof(struct stm32_vrefbuf),
  128. };