226-v6.3-clk-mediatek-clk-mtk-Extend-mtk_clk_simple_probe.patch 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. From 7b6183108c8ccf0dc295f39cdf78bd8078455636 Mon Sep 17 00:00:00 2001
  2. From: AngeloGioacchino Del Regno <[email protected]>
  3. Date: Fri, 20 Jan 2023 10:20:42 +0100
  4. Subject: [PATCH] clk: mediatek: clk-mtk: Extend mtk_clk_simple_probe()
  5. As a preparation to increase probe functions commonization across
  6. various MediaTek SoC clock controller drivers, extend function
  7. mtk_clk_simple_probe() to be able to register not only gates, but
  8. also fixed clocks, factors, muxes and composites.
  9. Signed-off-by: AngeloGioacchino Del Regno <[email protected]>
  10. Reviewed-by: Miles Chen <[email protected]>
  11. Reviewed-by: Chen-Yu Tsai <[email protected]>
  12. Tested-by: Miles Chen <[email protected]>
  13. Link: https://lore.kernel.org/r/[email protected]
  14. Tested-by: Mingming Su <[email protected]>
  15. Signed-off-by: Stephen Boyd <[email protected]>
  16. ---
  17. drivers/clk/mediatek/clk-mtk.c | 101 ++++++++++++++++++++++++++++++---
  18. drivers/clk/mediatek/clk-mtk.h | 10 ++++
  19. 2 files changed, 103 insertions(+), 8 deletions(-)
  20. --- a/drivers/clk/mediatek/clk-mtk.c
  21. +++ b/drivers/clk/mediatek/clk-mtk.c
  22. @@ -11,12 +11,14 @@
  23. #include <linux/mfd/syscon.h>
  24. #include <linux/module.h>
  25. #include <linux/of.h>
  26. +#include <linux/of_address.h>
  27. #include <linux/of_device.h>
  28. #include <linux/platform_device.h>
  29. #include <linux/slab.h>
  30. #include "clk-mtk.h"
  31. #include "clk-gate.h"
  32. +#include "clk-mux.h"
  33. const struct mtk_gate_regs cg_regs_dummy = { 0, 0, 0 };
  34. EXPORT_SYMBOL_GPL(cg_regs_dummy);
  35. @@ -466,20 +468,71 @@ int mtk_clk_simple_probe(struct platform
  36. const struct mtk_clk_desc *mcd;
  37. struct clk_hw_onecell_data *clk_data;
  38. struct device_node *node = pdev->dev.of_node;
  39. - int r;
  40. + void __iomem *base;
  41. + int num_clks, r;
  42. mcd = of_device_get_match_data(&pdev->dev);
  43. if (!mcd)
  44. return -EINVAL;
  45. - clk_data = mtk_alloc_clk_data(mcd->num_clks);
  46. + /* Composite clocks needs us to pass iomem pointer */
  47. + if (mcd->composite_clks) {
  48. + if (!mcd->shared_io)
  49. + base = devm_platform_ioremap_resource(pdev, 0);
  50. + else
  51. + base = of_iomap(node, 0);
  52. +
  53. + if (IS_ERR_OR_NULL(base))
  54. + return IS_ERR(base) ? PTR_ERR(base) : -ENOMEM;
  55. + }
  56. +
  57. + /* Calculate how many clk_hw_onecell_data entries to allocate */
  58. + num_clks = mcd->num_clks + mcd->num_composite_clks;
  59. + num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
  60. + num_clks += mcd->num_mux_clks;
  61. +
  62. + clk_data = mtk_alloc_clk_data(num_clks);
  63. if (!clk_data)
  64. return -ENOMEM;
  65. - r = mtk_clk_register_gates(&pdev->dev, node, mcd->clks, mcd->num_clks,
  66. - clk_data);
  67. - if (r)
  68. - goto free_data;
  69. + if (mcd->fixed_clks) {
  70. + r = mtk_clk_register_fixed_clks(mcd->fixed_clks,
  71. + mcd->num_fixed_clks, clk_data);
  72. + if (r)
  73. + goto free_data;
  74. + }
  75. +
  76. + if (mcd->factor_clks) {
  77. + r = mtk_clk_register_factors(mcd->factor_clks,
  78. + mcd->num_factor_clks, clk_data);
  79. + if (r)
  80. + goto unregister_fixed_clks;
  81. + }
  82. +
  83. + if (mcd->mux_clks) {
  84. + r = mtk_clk_register_muxes(&pdev->dev, mcd->mux_clks,
  85. + mcd->num_mux_clks, node,
  86. + mcd->clk_lock, clk_data);
  87. + if (r)
  88. + goto unregister_factors;
  89. + };
  90. +
  91. + if (mcd->composite_clks) {
  92. + /* We don't check composite_lock because it's optional */
  93. + r = mtk_clk_register_composites(&pdev->dev,
  94. + mcd->composite_clks,
  95. + mcd->num_composite_clks,
  96. + base, mcd->clk_lock, clk_data);
  97. + if (r)
  98. + goto unregister_muxes;
  99. + }
  100. +
  101. + if (mcd->clks) {
  102. + r = mtk_clk_register_gates(&pdev->dev, node, mcd->clks,
  103. + mcd->num_clks, clk_data);
  104. + if (r)
  105. + goto unregister_composites;
  106. + }
  107. r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
  108. if (r)
  109. @@ -497,9 +550,28 @@ int mtk_clk_simple_probe(struct platform
  110. return r;
  111. unregister_clks:
  112. - mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
  113. + if (mcd->clks)
  114. + mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
  115. +unregister_composites:
  116. + if (mcd->composite_clks)
  117. + mtk_clk_unregister_composites(mcd->composite_clks,
  118. + mcd->num_composite_clks, clk_data);
  119. +unregister_muxes:
  120. + if (mcd->mux_clks)
  121. + mtk_clk_unregister_muxes(mcd->mux_clks,
  122. + mcd->num_mux_clks, clk_data);
  123. +unregister_factors:
  124. + if (mcd->factor_clks)
  125. + mtk_clk_unregister_factors(mcd->factor_clks,
  126. + mcd->num_factor_clks, clk_data);
  127. +unregister_fixed_clks:
  128. + if (mcd->fixed_clks)
  129. + mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
  130. + mcd->num_fixed_clks, clk_data);
  131. free_data:
  132. mtk_free_clk_data(clk_data);
  133. + if (mcd->shared_io && base)
  134. + iounmap(base);
  135. return r;
  136. }
  137. EXPORT_SYMBOL_GPL(mtk_clk_simple_probe);
  138. @@ -511,7 +583,20 @@ int mtk_clk_simple_remove(struct platfor
  139. struct device_node *node = pdev->dev.of_node;
  140. of_clk_del_provider(node);
  141. - mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
  142. + if (mcd->clks)
  143. + mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
  144. + if (mcd->composite_clks)
  145. + mtk_clk_unregister_composites(mcd->composite_clks,
  146. + mcd->num_composite_clks, clk_data);
  147. + if (mcd->mux_clks)
  148. + mtk_clk_unregister_muxes(mcd->mux_clks,
  149. + mcd->num_mux_clks, clk_data);
  150. + if (mcd->factor_clks)
  151. + mtk_clk_unregister_factors(mcd->factor_clks,
  152. + mcd->num_factor_clks, clk_data);
  153. + if (mcd->fixed_clks)
  154. + mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
  155. + mcd->num_fixed_clks, clk_data);
  156. mtk_free_clk_data(clk_data);
  157. return 0;
  158. --- a/drivers/clk/mediatek/clk-mtk.h
  159. +++ b/drivers/clk/mediatek/clk-mtk.h
  160. @@ -215,7 +215,17 @@ void mtk_clk_unregister_ref2usb_tx(struc
  161. struct mtk_clk_desc {
  162. const struct mtk_gate *clks;
  163. size_t num_clks;
  164. + const struct mtk_composite *composite_clks;
  165. + size_t num_composite_clks;
  166. + const struct mtk_fixed_clk *fixed_clks;
  167. + size_t num_fixed_clks;
  168. + const struct mtk_fixed_factor *factor_clks;
  169. + size_t num_factor_clks;
  170. + const struct mtk_mux *mux_clks;
  171. + size_t num_mux_clks;
  172. const struct mtk_clk_rst_desc *rst_desc;
  173. + spinlock_t *clk_lock;
  174. + bool shared_io;
  175. };
  176. int mtk_clk_simple_probe(struct platform_device *pdev);