stm32-adc-core.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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.18 drivers/iio/adc/stm32-adc-core.c.
  7. */
  8. #include <common.h>
  9. #include <asm/io.h>
  10. #include <power/regulator.h>
  11. #include "stm32-adc-core.h"
  12. /* STM32H7 - common registers for all ADC instances */
  13. #define STM32H7_ADC_CCR (STM32_ADCX_COMN_OFFSET + 0x08)
  14. /* STM32H7_ADC_CCR - bit fields */
  15. #define STM32H7_PRESC_SHIFT 18
  16. #define STM32H7_PRESC_MASK GENMASK(21, 18)
  17. #define STM32H7_CKMODE_SHIFT 16
  18. #define STM32H7_CKMODE_MASK GENMASK(17, 16)
  19. /* STM32 H7 maximum analog clock rate (from datasheet) */
  20. #define STM32H7_ADC_MAX_CLK_RATE 36000000
  21. /**
  22. * struct stm32h7_adc_ck_spec - specification for stm32h7 adc clock
  23. * @ckmode: ADC clock mode, Async or sync with prescaler.
  24. * @presc: prescaler bitfield for async clock mode
  25. * @div: prescaler division ratio
  26. */
  27. struct stm32h7_adc_ck_spec {
  28. u32 ckmode;
  29. u32 presc;
  30. int div;
  31. };
  32. static const struct stm32h7_adc_ck_spec stm32h7_adc_ckmodes_spec[] = {
  33. /* 00: CK_ADC[1..3]: Asynchronous clock modes */
  34. { 0, 0, 1 },
  35. { 0, 1, 2 },
  36. { 0, 2, 4 },
  37. { 0, 3, 6 },
  38. { 0, 4, 8 },
  39. { 0, 5, 10 },
  40. { 0, 6, 12 },
  41. { 0, 7, 16 },
  42. { 0, 8, 32 },
  43. { 0, 9, 64 },
  44. { 0, 10, 128 },
  45. { 0, 11, 256 },
  46. /* HCLK used: Synchronous clock modes (1, 2 or 4 prescaler) */
  47. { 1, 0, 1 },
  48. { 2, 0, 2 },
  49. { 3, 0, 4 },
  50. };
  51. static int stm32h7_adc_clk_sel(struct udevice *dev,
  52. struct stm32_adc_common *common)
  53. {
  54. u32 ckmode, presc;
  55. unsigned long rate;
  56. int i, div;
  57. /* stm32h7 bus clock is common for all ADC instances (mandatory) */
  58. if (!clk_valid(&common->bclk)) {
  59. dev_err(dev, "No bclk clock found\n");
  60. return -ENOENT;
  61. }
  62. /*
  63. * stm32h7 can use either 'bus' or 'adc' clock for analog circuitry.
  64. * So, choice is to have bus clock mandatory and adc clock optional.
  65. * If optional 'adc' clock has been found, then try to use it first.
  66. */
  67. if (clk_valid(&common->aclk)) {
  68. /*
  69. * Asynchronous clock modes (e.g. ckmode == 0)
  70. * From spec: PLL output musn't exceed max rate
  71. */
  72. rate = clk_get_rate(&common->aclk);
  73. if (!rate) {
  74. dev_err(dev, "Invalid aclk rate: 0\n");
  75. return -EINVAL;
  76. }
  77. for (i = 0; i < ARRAY_SIZE(stm32h7_adc_ckmodes_spec); i++) {
  78. ckmode = stm32h7_adc_ckmodes_spec[i].ckmode;
  79. presc = stm32h7_adc_ckmodes_spec[i].presc;
  80. div = stm32h7_adc_ckmodes_spec[i].div;
  81. if (ckmode)
  82. continue;
  83. if ((rate / div) <= STM32H7_ADC_MAX_CLK_RATE)
  84. goto out;
  85. }
  86. }
  87. /* Synchronous clock modes (e.g. ckmode is 1, 2 or 3) */
  88. rate = clk_get_rate(&common->bclk);
  89. if (!rate) {
  90. dev_err(dev, "Invalid bus clock rate: 0\n");
  91. return -EINVAL;
  92. }
  93. for (i = 0; i < ARRAY_SIZE(stm32h7_adc_ckmodes_spec); i++) {
  94. ckmode = stm32h7_adc_ckmodes_spec[i].ckmode;
  95. presc = stm32h7_adc_ckmodes_spec[i].presc;
  96. div = stm32h7_adc_ckmodes_spec[i].div;
  97. if (!ckmode)
  98. continue;
  99. if ((rate / div) <= STM32H7_ADC_MAX_CLK_RATE)
  100. goto out;
  101. }
  102. dev_err(dev, "clk selection failed\n");
  103. return -EINVAL;
  104. out:
  105. /* rate used later by each ADC instance to control BOOST mode */
  106. common->rate = rate / div;
  107. /* Set common clock mode and prescaler */
  108. clrsetbits_le32(common->base + STM32H7_ADC_CCR,
  109. STM32H7_CKMODE_MASK | STM32H7_PRESC_MASK,
  110. ckmode << STM32H7_CKMODE_SHIFT |
  111. presc << STM32H7_PRESC_SHIFT);
  112. dev_dbg(dev, "Using %s clock/%d source at %ld kHz\n",
  113. ckmode ? "bus" : "adc", div, common->rate / 1000);
  114. return 0;
  115. }
  116. static int stm32_adc_core_probe(struct udevice *dev)
  117. {
  118. struct stm32_adc_common *common = dev_get_priv(dev);
  119. int ret;
  120. common->base = dev_read_addr_ptr(dev);
  121. if (!common->base) {
  122. dev_err(dev, "can't get address\n");
  123. return -ENOENT;
  124. }
  125. ret = device_get_supply_regulator(dev, "vref-supply", &common->vref);
  126. if (ret) {
  127. dev_err(dev, "can't get vref-supply: %d\n", ret);
  128. return ret;
  129. }
  130. ret = regulator_get_value(common->vref);
  131. if (ret < 0) {
  132. dev_err(dev, "can't get vref-supply value: %d\n", ret);
  133. return ret;
  134. }
  135. common->vref_uv = ret;
  136. ret = clk_get_by_name(dev, "adc", &common->aclk);
  137. if (!ret) {
  138. ret = clk_enable(&common->aclk);
  139. if (ret) {
  140. dev_err(dev, "Can't enable aclk: %d\n", ret);
  141. return ret;
  142. }
  143. }
  144. ret = clk_get_by_name(dev, "bus", &common->bclk);
  145. if (!ret) {
  146. ret = clk_enable(&common->bclk);
  147. if (ret) {
  148. dev_err(dev, "Can't enable bclk: %d\n", ret);
  149. goto err_aclk_disable;
  150. }
  151. }
  152. ret = stm32h7_adc_clk_sel(dev, common);
  153. if (ret)
  154. goto err_bclk_disable;
  155. return ret;
  156. err_bclk_disable:
  157. if (clk_valid(&common->bclk))
  158. clk_disable(&common->bclk);
  159. err_aclk_disable:
  160. if (clk_valid(&common->aclk))
  161. clk_disable(&common->aclk);
  162. return ret;
  163. }
  164. static const struct udevice_id stm32_adc_core_ids[] = {
  165. { .compatible = "st,stm32h7-adc-core" },
  166. { .compatible = "st,stm32mp1-adc-core" },
  167. {}
  168. };
  169. U_BOOT_DRIVER(stm32_adc_core) = {
  170. .name = "stm32-adc-core",
  171. .id = UCLASS_SIMPLE_BUS,
  172. .of_match = stm32_adc_core_ids,
  173. .probe = stm32_adc_core_probe,
  174. .priv_auto_alloc_size = sizeof(struct stm32_adc_common),
  175. };