002-0024-clk-mediatek-add-infrasys-clock-mux-support.patch 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. From e9c0c2ebd346aa578007c2aa88fc0974af6afb40 Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Fri, 29 Jul 2022 11:14:33 +0800
  4. Subject: [PATCH 24/31] clk: mediatek: add infrasys clock mux support
  5. This patch adds infrasys clock mux support for mediatek clock drivers.
  6. Reviewed-by: Simon Glass <[email protected]>
  7. Signed-off-by: Weijie Gao <[email protected]>
  8. ---
  9. drivers/clk/mediatek/clk-mtk.c | 72 ++++++++++++++++++++++++++++++++++
  10. drivers/clk/mediatek/clk-mtk.h | 4 +-
  11. 2 files changed, 75 insertions(+), 1 deletion(-)
  12. --- a/drivers/clk/mediatek/clk-mtk.c
  13. +++ b/drivers/clk/mediatek/clk-mtk.c
  14. @@ -303,6 +303,24 @@ static ulong mtk_topckgen_get_factor_rat
  15. return mtk_factor_recalc_rate(fdiv, rate);
  16. }
  17. +static ulong mtk_infrasys_get_factor_rate(struct clk *clk, u32 off)
  18. +{
  19. + struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  20. + const struct mtk_fixed_factor *fdiv = &priv->tree->fdivs[off];
  21. + ulong rate;
  22. +
  23. + switch (fdiv->flags & CLK_PARENT_MASK) {
  24. + case CLK_PARENT_TOPCKGEN:
  25. + rate = mtk_clk_find_parent_rate(clk, fdiv->parent,
  26. + priv->parent);
  27. + break;
  28. + default:
  29. + rate = mtk_clk_find_parent_rate(clk, fdiv->parent, NULL);
  30. + }
  31. +
  32. + return mtk_factor_recalc_rate(fdiv, rate);
  33. +}
  34. +
  35. static ulong mtk_topckgen_get_mux_rate(struct clk *clk, u32 off)
  36. {
  37. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  38. @@ -332,6 +350,34 @@ static ulong mtk_topckgen_get_mux_rate(s
  39. return priv->tree->xtal_rate;
  40. }
  41. +static ulong mtk_infrasys_get_mux_rate(struct clk *clk, u32 off)
  42. +{
  43. + struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  44. + const struct mtk_composite *mux = &priv->tree->muxes[off];
  45. + u32 index;
  46. + u32 flag;
  47. +
  48. + index = readl(priv->base + mux->mux_reg);
  49. + index &= mux->mux_mask << mux->mux_shift;
  50. + index = index >> mux->mux_shift;
  51. +
  52. + if (mux->parent[index] == CLK_XTAL && priv->tree->flags & CLK_BYPASS_XTAL)
  53. + flag = 1;
  54. + if (mux->parent[index] > 0 || flag == 1) {
  55. + switch (mux->flags & CLK_PARENT_MASK) {
  56. + case CLK_PARENT_TOPCKGEN:
  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 0;
  67. +}
  68. +
  69. static ulong mtk_topckgen_get_rate(struct clk *clk)
  70. {
  71. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  72. @@ -346,6 +392,25 @@ static ulong mtk_topckgen_get_rate(struc
  73. priv->tree->muxes_offs);
  74. }
  75. +static ulong mtk_infrasys_get_rate(struct clk *clk)
  76. +{
  77. + struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  78. +
  79. + ulong rate;
  80. +
  81. + if (clk->id < priv->tree->fdivs_offs) {
  82. + rate = priv->tree->fclks[clk->id].rate;
  83. + } else if (clk->id < priv->tree->muxes_offs) {
  84. + rate = mtk_infrasys_get_factor_rate(clk, clk->id -
  85. + priv->tree->fdivs_offs);
  86. + } else {
  87. + rate = mtk_infrasys_get_mux_rate(clk, clk->id -
  88. + priv->tree->muxes_offs);
  89. + }
  90. +
  91. + return rate;
  92. +}
  93. +
  94. static int mtk_clk_mux_enable(struct clk *clk)
  95. {
  96. struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
  97. @@ -494,6 +559,13 @@ const struct clk_ops mtk_clk_topckgen_op
  98. .set_parent = mtk_common_clk_set_parent,
  99. };
  100. +const struct clk_ops mtk_clk_infrasys_ops = {
  101. + .enable = mtk_clk_mux_enable,
  102. + .disable = mtk_clk_mux_disable,
  103. + .get_rate = mtk_infrasys_get_rate,
  104. + .set_parent = mtk_common_clk_set_parent,
  105. +};
  106. +
  107. const struct clk_ops mtk_clk_gate_ops = {
  108. .enable = mtk_clk_gate_enable,
  109. .disable = mtk_clk_gate_disable,
  110. --- a/drivers/clk/mediatek/clk-mtk.h
  111. +++ b/drivers/clk/mediatek/clk-mtk.h
  112. @@ -28,7 +28,8 @@
  113. #define CLK_PARENT_APMIXED BIT(4)
  114. #define CLK_PARENT_TOPCKGEN BIT(5)
  115. -#define CLK_PARENT_MASK GENMASK(5, 4)
  116. +#define CLK_PARENT_INFRASYS BIT(6)
  117. +#define CLK_PARENT_MASK GENMASK(6, 4)
  118. #define ETHSYS_HIFSYS_RST_CTRL_OFS 0x34
  119. @@ -220,6 +221,7 @@ struct mtk_cg_priv {
  120. extern const struct clk_ops mtk_clk_apmixedsys_ops;
  121. extern const struct clk_ops mtk_clk_topckgen_ops;
  122. +extern const struct clk_ops mtk_clk_infrasys_ops;
  123. extern const struct clk_ops mtk_clk_gate_ops;
  124. int mtk_common_clk_init(struct udevice *dev,