002-0023-clk-mediatek-add-support-to-configure-clock-driver-p.patch 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. From 50859bea6a3334834b8250e7e5406507f0d0918a Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 31 Aug 2022 19:05:06 +0800
  4. Subject: [PATCH 23/32] clk: mediatek: add support to configure clock driver
  5. parent
  6. This patch adds support for a clock node to configure its parent clock
  7. where possible.
  8. Reviewed-by: Simon Glass <[email protected]>
  9. Signed-off-by: Weijie Gao <[email protected]>
  10. ---
  11. drivers/clk/mediatek/clk-mtk.c | 79 ++++++++++++++++++++--------------
  12. drivers/clk/mediatek/clk-mtk.h | 2 +
  13. 2 files changed, 48 insertions(+), 33 deletions(-)
  14. --- a/drivers/clk/mediatek/clk-mtk.c
  15. +++ b/drivers/clk/mediatek/clk-mtk.c
  16. @@ -42,20 +42,14 @@
  17. * the accurate frequency.
  18. */
  19. static ulong mtk_clk_find_parent_rate(struct clk *clk, int id,
  20. - const struct driver *drv)
  21. + struct udevice *pdev)
  22. {
  23. struct clk parent = { .id = id, };
  24. - if (drv) {
  25. - struct udevice *dev;
  26. -
  27. - if (uclass_get_device_by_driver(UCLASS_CLK, drv, &dev))
  28. - return -ENODEV;
  29. -
  30. - parent.dev = dev;
  31. - } else {
  32. + if (pdev)
  33. + parent.dev = pdev;
  34. + else
  35. parent.dev = clk->dev;
  36. - }
  37. return clk_get_rate(&parent);
  38. }
  39. @@ -296,7 +290,7 @@ static ulong mtk_topckgen_get_factor_rat
  40. switch (fdiv->flags & CLK_PARENT_MASK) {
  41. case CLK_PARENT_APMIXED:
  42. rate = mtk_clk_find_parent_rate(clk, fdiv->parent,
  43. - DM_DRIVER_GET(mtk_clk_apmixedsys));
  44. + priv->parent);
  45. break;
  46. case CLK_PARENT_TOPCKGEN:
  47. rate = mtk_clk_find_parent_rate(clk, fdiv->parent, NULL);
  48. @@ -321,9 +315,18 @@ static ulong mtk_topckgen_get_mux_rate(s
  49. if (mux->parent[index] > 0 ||
  50. (mux->parent[index] == CLK_XTAL &&
  51. - priv->tree->flags & CLK_BYPASS_XTAL))
  52. - return mtk_clk_find_parent_rate(clk, mux->parent[index],
  53. - NULL);
  54. + priv->tree->flags & CLK_BYPASS_XTAL)) {
  55. + switch (mux->flags & CLK_PARENT_MASK) {
  56. + case CLK_PARENT_APMIXED:
  57. + return mtk_clk_find_parent_rate(clk, mux->parent[index],
  58. + priv->parent);
  59. + break;
  60. + default:
  61. + return mtk_clk_find_parent_rate(clk, mux->parent[index],
  62. + NULL);
  63. + break;
  64. + }
  65. + }
  66. return priv->tree->xtal_rate;
  67. }
  68. @@ -342,7 +345,7 @@ static ulong mtk_topckgen_get_rate(struc
  69. priv->tree->muxes_offs);
  70. }
  71. -static int mtk_topckgen_enable(struct clk *clk)
  72. +static int mtk_clk_mux_enable(struct clk *clk)
  73. {
  74. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  75. const struct mtk_composite *mux;
  76. @@ -375,7 +378,7 @@ static int mtk_topckgen_enable(struct cl
  77. return 0;
  78. }
  79. -static int mtk_topckgen_disable(struct clk *clk)
  80. +static int mtk_clk_mux_disable(struct clk *clk)
  81. {
  82. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  83. const struct mtk_composite *mux;
  84. @@ -401,7 +404,7 @@ static int mtk_topckgen_disable(struct c
  85. return 0;
  86. }
  87. -static int mtk_topckgen_set_parent(struct clk *clk, struct clk *parent)
  88. +static int mtk_common_clk_set_parent(struct clk *clk, struct clk *parent)
  89. {
  90. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  91. @@ -473,19 +476,7 @@ static ulong mtk_clk_gate_get_rate(struc
  92. struct mtk_cg_priv *priv = dev_get_priv(clk->dev);
  93. const struct mtk_gate *gate = &priv->gates[clk->id];
  94. - switch (gate->flags & CLK_PARENT_MASK) {
  95. - case CLK_PARENT_APMIXED:
  96. - return mtk_clk_find_parent_rate(clk, gate->parent,
  97. - DM_DRIVER_GET(mtk_clk_apmixedsys));
  98. - break;
  99. - case CLK_PARENT_TOPCKGEN:
  100. - return mtk_clk_find_parent_rate(clk, gate->parent,
  101. - DM_DRIVER_GET(mtk_clk_topckgen));
  102. - break;
  103. -
  104. - default:
  105. - return priv->tree->xtal_rate;
  106. - }
  107. + return mtk_clk_find_parent_rate(clk, gate->parent, priv->parent);
  108. }
  109. const struct clk_ops mtk_clk_apmixedsys_ops = {
  110. @@ -496,10 +487,10 @@ const struct clk_ops mtk_clk_apmixedsys_
  111. };
  112. const struct clk_ops mtk_clk_topckgen_ops = {
  113. - .enable = mtk_topckgen_enable,
  114. - .disable = mtk_topckgen_disable,
  115. + .enable = mtk_clk_mux_enable,
  116. + .disable = mtk_clk_mux_disable,
  117. .get_rate = mtk_topckgen_get_rate,
  118. - .set_parent = mtk_topckgen_set_parent,
  119. + .set_parent = mtk_common_clk_set_parent,
  120. };
  121. const struct clk_ops mtk_clk_gate_ops = {
  122. @@ -512,11 +503,22 @@ int mtk_common_clk_init(struct udevice *
  123. const struct mtk_clk_tree *tree)
  124. {
  125. struct mtk_clk_priv *priv = dev_get_priv(dev);
  126. + struct udevice *parent;
  127. + int ret;
  128. priv->base = dev_read_addr_ptr(dev);
  129. if (!priv->base)
  130. return -ENOENT;
  131. + ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
  132. + if (ret || !parent) {
  133. + ret = uclass_get_device_by_driver(UCLASS_CLK,
  134. + DM_DRIVER_GET(mtk_clk_apmixedsys), &parent);
  135. + if (ret || !parent)
  136. + return -ENOENT;
  137. + }
  138. +
  139. + priv->parent = parent;
  140. priv->tree = tree;
  141. return 0;
  142. @@ -527,11 +529,22 @@ int mtk_common_clk_gate_init(struct udev
  143. const struct mtk_gate *gates)
  144. {
  145. struct mtk_cg_priv *priv = dev_get_priv(dev);
  146. + struct udevice *parent;
  147. + int ret;
  148. priv->base = dev_read_addr_ptr(dev);
  149. if (!priv->base)
  150. return -ENOENT;
  151. + ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
  152. + if (ret || !parent) {
  153. + ret = uclass_get_device_by_driver(UCLASS_CLK,
  154. + DM_DRIVER_GET(mtk_clk_topckgen), &parent);
  155. + if (ret || !parent)
  156. + return -ENOENT;
  157. + }
  158. +
  159. + priv->parent = parent;
  160. priv->tree = tree;
  161. priv->gates = gates;
  162. --- a/drivers/clk/mediatek/clk-mtk.h
  163. +++ b/drivers/clk/mediatek/clk-mtk.h
  164. @@ -206,11 +206,13 @@ struct mtk_clk_tree {
  165. };
  166. struct mtk_clk_priv {
  167. + struct udevice *parent;
  168. void __iomem *base;
  169. const struct mtk_clk_tree *tree;
  170. };
  171. struct mtk_cg_priv {
  172. + struct udevice *parent;
  173. void __iomem *base;
  174. const struct mtk_clk_tree *tree;
  175. const struct mtk_gate *gates;