162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * mt8188-afe-clk.c  --  MediaTek 8188 afe clock ctrl
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2022 MediaTek Inc.
662306a36Sopenharmony_ci * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
762306a36Sopenharmony_ci *         Trevor Wu <trevor.wu@mediatek.com>
862306a36Sopenharmony_ci *         Chun-Chia Chiu <chun-chia.chiu@mediatek.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/clk.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "mt8188-afe-common.h"
1462306a36Sopenharmony_ci#include "mt8188-afe-clk.h"
1562306a36Sopenharmony_ci#include "mt8188-audsys-clk.h"
1662306a36Sopenharmony_ci#include "mt8188-reg.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic const char *aud_clks[MT8188_CLK_NUM] = {
1962306a36Sopenharmony_ci	/* xtal */
2062306a36Sopenharmony_ci	[MT8188_CLK_XTAL_26M] = "clk26m",
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	/* pll */
2362306a36Sopenharmony_ci	[MT8188_CLK_APMIXED_APLL1] = "apll1",
2462306a36Sopenharmony_ci	[MT8188_CLK_APMIXED_APLL2] = "apll2",
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	/* divider */
2762306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL1_D4] = "apll1_d4",
2862306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL2_D4] = "apll2_d4",
2962306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV0] = "apll12_div0",
3062306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV1] = "apll12_div1",
3162306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV2] = "apll12_div2",
3262306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV3] = "apll12_div3",
3362306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV4] = "apll12_div4",
3462306a36Sopenharmony_ci	[MT8188_CLK_TOP_APLL12_DIV9] = "apll12_div9",
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/* mux */
3762306a36Sopenharmony_ci	[MT8188_CLK_TOP_A1SYS_HP_SEL] = "top_a1sys_hp",
3862306a36Sopenharmony_ci	[MT8188_CLK_TOP_A2SYS_SEL] = "top_a2sys",
3962306a36Sopenharmony_ci	[MT8188_CLK_TOP_AUD_IEC_SEL] = "top_aud_iec",
4062306a36Sopenharmony_ci	[MT8188_CLK_TOP_AUD_INTBUS_SEL] = "top_aud_intbus",
4162306a36Sopenharmony_ci	[MT8188_CLK_TOP_AUDIO_H_SEL] = "top_audio_h",
4262306a36Sopenharmony_ci	[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = "top_audio_local_bus",
4362306a36Sopenharmony_ci	[MT8188_CLK_TOP_DPTX_M_SEL] = "top_dptx",
4462306a36Sopenharmony_ci	[MT8188_CLK_TOP_I2SO1_M_SEL] = "top_i2so1",
4562306a36Sopenharmony_ci	[MT8188_CLK_TOP_I2SO2_M_SEL] = "top_i2so2",
4662306a36Sopenharmony_ci	[MT8188_CLK_TOP_I2SI1_M_SEL] = "top_i2si1",
4762306a36Sopenharmony_ci	[MT8188_CLK_TOP_I2SI2_M_SEL] = "top_i2si2",
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	/* clock gate */
5062306a36Sopenharmony_ci	[MT8188_CLK_ADSP_AUDIO_26M] = "adsp_audio_26m",
5162306a36Sopenharmony_ci	/* afe clock gate */
5262306a36Sopenharmony_ci	[MT8188_CLK_AUD_AFE] = "aud_afe",
5362306a36Sopenharmony_ci	[MT8188_CLK_AUD_APLL1_TUNER] = "aud_apll1_tuner",
5462306a36Sopenharmony_ci	[MT8188_CLK_AUD_APLL2_TUNER] = "aud_apll2_tuner",
5562306a36Sopenharmony_ci	[MT8188_CLK_AUD_APLL] = "aud_apll",
5662306a36Sopenharmony_ci	[MT8188_CLK_AUD_APLL2] = "aud_apll2",
5762306a36Sopenharmony_ci	[MT8188_CLK_AUD_DAC] = "aud_dac",
5862306a36Sopenharmony_ci	[MT8188_CLK_AUD_ADC] = "aud_adc",
5962306a36Sopenharmony_ci	[MT8188_CLK_AUD_DAC_HIRES] = "aud_dac_hires",
6062306a36Sopenharmony_ci	[MT8188_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp",
6162306a36Sopenharmony_ci	[MT8188_CLK_AUD_ADC_HIRES] = "aud_adc_hires",
6262306a36Sopenharmony_ci	[MT8188_CLK_AUD_I2SIN] = "aud_i2sin",
6362306a36Sopenharmony_ci	[MT8188_CLK_AUD_TDM_IN] = "aud_tdm_in",
6462306a36Sopenharmony_ci	[MT8188_CLK_AUD_I2S_OUT] = "aud_i2s_out",
6562306a36Sopenharmony_ci	[MT8188_CLK_AUD_TDM_OUT] = "aud_tdm_out",
6662306a36Sopenharmony_ci	[MT8188_CLK_AUD_HDMI_OUT] = "aud_hdmi_out",
6762306a36Sopenharmony_ci	[MT8188_CLK_AUD_ASRC11] = "aud_asrc11",
6862306a36Sopenharmony_ci	[MT8188_CLK_AUD_ASRC12] = "aud_asrc12",
6962306a36Sopenharmony_ci	[MT8188_CLK_AUD_A1SYS] = "aud_a1sys",
7062306a36Sopenharmony_ci	[MT8188_CLK_AUD_A2SYS] = "aud_a2sys",
7162306a36Sopenharmony_ci	[MT8188_CLK_AUD_PCMIF] = "aud_pcmif",
7262306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1",
7362306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2",
7462306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3",
7562306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4",
7662306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5",
7762306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6",
7862306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8",
7962306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9",
8062306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10",
8162306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2",
8262306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3",
8362306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6",
8462306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7",
8562306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8",
8662306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10",
8762306a36Sopenharmony_ci	[MT8188_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11",
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistruct mt8188_afe_tuner_cfg {
9162306a36Sopenharmony_ci	unsigned int id;
9262306a36Sopenharmony_ci	int apll_div_reg;
9362306a36Sopenharmony_ci	unsigned int apll_div_shift;
9462306a36Sopenharmony_ci	unsigned int apll_div_maskbit;
9562306a36Sopenharmony_ci	unsigned int apll_div_default;
9662306a36Sopenharmony_ci	int ref_ck_sel_reg;
9762306a36Sopenharmony_ci	unsigned int ref_ck_sel_shift;
9862306a36Sopenharmony_ci	unsigned int ref_ck_sel_maskbit;
9962306a36Sopenharmony_ci	unsigned int ref_ck_sel_default;
10062306a36Sopenharmony_ci	int tuner_en_reg;
10162306a36Sopenharmony_ci	unsigned int tuner_en_shift;
10262306a36Sopenharmony_ci	unsigned int tuner_en_maskbit;
10362306a36Sopenharmony_ci	int upper_bound_reg;
10462306a36Sopenharmony_ci	unsigned int upper_bound_shift;
10562306a36Sopenharmony_ci	unsigned int upper_bound_maskbit;
10662306a36Sopenharmony_ci	unsigned int upper_bound_default;
10762306a36Sopenharmony_ci	spinlock_t ctrl_lock; /* lock for apll tuner ctrl*/
10862306a36Sopenharmony_ci	int ref_cnt;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistatic struct mt8188_afe_tuner_cfg
11262306a36Sopenharmony_ci	mt8188_afe_tuner_cfgs[MT8188_AUD_PLL_NUM] = {
11362306a36Sopenharmony_ci	[MT8188_AUD_PLL1] = {
11462306a36Sopenharmony_ci		.id = MT8188_AUD_PLL1,
11562306a36Sopenharmony_ci		.apll_div_reg = AFE_APLL_TUNER_CFG,
11662306a36Sopenharmony_ci		.apll_div_shift = 4,
11762306a36Sopenharmony_ci		.apll_div_maskbit = 0xf,
11862306a36Sopenharmony_ci		.apll_div_default = 0x7,
11962306a36Sopenharmony_ci		.ref_ck_sel_reg = AFE_APLL_TUNER_CFG,
12062306a36Sopenharmony_ci		.ref_ck_sel_shift = 1,
12162306a36Sopenharmony_ci		.ref_ck_sel_maskbit = 0x3,
12262306a36Sopenharmony_ci		.ref_ck_sel_default = 0x2,
12362306a36Sopenharmony_ci		.tuner_en_reg = AFE_APLL_TUNER_CFG,
12462306a36Sopenharmony_ci		.tuner_en_shift = 0,
12562306a36Sopenharmony_ci		.tuner_en_maskbit = 0x1,
12662306a36Sopenharmony_ci		.upper_bound_reg = AFE_APLL_TUNER_CFG,
12762306a36Sopenharmony_ci		.upper_bound_shift = 8,
12862306a36Sopenharmony_ci		.upper_bound_maskbit = 0xff,
12962306a36Sopenharmony_ci		.upper_bound_default = 0x3,
13062306a36Sopenharmony_ci	},
13162306a36Sopenharmony_ci	[MT8188_AUD_PLL2] = {
13262306a36Sopenharmony_ci		.id = MT8188_AUD_PLL2,
13362306a36Sopenharmony_ci		.apll_div_reg = AFE_APLL_TUNER_CFG1,
13462306a36Sopenharmony_ci		.apll_div_shift = 4,
13562306a36Sopenharmony_ci		.apll_div_maskbit = 0xf,
13662306a36Sopenharmony_ci		.apll_div_default = 0x7,
13762306a36Sopenharmony_ci		.ref_ck_sel_reg = AFE_APLL_TUNER_CFG1,
13862306a36Sopenharmony_ci		.ref_ck_sel_shift = 1,
13962306a36Sopenharmony_ci		.ref_ck_sel_maskbit = 0x3,
14062306a36Sopenharmony_ci		.ref_ck_sel_default = 0x1,
14162306a36Sopenharmony_ci		.tuner_en_reg = AFE_APLL_TUNER_CFG1,
14262306a36Sopenharmony_ci		.tuner_en_shift = 0,
14362306a36Sopenharmony_ci		.tuner_en_maskbit = 0x1,
14462306a36Sopenharmony_ci		.upper_bound_reg = AFE_APLL_TUNER_CFG1,
14562306a36Sopenharmony_ci		.upper_bound_shift = 8,
14662306a36Sopenharmony_ci		.upper_bound_maskbit = 0xff,
14762306a36Sopenharmony_ci		.upper_bound_default = 0x3,
14862306a36Sopenharmony_ci	},
14962306a36Sopenharmony_ci	[MT8188_AUD_PLL3] = {
15062306a36Sopenharmony_ci		.id = MT8188_AUD_PLL3,
15162306a36Sopenharmony_ci		.apll_div_reg = AFE_EARC_APLL_TUNER_CFG,
15262306a36Sopenharmony_ci		.apll_div_shift = 4,
15362306a36Sopenharmony_ci		.apll_div_maskbit = 0x3f,
15462306a36Sopenharmony_ci		.apll_div_default = 0x3,
15562306a36Sopenharmony_ci		.ref_ck_sel_reg = AFE_EARC_APLL_TUNER_CFG,
15662306a36Sopenharmony_ci		.ref_ck_sel_shift = 24,
15762306a36Sopenharmony_ci		.ref_ck_sel_maskbit = 0x3,
15862306a36Sopenharmony_ci		.ref_ck_sel_default = 0x0,
15962306a36Sopenharmony_ci		.tuner_en_reg = AFE_EARC_APLL_TUNER_CFG,
16062306a36Sopenharmony_ci		.tuner_en_shift = 0,
16162306a36Sopenharmony_ci		.tuner_en_maskbit = 0x1,
16262306a36Sopenharmony_ci		.upper_bound_reg = AFE_EARC_APLL_TUNER_CFG,
16362306a36Sopenharmony_ci		.upper_bound_shift = 12,
16462306a36Sopenharmony_ci		.upper_bound_maskbit = 0xff,
16562306a36Sopenharmony_ci		.upper_bound_default = 0x4,
16662306a36Sopenharmony_ci	},
16762306a36Sopenharmony_ci	[MT8188_AUD_PLL4] = {
16862306a36Sopenharmony_ci		.id = MT8188_AUD_PLL4,
16962306a36Sopenharmony_ci		.apll_div_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
17062306a36Sopenharmony_ci		.apll_div_shift = 4,
17162306a36Sopenharmony_ci		.apll_div_maskbit = 0x3f,
17262306a36Sopenharmony_ci		.apll_div_default = 0x7,
17362306a36Sopenharmony_ci		.ref_ck_sel_reg = AFE_SPDIFIN_APLL_TUNER_CFG1,
17462306a36Sopenharmony_ci		.ref_ck_sel_shift = 8,
17562306a36Sopenharmony_ci		.ref_ck_sel_maskbit = 0x1,
17662306a36Sopenharmony_ci		.ref_ck_sel_default = 0,
17762306a36Sopenharmony_ci		.tuner_en_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
17862306a36Sopenharmony_ci		.tuner_en_shift = 0,
17962306a36Sopenharmony_ci		.tuner_en_maskbit = 0x1,
18062306a36Sopenharmony_ci		.upper_bound_reg = AFE_SPDIFIN_APLL_TUNER_CFG,
18162306a36Sopenharmony_ci		.upper_bound_shift = 12,
18262306a36Sopenharmony_ci		.upper_bound_maskbit = 0xff,
18362306a36Sopenharmony_ci		.upper_bound_default = 0x4,
18462306a36Sopenharmony_ci	},
18562306a36Sopenharmony_ci	[MT8188_AUD_PLL5] = {
18662306a36Sopenharmony_ci		.id = MT8188_AUD_PLL5,
18762306a36Sopenharmony_ci		.apll_div_reg = AFE_LINEIN_APLL_TUNER_CFG,
18862306a36Sopenharmony_ci		.apll_div_shift = 4,
18962306a36Sopenharmony_ci		.apll_div_maskbit = 0x3f,
19062306a36Sopenharmony_ci		.apll_div_default = 0x3,
19162306a36Sopenharmony_ci		.ref_ck_sel_reg = AFE_LINEIN_APLL_TUNER_CFG,
19262306a36Sopenharmony_ci		.ref_ck_sel_shift = 24,
19362306a36Sopenharmony_ci		.ref_ck_sel_maskbit = 0x1,
19462306a36Sopenharmony_ci		.ref_ck_sel_default = 0,
19562306a36Sopenharmony_ci		.tuner_en_reg = AFE_LINEIN_APLL_TUNER_CFG,
19662306a36Sopenharmony_ci		.tuner_en_shift = 0,
19762306a36Sopenharmony_ci		.tuner_en_maskbit = 0x1,
19862306a36Sopenharmony_ci		.upper_bound_reg = AFE_LINEIN_APLL_TUNER_CFG,
19962306a36Sopenharmony_ci		.upper_bound_shift = 12,
20062306a36Sopenharmony_ci		.upper_bound_maskbit = 0xff,
20162306a36Sopenharmony_ci		.upper_bound_default = 0x4,
20262306a36Sopenharmony_ci	},
20362306a36Sopenharmony_ci};
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistatic struct mt8188_afe_tuner_cfg *mt8188_afe_found_apll_tuner(unsigned int id)
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	if (id >= MT8188_AUD_PLL_NUM)
20862306a36Sopenharmony_ci		return NULL;
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	return &mt8188_afe_tuner_cfgs[id];
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistatic int mt8188_afe_init_apll_tuner(unsigned int id)
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	if (!cfg)
21862306a36Sopenharmony_ci		return -EINVAL;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	cfg->ref_cnt = 0;
22162306a36Sopenharmony_ci	spin_lock_init(&cfg->ctrl_lock);
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	return 0;
22462306a36Sopenharmony_ci}
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistatic int mt8188_afe_setup_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
22762306a36Sopenharmony_ci{
22862306a36Sopenharmony_ci	const struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	if (!cfg)
23162306a36Sopenharmony_ci		return -EINVAL;
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
23462306a36Sopenharmony_ci			   cfg->apll_div_reg,
23562306a36Sopenharmony_ci			   cfg->apll_div_maskbit << cfg->apll_div_shift,
23662306a36Sopenharmony_ci			   cfg->apll_div_default << cfg->apll_div_shift);
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
23962306a36Sopenharmony_ci			   cfg->ref_ck_sel_reg,
24062306a36Sopenharmony_ci			   cfg->ref_ck_sel_maskbit << cfg->ref_ck_sel_shift,
24162306a36Sopenharmony_ci			   cfg->ref_ck_sel_default << cfg->ref_ck_sel_shift);
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
24462306a36Sopenharmony_ci			   cfg->upper_bound_reg,
24562306a36Sopenharmony_ci			   cfg->upper_bound_maskbit << cfg->upper_bound_shift,
24662306a36Sopenharmony_ci			   cfg->upper_bound_default << cfg->upper_bound_shift);
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	return 0;
24962306a36Sopenharmony_ci}
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic int mt8188_afe_enable_tuner_clk(struct mtk_base_afe *afe,
25262306a36Sopenharmony_ci				       unsigned int id)
25362306a36Sopenharmony_ci{
25462306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	switch (id) {
25762306a36Sopenharmony_ci	case MT8188_AUD_PLL1:
25862306a36Sopenharmony_ci		mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);
25962306a36Sopenharmony_ci		mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);
26062306a36Sopenharmony_ci		break;
26162306a36Sopenharmony_ci	case MT8188_AUD_PLL2:
26262306a36Sopenharmony_ci		mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);
26362306a36Sopenharmony_ci		mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);
26462306a36Sopenharmony_ci		break;
26562306a36Sopenharmony_ci	default:
26662306a36Sopenharmony_ci		return -EINVAL;
26762306a36Sopenharmony_ci	}
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	return 0;
27062306a36Sopenharmony_ci}
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic int mt8188_afe_disable_tuner_clk(struct mtk_base_afe *afe,
27362306a36Sopenharmony_ci					unsigned int id)
27462306a36Sopenharmony_ci{
27562306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	switch (id) {
27862306a36Sopenharmony_ci	case MT8188_AUD_PLL1:
27962306a36Sopenharmony_ci		mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);
28062306a36Sopenharmony_ci		mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);
28162306a36Sopenharmony_ci		break;
28262306a36Sopenharmony_ci	case MT8188_AUD_PLL2:
28362306a36Sopenharmony_ci		mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);
28462306a36Sopenharmony_ci		mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);
28562306a36Sopenharmony_ci		break;
28662306a36Sopenharmony_ci	default:
28762306a36Sopenharmony_ci		return -EINVAL;
28862306a36Sopenharmony_ci	}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci	return 0;
29162306a36Sopenharmony_ci}
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistatic int mt8188_afe_enable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
29462306a36Sopenharmony_ci{
29562306a36Sopenharmony_ci	struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
29662306a36Sopenharmony_ci	unsigned long flags;
29762306a36Sopenharmony_ci	int ret;
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	if (!cfg)
30062306a36Sopenharmony_ci		return -EINVAL;
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	ret = mt8188_afe_setup_apll_tuner(afe, id);
30362306a36Sopenharmony_ci	if (ret)
30462306a36Sopenharmony_ci		return ret;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	ret = mt8188_afe_enable_tuner_clk(afe, id);
30762306a36Sopenharmony_ci	if (ret)
30862306a36Sopenharmony_ci		return ret;
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci	spin_lock_irqsave(&cfg->ctrl_lock, flags);
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	cfg->ref_cnt++;
31362306a36Sopenharmony_ci	if (cfg->ref_cnt == 1)
31462306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
31562306a36Sopenharmony_ci				   cfg->tuner_en_reg,
31662306a36Sopenharmony_ci				   cfg->tuner_en_maskbit << cfg->tuner_en_shift,
31762306a36Sopenharmony_ci				   BIT(cfg->tuner_en_shift));
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	spin_unlock_irqrestore(&cfg->ctrl_lock, flags);
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	return 0;
32262306a36Sopenharmony_ci}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_cistatic int mt8188_afe_disable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)
32562306a36Sopenharmony_ci{
32662306a36Sopenharmony_ci	struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);
32762306a36Sopenharmony_ci	unsigned long flags;
32862306a36Sopenharmony_ci	int ret;
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	if (!cfg)
33162306a36Sopenharmony_ci		return -EINVAL;
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	spin_lock_irqsave(&cfg->ctrl_lock, flags);
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	cfg->ref_cnt--;
33662306a36Sopenharmony_ci	if (cfg->ref_cnt == 0)
33762306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
33862306a36Sopenharmony_ci				   cfg->tuner_en_reg,
33962306a36Sopenharmony_ci				   cfg->tuner_en_maskbit << cfg->tuner_en_shift,
34062306a36Sopenharmony_ci				   0 << cfg->tuner_en_shift);
34162306a36Sopenharmony_ci	else if (cfg->ref_cnt < 0)
34262306a36Sopenharmony_ci		cfg->ref_cnt = 0;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	spin_unlock_irqrestore(&cfg->ctrl_lock, flags);
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci	ret = mt8188_afe_disable_tuner_clk(afe, id);
34762306a36Sopenharmony_ci	if (ret)
34862306a36Sopenharmony_ci		return ret;
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	return 0;
35162306a36Sopenharmony_ci}
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ciint mt8188_afe_get_mclk_source_clk_id(int sel)
35462306a36Sopenharmony_ci{
35562306a36Sopenharmony_ci	switch (sel) {
35662306a36Sopenharmony_ci	case MT8188_MCK_SEL_26M:
35762306a36Sopenharmony_ci		return MT8188_CLK_XTAL_26M;
35862306a36Sopenharmony_ci	case MT8188_MCK_SEL_APLL1:
35962306a36Sopenharmony_ci		return MT8188_CLK_APMIXED_APLL1;
36062306a36Sopenharmony_ci	case MT8188_MCK_SEL_APLL2:
36162306a36Sopenharmony_ci		return MT8188_CLK_APMIXED_APLL2;
36262306a36Sopenharmony_ci	default:
36362306a36Sopenharmony_ci		return -EINVAL;
36462306a36Sopenharmony_ci	}
36562306a36Sopenharmony_ci}
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ciint mt8188_afe_get_mclk_source_rate(struct mtk_base_afe *afe, int apll)
36862306a36Sopenharmony_ci{
36962306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
37062306a36Sopenharmony_ci	int clk_id = mt8188_afe_get_mclk_source_clk_id(apll);
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	if (clk_id < 0) {
37362306a36Sopenharmony_ci		dev_dbg(afe->dev, "invalid clk id\n");
37462306a36Sopenharmony_ci		return 0;
37562306a36Sopenharmony_ci	}
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	return clk_get_rate(afe_priv->clk[clk_id]);
37862306a36Sopenharmony_ci}
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ciint mt8188_afe_get_default_mclk_source_by_rate(int rate)
38162306a36Sopenharmony_ci{
38262306a36Sopenharmony_ci	return ((rate % 8000) == 0) ?
38362306a36Sopenharmony_ci		MT8188_MCK_SEL_APLL1 : MT8188_MCK_SEL_APLL2;
38462306a36Sopenharmony_ci}
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ciint mt8188_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	return ((rate % 8000) == 0) ? MT8188_AUD_PLL1 : MT8188_AUD_PLL2;
38962306a36Sopenharmony_ci}
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ciint mt8188_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
39262306a36Sopenharmony_ci{
39362306a36Sopenharmony_ci	if (strcmp(name, APLL1_W_NAME) == 0)
39462306a36Sopenharmony_ci		return MT8188_AUD_PLL1;
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	return MT8188_AUD_PLL2;
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ciint mt8188_afe_init_clock(struct mtk_base_afe *afe)
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
40262306a36Sopenharmony_ci	int i, ret;
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	ret = mt8188_audsys_clk_register(afe);
40562306a36Sopenharmony_ci	if (ret) {
40662306a36Sopenharmony_ci		dev_err(afe->dev, "register audsys clk fail %d\n", ret);
40762306a36Sopenharmony_ci		return ret;
40862306a36Sopenharmony_ci	}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	afe_priv->clk =
41162306a36Sopenharmony_ci		devm_kcalloc(afe->dev, MT8188_CLK_NUM, sizeof(*afe_priv->clk),
41262306a36Sopenharmony_ci			     GFP_KERNEL);
41362306a36Sopenharmony_ci	if (!afe_priv->clk)
41462306a36Sopenharmony_ci		return -ENOMEM;
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	for (i = 0; i < MT8188_CLK_NUM; i++) {
41762306a36Sopenharmony_ci		afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
41862306a36Sopenharmony_ci		if (IS_ERR(afe_priv->clk[i])) {
41962306a36Sopenharmony_ci			dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",
42062306a36Sopenharmony_ci				__func__, aud_clks[i],
42162306a36Sopenharmony_ci				PTR_ERR(afe_priv->clk[i]));
42262306a36Sopenharmony_ci			return PTR_ERR(afe_priv->clk[i]);
42362306a36Sopenharmony_ci		}
42462306a36Sopenharmony_ci	}
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci	/* initial tuner */
42762306a36Sopenharmony_ci	for (i = 0; i < MT8188_AUD_PLL_NUM; i++) {
42862306a36Sopenharmony_ci		ret = mt8188_afe_init_apll_tuner(i);
42962306a36Sopenharmony_ci		if (ret) {
43062306a36Sopenharmony_ci			dev_info(afe->dev, "%s(), init apll_tuner%d failed",
43162306a36Sopenharmony_ci				 __func__, (i + 1));
43262306a36Sopenharmony_ci			return -EINVAL;
43362306a36Sopenharmony_ci		}
43462306a36Sopenharmony_ci	}
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci	return 0;
43762306a36Sopenharmony_ci}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ciint mt8188_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk)
44062306a36Sopenharmony_ci{
44162306a36Sopenharmony_ci	int ret;
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	if (clk) {
44462306a36Sopenharmony_ci		ret = clk_prepare_enable(clk);
44562306a36Sopenharmony_ci		if (ret) {
44662306a36Sopenharmony_ci			dev_dbg(afe->dev, "%s(), failed to enable clk\n",
44762306a36Sopenharmony_ci				__func__);
44862306a36Sopenharmony_ci			return ret;
44962306a36Sopenharmony_ci		}
45062306a36Sopenharmony_ci	} else {
45162306a36Sopenharmony_ci		dev_dbg(afe->dev, "NULL clk\n");
45262306a36Sopenharmony_ci	}
45362306a36Sopenharmony_ci	return 0;
45462306a36Sopenharmony_ci}
45562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt8188_afe_enable_clk);
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_civoid mt8188_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk)
45862306a36Sopenharmony_ci{
45962306a36Sopenharmony_ci	if (clk)
46062306a36Sopenharmony_ci		clk_disable_unprepare(clk);
46162306a36Sopenharmony_ci	else
46262306a36Sopenharmony_ci		dev_dbg(afe->dev, "NULL clk\n");
46362306a36Sopenharmony_ci}
46462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt8188_afe_disable_clk);
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ciint mt8188_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk,
46762306a36Sopenharmony_ci			    unsigned int rate)
46862306a36Sopenharmony_ci{
46962306a36Sopenharmony_ci	int ret;
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	if (clk) {
47262306a36Sopenharmony_ci		ret = clk_set_rate(clk, rate);
47362306a36Sopenharmony_ci		if (ret) {
47462306a36Sopenharmony_ci			dev_dbg(afe->dev, "%s(), failed to set clk rate\n",
47562306a36Sopenharmony_ci				__func__);
47662306a36Sopenharmony_ci			return ret;
47762306a36Sopenharmony_ci		}
47862306a36Sopenharmony_ci	}
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	return 0;
48162306a36Sopenharmony_ci}
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ciint mt8188_afe_set_clk_parent(struct mtk_base_afe *afe, struct clk *clk,
48462306a36Sopenharmony_ci			      struct clk *parent)
48562306a36Sopenharmony_ci{
48662306a36Sopenharmony_ci	int ret;
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	if (clk && parent) {
48962306a36Sopenharmony_ci		ret = clk_set_parent(clk, parent);
49062306a36Sopenharmony_ci		if (ret) {
49162306a36Sopenharmony_ci			dev_dbg(afe->dev, "%s(), failed to set clk parent %d\n",
49262306a36Sopenharmony_ci				__func__, ret);
49362306a36Sopenharmony_ci			return ret;
49462306a36Sopenharmony_ci		}
49562306a36Sopenharmony_ci	}
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci	return 0;
49862306a36Sopenharmony_ci}
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_cistatic unsigned int get_top_cg_reg(unsigned int cg_type)
50162306a36Sopenharmony_ci{
50262306a36Sopenharmony_ci	switch (cg_type) {
50362306a36Sopenharmony_ci	case MT8188_TOP_CG_A1SYS_TIMING:
50462306a36Sopenharmony_ci	case MT8188_TOP_CG_A2SYS_TIMING:
50562306a36Sopenharmony_ci	case MT8188_TOP_CG_26M_TIMING:
50662306a36Sopenharmony_ci		return ASYS_TOP_CON;
50762306a36Sopenharmony_ci	default:
50862306a36Sopenharmony_ci		return 0;
50962306a36Sopenharmony_ci	}
51062306a36Sopenharmony_ci}
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_cistatic unsigned int get_top_cg_mask(unsigned int cg_type)
51362306a36Sopenharmony_ci{
51462306a36Sopenharmony_ci	switch (cg_type) {
51562306a36Sopenharmony_ci	case MT8188_TOP_CG_A1SYS_TIMING:
51662306a36Sopenharmony_ci		return ASYS_TOP_CON_A1SYS_TIMING_ON;
51762306a36Sopenharmony_ci	case MT8188_TOP_CG_A2SYS_TIMING:
51862306a36Sopenharmony_ci		return ASYS_TOP_CON_A2SYS_TIMING_ON;
51962306a36Sopenharmony_ci	case MT8188_TOP_CG_26M_TIMING:
52062306a36Sopenharmony_ci		return ASYS_TOP_CON_26M_TIMING_ON;
52162306a36Sopenharmony_ci	default:
52262306a36Sopenharmony_ci		return 0;
52362306a36Sopenharmony_ci	}
52462306a36Sopenharmony_ci}
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cistatic unsigned int get_top_cg_on_val(unsigned int cg_type)
52762306a36Sopenharmony_ci{
52862306a36Sopenharmony_ci	switch (cg_type) {
52962306a36Sopenharmony_ci	case MT8188_TOP_CG_A1SYS_TIMING:
53062306a36Sopenharmony_ci	case MT8188_TOP_CG_A2SYS_TIMING:
53162306a36Sopenharmony_ci	case MT8188_TOP_CG_26M_TIMING:
53262306a36Sopenharmony_ci		return get_top_cg_mask(cg_type);
53362306a36Sopenharmony_ci	default:
53462306a36Sopenharmony_ci		return 0;
53562306a36Sopenharmony_ci	}
53662306a36Sopenharmony_ci}
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cistatic unsigned int get_top_cg_off_val(unsigned int cg_type)
53962306a36Sopenharmony_ci{
54062306a36Sopenharmony_ci	switch (cg_type) {
54162306a36Sopenharmony_ci	case MT8188_TOP_CG_A1SYS_TIMING:
54262306a36Sopenharmony_ci	case MT8188_TOP_CG_A2SYS_TIMING:
54362306a36Sopenharmony_ci	case MT8188_TOP_CG_26M_TIMING:
54462306a36Sopenharmony_ci		return 0;
54562306a36Sopenharmony_ci	default:
54662306a36Sopenharmony_ci		return get_top_cg_mask(cg_type);
54762306a36Sopenharmony_ci	}
54862306a36Sopenharmony_ci}
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_cistatic int mt8188_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
55162306a36Sopenharmony_ci{
55262306a36Sopenharmony_ci	unsigned int reg = get_top_cg_reg(cg_type);
55362306a36Sopenharmony_ci	unsigned int mask = get_top_cg_mask(cg_type);
55462306a36Sopenharmony_ci	unsigned int val = get_top_cg_on_val(cg_type);
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, reg, mask, val);
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	return 0;
55962306a36Sopenharmony_ci}
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cistatic int mt8188_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
56262306a36Sopenharmony_ci{
56362306a36Sopenharmony_ci	unsigned int reg = get_top_cg_reg(cg_type);
56462306a36Sopenharmony_ci	unsigned int mask = get_top_cg_mask(cg_type);
56562306a36Sopenharmony_ci	unsigned int val = get_top_cg_off_val(cg_type);
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, reg, mask, val);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci	return 0;
57062306a36Sopenharmony_ci}
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ciint mt8188_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)
57362306a36Sopenharmony_ci{
57462306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	/* bus clock for AFE external access, like DRAM */
57762306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	/* bus clock for AFE internal access, like AFE SRAM */
58062306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	/* audio 26m clock source */
58362306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci	/* AFE hw clock */
58662306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);
58762306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);
58862306a36Sopenharmony_ci	mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	return 0;
59162306a36Sopenharmony_ci}
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ciint mt8188_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)
59462306a36Sopenharmony_ci{
59562306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
59862306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);
59962306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);
60062306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);
60162306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);
60262306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci	return 0;
60562306a36Sopenharmony_ci}
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_cistatic int mt8188_afe_enable_afe_on(struct mtk_base_afe *afe)
60862306a36Sopenharmony_ci{
60962306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);
61062306a36Sopenharmony_ci	return 0;
61162306a36Sopenharmony_ci}
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_cistatic int mt8188_afe_disable_afe_on(struct mtk_base_afe *afe)
61462306a36Sopenharmony_ci{
61562306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);
61662306a36Sopenharmony_ci	return 0;
61762306a36Sopenharmony_ci}
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_cistatic int mt8188_afe_enable_a1sys(struct mtk_base_afe *afe)
62062306a36Sopenharmony_ci{
62162306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
62262306a36Sopenharmony_ci	int ret;
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci	ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
62562306a36Sopenharmony_ci	if (ret)
62662306a36Sopenharmony_ci		return ret;
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci	return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);
62962306a36Sopenharmony_ci}
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_cistatic int mt8188_afe_disable_a1sys(struct mtk_base_afe *afe)
63262306a36Sopenharmony_ci{
63362306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);
63662306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);
63762306a36Sopenharmony_ci	return 0;
63862306a36Sopenharmony_ci}
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cistatic int mt8188_afe_enable_a2sys(struct mtk_base_afe *afe)
64162306a36Sopenharmony_ci{
64262306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
64362306a36Sopenharmony_ci	int ret;
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci	ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);
64662306a36Sopenharmony_ci	if (ret)
64762306a36Sopenharmony_ci		return ret;
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);
65062306a36Sopenharmony_ci}
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_cistatic int mt8188_afe_disable_a2sys(struct mtk_base_afe *afe)
65362306a36Sopenharmony_ci{
65462306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);
65762306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);
65862306a36Sopenharmony_ci	return 0;
65962306a36Sopenharmony_ci}
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ciint mt8188_apll1_enable(struct mtk_base_afe *afe)
66262306a36Sopenharmony_ci{
66362306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
66462306a36Sopenharmony_ci	int ret;
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_ci	ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
66762306a36Sopenharmony_ci	if (ret)
66862306a36Sopenharmony_ci		return ret;
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
67162306a36Sopenharmony_ci					afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
67262306a36Sopenharmony_ci	if (ret)
67362306a36Sopenharmony_ci		goto err_clk_parent;
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL1);
67662306a36Sopenharmony_ci	if (ret)
67762306a36Sopenharmony_ci		goto err_apll_tuner;
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	ret = mt8188_afe_enable_a1sys(afe);
68062306a36Sopenharmony_ci	if (ret)
68162306a36Sopenharmony_ci		goto err_a1sys;
68262306a36Sopenharmony_ci
68362306a36Sopenharmony_ci	return 0;
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_cierr_a1sys:
68662306a36Sopenharmony_ci	mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);
68762306a36Sopenharmony_cierr_apll_tuner:
68862306a36Sopenharmony_ci	mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
68962306a36Sopenharmony_ci				  afe_priv->clk[MT8188_CLK_XTAL_26M]);
69062306a36Sopenharmony_cierr_clk_parent:
69162306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	return ret;
69462306a36Sopenharmony_ci}
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_ciint mt8188_apll1_disable(struct mtk_base_afe *afe)
69762306a36Sopenharmony_ci{
69862306a36Sopenharmony_ci	struct mt8188_afe_private *afe_priv = afe->platform_priv;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	mt8188_afe_disable_a1sys(afe);
70162306a36Sopenharmony_ci	mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);
70262306a36Sopenharmony_ci	mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],
70362306a36Sopenharmony_ci				  afe_priv->clk[MT8188_CLK_XTAL_26M]);
70462306a36Sopenharmony_ci	mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	return 0;
70762306a36Sopenharmony_ci}
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ciint mt8188_apll2_enable(struct mtk_base_afe *afe)
71062306a36Sopenharmony_ci{
71162306a36Sopenharmony_ci	int ret;
71262306a36Sopenharmony_ci
71362306a36Sopenharmony_ci	ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL2);
71462306a36Sopenharmony_ci	if (ret)
71562306a36Sopenharmony_ci		return ret;
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci	ret =  mt8188_afe_enable_a2sys(afe);
71862306a36Sopenharmony_ci	if (ret)
71962306a36Sopenharmony_ci		goto err_a2sys;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	return 0;
72262306a36Sopenharmony_cierr_a2sys:
72362306a36Sopenharmony_ci	mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci	return ret;
72662306a36Sopenharmony_ci}
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ciint mt8188_apll2_disable(struct mtk_base_afe *afe)
72962306a36Sopenharmony_ci{
73062306a36Sopenharmony_ci	mt8188_afe_disable_a2sys(afe);
73162306a36Sopenharmony_ci	mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);
73262306a36Sopenharmony_ci	return 0;
73362306a36Sopenharmony_ci}
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ciint mt8188_afe_enable_main_clock(struct mtk_base_afe *afe)
73662306a36Sopenharmony_ci{
73762306a36Sopenharmony_ci	mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);
73862306a36Sopenharmony_ci	mt8188_afe_enable_afe_on(afe);
73962306a36Sopenharmony_ci	return 0;
74062306a36Sopenharmony_ci}
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ciint mt8188_afe_disable_main_clock(struct mtk_base_afe *afe)
74362306a36Sopenharmony_ci{
74462306a36Sopenharmony_ci	mt8188_afe_disable_afe_on(afe);
74562306a36Sopenharmony_ci	mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);
74662306a36Sopenharmony_ci	return 0;
74762306a36Sopenharmony_ci}
748