dwc3-of-simple.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * dwc3-of-simple.c - OF glue layer for simple integrations
  3. *
  4. * Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
  5. *
  6. * Author: Felipe Balbi <balbi@ti.com>
  7. *
  8. * Copyright (C) 2018 BayLibre, SAS
  9. * Author: Neil Armstrong <narmstron@baylibre.com>
  10. *
  11. * SPDX-License-Identifier: GPL-2.0+
  12. */
  13. #include <common.h>
  14. #include <dm.h>
  15. #include <fdtdec.h>
  16. #include <reset.h>
  17. #include <clk.h>
  18. DECLARE_GLOBAL_DATA_PTR;
  19. struct dwc3_of_simple {
  20. struct clk_bulk clks;
  21. struct reset_ctl_bulk resets;
  22. };
  23. static int dwc3_of_simple_reset_init(struct udevice *dev,
  24. struct dwc3_of_simple *simple)
  25. {
  26. int ret;
  27. ret = reset_get_bulk(dev, &simple->resets);
  28. if (ret == -ENOTSUPP)
  29. return 0;
  30. else if (ret)
  31. return ret;
  32. ret = reset_deassert_bulk(&simple->resets);
  33. if (ret) {
  34. reset_release_bulk(&simple->resets);
  35. return ret;
  36. }
  37. return 0;
  38. }
  39. static int dwc3_of_simple_clk_init(struct udevice *dev,
  40. struct dwc3_of_simple *simple)
  41. {
  42. int ret;
  43. ret = clk_get_bulk(dev, &simple->clks);
  44. if (ret == -ENOTSUPP)
  45. return 0;
  46. if (ret)
  47. return ret;
  48. #if CONFIG_IS_ENABLED(CLK)
  49. ret = clk_enable_bulk(&simple->clks);
  50. if (ret) {
  51. clk_release_bulk(&simple->clks);
  52. return ret;
  53. }
  54. #endif
  55. return 0;
  56. }
  57. static int dwc3_of_simple_probe(struct udevice *dev)
  58. {
  59. struct dwc3_of_simple *simple = dev_get_platdata(dev);
  60. int ret;
  61. ret = dwc3_of_simple_clk_init(dev, simple);
  62. if (ret)
  63. return ret;
  64. ret = dwc3_of_simple_reset_init(dev, simple);
  65. if (ret)
  66. return ret;
  67. return 0;
  68. }
  69. static int dwc3_of_simple_remove(struct udevice *dev)
  70. {
  71. struct dwc3_of_simple *simple = dev_get_platdata(dev);
  72. reset_release_bulk(&simple->resets);
  73. clk_release_bulk(&simple->clks);
  74. return dm_scan_fdt_dev(dev);
  75. }
  76. static const struct udevice_id dwc3_of_simple_ids[] = {
  77. { .compatible = "amlogic,meson-gxl-dwc3" },
  78. { }
  79. };
  80. U_BOOT_DRIVER(dwc3_of_simple) = {
  81. .name = "dwc3-of-simple",
  82. .id = UCLASS_SIMPLE_BUS,
  83. .of_match = dwc3_of_simple_ids,
  84. .probe = dwc3_of_simple_probe,
  85. .remove = dwc3_of_simple_remove,
  86. .platdata_auto_alloc_size = sizeof(struct dwc3_of_simple),
  87. .flags = DM_FLAG_ALLOC_PRIV_DMA,
  88. };