Path: blob/master/sound/soc/mediatek/mt8195/mt8195-afe-clk.c
26488 views
// SPDX-License-Identifier: GPL-2.01/*2* mt8195-afe-clk.c -- Mediatek 8195 afe clock ctrl3*4* Copyright (c) 2021 MediaTek Inc.5* Author: Bicycle Tsai <[email protected]>6* Trevor Wu <[email protected]>7*/89#include <linux/clk.h>1011#include "mt8195-afe-common.h"12#include "mt8195-afe-clk.h"13#include "mt8195-reg.h"14#include "mt8195-audsys-clk.h"1516static const char *aud_clks[MT8195_CLK_NUM] = {17/* xtal */18[MT8195_CLK_XTAL_26M] = "clk26m",19/* divider */20[MT8195_CLK_TOP_APLL1] = "apll1_ck",21[MT8195_CLK_TOP_APLL2] = "apll2_ck",22[MT8195_CLK_TOP_APLL12_DIV0] = "apll12_div0",23[MT8195_CLK_TOP_APLL12_DIV1] = "apll12_div1",24[MT8195_CLK_TOP_APLL12_DIV2] = "apll12_div2",25[MT8195_CLK_TOP_APLL12_DIV3] = "apll12_div3",26[MT8195_CLK_TOP_APLL12_DIV9] = "apll12_div9",27/* mux */28[MT8195_CLK_TOP_A1SYS_HP_SEL] = "a1sys_hp_sel",29[MT8195_CLK_TOP_AUD_INTBUS_SEL] = "aud_intbus_sel",30[MT8195_CLK_TOP_AUDIO_H_SEL] = "audio_h_sel",31[MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = "audio_local_bus_sel",32[MT8195_CLK_TOP_DPTX_M_SEL] = "dptx_m_sel",33[MT8195_CLK_TOP_I2SO1_M_SEL] = "i2so1_m_sel",34[MT8195_CLK_TOP_I2SO2_M_SEL] = "i2so2_m_sel",35[MT8195_CLK_TOP_I2SI1_M_SEL] = "i2si1_m_sel",36[MT8195_CLK_TOP_I2SI2_M_SEL] = "i2si2_m_sel",37/* clock gate */38[MT8195_CLK_INFRA_AO_AUDIO_26M_B] = "infra_ao_audio_26m_b",39[MT8195_CLK_SCP_ADSP_AUDIODSP] = "scp_adsp_audiodsp",40/* afe clock gate */41[MT8195_CLK_AUD_AFE] = "aud_afe",42[MT8195_CLK_AUD_APLL1_TUNER] = "aud_apll1_tuner",43[MT8195_CLK_AUD_APLL2_TUNER] = "aud_apll2_tuner",44[MT8195_CLK_AUD_APLL] = "aud_apll",45[MT8195_CLK_AUD_APLL2] = "aud_apll2",46[MT8195_CLK_AUD_DAC] = "aud_dac",47[MT8195_CLK_AUD_ADC] = "aud_adc",48[MT8195_CLK_AUD_DAC_HIRES] = "aud_dac_hires",49[MT8195_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp",50[MT8195_CLK_AUD_ADC_HIRES] = "aud_adc_hires",51[MT8195_CLK_AUD_ADDA6_ADC] = "aud_adda6_adc",52[MT8195_CLK_AUD_ADDA6_ADC_HIRES] = "aud_adda6_adc_hires",53[MT8195_CLK_AUD_I2SIN] = "aud_i2sin",54[MT8195_CLK_AUD_TDM_IN] = "aud_tdm_in",55[MT8195_CLK_AUD_I2S_OUT] = "aud_i2s_out",56[MT8195_CLK_AUD_TDM_OUT] = "aud_tdm_out",57[MT8195_CLK_AUD_HDMI_OUT] = "aud_hdmi_out",58[MT8195_CLK_AUD_ASRC11] = "aud_asrc11",59[MT8195_CLK_AUD_ASRC12] = "aud_asrc12",60[MT8195_CLK_AUD_A1SYS] = "aud_a1sys",61[MT8195_CLK_AUD_A2SYS] = "aud_a2sys",62[MT8195_CLK_AUD_PCMIF] = "aud_pcmif",63[MT8195_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1",64[MT8195_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2",65[MT8195_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3",66[MT8195_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4",67[MT8195_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5",68[MT8195_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6",69[MT8195_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8",70[MT8195_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9",71[MT8195_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10",72[MT8195_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2",73[MT8195_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3",74[MT8195_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6",75[MT8195_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7",76[MT8195_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8",77[MT8195_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10",78[MT8195_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11",79};8081struct mt8195_afe_tuner_cfg {82unsigned int id;83int apll_div_reg;84unsigned int apll_div_shift;85unsigned int apll_div_maskbit;86unsigned int apll_div_default;87int ref_ck_sel_reg;88unsigned int ref_ck_sel_shift;89unsigned int ref_ck_sel_maskbit;90unsigned int ref_ck_sel_default;91int tuner_en_reg;92unsigned int tuner_en_shift;93unsigned int tuner_en_maskbit;94int upper_bound_reg;95unsigned int upper_bound_shift;96unsigned int upper_bound_maskbit;97unsigned int upper_bound_default;98spinlock_t ctrl_lock; /* lock for apll tuner ctrl*/99int ref_cnt;100};101102static struct mt8195_afe_tuner_cfg mt8195_afe_tuner_cfgs[MT8195_AUD_PLL_NUM] = {103[MT8195_AUD_PLL1] = {104.id = MT8195_AUD_PLL1,105.apll_div_reg = AFE_APLL_TUNER_CFG,106.apll_div_shift = 4,107.apll_div_maskbit = 0xf,108.apll_div_default = 0x7,109.ref_ck_sel_reg = AFE_APLL_TUNER_CFG,110.ref_ck_sel_shift = 1,111.ref_ck_sel_maskbit = 0x3,112.ref_ck_sel_default = 0x2,113.tuner_en_reg = AFE_APLL_TUNER_CFG,114.tuner_en_shift = 0,115.tuner_en_maskbit = 0x1,116.upper_bound_reg = AFE_APLL_TUNER_CFG,117.upper_bound_shift = 8,118.upper_bound_maskbit = 0xff,119.upper_bound_default = 0x3,120},121[MT8195_AUD_PLL2] = {122.id = MT8195_AUD_PLL2,123.apll_div_reg = AFE_APLL_TUNER_CFG1,124.apll_div_shift = 4,125.apll_div_maskbit = 0xf,126.apll_div_default = 0x7,127.ref_ck_sel_reg = AFE_APLL_TUNER_CFG1,128.ref_ck_sel_shift = 1,129.ref_ck_sel_maskbit = 0x3,130.ref_ck_sel_default = 0x1,131.tuner_en_reg = AFE_APLL_TUNER_CFG1,132.tuner_en_shift = 0,133.tuner_en_maskbit = 0x1,134.upper_bound_reg = AFE_APLL_TUNER_CFG1,135.upper_bound_shift = 8,136.upper_bound_maskbit = 0xff,137.upper_bound_default = 0x3,138},139[MT8195_AUD_PLL3] = {140.id = MT8195_AUD_PLL3,141.apll_div_reg = AFE_EARC_APLL_TUNER_CFG,142.apll_div_shift = 4,143.apll_div_maskbit = 0x3f,144.apll_div_default = 0x3,145.ref_ck_sel_reg = AFE_EARC_APLL_TUNER_CFG,146.ref_ck_sel_shift = 24,147.ref_ck_sel_maskbit = 0x3,148.ref_ck_sel_default = 0x0,149.tuner_en_reg = AFE_EARC_APLL_TUNER_CFG,150.tuner_en_shift = 0,151.tuner_en_maskbit = 0x1,152.upper_bound_reg = AFE_EARC_APLL_TUNER_CFG,153.upper_bound_shift = 12,154.upper_bound_maskbit = 0xff,155.upper_bound_default = 0x4,156},157[MT8195_AUD_PLL4] = {158.id = MT8195_AUD_PLL4,159.apll_div_reg = AFE_SPDIFIN_APLL_TUNER_CFG,160.apll_div_shift = 4,161.apll_div_maskbit = 0x3f,162.apll_div_default = 0x7,163.ref_ck_sel_reg = AFE_SPDIFIN_APLL_TUNER_CFG1,164.ref_ck_sel_shift = 8,165.ref_ck_sel_maskbit = 0x1,166.ref_ck_sel_default = 0,167.tuner_en_reg = AFE_SPDIFIN_APLL_TUNER_CFG,168.tuner_en_shift = 0,169.tuner_en_maskbit = 0x1,170.upper_bound_reg = AFE_SPDIFIN_APLL_TUNER_CFG,171.upper_bound_shift = 12,172.upper_bound_maskbit = 0xff,173.upper_bound_default = 0x4,174},175[MT8195_AUD_PLL5] = {176.id = MT8195_AUD_PLL5,177.apll_div_reg = AFE_LINEIN_APLL_TUNER_CFG,178.apll_div_shift = 4,179.apll_div_maskbit = 0x3f,180.apll_div_default = 0x3,181.ref_ck_sel_reg = AFE_LINEIN_APLL_TUNER_CFG,182.ref_ck_sel_shift = 24,183.ref_ck_sel_maskbit = 0x1,184.ref_ck_sel_default = 0,185.tuner_en_reg = AFE_LINEIN_APLL_TUNER_CFG,186.tuner_en_shift = 0,187.tuner_en_maskbit = 0x1,188.upper_bound_reg = AFE_LINEIN_APLL_TUNER_CFG,189.upper_bound_shift = 12,190.upper_bound_maskbit = 0xff,191.upper_bound_default = 0x4,192},193};194195static struct mt8195_afe_tuner_cfg *mt8195_afe_found_apll_tuner(unsigned int id)196{197if (id >= MT8195_AUD_PLL_NUM)198return NULL;199200return &mt8195_afe_tuner_cfgs[id];201}202203static int mt8195_afe_init_apll_tuner(unsigned int id)204{205struct mt8195_afe_tuner_cfg *cfg = mt8195_afe_found_apll_tuner(id);206207if (!cfg)208return -EINVAL;209210cfg->ref_cnt = 0;211spin_lock_init(&cfg->ctrl_lock);212213return 0;214}215216static int mt8195_afe_setup_apll_tuner(struct mtk_base_afe *afe,217unsigned int id)218{219const struct mt8195_afe_tuner_cfg *cfg = mt8195_afe_found_apll_tuner(id);220221if (!cfg)222return -EINVAL;223224regmap_update_bits(afe->regmap, cfg->apll_div_reg,225cfg->apll_div_maskbit << cfg->apll_div_shift,226cfg->apll_div_default << cfg->apll_div_shift);227228regmap_update_bits(afe->regmap, cfg->ref_ck_sel_reg,229cfg->ref_ck_sel_maskbit << cfg->ref_ck_sel_shift,230cfg->ref_ck_sel_default << cfg->ref_ck_sel_shift);231232regmap_update_bits(afe->regmap, cfg->upper_bound_reg,233cfg->upper_bound_maskbit << cfg->upper_bound_shift,234cfg->upper_bound_default << cfg->upper_bound_shift);235236return 0;237}238239static int mt8195_afe_enable_tuner_clk(struct mtk_base_afe *afe,240unsigned int id)241{242struct mt8195_afe_private *afe_priv = afe->platform_priv;243244switch (id) {245case MT8195_AUD_PLL1:246mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL]);247mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL1_TUNER]);248break;249case MT8195_AUD_PLL2:250mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL2]);251mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL2_TUNER]);252break;253default:254break;255}256257return 0;258}259260static int mt8195_afe_disable_tuner_clk(struct mtk_base_afe *afe,261unsigned int id)262{263struct mt8195_afe_private *afe_priv = afe->platform_priv;264265switch (id) {266case MT8195_AUD_PLL1:267mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL1_TUNER]);268mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL]);269break;270case MT8195_AUD_PLL2:271mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL2_TUNER]);272mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_APLL2]);273break;274default:275break;276}277278return 0;279}280281static int mt8195_afe_enable_apll_tuner(struct mtk_base_afe *afe,282unsigned int id)283{284struct mt8195_afe_tuner_cfg *cfg = mt8195_afe_found_apll_tuner(id);285unsigned long flags;286int ret;287288if (!cfg)289return -EINVAL;290291ret = mt8195_afe_setup_apll_tuner(afe, id);292if (ret)293return ret;294295ret = mt8195_afe_enable_tuner_clk(afe, id);296if (ret)297return ret;298299spin_lock_irqsave(&cfg->ctrl_lock, flags);300301cfg->ref_cnt++;302if (cfg->ref_cnt == 1)303regmap_update_bits(afe->regmap,304cfg->tuner_en_reg,305cfg->tuner_en_maskbit << cfg->tuner_en_shift,3061 << cfg->tuner_en_shift);307308spin_unlock_irqrestore(&cfg->ctrl_lock, flags);309310return 0;311}312313static int mt8195_afe_disable_apll_tuner(struct mtk_base_afe *afe,314unsigned int id)315{316struct mt8195_afe_tuner_cfg *cfg = mt8195_afe_found_apll_tuner(id);317unsigned long flags;318int ret;319320if (!cfg)321return -EINVAL;322323spin_lock_irqsave(&cfg->ctrl_lock, flags);324325cfg->ref_cnt--;326if (cfg->ref_cnt == 0)327regmap_update_bits(afe->regmap,328cfg->tuner_en_reg,329cfg->tuner_en_maskbit << cfg->tuner_en_shift,3300 << cfg->tuner_en_shift);331else if (cfg->ref_cnt < 0)332cfg->ref_cnt = 0;333334spin_unlock_irqrestore(&cfg->ctrl_lock, flags);335336ret = mt8195_afe_disable_tuner_clk(afe, id);337if (ret)338return ret;339340return 0;341}342343int mt8195_afe_get_mclk_source_clk_id(int sel)344{345switch (sel) {346case MT8195_MCK_SEL_26M:347return MT8195_CLK_XTAL_26M;348case MT8195_MCK_SEL_APLL1:349return MT8195_CLK_TOP_APLL1;350case MT8195_MCK_SEL_APLL2:351return MT8195_CLK_TOP_APLL2;352default:353return -EINVAL;354}355}356357int mt8195_afe_get_mclk_source_rate(struct mtk_base_afe *afe, int apll)358{359struct mt8195_afe_private *afe_priv = afe->platform_priv;360int clk_id = mt8195_afe_get_mclk_source_clk_id(apll);361362if (clk_id < 0) {363dev_dbg(afe->dev, "invalid clk id\n");364return 0;365}366367return clk_get_rate(afe_priv->clk[clk_id]);368}369370int mt8195_afe_get_default_mclk_source_by_rate(int rate)371{372return ((rate % 8000) == 0) ?373MT8195_MCK_SEL_APLL1 : MT8195_MCK_SEL_APLL2;374}375376int mt8195_afe_init_clock(struct mtk_base_afe *afe)377{378struct mt8195_afe_private *afe_priv = afe->platform_priv;379int i, ret;380381mt8195_audsys_clk_register(afe);382383afe_priv->clk =384devm_kcalloc(afe->dev, MT8195_CLK_NUM, sizeof(*afe_priv->clk),385GFP_KERNEL);386if (!afe_priv->clk)387return -ENOMEM;388389for (i = 0; i < MT8195_CLK_NUM; i++) {390afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);391if (IS_ERR(afe_priv->clk[i])) {392dev_dbg(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",393__func__, aud_clks[i],394PTR_ERR(afe_priv->clk[i]));395return PTR_ERR(afe_priv->clk[i]);396}397}398399/* initial tuner */400for (i = 0; i < MT8195_AUD_PLL_NUM; i++) {401ret = mt8195_afe_init_apll_tuner(i);402if (ret) {403dev_dbg(afe->dev, "%s(), init apll_tuner%d failed",404__func__, (i + 1));405return -EINVAL;406}407}408409return 0;410}411412int mt8195_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk)413{414int ret;415416if (clk) {417ret = clk_prepare_enable(clk);418if (ret) {419dev_dbg(afe->dev, "%s(), failed to enable clk\n",420__func__);421return ret;422}423} else {424dev_dbg(afe->dev, "NULL clk\n");425}426return 0;427}428EXPORT_SYMBOL_GPL(mt8195_afe_enable_clk);429430void mt8195_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk)431{432if (clk)433clk_disable_unprepare(clk);434else435dev_dbg(afe->dev, "NULL clk\n");436}437EXPORT_SYMBOL_GPL(mt8195_afe_disable_clk);438439int mt8195_afe_prepare_clk(struct mtk_base_afe *afe, struct clk *clk)440{441int ret;442443if (clk) {444ret = clk_prepare(clk);445if (ret) {446dev_dbg(afe->dev, "%s(), failed to prepare clk\n",447__func__);448return ret;449}450} else {451dev_dbg(afe->dev, "NULL clk\n");452}453return 0;454}455456void mt8195_afe_unprepare_clk(struct mtk_base_afe *afe, struct clk *clk)457{458if (clk)459clk_unprepare(clk);460else461dev_dbg(afe->dev, "NULL clk\n");462}463464int mt8195_afe_enable_clk_atomic(struct mtk_base_afe *afe, struct clk *clk)465{466int ret;467468if (clk) {469ret = clk_enable(clk);470if (ret) {471dev_dbg(afe->dev, "%s(), failed to clk enable\n",472__func__);473return ret;474}475} else {476dev_dbg(afe->dev, "NULL clk\n");477}478return 0;479}480481void mt8195_afe_disable_clk_atomic(struct mtk_base_afe *afe, struct clk *clk)482{483if (clk)484clk_disable(clk);485else486dev_dbg(afe->dev, "NULL clk\n");487}488489int mt8195_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk,490unsigned int rate)491{492int ret;493494if (clk) {495ret = clk_set_rate(clk, rate);496if (ret) {497dev_dbg(afe->dev, "%s(), failed to set clk rate\n",498__func__);499return ret;500}501}502503return 0;504}505506int mt8195_afe_set_clk_parent(struct mtk_base_afe *afe, struct clk *clk,507struct clk *parent)508{509int ret;510511if (clk && parent) {512ret = clk_set_parent(clk, parent);513if (ret) {514dev_dbg(afe->dev, "%s(), failed to set clk parent\n",515__func__);516return ret;517}518}519520return 0;521}522523static unsigned int get_top_cg_reg(unsigned int cg_type)524{525switch (cg_type) {526case MT8195_TOP_CG_A1SYS_TIMING:527case MT8195_TOP_CG_A2SYS_TIMING:528case MT8195_TOP_CG_26M_TIMING:529return ASYS_TOP_CON;530default:531return 0;532}533}534535static unsigned int get_top_cg_mask(unsigned int cg_type)536{537switch (cg_type) {538case MT8195_TOP_CG_A1SYS_TIMING:539return ASYS_TOP_CON_A1SYS_TIMING_ON;540case MT8195_TOP_CG_A2SYS_TIMING:541return ASYS_TOP_CON_A2SYS_TIMING_ON;542case MT8195_TOP_CG_26M_TIMING:543return ASYS_TOP_CON_26M_TIMING_ON;544default:545return 0;546}547}548549static unsigned int get_top_cg_on_val(unsigned int cg_type)550{551switch (cg_type) {552case MT8195_TOP_CG_A1SYS_TIMING:553case MT8195_TOP_CG_A2SYS_TIMING:554case MT8195_TOP_CG_26M_TIMING:555return get_top_cg_mask(cg_type);556default:557return 0;558}559}560561static unsigned int get_top_cg_off_val(unsigned int cg_type)562{563switch (cg_type) {564case MT8195_TOP_CG_A1SYS_TIMING:565case MT8195_TOP_CG_A2SYS_TIMING:566case MT8195_TOP_CG_26M_TIMING:567return 0;568default:569return get_top_cg_mask(cg_type);570}571}572573static int mt8195_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)574{575unsigned int reg = get_top_cg_reg(cg_type);576unsigned int mask = get_top_cg_mask(cg_type);577unsigned int val = get_top_cg_on_val(cg_type);578579regmap_update_bits(afe->regmap, reg, mask, val);580return 0;581}582583static int mt8195_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)584{585unsigned int reg = get_top_cg_reg(cg_type);586unsigned int mask = get_top_cg_mask(cg_type);587unsigned int val = get_top_cg_off_val(cg_type);588589regmap_update_bits(afe->regmap, reg, mask, val);590return 0;591}592593int mt8195_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)594{595struct mt8195_afe_private *afe_priv = afe->platform_priv;596int i;597static const unsigned int clk_array[] = {598MT8195_CLK_SCP_ADSP_AUDIODSP, /* bus clock for infra */599MT8195_CLK_TOP_AUDIO_H_SEL, /* clock for ADSP bus */600MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL, /* bus clock for DRAM access */601MT8195_CLK_TOP_AUD_INTBUS_SEL, /* bus clock for AFE SRAM access */602MT8195_CLK_INFRA_AO_AUDIO_26M_B, /* audio 26M clock */603MT8195_CLK_AUD_AFE, /* AFE HW master switch */604MT8195_CLK_AUD_A1SYS_HP, /* AFE HW clock*/605MT8195_CLK_AUD_A1SYS, /* AFE HW clock */606};607608for (i = 0; i < ARRAY_SIZE(clk_array); i++)609mt8195_afe_enable_clk(afe, afe_priv->clk[clk_array[i]]);610611return 0;612}613614int mt8195_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)615{616struct mt8195_afe_private *afe_priv = afe->platform_priv;617int i;618static const unsigned int clk_array[] = {619MT8195_CLK_AUD_A1SYS,620MT8195_CLK_AUD_A1SYS_HP,621MT8195_CLK_AUD_AFE,622MT8195_CLK_INFRA_AO_AUDIO_26M_B,623MT8195_CLK_TOP_AUD_INTBUS_SEL,624MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL,625MT8195_CLK_TOP_AUDIO_H_SEL,626MT8195_CLK_SCP_ADSP_AUDIODSP,627};628629for (i = 0; i < ARRAY_SIZE(clk_array); i++)630mt8195_afe_disable_clk(afe, afe_priv->clk[clk_array[i]]);631632return 0;633}634635static int mt8195_afe_enable_afe_on(struct mtk_base_afe *afe)636{637regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);638return 0;639}640641static int mt8195_afe_disable_afe_on(struct mtk_base_afe *afe)642{643regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);644return 0;645}646647static int mt8195_afe_enable_timing_sys(struct mtk_base_afe *afe)648{649struct mt8195_afe_private *afe_priv = afe->platform_priv;650int i;651static const unsigned int clk_array[] = {652MT8195_CLK_AUD_A1SYS,653MT8195_CLK_AUD_A2SYS,654};655static const unsigned int cg_array[] = {656MT8195_TOP_CG_A1SYS_TIMING,657MT8195_TOP_CG_A2SYS_TIMING,658MT8195_TOP_CG_26M_TIMING,659};660661for (i = 0; i < ARRAY_SIZE(clk_array); i++)662mt8195_afe_enable_clk(afe, afe_priv->clk[clk_array[i]]);663664for (i = 0; i < ARRAY_SIZE(cg_array); i++)665mt8195_afe_enable_top_cg(afe, cg_array[i]);666667return 0;668}669670static int mt8195_afe_disable_timing_sys(struct mtk_base_afe *afe)671{672struct mt8195_afe_private *afe_priv = afe->platform_priv;673int i;674static const unsigned int clk_array[] = {675MT8195_CLK_AUD_A2SYS,676MT8195_CLK_AUD_A1SYS,677};678static const unsigned int cg_array[] = {679MT8195_TOP_CG_26M_TIMING,680MT8195_TOP_CG_A2SYS_TIMING,681MT8195_TOP_CG_A1SYS_TIMING,682};683684for (i = 0; i < ARRAY_SIZE(cg_array); i++)685mt8195_afe_disable_top_cg(afe, cg_array[i]);686687for (i = 0; i < ARRAY_SIZE(clk_array); i++)688mt8195_afe_disable_clk(afe, afe_priv->clk[clk_array[i]]);689690return 0;691}692693int mt8195_afe_enable_main_clock(struct mtk_base_afe *afe)694{695mt8195_afe_enable_timing_sys(afe);696697mt8195_afe_enable_afe_on(afe);698699mt8195_afe_enable_apll_tuner(afe, MT8195_AUD_PLL1);700mt8195_afe_enable_apll_tuner(afe, MT8195_AUD_PLL2);701702return 0;703}704705int mt8195_afe_disable_main_clock(struct mtk_base_afe *afe)706{707mt8195_afe_disable_apll_tuner(afe, MT8195_AUD_PLL2);708mt8195_afe_disable_apll_tuner(afe, MT8195_AUD_PLL1);709710mt8195_afe_disable_afe_on(afe);711712mt8195_afe_disable_timing_sys(afe);713714return 0;715}716717718