cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mt8183-afe-clk.c (17301B)


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