mt8188-afe-clk.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mt8188-afe-clk.c -- MediaTek 8188 afe clock ctrl
  4. *
  5. * Copyright (c) 2022 MediaTek Inc.
  6. * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
  7. * Trevor Wu <trevor.wu@mediatek.com>
  8. * Chun-Chia Chiu <chun-chia.chiu@mediatek.com>
  9. */
  10. #include <linux/clk.h>
  11. #include "mt8188-afe-common.h"
  12. #include "mt8188-afe-clk.h"
  13. #include "mt8188-audsys-clk.h"
  14. #include "mt8188-reg.h"
  15. static const char *aud_clks[MT8188_CLK_NUM] = {
  16. /* xtal */
  17. [MT8188_CLK_XTAL_26M] = "clk26m",
  18. /* pll */
  19. [MT8188_CLK_APMIXED_APLL1] = "apll1",
  20. [MT8188_CLK_APMIXED_APLL2] = "apll2",
  21. /* divider */
  22. [MT8188_CLK_TOP_APLL1_D4] = "apll1_d4",
  23. [MT8188_CLK_TOP_APLL2_D4] = "apll2_d4",
  24. [MT8188_CLK_TOP_APLL12_DIV0] = "apll12_div0",
  25. [MT8188_CLK_TOP_APLL12_DIV1] = "apll12_div1",
  26. [MT8188_CLK_TOP_APLL12_DIV2] = "apll12_div2",
  27. [MT8188_CLK_TOP_APLL12_DIV3] = "apll12_div3",
  28. [MT8188_CLK_TOP_APLL12_DIV4] = "apll12_div4",
  29. [MT8188_CLK_TOP_APLL12_DIV9] = "apll12_div9",
  30. /* mux */
  31. [MT8188_CLK_TOP_A1SYS_HP_SEL] = "top_a1sys_hp",
  32. [MT8188_CLK_TOP_A2SYS_SEL] = "top_a2sys",
  33. [MT8188_CLK_TOP_AUD_IEC_SEL] = "top_aud_iec",
  34. [MT8188_CLK_TOP_AUD_INTBUS_SEL] = "top_aud_intbus",
  35. [MT8188_CLK_TOP_AUDIO_H_SEL] = "top_audio_h",
  36. [MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = "top_audio_local_bus",
  37. [MT8188_CLK_TOP_DPTX_M_SEL] = "top_dptx",
  38. [MT8188_CLK_TOP_I2SO1_M_SEL] = "top_i2so1",
  39. [MT8188_CLK_TOP_I2SO2_M_SEL] = "top_i2so2",
  40. [MT8188_CLK_TOP_I2SI1_M_SEL] = "top_i2si1",
  41. [MT8188_CLK_TOP_I2SI2_M_SEL] = "top_i2si2",
  42. /* clock gate */
  43. [MT8188_CLK_ADSP_AUDIO_26M] = "adsp_audio_26m",
  44. /* afe clock gate */
  45. [MT8188_CLK_AUD_AFE] = "aud_afe",
  46. [MT8188_CLK_AUD_APLL1_TUNER] = "aud_apll1_tuner",
  47. [MT8188_CLK_AUD_APLL2_TUNER] = "aud_apll2_tuner",
  48. [MT8188_CLK_AUD_APLL] = "aud_apll",
  49. [MT8188_CLK_AUD_APLL2] = "aud_apll2",
  50. [MT8188_CLK_AUD_DAC] = "aud_dac",
  51. [MT8188_CLK_AUD_ADC] = "aud_adc",
  52. [MT8188_CLK_AUD_DAC_HIRES] = "aud_dac_hires",
  53. [MT8188_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp",
  54. [MT8188_CLK_AUD_ADC_HIRES] = "aud_adc_hires",
  55. [MT8188_CLK_AUD_I2SIN] = "aud_i2sin",
  56. [MT8188_CLK_AUD_TDM_IN] = "aud_tdm_in",
  57. [MT8188_CLK_AUD_I2S_OUT] = "aud_i2s_out",
  58. [MT8188_CLK_AUD_TDM_OUT] = "aud_tdm_out",
  59. [MT8188_CLK_AUD_HDMI_OUT] = "aud_hdmi_out",
  60. [MT8188_CLK_AUD_ASRC11] = "aud_asrc11",
  61. [MT8188_CLK_AUD_ASRC12] = "aud_asrc12",
  62. [MT8188_CLK_AUD_A1SYS] = "aud_a1sys",
  63. [MT8188_CLK_AUD_A2SYS] = "aud_a2sys",
  64. [MT8188_CLK_AUD_PCMIF] = "aud_pcmif",
  65. [MT8188_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1",
  66. [MT8188_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2",
  67. [MT8188_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3",
  68. [MT8188_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4",
  69. [MT8188_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5",
  70. [MT8188_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6",
  71. [MT8188_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8",
  72. [MT8188_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9",
  73. [MT8188_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10",
  74. [MT8188_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2",
  75. [MT8188_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3",
  76. [MT8188_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6",
  77. [MT8188_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7",
  78. [MT8188_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8",
  79. [MT8188_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10",
  80. [MT8188_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11",
  81. };
  82. struct mt8188_afe_tuner_cfg {
  83. unsigned int id;
  84. int apll_div_reg;
  85. unsigned int apll_div_shift;
  86. unsigned int apll_div_maskbit;
  87. unsigned int apll_div_default;
  88. int ref_ck_sel_reg;
  89. unsigned int ref_ck_sel_shift;
  90. unsigned int ref_ck_sel_maskbit;
  91. unsigned int ref_ck_sel_default;
  92. int tuner_en_reg;
  93. unsigned int tuner_en_shift;
  94. unsigned int tuner_en_maskbit;
  95. int upper_bound_reg;
  96. unsigned int upper_bound_shift;
  97. unsigned int upper_bound_maskbit;
  98. unsigned int upper_bound_default;
  99. spinlock_t ctrl_lock; /* lock for apll tuner ctrl*/
  100. int ref_cnt;
  101. };
  102. static struct mt8188_afe_tuner_cfg
  103. mt8188_afe_tuner_cfgs[MT8188_AUD_PLL_NUM] = {
  104. [MT8188_AUD_PLL1] = {
  105. .id = MT8188_AUD_PLL1,
  106. .apll_div_reg = AFE_APLL_TUNER_CFG,
  107. .apll_div_shift = 4,
  108. .apll_div_maskbit = 0xf,
  109. .apll_div_default = 0x7,
  110. .ref_ck_sel_reg = AFE_APLL_TUNER_CFG,
  111. .ref_ck_sel_shift = 1,
  112. .ref_ck_sel_maskbit = 0x3,
  113. .ref_ck_sel_default = 0x2,
  114. .tuner_en_reg = AFE_APLL_TUNER_CFG,
  115. .tuner_en_shift = 0,
  116. .tuner_en_maskbit = 0x1,
  117. .upper_bound_reg = AFE_APLL_TUNER_CFG,
  118. .upper_bound_shift = 8,
  119. .upper_bound_maskbit = 0xff,
  120. .upper_bound_default = 0x3,
  121. },
  122. [MT8188_AUD_PLL2] = {
  123. .id = MT8188_AUD_PLL2,
  124. .apll_div_reg = AFE_APLL_TUNER_CFG1,
  125. .apll_div_shift = 4,
  126. .apll_div_maskbit = 0xf,
  127. .apll_div_default = 0x7,
  128. .ref_ck_sel_reg = AFE_APLL_TUNER_CFG1,
  129. .ref_ck_sel_shift = 1,
  130. .ref_ck_sel_maskbit = 0x3,
  131. .ref_ck_sel_default = 0x1,
  132. .tuner_en_reg = AFE_APLL_TUNER_CFG1,
  133. .tuner_en_shift = 0,
  134. .tuner_en_maskbit = 0x1,
  135. .upper_bound_reg = AFE_APLL_TUNER_CFG1,
  136. .upper_bound_shift = 8,
  137. .upper_bound_maskbit = 0xff,
  138. .upper_bound_default = 0x3,
  139. },
  140. [MT8188_AUD_PLL3] = {
  141. .id = MT8188_AUD_PLL3,
  142. .apll_div_reg = AFE_EARC_APLL_TUNER_CFG,
  143. .apll_div_shift = 4,
  144. .apll_div_maskbit = 0x3f,
  145. .apll_div_default = 0x3,
  146. .ref_ck_sel_reg = AFE_EARC_APLL_TUNER_CFG,
  147. .ref_ck_sel_shift = 24,
  148. .ref_ck_sel_maskbit = 0x3,
  149. .ref_ck_sel_default = 0x0,
  150. .tuner_en_reg = AFE_EARC_APLL_TUNER_CFG,
  151. .tuner_en_shift = 0,
  152. .tuner_en_maskbit = 0x1,
  153. .upper_bound_reg = AFE_EARC_APLL_TUNER_CFG,
  154. .upper_bound_shift = 12,
  155. .upper_bound_maskbit = 0xff,
  156. .upper_bound_default = 0x4,
  157. },
  158. [MT8188_AUD_PLL4] = {
  159. .id = MT8188_AUD_PLL4,
  160. .apll_div_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
  161. .apll_div_shift = 4,
  162. .apll_div_maskbit = 0x3f,
  163. .apll_div_default = 0x7,
  164. .ref_ck_sel_reg = AFE_SPDIFIN_APLL_TUNER_CFG1,
  165. .ref_ck_sel_shift = 8,
  166. .ref_ck_sel_maskbit = 0x1,
  167. .ref_ck_sel_default = 0,
  168. .tuner_en_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
  169. .tuner_en_shift = 0,
  170. .tuner_en_maskbit = 0x1,
  171. .upper_bound_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
  172. .upper_bound_shift = 12,
  173. .upper_bound_maskbit = 0xff,
  174. .upper_bound_default = 0x4,
  175. },
  176. [MT8188_AUD_PLL5] = {
  177. .id = MT8188_AUD_PLL5,
  178. .apll_div_reg = AFE_LINEIN_APLL_TUNER_CFG,
  179. .apll_div_shift = 4,
  180. .apll_div_maskbit = 0x3f,
  181. .apll_div_default = 0x3,
  182. .ref_ck_sel_reg = AFE_LINEIN_APLL_TUNER_CFG,
  183. .ref_ck_sel_shift = 24,
  184. .ref_ck_sel_maskbit = 0x1,
  185. .ref_ck_sel_default = 0,
  186. .tuner_en_reg = AFE_LINEIN_APLL_TUNER_CFG,
  187. .tuner_en_shift = 0,
  188. .tuner_en_maskbit = 0x1,
  189. .upper_bound_reg = AFE_LINEIN_APLL_TUNER_CFG,
  190. .upper_bound_shift = 12,
  191. .upper_bound_maskbit = 0xff,
  192. .upper_bound_default = 0x4,
  193. },
  194. };
  195. static struct mt8188_afe_tuner_cfg *mt8188_afe_found_apll_tuner(unsigned int id)
  196. {
  197. if (id >= MT8188_AUD_PLL_NUM)
  198. return NULL;
  199. return &mt8188_afe_tuner_cfgs[id];
  200. }
  201. static int mt8188_afe_init_apll_tuner(unsigned int id)
  202. {
  203. struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
  204. if (!cfg)
  205. return -EINVAL;
  206. cfg->ref_cnt = 0;
  207. spin_lock_init(&cfg->ctrl_lock);
  208. return 0;
  209. }
  210. static int mt8188_afe_setup_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
  211. {
  212. const struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
  213. if (!cfg)
  214. return -EINVAL;
  215. regmap_update_bits(afe->regmap,
  216. cfg->apll_div_reg,
  217. cfg->apll_div_maskbit << cfg->apll_div_shift,
  218. cfg->apll_div_default << cfg->apll_div_shift);
  219. regmap_update_bits(afe->regmap,
  220. cfg->ref_ck_sel_reg,
  221. cfg->ref_ck_sel_maskbit << cfg->ref_ck_sel_shift,
  222. cfg->ref_ck_sel_default << cfg->ref_ck_sel_shift);
  223. regmap_update_bits(afe->regmap,
  224. cfg->upper_bound_reg,
  225. cfg->upper_bound_maskbit << cfg->upper_bound_shift,
  226. cfg->upper_bound_default << cfg->upper_bound_shift);
  227. return 0;
  228. }
  229. static int mt8188_afe_enable_tuner_clk(struct mtk_base_afe *afe,
  230. unsigned int id)
  231. {
  232. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  233. switch (id) {
  234. case MT8188_AUD_PLL1:
  235. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);
  236. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);
  237. break;
  238. case MT8188_AUD_PLL2:
  239. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);
  240. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);
  241. break;
  242. default:
  243. return -EINVAL;
  244. }
  245. return 0;
  246. }
  247. static int mt8188_afe_disable_tuner_clk(struct mtk_base_afe *afe,
  248. unsigned int id)
  249. {
  250. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  251. switch (id) {
  252. case MT8188_AUD_PLL1:
  253. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);
  254. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);
  255. break;
  256. case MT8188_AUD_PLL2:
  257. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);
  258. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);
  259. break;
  260. default:
  261. return -EINVAL;
  262. }
  263. return 0;
  264. }
  265. static int mt8188_afe_enable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
  266. {
  267. struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
  268. unsigned long flags;
  269. int ret;
  270. if (!cfg)
  271. return -EINVAL;
  272. ret = mt8188_afe_setup_apll_tuner(afe, id);
  273. if (ret)
  274. return ret;
  275. ret = mt8188_afe_enable_tuner_clk(afe, id);
  276. if (ret)
  277. return ret;
  278. spin_lock_irqsave(&cfg->ctrl_lock, flags);
  279. cfg->ref_cnt++;
  280. if (cfg->ref_cnt == 1)
  281. regmap_update_bits(afe->regmap,
  282. cfg->tuner_en_reg,
  283. cfg->tuner_en_maskbit << cfg->tuner_en_shift,
  284. BIT(cfg->tuner_en_shift));
  285. spin_unlock_irqrestore(&cfg->ctrl_lock, flags);
  286. return 0;
  287. }
  288. static int mt8188_afe_disable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
  289. {
  290. struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
  291. unsigned long flags;
  292. int ret;
  293. if (!cfg)
  294. return -EINVAL;
  295. spin_lock_irqsave(&cfg->ctrl_lock, flags);
  296. cfg->ref_cnt--;
  297. if (cfg->ref_cnt == 0)
  298. regmap_update_bits(afe->regmap,
  299. cfg->tuner_en_reg,
  300. cfg->tuner_en_maskbit << cfg->tuner_en_shift,
  301. 0 << cfg->tuner_en_shift);
  302. else if (cfg->ref_cnt < 0)
  303. cfg->ref_cnt = 0;
  304. spin_unlock_irqrestore(&cfg->ctrl_lock, flags);
  305. ret = mt8188_afe_disable_tuner_clk(afe, id);
  306. if (ret)
  307. return ret;
  308. return 0;
  309. }
  310. int mt8188_afe_get_mclk_source_clk_id(int sel)
  311. {
  312. switch (sel) {
  313. case MT8188_MCK_SEL_26M:
  314. return MT8188_CLK_XTAL_26M;
  315. case MT8188_MCK_SEL_APLL1:
  316. return MT8188_CLK_APMIXED_APLL1;
  317. case MT8188_MCK_SEL_APLL2:
  318. return MT8188_CLK_APMIXED_APLL2;
  319. default:
  320. return -EINVAL;
  321. }
  322. }
  323. int mt8188_afe_get_mclk_source_rate(struct mtk_base_afe *afe, int apll)
  324. {
  325. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  326. int clk_id = mt8188_afe_get_mclk_source_clk_id(apll);
  327. if (clk_id < 0) {
  328. dev_dbg(afe->dev, "invalid clk id\n");
  329. return 0;
  330. }
  331. return clk_get_rate(afe_priv->clk[clk_id]);
  332. }
  333. int mt8188_afe_get_default_mclk_source_by_rate(int rate)
  334. {
  335. return ((rate % 8000) == 0) ?
  336. MT8188_MCK_SEL_APLL1 : MT8188_MCK_SEL_APLL2;
  337. }
  338. int mt8188_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
  339. {
  340. return ((rate % 8000) == 0) ? MT8188_AUD_PLL1 : MT8188_AUD_PLL2;
  341. }
  342. int mt8188_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
  343. {
  344. if (strcmp(name, APLL1_W_NAME) == 0)
  345. return MT8188_AUD_PLL1;
  346. return MT8188_AUD_PLL2;
  347. }
  348. int mt8188_afe_init_clock(struct mtk_base_afe *afe)
  349. {
  350. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  351. int i, ret;
  352. ret = mt8188_audsys_clk_register(afe);
  353. if (ret) {
  354. dev_err(afe->dev, "register audsys clk fail %d\n", ret);
  355. return ret;
  356. }
  357. afe_priv->clk =
  358. devm_kcalloc(afe->dev, MT8188_CLK_NUM, sizeof(*afe_priv->clk),
  359. GFP_KERNEL);
  360. if (!afe_priv->clk)
  361. return -ENOMEM;
  362. for (i = 0; i < MT8188_CLK_NUM; i++) {
  363. afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
  364. if (IS_ERR(afe_priv->clk[i])) {
  365. dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",
  366. __func__, aud_clks[i],
  367. PTR_ERR(afe_priv->clk[i]));
  368. return PTR_ERR(afe_priv->clk[i]);
  369. }
  370. }
  371. /* initial tuner */
  372. for (i = 0; i < MT8188_AUD_PLL_NUM; i++) {
  373. ret = mt8188_afe_init_apll_tuner(i);
  374. if (ret) {
  375. dev_info(afe->dev, "%s(), init apll_tuner%d failed",
  376. __func__, (i + 1));
  377. return -EINVAL;
  378. }
  379. }
  380. return 0;
  381. }
  382. int mt8188_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk)
  383. {
  384. int ret;
  385. if (clk) {
  386. ret = clk_prepare_enable(clk);
  387. if (ret) {
  388. dev_dbg(afe->dev, "%s(), failed to enable clk\n",
  389. __func__);
  390. return ret;
  391. }
  392. } else {
  393. dev_dbg(afe->dev, "NULL clk\n");
  394. }
  395. return 0;
  396. }
  397. EXPORT_SYMBOL_GPL(mt8188_afe_enable_clk);
  398. void mt8188_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk)
  399. {
  400. if (clk)
  401. clk_disable_unprepare(clk);
  402. else
  403. dev_dbg(afe->dev, "NULL clk\n");
  404. }
  405. EXPORT_SYMBOL_GPL(mt8188_afe_disable_clk);
  406. int mt8188_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk,
  407. unsigned int rate)
  408. {
  409. int ret;
  410. if (clk) {
  411. ret = clk_set_rate(clk, rate);
  412. if (ret) {
  413. dev_dbg(afe->dev, "%s(), failed to set clk rate\n",
  414. __func__);
  415. return ret;
  416. }
  417. }
  418. return 0;
  419. }
  420. int mt8188_afe_set_clk_parent(struct mtk_base_afe *afe, struct clk *clk,
  421. struct clk *parent)
  422. {
  423. int ret;
  424. if (clk && parent) {
  425. ret = clk_set_parent(clk, parent);
  426. if (ret) {
  427. dev_dbg(afe->dev, "%s(), failed to set clk parent %d\n",
  428. __func__, ret);
  429. return ret;
  430. }
  431. }
  432. return 0;
  433. }
  434. static unsigned int get_top_cg_reg(unsigned int cg_type)
  435. {
  436. switch (cg_type) {
  437. case MT8188_TOP_CG_A1SYS_TIMING:
  438. case MT8188_TOP_CG_A2SYS_TIMING:
  439. case MT8188_TOP_CG_26M_TIMING:
  440. return ASYS_TOP_CON;
  441. default:
  442. return 0;
  443. }
  444. }
  445. static unsigned int get_top_cg_mask(unsigned int cg_type)
  446. {
  447. switch (cg_type) {
  448. case MT8188_TOP_CG_A1SYS_TIMING:
  449. return ASYS_TOP_CON_A1SYS_TIMING_ON;
  450. case MT8188_TOP_CG_A2SYS_TIMING:
  451. return ASYS_TOP_CON_A2SYS_TIMING_ON;
  452. case MT8188_TOP_CG_26M_TIMING:
  453. return ASYS_TOP_CON_26M_TIMING_ON;
  454. default:
  455. return 0;
  456. }
  457. }
  458. static unsigned int get_top_cg_on_val(unsigned int cg_type)
  459. {
  460. switch (cg_type) {
  461. case MT8188_TOP_CG_A1SYS_TIMING:
  462. case MT8188_TOP_CG_A2SYS_TIMING:
  463. case MT8188_TOP_CG_26M_TIMING:
  464. return get_top_cg_mask(cg_type);
  465. default:
  466. return 0;
  467. }
  468. }
  469. static unsigned int get_top_cg_off_val(unsigned int cg_type)
  470. {
  471. switch (cg_type) {
  472. case MT8188_TOP_CG_A1SYS_TIMING:
  473. case MT8188_TOP_CG_A2SYS_TIMING:
  474. case MT8188_TOP_CG_26M_TIMING:
  475. return 0;
  476. default:
  477. return get_top_cg_mask(cg_type);
  478. }
  479. }
  480. static int mt8188_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
  481. {
  482. unsigned int reg = get_top_cg_reg(cg_type);
  483. unsigned int mask = get_top_cg_mask(cg_type);
  484. unsigned int val = get_top_cg_on_val(cg_type);
  485. regmap_update_bits(afe->regmap, reg, mask, val);
  486. return 0;
  487. }
  488. static int mt8188_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
  489. {
  490. unsigned int reg = get_top_cg_reg(cg_type);
  491. unsigned int mask = get_top_cg_mask(cg_type);
  492. unsigned int val = get_top_cg_off_val(cg_type);
  493. regmap_update_bits(afe->regmap, reg, mask, val);
  494. return 0;
  495. }
  496. int mt8188_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)
  497. {
  498. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  499. /* bus clock for AFE external access, like DRAM */
  500. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);
  501. /* bus clock for AFE internal access, like AFE SRAM */
  502. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);
  503. /* audio 26m clock source */
  504. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);
  505. /* AFE hw clock */
  506. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);
  507. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);
  508. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
  509. return 0;
  510. }
  511. int mt8188_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)
  512. {
  513. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  514. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
  515. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);
  516. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);
  517. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);
  518. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);
  519. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);
  520. return 0;
  521. }
  522. static int mt8188_afe_enable_afe_on(struct mtk_base_afe *afe)
  523. {
  524. regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);
  525. return 0;
  526. }
  527. static int mt8188_afe_disable_afe_on(struct mtk_base_afe *afe)
  528. {
  529. regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);
  530. return 0;
  531. }
  532. static int mt8188_afe_enable_a1sys(struct mtk_base_afe *afe)
  533. {
  534. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  535. int ret;
  536. ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
  537. if (ret)
  538. return ret;
  539. return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);
  540. }
  541. static int mt8188_afe_disable_a1sys(struct mtk_base_afe *afe)
  542. {
  543. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  544. mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);
  545. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
  546. return 0;
  547. }
  548. static int mt8188_afe_enable_a2sys(struct mtk_base_afe *afe)
  549. {
  550. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  551. int ret;
  552. ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);
  553. if (ret)
  554. return ret;
  555. return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);
  556. }
  557. static int mt8188_afe_disable_a2sys(struct mtk_base_afe *afe)
  558. {
  559. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  560. mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);
  561. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);
  562. return 0;
  563. }
  564. int mt8188_apll1_enable(struct mtk_base_afe *afe)
  565. {
  566. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  567. int ret;
  568. ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
  569. if (ret)
  570. return ret;
  571. ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
  572. afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
  573. if (ret)
  574. goto err_clk_parent;
  575. ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL1);
  576. if (ret)
  577. goto err_apll_tuner;
  578. ret = mt8188_afe_enable_a1sys(afe);
  579. if (ret)
  580. goto err_a1sys;
  581. return 0;
  582. err_a1sys:
  583. mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);
  584. err_apll_tuner:
  585. mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
  586. afe_priv->clk[MT8188_CLK_XTAL_26M]);
  587. err_clk_parent:
  588. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
  589. return ret;
  590. }
  591. int mt8188_apll1_disable(struct mtk_base_afe *afe)
  592. {
  593. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  594. mt8188_afe_disable_a1sys(afe);
  595. mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);
  596. mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
  597. afe_priv->clk[MT8188_CLK_XTAL_26M]);
  598. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
  599. return 0;
  600. }
  601. int mt8188_apll2_enable(struct mtk_base_afe *afe)
  602. {
  603. int ret;
  604. ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL2);
  605. if (ret)
  606. return ret;
  607. ret = mt8188_afe_enable_a2sys(afe);
  608. if (ret)
  609. goto err_a2sys;
  610. return 0;
  611. err_a2sys:
  612. mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);
  613. return ret;
  614. }
  615. int mt8188_apll2_disable(struct mtk_base_afe *afe)
  616. {
  617. mt8188_afe_disable_a2sys(afe);
  618. mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);
  619. return 0;
  620. }
  621. int mt8188_afe_enable_main_clock(struct mtk_base_afe *afe)
  622. {
  623. mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);
  624. mt8188_afe_enable_afe_on(afe);
  625. return 0;
  626. }
  627. int mt8188_afe_disable_main_clock(struct mtk_base_afe *afe)
  628. {
  629. mt8188_afe_disable_afe_on(afe);
  630. mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);
  631. return 0;
  632. }