mt8183-afe-clk.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // mt8183-afe-clk.c -- Mediatek 8183 afe clock ctrl
  4. //
  5. // Copyright (c) 2018 MediaTek Inc.
  6. // Author: KaiChieh Chuang <[email protected]>
  7. #include <linux/clk.h>
  8. #include "mt8183-afe-common.h"
  9. #include "mt8183-afe-clk.h"
  10. #include "mt8183-reg.h"
  11. enum {
  12. CLK_AFE = 0,
  13. CLK_TML,
  14. CLK_APLL22M,
  15. CLK_APLL24M,
  16. CLK_APLL1_TUNER,
  17. CLK_APLL2_TUNER,
  18. CLK_I2S1_BCLK_SW,
  19. CLK_I2S2_BCLK_SW,
  20. CLK_I2S3_BCLK_SW,
  21. CLK_I2S4_BCLK_SW,
  22. CLK_INFRA_SYS_AUDIO,
  23. CLK_MUX_AUDIO,
  24. CLK_MUX_AUDIOINTBUS,
  25. CLK_TOP_SYSPLL_D2_D4,
  26. /* apll related mux */
  27. CLK_TOP_MUX_AUD_1,
  28. CLK_TOP_APLL1_CK,
  29. CLK_TOP_MUX_AUD_2,
  30. CLK_TOP_APLL2_CK,
  31. CLK_TOP_MUX_AUD_ENG1,
  32. CLK_TOP_APLL1_D8,
  33. CLK_TOP_MUX_AUD_ENG2,
  34. CLK_TOP_APLL2_D8,
  35. CLK_TOP_I2S0_M_SEL,
  36. CLK_TOP_I2S1_M_SEL,
  37. CLK_TOP_I2S2_M_SEL,
  38. CLK_TOP_I2S3_M_SEL,
  39. CLK_TOP_I2S4_M_SEL,
  40. CLK_TOP_I2S5_M_SEL,
  41. CLK_TOP_APLL12_DIV0,
  42. CLK_TOP_APLL12_DIV1,
  43. CLK_TOP_APLL12_DIV2,
  44. CLK_TOP_APLL12_DIV3,
  45. CLK_TOP_APLL12_DIV4,
  46. CLK_TOP_APLL12_DIVB,
  47. CLK_CLK26M,
  48. CLK_NUM
  49. };
  50. static const char *aud_clks[CLK_NUM] = {
  51. [CLK_AFE] = "aud_afe_clk",
  52. [CLK_TML] = "aud_tml_clk",
  53. [CLK_APLL22M] = "aud_apll22m_clk",
  54. [CLK_APLL24M] = "aud_apll24m_clk",
  55. [CLK_APLL1_TUNER] = "aud_apll1_tuner_clk",
  56. [CLK_APLL2_TUNER] = "aud_apll2_tuner_clk",
  57. [CLK_I2S1_BCLK_SW] = "aud_i2s1_bclk_sw",
  58. [CLK_I2S2_BCLK_SW] = "aud_i2s2_bclk_sw",
  59. [CLK_I2S3_BCLK_SW] = "aud_i2s3_bclk_sw",
  60. [CLK_I2S4_BCLK_SW] = "aud_i2s4_bclk_sw",
  61. [CLK_INFRA_SYS_AUDIO] = "aud_infra_clk",
  62. [CLK_MUX_AUDIO] = "top_mux_audio",
  63. [CLK_MUX_AUDIOINTBUS] = "top_mux_aud_intbus",
  64. [CLK_TOP_SYSPLL_D2_D4] = "top_syspll_d2_d4",
  65. [CLK_TOP_MUX_AUD_1] = "top_mux_aud_1",
  66. [CLK_TOP_APLL1_CK] = "top_apll1_ck",
  67. [CLK_TOP_MUX_AUD_2] = "top_mux_aud_2",
  68. [CLK_TOP_APLL2_CK] = "top_apll2_ck",
  69. [CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1",
  70. [CLK_TOP_APLL1_D8] = "top_apll1_d8",
  71. [CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2",
  72. [CLK_TOP_APLL2_D8] = "top_apll2_d8",
  73. [CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel",
  74. [CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel",
  75. [CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel",
  76. [CLK_TOP_I2S3_M_SEL] = "top_i2s3_m_sel",
  77. [CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel",
  78. [CLK_TOP_I2S5_M_SEL] = "top_i2s5_m_sel",
  79. [CLK_TOP_APLL12_DIV0] = "top_apll12_div0",
  80. [CLK_TOP_APLL12_DIV1] = "top_apll12_div1",
  81. [CLK_TOP_APLL12_DIV2] = "top_apll12_div2",
  82. [CLK_TOP_APLL12_DIV3] = "top_apll12_div3",
  83. [CLK_TOP_APLL12_DIV4] = "top_apll12_div4",
  84. [CLK_TOP_APLL12_DIVB] = "top_apll12_divb",
  85. [CLK_CLK26M] = "top_clk26m_clk",
  86. };
  87. int mt8183_init_clock(struct mtk_base_afe *afe)
  88. {
  89. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  90. int i;
  91. afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk),
  92. GFP_KERNEL);
  93. if (!afe_priv->clk)
  94. return -ENOMEM;
  95. for (i = 0; i < CLK_NUM; i++) {
  96. afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
  97. if (IS_ERR(afe_priv->clk[i])) {
  98. dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",
  99. __func__, aud_clks[i],
  100. PTR_ERR(afe_priv->clk[i]));
  101. return PTR_ERR(afe_priv->clk[i]);
  102. }
  103. }
  104. return 0;
  105. }
  106. int mt8183_afe_enable_clock(struct mtk_base_afe *afe)
  107. {
  108. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  109. int ret;
  110. ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
  111. if (ret) {
  112. dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
  113. __func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret);
  114. goto CLK_INFRA_SYS_AUDIO_ERR;
  115. }
  116. ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]);
  117. if (ret) {
  118. dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
  119. __func__, aud_clks[CLK_MUX_AUDIO], ret);
  120. goto CLK_MUX_AUDIO_ERR;
  121. }
  122. ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO],
  123. afe_priv->clk[CLK_CLK26M]);
  124. if (ret) {
  125. dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
  126. __func__, aud_clks[CLK_MUX_AUDIO],
  127. aud_clks[CLK_CLK26M], ret);
  128. goto CLK_MUX_AUDIO_ERR;
  129. }
  130. ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
  131. if (ret) {
  132. dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
  133. __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);
  134. goto CLK_MUX_AUDIO_INTBUS_ERR;
  135. }
  136. ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS],
  137. afe_priv->clk[CLK_TOP_SYSPLL_D2_D4]);
  138. if (ret) {
  139. dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
  140. __func__, aud_clks[CLK_MUX_AUDIOINTBUS],
  141. aud_clks[CLK_TOP_SYSPLL_D2_D4], ret);
  142. goto CLK_MUX_AUDIO_INTBUS_ERR;
  143. }
  144. ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]);
  145. if (ret) {
  146. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  147. __func__, aud_clks[CLK_AFE], ret);
  148. goto CLK_AFE_ERR;
  149. }
  150. ret = clk_prepare_enable(afe_priv->clk[CLK_I2S1_BCLK_SW]);
  151. if (ret) {
  152. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  153. __func__, aud_clks[CLK_I2S1_BCLK_SW], ret);
  154. goto CLK_I2S1_BCLK_SW_ERR;
  155. }
  156. ret = clk_prepare_enable(afe_priv->clk[CLK_I2S2_BCLK_SW]);
  157. if (ret) {
  158. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  159. __func__, aud_clks[CLK_I2S2_BCLK_SW], ret);
  160. goto CLK_I2S2_BCLK_SW_ERR;
  161. }
  162. ret = clk_prepare_enable(afe_priv->clk[CLK_I2S3_BCLK_SW]);
  163. if (ret) {
  164. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  165. __func__, aud_clks[CLK_I2S3_BCLK_SW], ret);
  166. goto CLK_I2S3_BCLK_SW_ERR;
  167. }
  168. ret = clk_prepare_enable(afe_priv->clk[CLK_I2S4_BCLK_SW]);
  169. if (ret) {
  170. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  171. __func__, aud_clks[CLK_I2S4_BCLK_SW], ret);
  172. goto CLK_I2S4_BCLK_SW_ERR;
  173. }
  174. return 0;
  175. CLK_I2S4_BCLK_SW_ERR:
  176. clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);
  177. CLK_I2S3_BCLK_SW_ERR:
  178. clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);
  179. CLK_I2S2_BCLK_SW_ERR:
  180. clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);
  181. CLK_I2S1_BCLK_SW_ERR:
  182. clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
  183. CLK_AFE_ERR:
  184. clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
  185. CLK_MUX_AUDIO_INTBUS_ERR:
  186. clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
  187. CLK_MUX_AUDIO_ERR:
  188. clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
  189. CLK_INFRA_SYS_AUDIO_ERR:
  190. return ret;
  191. }
  192. int mt8183_afe_disable_clock(struct mtk_base_afe *afe)
  193. {
  194. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  195. clk_disable_unprepare(afe_priv->clk[CLK_I2S4_BCLK_SW]);
  196. clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);
  197. clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);
  198. clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);
  199. clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
  200. clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
  201. clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
  202. clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
  203. return 0;
  204. }
  205. /* apll */
  206. static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)
  207. {
  208. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  209. int ret;
  210. if (enable) {
  211. ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
  212. if (ret) {
  213. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  214. __func__, aud_clks[CLK_TOP_MUX_AUD_1], ret);
  215. goto ERR_ENABLE_CLK_TOP_MUX_AUD_1;
  216. }
  217. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
  218. afe_priv->clk[CLK_TOP_APLL1_CK]);
  219. if (ret) {
  220. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  221. __func__, aud_clks[CLK_TOP_MUX_AUD_1],
  222. aud_clks[CLK_TOP_APLL1_CK], ret);
  223. goto ERR_SELECT_CLK_TOP_MUX_AUD_1;
  224. }
  225. /* 180.6336 / 8 = 22.5792MHz */
  226. ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
  227. if (ret) {
  228. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  229. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret);
  230. goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1;
  231. }
  232. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
  233. afe_priv->clk[CLK_TOP_APLL1_D8]);
  234. if (ret) {
  235. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  236. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
  237. aud_clks[CLK_TOP_APLL1_D8], ret);
  238. goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG1;
  239. }
  240. } else {
  241. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
  242. afe_priv->clk[CLK_CLK26M]);
  243. if (ret) {
  244. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  245. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
  246. aud_clks[CLK_CLK26M], ret);
  247. goto EXIT;
  248. }
  249. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
  250. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
  251. afe_priv->clk[CLK_CLK26M]);
  252. if (ret) {
  253. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  254. __func__, aud_clks[CLK_TOP_MUX_AUD_1],
  255. aud_clks[CLK_CLK26M], ret);
  256. goto EXIT;
  257. }
  258. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
  259. }
  260. return 0;
  261. ERR_SELECT_CLK_TOP_MUX_AUD_ENG1:
  262. clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
  263. afe_priv->clk[CLK_CLK26M]);
  264. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
  265. ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1:
  266. ERR_SELECT_CLK_TOP_MUX_AUD_1:
  267. clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
  268. afe_priv->clk[CLK_CLK26M]);
  269. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
  270. ERR_ENABLE_CLK_TOP_MUX_AUD_1:
  271. EXIT:
  272. return ret;
  273. }
  274. static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)
  275. {
  276. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  277. int ret;
  278. if (enable) {
  279. ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
  280. if (ret) {
  281. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  282. __func__, aud_clks[CLK_TOP_MUX_AUD_2], ret);
  283. goto ERR_ENABLE_CLK_TOP_MUX_AUD_2;
  284. }
  285. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
  286. afe_priv->clk[CLK_TOP_APLL2_CK]);
  287. if (ret) {
  288. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  289. __func__, aud_clks[CLK_TOP_MUX_AUD_2],
  290. aud_clks[CLK_TOP_APLL2_CK], ret);
  291. goto ERR_SELECT_CLK_TOP_MUX_AUD_2;
  292. }
  293. /* 196.608 / 8 = 24.576MHz */
  294. ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
  295. if (ret) {
  296. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  297. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret);
  298. goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2;
  299. }
  300. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
  301. afe_priv->clk[CLK_TOP_APLL2_D8]);
  302. if (ret) {
  303. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  304. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
  305. aud_clks[CLK_TOP_APLL2_D8], ret);
  306. goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG2;
  307. }
  308. } else {
  309. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
  310. afe_priv->clk[CLK_CLK26M]);
  311. if (ret) {
  312. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  313. __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
  314. aud_clks[CLK_CLK26M], ret);
  315. goto EXIT;
  316. }
  317. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
  318. ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
  319. afe_priv->clk[CLK_CLK26M]);
  320. if (ret) {
  321. dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
  322. __func__, aud_clks[CLK_TOP_MUX_AUD_2],
  323. aud_clks[CLK_CLK26M], ret);
  324. goto EXIT;
  325. }
  326. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
  327. }
  328. return 0;
  329. ERR_SELECT_CLK_TOP_MUX_AUD_ENG2:
  330. clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
  331. afe_priv->clk[CLK_CLK26M]);
  332. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
  333. ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2:
  334. ERR_SELECT_CLK_TOP_MUX_AUD_2:
  335. clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
  336. afe_priv->clk[CLK_CLK26M]);
  337. clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
  338. ERR_ENABLE_CLK_TOP_MUX_AUD_2:
  339. EXIT:
  340. return ret;
  341. }
  342. int mt8183_apll1_enable(struct mtk_base_afe *afe)
  343. {
  344. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  345. int ret;
  346. /* setting for APLL */
  347. apll1_mux_setting(afe, true);
  348. ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]);
  349. if (ret) {
  350. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  351. __func__, aud_clks[CLK_APLL22M], ret);
  352. goto ERR_CLK_APLL22M;
  353. }
  354. ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]);
  355. if (ret) {
  356. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  357. __func__, aud_clks[CLK_APLL1_TUNER], ret);
  358. goto ERR_CLK_APLL1_TUNER;
  359. }
  360. regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,
  361. 0x0000FFF7, 0x00000832);
  362. regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1);
  363. regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
  364. AFE_22M_ON_MASK_SFT,
  365. 0x1 << AFE_22M_ON_SFT);
  366. return 0;
  367. ERR_CLK_APLL1_TUNER:
  368. clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
  369. ERR_CLK_APLL22M:
  370. return ret;
  371. }
  372. void mt8183_apll1_disable(struct mtk_base_afe *afe)
  373. {
  374. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  375. regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
  376. AFE_22M_ON_MASK_SFT,
  377. 0x0 << AFE_22M_ON_SFT);
  378. regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x0);
  379. clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);
  380. clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
  381. apll1_mux_setting(afe, false);
  382. }
  383. int mt8183_apll2_enable(struct mtk_base_afe *afe)
  384. {
  385. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  386. int ret;
  387. /* setting for APLL */
  388. apll2_mux_setting(afe, true);
  389. ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]);
  390. if (ret) {
  391. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  392. __func__, aud_clks[CLK_APLL24M], ret);
  393. goto ERR_CLK_APLL24M;
  394. }
  395. ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]);
  396. if (ret) {
  397. dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
  398. __func__, aud_clks[CLK_APLL2_TUNER], ret);
  399. goto ERR_CLK_APLL2_TUNER;
  400. }
  401. regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,
  402. 0x0000FFF7, 0x00000634);
  403. regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1);
  404. regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
  405. AFE_24M_ON_MASK_SFT,
  406. 0x1 << AFE_24M_ON_SFT);
  407. return 0;
  408. ERR_CLK_APLL2_TUNER:
  409. clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
  410. ERR_CLK_APLL24M:
  411. return ret;
  412. }
  413. void mt8183_apll2_disable(struct mtk_base_afe *afe)
  414. {
  415. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  416. regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
  417. AFE_24M_ON_MASK_SFT,
  418. 0x0 << AFE_24M_ON_SFT);
  419. regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x0);
  420. clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);
  421. clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
  422. apll2_mux_setting(afe, false);
  423. }
  424. int mt8183_get_apll_rate(struct mtk_base_afe *afe, int apll)
  425. {
  426. return (apll == MT8183_APLL1) ? 180633600 : 196608000;
  427. }
  428. int mt8183_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
  429. {
  430. return ((rate % 8000) == 0) ? MT8183_APLL2 : MT8183_APLL1;
  431. }
  432. int mt8183_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
  433. {
  434. if (strcmp(name, APLL1_W_NAME) == 0)
  435. return MT8183_APLL1;
  436. else
  437. return MT8183_APLL2;
  438. }
  439. /* mck */
  440. struct mt8183_mck_div {
  441. int m_sel_id;
  442. int div_clk_id;
  443. };
  444. static const struct mt8183_mck_div mck_div[MT8183_MCK_NUM] = {
  445. [MT8183_I2S0_MCK] = {
  446. .m_sel_id = CLK_TOP_I2S0_M_SEL,
  447. .div_clk_id = CLK_TOP_APLL12_DIV0,
  448. },
  449. [MT8183_I2S1_MCK] = {
  450. .m_sel_id = CLK_TOP_I2S1_M_SEL,
  451. .div_clk_id = CLK_TOP_APLL12_DIV1,
  452. },
  453. [MT8183_I2S2_MCK] = {
  454. .m_sel_id = CLK_TOP_I2S2_M_SEL,
  455. .div_clk_id = CLK_TOP_APLL12_DIV2,
  456. },
  457. [MT8183_I2S3_MCK] = {
  458. .m_sel_id = CLK_TOP_I2S3_M_SEL,
  459. .div_clk_id = CLK_TOP_APLL12_DIV3,
  460. },
  461. [MT8183_I2S4_MCK] = {
  462. .m_sel_id = CLK_TOP_I2S4_M_SEL,
  463. .div_clk_id = CLK_TOP_APLL12_DIV4,
  464. },
  465. [MT8183_I2S4_BCK] = {
  466. .m_sel_id = -1,
  467. .div_clk_id = CLK_TOP_APLL12_DIVB,
  468. },
  469. [MT8183_I2S5_MCK] = {
  470. .m_sel_id = -1,
  471. .div_clk_id = -1,
  472. },
  473. };
  474. int mt8183_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)
  475. {
  476. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  477. int apll = mt8183_get_apll_by_rate(afe, rate);
  478. int apll_clk_id = apll == MT8183_APLL1 ?
  479. CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2;
  480. int m_sel_id = mck_div[mck_id].m_sel_id;
  481. int div_clk_id = mck_div[mck_id].div_clk_id;
  482. int ret;
  483. /* i2s5 mck not support */
  484. if (mck_id == MT8183_I2S5_MCK)
  485. return 0;
  486. /* select apll */
  487. if (m_sel_id >= 0) {
  488. ret = clk_prepare_enable(afe_priv->clk[m_sel_id]);
  489. if (ret) {
  490. dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
  491. __func__, aud_clks[m_sel_id], ret);
  492. goto ERR_ENABLE_MCLK;
  493. }
  494. ret = clk_set_parent(afe_priv->clk[m_sel_id],
  495. afe_priv->clk[apll_clk_id]);
  496. if (ret) {
  497. dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
  498. __func__, aud_clks[m_sel_id],
  499. aud_clks[apll_clk_id], ret);
  500. goto ERR_SELECT_MCLK;
  501. }
  502. }
  503. /* enable div, set rate */
  504. ret = clk_prepare_enable(afe_priv->clk[div_clk_id]);
  505. if (ret) {
  506. dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
  507. __func__, aud_clks[div_clk_id], ret);
  508. goto ERR_ENABLE_MCLK_DIV;
  509. }
  510. ret = clk_set_rate(afe_priv->clk[div_clk_id], rate);
  511. if (ret) {
  512. dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n",
  513. __func__, aud_clks[div_clk_id],
  514. rate, ret);
  515. goto ERR_SET_MCLK_RATE;
  516. }
  517. return 0;
  518. ERR_SET_MCLK_RATE:
  519. clk_disable_unprepare(afe_priv->clk[div_clk_id]);
  520. ERR_ENABLE_MCLK_DIV:
  521. ERR_SELECT_MCLK:
  522. if (m_sel_id >= 0)
  523. clk_disable_unprepare(afe_priv->clk[m_sel_id]);
  524. ERR_ENABLE_MCLK:
  525. return ret;
  526. }
  527. void mt8183_mck_disable(struct mtk_base_afe *afe, int mck_id)
  528. {
  529. struct mt8183_afe_private *afe_priv = afe->platform_priv;
  530. int m_sel_id = mck_div[mck_id].m_sel_id;
  531. int div_clk_id = mck_div[mck_id].div_clk_id;
  532. /* i2s5 mck not support */
  533. if (mck_id == MT8183_I2S5_MCK)
  534. return;
  535. clk_disable_unprepare(afe_priv->clk[div_clk_id]);
  536. if (m_sel_id >= 0)
  537. clk_disable_unprepare(afe_priv->clk[m_sel_id]);
  538. }