stm32_rcc.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
  4. * Author(s): Patrice Chotard, <patrice.chotard@foss.st.com> for STMicroelectronics.
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <log.h>
  9. #include <misc.h>
  10. #include <stm32_rcc.h>
  11. #include <dm/device-internal.h>
  12. #include <dm/device_compat.h>
  13. #include <dm/lists.h>
  14. struct stm32_rcc_clk stm32_rcc_clk_f42x = {
  15. .drv_name = "stm32fx_rcc_clock",
  16. .soc = STM32F42X,
  17. };
  18. struct stm32_rcc_clk stm32_rcc_clk_f469 = {
  19. .drv_name = "stm32fx_rcc_clock",
  20. .soc = STM32F469,
  21. };
  22. struct stm32_rcc_clk stm32_rcc_clk_f7 = {
  23. .drv_name = "stm32fx_rcc_clock",
  24. .soc = STM32F7,
  25. };
  26. struct stm32_rcc_clk stm32_rcc_clk_h7 = {
  27. .drv_name = "stm32h7_rcc_clock",
  28. };
  29. struct stm32_rcc_clk stm32_rcc_clk_mp1 = {
  30. .drv_name = "stm32mp1_clk",
  31. .soc = STM32MP1,
  32. };
  33. static int stm32_rcc_bind(struct udevice *dev)
  34. {
  35. struct udevice *child;
  36. struct driver *drv;
  37. struct stm32_rcc_clk *rcc_clk =
  38. (struct stm32_rcc_clk *)dev_get_driver_data(dev);
  39. int ret;
  40. debug("%s(dev=%p)\n", __func__, dev);
  41. drv = lists_driver_lookup_name(rcc_clk->drv_name);
  42. if (!drv) {
  43. debug("Cannot find driver '%s'\n", rcc_clk->drv_name);
  44. return -ENOENT;
  45. }
  46. ret = device_bind_with_driver_data(dev, drv, rcc_clk->drv_name,
  47. rcc_clk->soc,
  48. dev_ofnode(dev), &child);
  49. if (ret)
  50. return ret;
  51. drv = lists_driver_lookup_name("stm32_rcc_reset");
  52. if (!drv) {
  53. dev_err(dev, "Cannot find driver stm32_rcc_reset'\n");
  54. return -ENOENT;
  55. }
  56. return device_bind_with_driver_data(dev, drv, "stm32_rcc_reset",
  57. rcc_clk->soc,
  58. dev_ofnode(dev), &child);
  59. }
  60. static const struct udevice_id stm32_rcc_ids[] = {
  61. {.compatible = "st,stm32f42xx-rcc", .data = (ulong)&stm32_rcc_clk_f42x },
  62. {.compatible = "st,stm32f469-rcc", .data = (ulong)&stm32_rcc_clk_f469 },
  63. {.compatible = "st,stm32f746-rcc", .data = (ulong)&stm32_rcc_clk_f7 },
  64. {.compatible = "st,stm32h743-rcc", .data = (ulong)&stm32_rcc_clk_h7 },
  65. {.compatible = "st,stm32mp1-rcc", .data = (ulong)&stm32_rcc_clk_mp1 },
  66. { }
  67. };
  68. U_BOOT_DRIVER(stm32_rcc) = {
  69. .name = "stm32-rcc",
  70. .id = UCLASS_NOP,
  71. .of_match = stm32_rcc_ids,
  72. .bind = stm32_rcc_bind,
  73. };