clk_sandbox_test.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2016, NVIDIA CORPORATION.
  4. */
  5. #include <common.h>
  6. #include <dm.h>
  7. #include <clk.h>
  8. #include <asm/clk.h>
  9. struct sandbox_clk_test {
  10. struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
  11. struct clk_bulk bulk;
  12. };
  13. static const char * const sandbox_clk_test_names[] = {
  14. [SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
  15. [SANDBOX_CLK_TEST_ID_SPI] = "spi",
  16. [SANDBOX_CLK_TEST_ID_I2C] = "i2c",
  17. };
  18. int sandbox_clk_test_get(struct udevice *dev)
  19. {
  20. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  21. int i, ret;
  22. for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
  23. ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
  24. &sbct->clks[i]);
  25. if (ret)
  26. return ret;
  27. }
  28. return 0;
  29. }
  30. int sandbox_clk_test_get_bulk(struct udevice *dev)
  31. {
  32. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  33. return clk_get_bulk(dev, &sbct->bulk);
  34. }
  35. ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
  36. {
  37. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  38. if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  39. return -EINVAL;
  40. return clk_get_rate(&sbct->clks[id]);
  41. }
  42. ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
  43. {
  44. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  45. if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  46. return -EINVAL;
  47. return clk_set_rate(&sbct->clks[id], rate);
  48. }
  49. int sandbox_clk_test_enable(struct udevice *dev, int id)
  50. {
  51. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  52. if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  53. return -EINVAL;
  54. return clk_enable(&sbct->clks[id]);
  55. }
  56. int sandbox_clk_test_enable_bulk(struct udevice *dev)
  57. {
  58. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  59. return clk_enable_bulk(&sbct->bulk);
  60. }
  61. int sandbox_clk_test_disable(struct udevice *dev, int id)
  62. {
  63. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  64. if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  65. return -EINVAL;
  66. return clk_disable(&sbct->clks[id]);
  67. }
  68. int sandbox_clk_test_disable_bulk(struct udevice *dev)
  69. {
  70. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  71. return clk_disable_bulk(&sbct->bulk);
  72. }
  73. int sandbox_clk_test_free(struct udevice *dev)
  74. {
  75. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  76. int i, ret;
  77. for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
  78. ret = clk_free(&sbct->clks[i]);
  79. if (ret)
  80. return ret;
  81. }
  82. return 0;
  83. }
  84. int sandbox_clk_test_release_bulk(struct udevice *dev)
  85. {
  86. struct sandbox_clk_test *sbct = dev_get_priv(dev);
  87. return clk_release_bulk(&sbct->bulk);
  88. }
  89. static const struct udevice_id sandbox_clk_test_ids[] = {
  90. { .compatible = "sandbox,clk-test" },
  91. { }
  92. };
  93. U_BOOT_DRIVER(sandbox_clk_test) = {
  94. .name = "sandbox_clk_test",
  95. .id = UCLASS_MISC,
  96. .of_match = sandbox_clk_test_ids,
  97. .priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
  98. };