mt2701-afe-clock-ctrl.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mt2701-afe-clock-ctrl.c -- Mediatek 2701 afe clock ctrl
  4. *
  5. * Copyright (c) 2016 MediaTek Inc.
  6. * Author: Garlic Tseng <[email protected]>
  7. * Ryder Lee <[email protected]>
  8. */
  9. #include "mt2701-afe-common.h"
  10. #include "mt2701-afe-clock-ctrl.h"
  11. static const char *const base_clks[] = {
  12. [MT2701_INFRA_SYS_AUDIO] = "infra_sys_audio_clk",
  13. [MT2701_TOP_AUD_MCLK_SRC0] = "top_audio_mux1_sel",
  14. [MT2701_TOP_AUD_MCLK_SRC1] = "top_audio_mux2_sel",
  15. [MT2701_TOP_AUD_A1SYS] = "top_audio_a1sys_hp",
  16. [MT2701_TOP_AUD_A2SYS] = "top_audio_a2sys_hp",
  17. [MT2701_AUDSYS_AFE] = "audio_afe_pd",
  18. [MT2701_AUDSYS_AFE_CONN] = "audio_afe_conn_pd",
  19. [MT2701_AUDSYS_A1SYS] = "audio_a1sys_pd",
  20. [MT2701_AUDSYS_A2SYS] = "audio_a2sys_pd",
  21. };
  22. int mt2701_init_clock(struct mtk_base_afe *afe)
  23. {
  24. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  25. int i;
  26. for (i = 0; i < MT2701_BASE_CLK_NUM; i++) {
  27. afe_priv->base_ck[i] = devm_clk_get(afe->dev, base_clks[i]);
  28. if (IS_ERR(afe_priv->base_ck[i])) {
  29. dev_err(afe->dev, "failed to get %s\n", base_clks[i]);
  30. return PTR_ERR(afe_priv->base_ck[i]);
  31. }
  32. }
  33. /* Get I2S related clocks */
  34. for (i = 0; i < afe_priv->soc->i2s_num; i++) {
  35. struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[i];
  36. struct clk *i2s_ck;
  37. char name[13];
  38. snprintf(name, sizeof(name), "i2s%d_src_sel", i);
  39. i2s_path->sel_ck = devm_clk_get(afe->dev, name);
  40. if (IS_ERR(i2s_path->sel_ck)) {
  41. dev_err(afe->dev, "failed to get %s\n", name);
  42. return PTR_ERR(i2s_path->sel_ck);
  43. }
  44. snprintf(name, sizeof(name), "i2s%d_src_div", i);
  45. i2s_path->div_ck = devm_clk_get(afe->dev, name);
  46. if (IS_ERR(i2s_path->div_ck)) {
  47. dev_err(afe->dev, "failed to get %s\n", name);
  48. return PTR_ERR(i2s_path->div_ck);
  49. }
  50. snprintf(name, sizeof(name), "i2s%d_mclk_en", i);
  51. i2s_path->mclk_ck = devm_clk_get(afe->dev, name);
  52. if (IS_ERR(i2s_path->mclk_ck)) {
  53. dev_err(afe->dev, "failed to get %s\n", name);
  54. return PTR_ERR(i2s_path->mclk_ck);
  55. }
  56. snprintf(name, sizeof(name), "i2so%d_hop_ck", i);
  57. i2s_ck = devm_clk_get(afe->dev, name);
  58. if (IS_ERR(i2s_ck)) {
  59. dev_err(afe->dev, "failed to get %s\n", name);
  60. return PTR_ERR(i2s_ck);
  61. }
  62. i2s_path->hop_ck[SNDRV_PCM_STREAM_PLAYBACK] = i2s_ck;
  63. snprintf(name, sizeof(name), "i2si%d_hop_ck", i);
  64. i2s_ck = devm_clk_get(afe->dev, name);
  65. if (IS_ERR(i2s_ck)) {
  66. dev_err(afe->dev, "failed to get %s\n", name);
  67. return PTR_ERR(i2s_ck);
  68. }
  69. i2s_path->hop_ck[SNDRV_PCM_STREAM_CAPTURE] = i2s_ck;
  70. snprintf(name, sizeof(name), "asrc%d_out_ck", i);
  71. i2s_path->asrco_ck = devm_clk_get(afe->dev, name);
  72. if (IS_ERR(i2s_path->asrco_ck)) {
  73. dev_err(afe->dev, "failed to get %s\n", name);
  74. return PTR_ERR(i2s_path->asrco_ck);
  75. }
  76. }
  77. /* Some platforms may support BT path */
  78. afe_priv->mrgif_ck = devm_clk_get(afe->dev, "audio_mrgif_pd");
  79. if (IS_ERR(afe_priv->mrgif_ck)) {
  80. if (PTR_ERR(afe_priv->mrgif_ck) == -EPROBE_DEFER)
  81. return -EPROBE_DEFER;
  82. afe_priv->mrgif_ck = NULL;
  83. }
  84. return 0;
  85. }
  86. int mt2701_afe_enable_i2s(struct mtk_base_afe *afe,
  87. struct mt2701_i2s_path *i2s_path,
  88. int dir)
  89. {
  90. int ret;
  91. ret = clk_prepare_enable(i2s_path->asrco_ck);
  92. if (ret) {
  93. dev_err(afe->dev, "failed to enable ASRC clock %d\n", ret);
  94. return ret;
  95. }
  96. ret = clk_prepare_enable(i2s_path->hop_ck[dir]);
  97. if (ret) {
  98. dev_err(afe->dev, "failed to enable I2S clock %d\n", ret);
  99. goto err_hop_ck;
  100. }
  101. return 0;
  102. err_hop_ck:
  103. clk_disable_unprepare(i2s_path->asrco_ck);
  104. return ret;
  105. }
  106. void mt2701_afe_disable_i2s(struct mtk_base_afe *afe,
  107. struct mt2701_i2s_path *i2s_path,
  108. int dir)
  109. {
  110. clk_disable_unprepare(i2s_path->hop_ck[dir]);
  111. clk_disable_unprepare(i2s_path->asrco_ck);
  112. }
  113. int mt2701_afe_enable_mclk(struct mtk_base_afe *afe, int id)
  114. {
  115. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  116. struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[id];
  117. return clk_prepare_enable(i2s_path->mclk_ck);
  118. }
  119. void mt2701_afe_disable_mclk(struct mtk_base_afe *afe, int id)
  120. {
  121. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  122. struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[id];
  123. clk_disable_unprepare(i2s_path->mclk_ck);
  124. }
  125. int mt2701_enable_btmrg_clk(struct mtk_base_afe *afe)
  126. {
  127. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  128. return clk_prepare_enable(afe_priv->mrgif_ck);
  129. }
  130. void mt2701_disable_btmrg_clk(struct mtk_base_afe *afe)
  131. {
  132. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  133. clk_disable_unprepare(afe_priv->mrgif_ck);
  134. }
  135. static int mt2701_afe_enable_audsys(struct mtk_base_afe *afe)
  136. {
  137. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  138. int ret;
  139. /* Enable infra clock gate */
  140. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
  141. if (ret)
  142. return ret;
  143. /* Enable top a1sys clock gate */
  144. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
  145. if (ret)
  146. goto err_a1sys;
  147. /* Enable top a2sys clock gate */
  148. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
  149. if (ret)
  150. goto err_a2sys;
  151. /* Internal clock gates */
  152. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
  153. if (ret)
  154. goto err_afe;
  155. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
  156. if (ret)
  157. goto err_audio_a1sys;
  158. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
  159. if (ret)
  160. goto err_audio_a2sys;
  161. ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_AFE_CONN]);
  162. if (ret)
  163. goto err_afe_conn;
  164. return 0;
  165. err_afe_conn:
  166. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
  167. err_audio_a2sys:
  168. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
  169. err_audio_a1sys:
  170. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
  171. err_afe:
  172. clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
  173. err_a2sys:
  174. clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
  175. err_a1sys:
  176. clk_disable_unprepare(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
  177. return ret;
  178. }
  179. static void mt2701_afe_disable_audsys(struct mtk_base_afe *afe)
  180. {
  181. struct mt2701_afe_private *afe_priv = afe->platform_priv;
  182. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE_CONN]);
  183. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
  184. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
  185. clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
  186. clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
  187. clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
  188. clk_disable_unprepare(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
  189. }
  190. int mt2701_afe_enable_clock(struct mtk_base_afe *afe)
  191. {
  192. int ret;
  193. /* Enable audio system */
  194. ret = mt2701_afe_enable_audsys(afe);
  195. if (ret) {
  196. dev_err(afe->dev, "failed to enable audio system %d\n", ret);
  197. return ret;
  198. }
  199. regmap_update_bits(afe->regmap, ASYS_TOP_CON,
  200. ASYS_TOP_CON_ASYS_TIMING_ON,
  201. ASYS_TOP_CON_ASYS_TIMING_ON);
  202. regmap_update_bits(afe->regmap, AFE_DAC_CON0,
  203. AFE_DAC_CON0_AFE_ON,
  204. AFE_DAC_CON0_AFE_ON);
  205. /* Configure ASRC */
  206. regmap_write(afe->regmap, PWR1_ASM_CON1, PWR1_ASM_CON1_INIT_VAL);
  207. regmap_write(afe->regmap, PWR2_ASM_CON1, PWR2_ASM_CON1_INIT_VAL);
  208. return 0;
  209. }
  210. int mt2701_afe_disable_clock(struct mtk_base_afe *afe)
  211. {
  212. regmap_update_bits(afe->regmap, ASYS_TOP_CON,
  213. ASYS_TOP_CON_ASYS_TIMING_ON, 0);
  214. regmap_update_bits(afe->regmap, AFE_DAC_CON0,
  215. AFE_DAC_CON0_AFE_ON, 0);
  216. mt2701_afe_disable_audsys(afe);
  217. return 0;
  218. }
  219. int mt2701_mclk_configuration(struct mtk_base_afe *afe, int id)
  220. {
  221. struct mt2701_afe_private *priv = afe->platform_priv;
  222. struct mt2701_i2s_path *i2s_path = &priv->i2s_path[id];
  223. int ret = -EINVAL;
  224. /* Set mclk source */
  225. if (!(MT2701_PLL_DOMAIN_0_RATE % i2s_path->mclk_rate))
  226. ret = clk_set_parent(i2s_path->sel_ck,
  227. priv->base_ck[MT2701_TOP_AUD_MCLK_SRC0]);
  228. else if (!(MT2701_PLL_DOMAIN_1_RATE % i2s_path->mclk_rate))
  229. ret = clk_set_parent(i2s_path->sel_ck,
  230. priv->base_ck[MT2701_TOP_AUD_MCLK_SRC1]);
  231. if (ret) {
  232. dev_err(afe->dev, "failed to set mclk source\n");
  233. return ret;
  234. }
  235. /* Set mclk divider */
  236. ret = clk_set_rate(i2s_path->div_ck, i2s_path->mclk_rate);
  237. if (ret) {
  238. dev_err(afe->dev, "failed to set mclk divider %d\n", ret);
  239. return ret;
  240. }
  241. return 0;
  242. }