cdns3-starfive.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0
  2. /**
  3. * cdns-starfive.c - Cadence USB Controller
  4. *
  5. * Copyright (C) 2022-2023 StarFive Technology Co., Ltd.
  6. * Author: yanhong <yanhong.wang@starfivetech.com>
  7. */
  8. #include <common.h>
  9. #include <clk.h>
  10. #include <dm.h>
  11. #include <dm/device_compat.h>
  12. #include <linux/usb/otg.h>
  13. #include <reset.h>
  14. #include "core.h"
  15. struct cdns_starfive {
  16. struct udevice *dev;
  17. struct clk_bulk clks;
  18. struct reset_ctl_bulk resets;
  19. };
  20. static int cdns_starfive_probe(struct udevice *dev)
  21. {
  22. struct cdns_starfive *data = dev_get_plat(dev);
  23. int ret;
  24. data->dev = dev;
  25. ret = clk_get_bulk(dev, &data->clks);
  26. if (ret)
  27. goto err;
  28. ret = reset_get_bulk(dev, &data->resets);
  29. if (ret)
  30. goto err_clk;
  31. ret = clk_enable_bulk(&data->clks);
  32. if (ret)
  33. goto err_reset;
  34. ret = reset_deassert_bulk(&data->resets);
  35. if (ret)
  36. goto err_reset;
  37. return 0;
  38. err_reset:
  39. reset_release_bulk(&data->resets);
  40. err_clk:
  41. clk_release_bulk(&data->clks);
  42. err:
  43. return ret;
  44. }
  45. static int cdns_starfive_remove(struct udevice *dev)
  46. {
  47. struct cdns_starfive *data = dev_get_plat(dev);
  48. clk_release_bulk(&data->clks);
  49. // reset_assert_bulk(&data->resets);
  50. return 0;
  51. }
  52. static const struct udevice_id cdns_starfive_of_match[] = {
  53. { .compatible = "starfive,jh7110-cdns3", },
  54. {},
  55. };
  56. U_BOOT_DRIVER(cdns_starfive) = {
  57. .name = "cdns-starfive",
  58. .id = UCLASS_NOP,
  59. .of_match = cdns_starfive_of_match,
  60. .bind = cdns3_bind,
  61. .probe = cdns_starfive_probe,
  62. .remove = cdns_starfive_remove,
  63. .plat_auto = sizeof(struct cdns_starfive),
  64. };