Path: blob/master/sound/soc/mediatek/mt8188/mt8188-afe-clk.c
26488 views
// SPDX-License-Identifier: GPL-2.01/*2* mt8188-afe-clk.c -- MediaTek 8188 afe clock ctrl3*4* Copyright (c) 2022 MediaTek Inc.5* Author: Bicycle Tsai <[email protected]>6* Trevor Wu <[email protected]>7* Chun-Chia Chiu <[email protected]>8*/910#include <linux/clk.h>1112#include "mt8188-afe-common.h"13#include "mt8188-afe-clk.h"14#include "mt8188-audsys-clk.h"15#include "mt8188-reg.h"1617static const char *aud_clks[MT8188_CLK_NUM] = {18/* xtal */19[MT8188_CLK_XTAL_26M] = "clk26m",2021/* pll */22[MT8188_CLK_APMIXED_APLL1] = "apll1",23[MT8188_CLK_APMIXED_APLL2] = "apll2",2425/* divider */26[MT8188_CLK_TOP_APLL1_D4] = "apll1_d4",27[MT8188_CLK_TOP_APLL2_D4] = "apll2_d4",28[MT8188_CLK_TOP_APLL12_DIV0] = "apll12_div0",29[MT8188_CLK_TOP_APLL12_DIV1] = "apll12_div1",30[MT8188_CLK_TOP_APLL12_DIV2] = "apll12_div2",31[MT8188_CLK_TOP_APLL12_DIV3] = "apll12_div3",32[MT8188_CLK_TOP_APLL12_DIV4] = "apll12_div4",33[MT8188_CLK_TOP_APLL12_DIV9] = "apll12_div9",3435/* mux */36[MT8188_CLK_TOP_A1SYS_HP_SEL] = "top_a1sys_hp",37[MT8188_CLK_TOP_A2SYS_SEL] = "top_a2sys",38[MT8188_CLK_TOP_AUD_IEC_SEL] = "top_aud_iec",39[MT8188_CLK_TOP_AUD_INTBUS_SEL] = "top_aud_intbus",40[MT8188_CLK_TOP_AUDIO_H_SEL] = "top_audio_h",41[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = "top_audio_local_bus",42[MT8188_CLK_TOP_DPTX_M_SEL] = "top_dptx",43[MT8188_CLK_TOP_I2SO1_M_SEL] = "top_i2so1",44[MT8188_CLK_TOP_I2SO2_M_SEL] = "top_i2so2",45[MT8188_CLK_TOP_I2SI1_M_SEL] = "top_i2si1",46[MT8188_CLK_TOP_I2SI2_M_SEL] = "top_i2si2",4748/* clock gate */49[MT8188_CLK_ADSP_AUDIO_26M] = "adsp_audio_26m",50/* afe clock gate */51[MT8188_CLK_AUD_AFE] = "aud_afe",52[MT8188_CLK_AUD_APLL1_TUNER] = "aud_apll1_tuner",53[MT8188_CLK_AUD_APLL2_TUNER] = "aud_apll2_tuner",54[MT8188_CLK_AUD_APLL] = "aud_apll",55[MT8188_CLK_AUD_APLL2] = "aud_apll2",56[MT8188_CLK_AUD_DAC] = "aud_dac",57[MT8188_CLK_AUD_ADC] = "aud_adc",58[MT8188_CLK_AUD_DAC_HIRES] = "aud_dac_hires",59[MT8188_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp",60[MT8188_CLK_AUD_AFE_DMIC1] = "aud_afe_dmic1",61[MT8188_CLK_AUD_AFE_DMIC2] = "aud_afe_dmic2",62[MT8188_CLK_AUD_AFE_DMIC3] = "aud_afe_dmic3",63[MT8188_CLK_AUD_AFE_DMIC4] = "aud_afe_dmic4",64[MT8188_CLK_AUD_ADC_HIRES] = "aud_adc_hires",65[MT8188_CLK_AUD_DMIC_HIRES1] = "aud_dmic_hires1",66[MT8188_CLK_AUD_DMIC_HIRES2] = "aud_dmic_hires2",67[MT8188_CLK_AUD_DMIC_HIRES3] = "aud_dmic_hires3",68[MT8188_CLK_AUD_DMIC_HIRES4] = "aud_dmic_hires4",69[MT8188_CLK_AUD_I2SIN] = "aud_i2sin",70[MT8188_CLK_AUD_TDM_IN] = "aud_tdm_in",71[MT8188_CLK_AUD_I2S_OUT] = "aud_i2s_out",72[MT8188_CLK_AUD_TDM_OUT] = "aud_tdm_out",73[MT8188_CLK_AUD_HDMI_OUT] = "aud_hdmi_out",74[MT8188_CLK_AUD_ASRC11] = "aud_asrc11",75[MT8188_CLK_AUD_ASRC12] = "aud_asrc12",76[MT8188_CLK_AUD_A1SYS] = "aud_a1sys",77[MT8188_CLK_AUD_A2SYS] = "aud_a2sys",78[MT8188_CLK_AUD_PCMIF] = "aud_pcmif",79[MT8188_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1",80[MT8188_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2",81[MT8188_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3",82[MT8188_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4",83[MT8188_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5",84[MT8188_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6",85[MT8188_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8",86[MT8188_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9",87[MT8188_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10",88[MT8188_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2",89[MT8188_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3",90[MT8188_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6",91[MT8188_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7",92[MT8188_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8",93[MT8188_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10",94[MT8188_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11",95};9697struct mt8188_afe_tuner_cfg {98unsigned int id;99int apll_div_reg;100unsigned int apll_div_shift;101unsigned int apll_div_maskbit;102unsigned int apll_div_default;103int ref_ck_sel_reg;104unsigned int ref_ck_sel_shift;105unsigned int ref_ck_sel_maskbit;106unsigned int ref_ck_sel_default;107int tuner_en_reg;108unsigned int tuner_en_shift;109unsigned int tuner_en_maskbit;110int upper_bound_reg;111unsigned int upper_bound_shift;112unsigned int upper_bound_maskbit;113unsigned int upper_bound_default;114spinlock_t ctrl_lock; /* lock for apll tuner ctrl*/115int ref_cnt;116};117118static struct mt8188_afe_tuner_cfg119mt8188_afe_tuner_cfgs[MT8188_AUD_PLL_NUM] = {120[MT8188_AUD_PLL1] = {121.id = MT8188_AUD_PLL1,122.apll_div_reg = AFE_APLL_TUNER_CFG,123.apll_div_shift = 4,124.apll_div_maskbit = 0xf,125.apll_div_default = 0x7,126.ref_ck_sel_reg = AFE_APLL_TUNER_CFG,127.ref_ck_sel_shift = 1,128.ref_ck_sel_maskbit = 0x3,129.ref_ck_sel_default = 0x2,130.tuner_en_reg = AFE_APLL_TUNER_CFG,131.tuner_en_shift = 0,132.tuner_en_maskbit = 0x1,133.upper_bound_reg = AFE_APLL_TUNER_CFG,134.upper_bound_shift = 8,135.upper_bound_maskbit = 0xff,136.upper_bound_default = 0x3,137},138[MT8188_AUD_PLL2] = {139.id = MT8188_AUD_PLL2,140.apll_div_reg = AFE_APLL_TUNER_CFG1,141.apll_div_shift = 4,142.apll_div_maskbit = 0xf,143.apll_div_default = 0x7,144.ref_ck_sel_reg = AFE_APLL_TUNER_CFG1,145.ref_ck_sel_shift = 1,146.ref_ck_sel_maskbit = 0x3,147.ref_ck_sel_default = 0x1,148.tuner_en_reg = AFE_APLL_TUNER_CFG1,149.tuner_en_shift = 0,150.tuner_en_maskbit = 0x1,151.upper_bound_reg = AFE_APLL_TUNER_CFG1,152.upper_bound_shift = 8,153.upper_bound_maskbit = 0xff,154.upper_bound_default = 0x3,155},156[MT8188_AUD_PLL3] = {157.id = MT8188_AUD_PLL3,158.apll_div_reg = AFE_EARC_APLL_TUNER_CFG,159.apll_div_shift = 4,160.apll_div_maskbit = 0x3f,161.apll_div_default = 0x3,162.ref_ck_sel_reg = AFE_EARC_APLL_TUNER_CFG,163.ref_ck_sel_shift = 24,164.ref_ck_sel_maskbit = 0x3,165.ref_ck_sel_default = 0x0,166.tuner_en_reg = AFE_EARC_APLL_TUNER_CFG,167.tuner_en_shift = 0,168.tuner_en_maskbit = 0x1,169.upper_bound_reg = AFE_EARC_APLL_TUNER_CFG,170.upper_bound_shift = 12,171.upper_bound_maskbit = 0xff,172.upper_bound_default = 0x4,173},174[MT8188_AUD_PLL4] = {175.id = MT8188_AUD_PLL4,176.apll_div_reg = AFE_SPDIFIN_APLL_TUNER_CFG,177.apll_div_shift = 4,178.apll_div_maskbit = 0x3f,179.apll_div_default = 0x7,180.ref_ck_sel_reg = AFE_SPDIFIN_APLL_TUNER_CFG1,181.ref_ck_sel_shift = 8,182.ref_ck_sel_maskbit = 0x1,183.ref_ck_sel_default = 0,184.tuner_en_reg = AFE_SPDIFIN_APLL_TUNER_CFG,185.tuner_en_shift = 0,186.tuner_en_maskbit = 0x1,187.upper_bound_reg = AFE_SPDIFIN_APLL_TUNER_CFG,188.upper_bound_shift = 12,189.upper_bound_maskbit = 0xff,190.upper_bound_default = 0x4,191},192[MT8188_AUD_PLL5] = {193.id = MT8188_AUD_PLL5,194.apll_div_reg = AFE_LINEIN_APLL_TUNER_CFG,195.apll_div_shift = 4,196.apll_div_maskbit = 0x3f,197.apll_div_default = 0x3,198.ref_ck_sel_reg = AFE_LINEIN_APLL_TUNER_CFG,199.ref_ck_sel_shift = 24,200.ref_ck_sel_maskbit = 0x1,201.ref_ck_sel_default = 0,202.tuner_en_reg = AFE_LINEIN_APLL_TUNER_CFG,203.tuner_en_shift = 0,204.tuner_en_maskbit = 0x1,205.upper_bound_reg = AFE_LINEIN_APLL_TUNER_CFG,206.upper_bound_shift = 12,207.upper_bound_maskbit = 0xff,208.upper_bound_default = 0x4,209},210};211212static struct mt8188_afe_tuner_cfg *mt8188_afe_found_apll_tuner(unsigned int id)213{214if (id >= MT8188_AUD_PLL_NUM)215return NULL;216217return &mt8188_afe_tuner_cfgs[id];218}219220static int mt8188_afe_init_apll_tuner(unsigned int id)221{222struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);223224if (!cfg)225return -EINVAL;226227cfg->ref_cnt = 0;228spin_lock_init(&cfg->ctrl_lock);229230return 0;231}232233static int mt8188_afe_setup_apll_tuner(struct mtk_base_afe *afe, unsigned int id)234{235const struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);236237if (!cfg)238return -EINVAL;239240regmap_update_bits(afe->regmap,241cfg->apll_div_reg,242cfg->apll_div_maskbit << cfg->apll_div_shift,243cfg->apll_div_default << cfg->apll_div_shift);244245regmap_update_bits(afe->regmap,246cfg->ref_ck_sel_reg,247cfg->ref_ck_sel_maskbit << cfg->ref_ck_sel_shift,248cfg->ref_ck_sel_default << cfg->ref_ck_sel_shift);249250regmap_update_bits(afe->regmap,251cfg->upper_bound_reg,252cfg->upper_bound_maskbit << cfg->upper_bound_shift,253cfg->upper_bound_default << cfg->upper_bound_shift);254255return 0;256}257258static int mt8188_afe_enable_tuner_clk(struct mtk_base_afe *afe,259unsigned int id)260{261struct mt8188_afe_private *afe_priv = afe->platform_priv;262263switch (id) {264case MT8188_AUD_PLL1:265mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);266mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);267break;268case MT8188_AUD_PLL2:269mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);270mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);271break;272default:273return -EINVAL;274}275276return 0;277}278279static int mt8188_afe_disable_tuner_clk(struct mtk_base_afe *afe,280unsigned int id)281{282struct mt8188_afe_private *afe_priv = afe->platform_priv;283284switch (id) {285case MT8188_AUD_PLL1:286mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL1_TUNER]);287mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL]);288break;289case MT8188_AUD_PLL2:290mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2_TUNER]);291mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_APLL2]);292break;293default:294return -EINVAL;295}296297return 0;298}299300static int mt8188_afe_enable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)301{302struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);303unsigned long flags;304int ret;305306if (!cfg)307return -EINVAL;308309ret = mt8188_afe_setup_apll_tuner(afe, id);310if (ret)311return ret;312313ret = mt8188_afe_enable_tuner_clk(afe, id);314if (ret)315return ret;316317spin_lock_irqsave(&cfg->ctrl_lock, flags);318319cfg->ref_cnt++;320if (cfg->ref_cnt == 1)321regmap_update_bits(afe->regmap,322cfg->tuner_en_reg,323cfg->tuner_en_maskbit << cfg->tuner_en_shift,324BIT(cfg->tuner_en_shift));325326spin_unlock_irqrestore(&cfg->ctrl_lock, flags);327328return 0;329}330331static int mt8188_afe_disable_apll_tuner(struct mtk_base_afe *afe, unsigned int id)332{333struct mt8188_afe_tuner_cfg *cfg = mt8188_afe_found_apll_tuner(id);334unsigned long flags;335int ret;336337if (!cfg)338return -EINVAL;339340spin_lock_irqsave(&cfg->ctrl_lock, flags);341342cfg->ref_cnt--;343if (cfg->ref_cnt == 0)344regmap_update_bits(afe->regmap,345cfg->tuner_en_reg,346cfg->tuner_en_maskbit << cfg->tuner_en_shift,3470 << cfg->tuner_en_shift);348else if (cfg->ref_cnt < 0)349cfg->ref_cnt = 0;350351spin_unlock_irqrestore(&cfg->ctrl_lock, flags);352353ret = mt8188_afe_disable_tuner_clk(afe, id);354if (ret)355return ret;356357return 0;358}359360int mt8188_afe_get_mclk_source_clk_id(int sel)361{362switch (sel) {363case MT8188_MCK_SEL_26M:364return MT8188_CLK_XTAL_26M;365case MT8188_MCK_SEL_APLL1:366return MT8188_CLK_APMIXED_APLL1;367case MT8188_MCK_SEL_APLL2:368return MT8188_CLK_APMIXED_APLL2;369default:370return -EINVAL;371}372}373374int mt8188_afe_get_mclk_source_rate(struct mtk_base_afe *afe, int apll)375{376struct mt8188_afe_private *afe_priv = afe->platform_priv;377int clk_id = mt8188_afe_get_mclk_source_clk_id(apll);378379if (clk_id < 0) {380dev_dbg(afe->dev, "invalid clk id\n");381return 0;382}383384return clk_get_rate(afe_priv->clk[clk_id]);385}386387int mt8188_afe_get_default_mclk_source_by_rate(int rate)388{389return ((rate % 8000) == 0) ?390MT8188_MCK_SEL_APLL1 : MT8188_MCK_SEL_APLL2;391}392393int mt8188_get_apll_by_rate(struct mtk_base_afe *afe, int rate)394{395return ((rate % 8000) == 0) ? MT8188_AUD_PLL1 : MT8188_AUD_PLL2;396}397398int mt8188_get_apll_by_name(struct mtk_base_afe *afe, const char *name)399{400if (strcmp(name, APLL1_W_NAME) == 0)401return MT8188_AUD_PLL1;402403return MT8188_AUD_PLL2;404}405406int mt8188_afe_init_clock(struct mtk_base_afe *afe)407{408struct mt8188_afe_private *afe_priv = afe->platform_priv;409int i, ret;410411ret = mt8188_audsys_clk_register(afe);412if (ret) {413dev_err(afe->dev, "register audsys clk fail %d\n", ret);414return ret;415}416417afe_priv->clk =418devm_kcalloc(afe->dev, MT8188_CLK_NUM, sizeof(*afe_priv->clk),419GFP_KERNEL);420if (!afe_priv->clk)421return -ENOMEM;422423for (i = 0; i < MT8188_CLK_NUM; i++) {424afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);425if (IS_ERR(afe_priv->clk[i])) {426dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",427__func__, aud_clks[i],428PTR_ERR(afe_priv->clk[i]));429return PTR_ERR(afe_priv->clk[i]);430}431}432433/* initial tuner */434for (i = 0; i < MT8188_AUD_PLL_NUM; i++) {435ret = mt8188_afe_init_apll_tuner(i);436if (ret) {437dev_info(afe->dev, "%s(), init apll_tuner%d failed",438__func__, (i + 1));439return -EINVAL;440}441}442443return 0;444}445446int mt8188_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk)447{448int ret;449450if (clk) {451ret = clk_prepare_enable(clk);452if (ret) {453dev_dbg(afe->dev, "%s(), failed to enable clk\n",454__func__);455return ret;456}457} else {458dev_dbg(afe->dev, "NULL clk\n");459}460return 0;461}462EXPORT_SYMBOL_GPL(mt8188_afe_enable_clk);463464void mt8188_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk)465{466if (clk)467clk_disable_unprepare(clk);468else469dev_dbg(afe->dev, "NULL clk\n");470}471EXPORT_SYMBOL_GPL(mt8188_afe_disable_clk);472473int mt8188_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk,474unsigned int rate)475{476int ret;477478if (clk) {479ret = clk_set_rate(clk, rate);480if (ret) {481dev_dbg(afe->dev, "%s(), failed to set clk rate\n",482__func__);483return ret;484}485}486487return 0;488}489490int mt8188_afe_set_clk_parent(struct mtk_base_afe *afe, struct clk *clk,491struct clk *parent)492{493int ret;494495if (clk && parent) {496ret = clk_set_parent(clk, parent);497if (ret) {498dev_dbg(afe->dev, "%s(), failed to set clk parent %d\n",499__func__, ret);500return ret;501}502}503504return 0;505}506507static unsigned int get_top_cg_reg(unsigned int cg_type)508{509switch (cg_type) {510case MT8188_TOP_CG_A1SYS_TIMING:511case MT8188_TOP_CG_A2SYS_TIMING:512case MT8188_TOP_CG_26M_TIMING:513return ASYS_TOP_CON;514default:515return 0;516}517}518519static unsigned int get_top_cg_mask(unsigned int cg_type)520{521switch (cg_type) {522case MT8188_TOP_CG_A1SYS_TIMING:523return ASYS_TOP_CON_A1SYS_TIMING_ON;524case MT8188_TOP_CG_A2SYS_TIMING:525return ASYS_TOP_CON_A2SYS_TIMING_ON;526case MT8188_TOP_CG_26M_TIMING:527return ASYS_TOP_CON_26M_TIMING_ON;528default:529return 0;530}531}532533static unsigned int get_top_cg_on_val(unsigned int cg_type)534{535switch (cg_type) {536case MT8188_TOP_CG_A1SYS_TIMING:537case MT8188_TOP_CG_A2SYS_TIMING:538case MT8188_TOP_CG_26M_TIMING:539return get_top_cg_mask(cg_type);540default:541return 0;542}543}544545static unsigned int get_top_cg_off_val(unsigned int cg_type)546{547switch (cg_type) {548case MT8188_TOP_CG_A1SYS_TIMING:549case MT8188_TOP_CG_A2SYS_TIMING:550case MT8188_TOP_CG_26M_TIMING:551return 0;552default:553return get_top_cg_mask(cg_type);554}555}556557static int mt8188_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)558{559unsigned int reg = get_top_cg_reg(cg_type);560unsigned int mask = get_top_cg_mask(cg_type);561unsigned int val = get_top_cg_on_val(cg_type);562563regmap_update_bits(afe->regmap, reg, mask, val);564565return 0;566}567568static int mt8188_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)569{570unsigned int reg = get_top_cg_reg(cg_type);571unsigned int mask = get_top_cg_mask(cg_type);572unsigned int val = get_top_cg_off_val(cg_type);573574regmap_update_bits(afe->regmap, reg, mask, val);575576return 0;577}578579int mt8188_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)580{581struct mt8188_afe_private *afe_priv = afe->platform_priv;582583/* bus clock for AFE external access, like DRAM */584mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);585586/* bus clock for AFE internal access, like AFE SRAM */587mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);588589/* audio 26m clock source */590mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);591592/* AFE hw clock */593mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);594mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);595mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);596597return 0;598}599600int mt8188_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)601{602struct mt8188_afe_private *afe_priv = afe->platform_priv;603604mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);605mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS_HP]);606mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_AFE]);607mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_ADSP_AUDIO_26M]);608mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUD_INTBUS_SEL]);609mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_AUDIO_LOCAL_BUS_SEL]);610611return 0;612}613614static int mt8188_afe_enable_afe_on(struct mtk_base_afe *afe)615{616regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);617return 0;618}619620static int mt8188_afe_disable_afe_on(struct mtk_base_afe *afe)621{622regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);623return 0;624}625626static int mt8188_afe_enable_a1sys(struct mtk_base_afe *afe)627{628struct mt8188_afe_private *afe_priv = afe->platform_priv;629int ret;630631ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);632if (ret)633return ret;634635return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);636}637638static int mt8188_afe_disable_a1sys(struct mtk_base_afe *afe)639{640struct mt8188_afe_private *afe_priv = afe->platform_priv;641642mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A1SYS_TIMING);643mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A1SYS]);644return 0;645}646647static int mt8188_afe_enable_a2sys(struct mtk_base_afe *afe)648{649struct mt8188_afe_private *afe_priv = afe->platform_priv;650int ret;651652ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);653if (ret)654return ret;655656return mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);657}658659static int mt8188_afe_disable_a2sys(struct mtk_base_afe *afe)660{661struct mt8188_afe_private *afe_priv = afe->platform_priv;662663mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_A2SYS_TIMING);664mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_A2SYS]);665return 0;666}667668int mt8188_apll1_enable(struct mtk_base_afe *afe)669{670struct mt8188_afe_private *afe_priv = afe->platform_priv;671int ret;672673ret = mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);674if (ret)675return ret;676677ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],678afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);679if (ret)680goto err_clk_parent;681682ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL1);683if (ret)684goto err_apll_tuner;685686ret = mt8188_afe_enable_a1sys(afe);687if (ret)688goto err_a1sys;689690return 0;691692err_a1sys:693mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);694err_apll_tuner:695mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],696afe_priv->clk[MT8188_CLK_XTAL_26M]);697err_clk_parent:698mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);699700return ret;701}702703int mt8188_apll1_disable(struct mtk_base_afe *afe)704{705struct mt8188_afe_private *afe_priv = afe->platform_priv;706707mt8188_afe_disable_a1sys(afe);708mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL1);709mt8188_afe_set_clk_parent(afe, afe_priv->clk[MT8188_CLK_TOP_A1SYS_HP_SEL],710afe_priv->clk[MT8188_CLK_XTAL_26M]);711mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_TOP_APLL1_D4]);712713return 0;714}715716int mt8188_apll2_enable(struct mtk_base_afe *afe)717{718int ret;719720ret = mt8188_afe_enable_apll_tuner(afe, MT8188_AUD_PLL2);721if (ret)722return ret;723724ret = mt8188_afe_enable_a2sys(afe);725if (ret)726goto err_a2sys;727728return 0;729err_a2sys:730mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);731732return ret;733}734735int mt8188_apll2_disable(struct mtk_base_afe *afe)736{737mt8188_afe_disable_a2sys(afe);738mt8188_afe_disable_apll_tuner(afe, MT8188_AUD_PLL2);739return 0;740}741742int mt8188_afe_enable_main_clock(struct mtk_base_afe *afe)743{744mt8188_afe_enable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);745mt8188_afe_enable_afe_on(afe);746return 0;747}748749int mt8188_afe_disable_main_clock(struct mtk_base_afe *afe)750{751mt8188_afe_disable_afe_on(afe);752mt8188_afe_disable_top_cg(afe, MT8188_TOP_CG_26M_TIMING);753return 0;754}755756757