1*7384ecabSDarren Ye // SPDX-License-Identifier: GPL-2.0 2*7384ecabSDarren Ye /* 3*7384ecabSDarren Ye * mt8196-afe-clk.c -- Mediatek 8196 afe clock ctrl 4*7384ecabSDarren Ye * 5*7384ecabSDarren Ye * Copyright (c) 2025 MediaTek Inc. 6*7384ecabSDarren Ye * Author: Darren Ye <darren.ye@mediatek.com> 7*7384ecabSDarren Ye */ 8*7384ecabSDarren Ye 9*7384ecabSDarren Ye #include <linux/clk.h> 10*7384ecabSDarren Ye #include <linux/regmap.h> 11*7384ecabSDarren Ye #include <linux/mfd/syscon.h> 12*7384ecabSDarren Ye 13*7384ecabSDarren Ye #include "mt8196-afe-clk.h" 14*7384ecabSDarren Ye #include "mt8196-afe-common.h" 15*7384ecabSDarren Ye 16*7384ecabSDarren Ye static const char *aud_clks[MT8196_CLK_NUM] = { 17*7384ecabSDarren Ye /* vlp clk */ 18*7384ecabSDarren Ye [MT8196_CLK_VLP_MUX_AUDIOINTBUS] = "top_aud_intbus", 19*7384ecabSDarren Ye [MT8196_CLK_VLP_MUX_AUD_ENG1] = "top_aud_eng1", 20*7384ecabSDarren Ye [MT8196_CLK_VLP_MUX_AUD_ENG2] = "top_aud_eng2", 21*7384ecabSDarren Ye [MT8196_CLK_VLP_MUX_AUDIO_H] = "top_aud_h", 22*7384ecabSDarren Ye /* pll */ 23*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL1_CK] = "apll1", 24*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL2_CK] = "apll2", 25*7384ecabSDarren Ye /* divider */ 26*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL12_DIV_I2SIN0] = "apll12_div_i2sin0", 27*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL12_DIV_I2SIN1] = "apll12_div_i2sin1", 28*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL12_DIV_FMI2S] = "apll12_div_fmi2s", 29*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL12_DIV_TDMOUT_M] = "apll12_div_tdmout_m", 30*7384ecabSDarren Ye [MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B] = "apll12_div_tdmout_b", 31*7384ecabSDarren Ye /* mux */ 32*7384ecabSDarren Ye [MT8196_CLK_TOP_ADSP_SEL] = "top_adsp", 33*7384ecabSDarren Ye }; 34*7384ecabSDarren Ye 35*7384ecabSDarren Ye int mt8196_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk) 36*7384ecabSDarren Ye { 37*7384ecabSDarren Ye int ret; 38*7384ecabSDarren Ye 39*7384ecabSDarren Ye ret = clk_prepare_enable(clk); 40*7384ecabSDarren Ye if (ret) { 41*7384ecabSDarren Ye dev_err(afe->dev, "failed to enable clk\n"); 42*7384ecabSDarren Ye return ret; 43*7384ecabSDarren Ye } 44*7384ecabSDarren Ye 45*7384ecabSDarren Ye return 0; 46*7384ecabSDarren Ye } 47*7384ecabSDarren Ye EXPORT_SYMBOL_GPL(mt8196_afe_enable_clk); 48*7384ecabSDarren Ye 49*7384ecabSDarren Ye void mt8196_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk) 50*7384ecabSDarren Ye { 51*7384ecabSDarren Ye if (clk) 52*7384ecabSDarren Ye clk_disable_unprepare(clk); 53*7384ecabSDarren Ye else 54*7384ecabSDarren Ye dev_err(afe->dev, "NULL clk\n"); 55*7384ecabSDarren Ye } 56*7384ecabSDarren Ye EXPORT_SYMBOL_GPL(mt8196_afe_disable_clk); 57*7384ecabSDarren Ye 58*7384ecabSDarren Ye static int mt8196_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk, 59*7384ecabSDarren Ye unsigned int rate) 60*7384ecabSDarren Ye { 61*7384ecabSDarren Ye int ret; 62*7384ecabSDarren Ye 63*7384ecabSDarren Ye if (clk) { 64*7384ecabSDarren Ye ret = clk_set_rate(clk, rate); 65*7384ecabSDarren Ye if (ret) { 66*7384ecabSDarren Ye dev_err(afe->dev, "failed to set clk rate\n"); 67*7384ecabSDarren Ye return ret; 68*7384ecabSDarren Ye } 69*7384ecabSDarren Ye } 70*7384ecabSDarren Ye 71*7384ecabSDarren Ye return 0; 72*7384ecabSDarren Ye } 73*7384ecabSDarren Ye 74*7384ecabSDarren Ye static unsigned int get_top_cg_reg(unsigned int cg_type) 75*7384ecabSDarren Ye { 76*7384ecabSDarren Ye switch (cg_type) { 77*7384ecabSDarren Ye case MT8196_AUDIO_26M_EN_ON: 78*7384ecabSDarren Ye case MT8196_AUDIO_F3P25M_EN_ON: 79*7384ecabSDarren Ye case MT8196_AUDIO_APLL1_EN_ON: 80*7384ecabSDarren Ye case MT8196_AUDIO_APLL2_EN_ON: 81*7384ecabSDarren Ye return AUDIO_ENGEN_CON0; 82*7384ecabSDarren Ye case MT8196_CG_AUDIO_HOPPING_CK: 83*7384ecabSDarren Ye case MT8196_CG_AUDIO_F26M_CK: 84*7384ecabSDarren Ye case MT8196_CG_APLL1_CK: 85*7384ecabSDarren Ye case MT8196_CG_APLL2_CK: 86*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER2: 87*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER1: 88*7384ecabSDarren Ye return AUDIO_TOP_CON4; 89*7384ecabSDarren Ye default: 90*7384ecabSDarren Ye return 0; 91*7384ecabSDarren Ye } 92*7384ecabSDarren Ye } 93*7384ecabSDarren Ye 94*7384ecabSDarren Ye static unsigned int get_top_cg_mask(unsigned int cg_type) 95*7384ecabSDarren Ye { 96*7384ecabSDarren Ye switch (cg_type) { 97*7384ecabSDarren Ye case MT8196_AUDIO_26M_EN_ON: 98*7384ecabSDarren Ye return AUDIO_26M_EN_ON_MASK_SFT; 99*7384ecabSDarren Ye case MT8196_AUDIO_F3P25M_EN_ON: 100*7384ecabSDarren Ye return AUDIO_F3P25M_EN_ON_MASK_SFT; 101*7384ecabSDarren Ye case MT8196_AUDIO_APLL1_EN_ON: 102*7384ecabSDarren Ye return AUDIO_APLL1_EN_ON_MASK_SFT; 103*7384ecabSDarren Ye case MT8196_AUDIO_APLL2_EN_ON: 104*7384ecabSDarren Ye return AUDIO_APLL2_EN_ON_MASK_SFT; 105*7384ecabSDarren Ye case MT8196_CG_AUDIO_HOPPING_CK: 106*7384ecabSDarren Ye return CG_AUDIO_HOPPING_CK_MASK_SFT; 107*7384ecabSDarren Ye case MT8196_CG_AUDIO_F26M_CK: 108*7384ecabSDarren Ye return CG_AUDIO_F26M_CK_MASK_SFT; 109*7384ecabSDarren Ye case MT8196_CG_APLL1_CK: 110*7384ecabSDarren Ye return CG_APLL1_CK_MASK_SFT; 111*7384ecabSDarren Ye case MT8196_CG_APLL2_CK: 112*7384ecabSDarren Ye return CG_APLL2_CK_MASK_SFT; 113*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER2: 114*7384ecabSDarren Ye return PDN_APLL_TUNER2_MASK_SFT; 115*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER1: 116*7384ecabSDarren Ye return PDN_APLL_TUNER1_MASK_SFT; 117*7384ecabSDarren Ye default: 118*7384ecabSDarren Ye return 0; 119*7384ecabSDarren Ye } 120*7384ecabSDarren Ye } 121*7384ecabSDarren Ye 122*7384ecabSDarren Ye static unsigned int get_top_cg_on_val(unsigned int cg_type) 123*7384ecabSDarren Ye { 124*7384ecabSDarren Ye switch (cg_type) { 125*7384ecabSDarren Ye case MT8196_AUDIO_26M_EN_ON: 126*7384ecabSDarren Ye case MT8196_AUDIO_F3P25M_EN_ON: 127*7384ecabSDarren Ye case MT8196_AUDIO_APLL1_EN_ON: 128*7384ecabSDarren Ye case MT8196_AUDIO_APLL2_EN_ON: 129*7384ecabSDarren Ye return get_top_cg_mask(cg_type); 130*7384ecabSDarren Ye case MT8196_CG_AUDIO_HOPPING_CK: 131*7384ecabSDarren Ye case MT8196_CG_AUDIO_F26M_CK: 132*7384ecabSDarren Ye case MT8196_CG_APLL1_CK: 133*7384ecabSDarren Ye case MT8196_CG_APLL2_CK: 134*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER2: 135*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER1: 136*7384ecabSDarren Ye return 0; 137*7384ecabSDarren Ye default: 138*7384ecabSDarren Ye return 0; 139*7384ecabSDarren Ye } 140*7384ecabSDarren Ye } 141*7384ecabSDarren Ye 142*7384ecabSDarren Ye static unsigned int get_top_cg_off_val(unsigned int cg_type) 143*7384ecabSDarren Ye { 144*7384ecabSDarren Ye switch (cg_type) { 145*7384ecabSDarren Ye case MT8196_AUDIO_26M_EN_ON: 146*7384ecabSDarren Ye case MT8196_AUDIO_F3P25M_EN_ON: 147*7384ecabSDarren Ye case MT8196_AUDIO_APLL1_EN_ON: 148*7384ecabSDarren Ye case MT8196_AUDIO_APLL2_EN_ON: 149*7384ecabSDarren Ye return 0; 150*7384ecabSDarren Ye case MT8196_CG_AUDIO_HOPPING_CK: 151*7384ecabSDarren Ye case MT8196_CG_AUDIO_F26M_CK: 152*7384ecabSDarren Ye case MT8196_CG_APLL1_CK: 153*7384ecabSDarren Ye case MT8196_CG_APLL2_CK: 154*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER2: 155*7384ecabSDarren Ye case MT8196_PDN_APLL_TUNER1: 156*7384ecabSDarren Ye return get_top_cg_mask(cg_type); 157*7384ecabSDarren Ye default: 158*7384ecabSDarren Ye return get_top_cg_mask(cg_type); 159*7384ecabSDarren Ye } 160*7384ecabSDarren Ye } 161*7384ecabSDarren Ye 162*7384ecabSDarren Ye static int mt8196_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type) 163*7384ecabSDarren Ye { 164*7384ecabSDarren Ye int ret; 165*7384ecabSDarren Ye unsigned int reg = get_top_cg_reg(cg_type); 166*7384ecabSDarren Ye unsigned int mask = get_top_cg_mask(cg_type); 167*7384ecabSDarren Ye unsigned int val = get_top_cg_on_val(cg_type); 168*7384ecabSDarren Ye 169*7384ecabSDarren Ye if (!afe->regmap) { 170*7384ecabSDarren Ye dev_err(afe->dev, "afe regmap is null !!!\n"); 171*7384ecabSDarren Ye return 0; 172*7384ecabSDarren Ye } 173*7384ecabSDarren Ye 174*7384ecabSDarren Ye dev_dbg(afe->dev, "reg: 0x%x, mask: 0x%x, val: 0x%x\n", reg, mask, val); 175*7384ecabSDarren Ye 176*7384ecabSDarren Ye ret = regmap_update_bits(afe->regmap, reg, mask, val); 177*7384ecabSDarren Ye if (ret) 178*7384ecabSDarren Ye dev_err(afe->dev, "regmap_update_bits failed: %d\n", ret); 179*7384ecabSDarren Ye 180*7384ecabSDarren Ye return ret; 181*7384ecabSDarren Ye } 182*7384ecabSDarren Ye 183*7384ecabSDarren Ye static int mt8196_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type) 184*7384ecabSDarren Ye { 185*7384ecabSDarren Ye int ret; 186*7384ecabSDarren Ye unsigned int reg = get_top_cg_reg(cg_type); 187*7384ecabSDarren Ye unsigned int mask = get_top_cg_mask(cg_type); 188*7384ecabSDarren Ye unsigned int val = get_top_cg_off_val(cg_type); 189*7384ecabSDarren Ye 190*7384ecabSDarren Ye if (!afe->regmap) { 191*7384ecabSDarren Ye dev_err(afe->dev, "afe regmap is null !!!\n"); 192*7384ecabSDarren Ye return 0; 193*7384ecabSDarren Ye } 194*7384ecabSDarren Ye 195*7384ecabSDarren Ye dev_dbg(afe->dev, "reg: 0x%x, mask: 0x%x, val: 0x%x\n", reg, mask, val); 196*7384ecabSDarren Ye 197*7384ecabSDarren Ye ret = regmap_update_bits(afe->regmap, reg, mask, val); 198*7384ecabSDarren Ye if (ret) 199*7384ecabSDarren Ye dev_err(afe->dev, "regmap_update_bits failed: %d\n", ret); 200*7384ecabSDarren Ye 201*7384ecabSDarren Ye return ret; 202*7384ecabSDarren Ye } 203*7384ecabSDarren Ye 204*7384ecabSDarren Ye static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable) 205*7384ecabSDarren Ye { 206*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 207*7384ecabSDarren Ye int apll_rate; 208*7384ecabSDarren Ye int ret; 209*7384ecabSDarren Ye 210*7384ecabSDarren Ye dev_dbg(afe->dev, "enable: %d\n", enable); 211*7384ecabSDarren Ye 212*7384ecabSDarren Ye if (enable) { 213*7384ecabSDarren Ye apll_rate = mt8196_get_apll_rate(afe, MT8196_APLL1); 214*7384ecabSDarren Ye 215*7384ecabSDarren Ye /* 180.6336 / 4 = 45.1584MHz */ 216*7384ecabSDarren Ye ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1]); 217*7384ecabSDarren Ye if (ret) 218*7384ecabSDarren Ye return ret; 219*7384ecabSDarren Ye 220*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1], 221*7384ecabSDarren Ye MT8196_AUD_ENG1_CLK); 222*7384ecabSDarren Ye if (ret) 223*7384ecabSDarren Ye return ret; 224*7384ecabSDarren Ye 225*7384ecabSDarren Ye ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 226*7384ecabSDarren Ye if (ret) 227*7384ecabSDarren Ye return ret; 228*7384ecabSDarren Ye 229*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H], 230*7384ecabSDarren Ye apll_rate); 231*7384ecabSDarren Ye if (ret) 232*7384ecabSDarren Ye return ret; 233*7384ecabSDarren Ye } else { 234*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1], 235*7384ecabSDarren Ye MT8196_AFE_26M); 236*7384ecabSDarren Ye if (ret) 237*7384ecabSDarren Ye return ret; 238*7384ecabSDarren Ye 239*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1]); 240*7384ecabSDarren Ye 241*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H], 242*7384ecabSDarren Ye MT8196_AFE_26M); 243*7384ecabSDarren Ye if (ret) 244*7384ecabSDarren Ye return ret; 245*7384ecabSDarren Ye 246*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 247*7384ecabSDarren Ye } 248*7384ecabSDarren Ye 249*7384ecabSDarren Ye return 0; 250*7384ecabSDarren Ye } 251*7384ecabSDarren Ye 252*7384ecabSDarren Ye static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable) 253*7384ecabSDarren Ye { 254*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 255*7384ecabSDarren Ye int apll_rate; 256*7384ecabSDarren Ye int ret; 257*7384ecabSDarren Ye 258*7384ecabSDarren Ye dev_dbg(afe->dev, "enable: %d\n", enable); 259*7384ecabSDarren Ye 260*7384ecabSDarren Ye if (enable) { 261*7384ecabSDarren Ye apll_rate = mt8196_get_apll_rate(afe, MT8196_APLL2); 262*7384ecabSDarren Ye 263*7384ecabSDarren Ye /* 196.608 / 4 = 49.152MHz */ 264*7384ecabSDarren Ye ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2]); 265*7384ecabSDarren Ye if (ret) 266*7384ecabSDarren Ye return ret; 267*7384ecabSDarren Ye 268*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2], 269*7384ecabSDarren Ye MT8196_AUD_ENG2_CLK); 270*7384ecabSDarren Ye if (ret) 271*7384ecabSDarren Ye return ret; 272*7384ecabSDarren Ye 273*7384ecabSDarren Ye ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 274*7384ecabSDarren Ye if (ret) 275*7384ecabSDarren Ye return ret; 276*7384ecabSDarren Ye 277*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H], 278*7384ecabSDarren Ye apll_rate); 279*7384ecabSDarren Ye if (ret) 280*7384ecabSDarren Ye return ret; 281*7384ecabSDarren Ye } else { 282*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2], 283*7384ecabSDarren Ye MT8196_AFE_26M); 284*7384ecabSDarren Ye if (ret) 285*7384ecabSDarren Ye return ret; 286*7384ecabSDarren Ye 287*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2]); 288*7384ecabSDarren Ye 289*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H], 290*7384ecabSDarren Ye MT8196_AFE_26M); 291*7384ecabSDarren Ye if (ret) 292*7384ecabSDarren Ye return ret; 293*7384ecabSDarren Ye 294*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 295*7384ecabSDarren Ye } 296*7384ecabSDarren Ye 297*7384ecabSDarren Ye return 0; 298*7384ecabSDarren Ye } 299*7384ecabSDarren Ye 300*7384ecabSDarren Ye int mt8196_apll1_enable(struct mtk_base_afe *afe) 301*7384ecabSDarren Ye { 302*7384ecabSDarren Ye int ret; 303*7384ecabSDarren Ye 304*7384ecabSDarren Ye /* setting for APLL */ 305*7384ecabSDarren Ye apll1_mux_setting(afe, true); 306*7384ecabSDarren Ye 307*7384ecabSDarren Ye ret = mt8196_afe_enable_top_cg(afe, MT8196_CG_APLL1_CK); 308*7384ecabSDarren Ye if (ret) 309*7384ecabSDarren Ye goto err_clk_apll1; 310*7384ecabSDarren Ye 311*7384ecabSDarren Ye ret = mt8196_afe_enable_top_cg(afe, MT8196_PDN_APLL_TUNER1); 312*7384ecabSDarren Ye if (ret) 313*7384ecabSDarren Ye goto err_clk_apll1_tuner; 314*7384ecabSDarren Ye 315*7384ecabSDarren Ye /* sel 44.1kHz:1, apll_div:7, upper bound:3 */ 316*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 317*7384ecabSDarren Ye XTAL_EN_128FS_SEL_MASK_SFT | APLL_DIV_MASK_SFT | UPPER_BOUND_MASK_SFT, 318*7384ecabSDarren Ye (0x1 << XTAL_EN_128FS_SEL_SFT) | (7 << APLL_DIV_SFT) | 319*7384ecabSDarren Ye (3 << UPPER_BOUND_SFT)); 320*7384ecabSDarren Ye 321*7384ecabSDarren Ye /* apll1 freq tuner enable */ 322*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 323*7384ecabSDarren Ye FREQ_TUNER_EN_MASK_SFT, 324*7384ecabSDarren Ye 0x1 << FREQ_TUNER_EN_SFT); 325*7384ecabSDarren Ye 326*7384ecabSDarren Ye /* audio apll1 on */ 327*7384ecabSDarren Ye mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_APLL1_EN_ON); 328*7384ecabSDarren Ye 329*7384ecabSDarren Ye return 0; 330*7384ecabSDarren Ye 331*7384ecabSDarren Ye err_clk_apll1_tuner: 332*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER1); 333*7384ecabSDarren Ye err_clk_apll1: 334*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL1_CK); 335*7384ecabSDarren Ye return ret; 336*7384ecabSDarren Ye } 337*7384ecabSDarren Ye 338*7384ecabSDarren Ye void mt8196_apll1_disable(struct mtk_base_afe *afe) 339*7384ecabSDarren Ye { 340*7384ecabSDarren Ye /* audio apll1 off */ 341*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_APLL1_EN_ON); 342*7384ecabSDarren Ye 343*7384ecabSDarren Ye /* apll1 freq tuner disable */ 344*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 345*7384ecabSDarren Ye FREQ_TUNER_EN_MASK_SFT, 346*7384ecabSDarren Ye 0x0); 347*7384ecabSDarren Ye 348*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER1); 349*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL1_CK); 350*7384ecabSDarren Ye apll1_mux_setting(afe, false); 351*7384ecabSDarren Ye } 352*7384ecabSDarren Ye 353*7384ecabSDarren Ye int mt8196_apll2_enable(struct mtk_base_afe *afe) 354*7384ecabSDarren Ye { 355*7384ecabSDarren Ye int ret; 356*7384ecabSDarren Ye 357*7384ecabSDarren Ye /* setting for APLL */ 358*7384ecabSDarren Ye apll2_mux_setting(afe, true); 359*7384ecabSDarren Ye 360*7384ecabSDarren Ye ret = mt8196_afe_enable_top_cg(afe, MT8196_CG_APLL2_CK); 361*7384ecabSDarren Ye if (ret) 362*7384ecabSDarren Ye goto err_clk_apll2; 363*7384ecabSDarren Ye 364*7384ecabSDarren Ye ret = mt8196_afe_enable_top_cg(afe, MT8196_PDN_APLL_TUNER2); 365*7384ecabSDarren Ye if (ret) 366*7384ecabSDarren Ye goto err_clk_apll2_tuner; 367*7384ecabSDarren Ye 368*7384ecabSDarren Ye /* sel 48kHz: 2, apll_div: 7, upper bound: 3*/ 369*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 370*7384ecabSDarren Ye XTAL_EN_128FS_SEL_MASK_SFT | APLL_DIV_MASK_SFT | UPPER_BOUND_MASK_SFT, 371*7384ecabSDarren Ye (0x2 << XTAL_EN_128FS_SEL_SFT) | (7 << APLL_DIV_SFT) | 372*7384ecabSDarren Ye (3 << UPPER_BOUND_SFT)); 373*7384ecabSDarren Ye 374*7384ecabSDarren Ye /* apll2 freq tuner enable */ 375*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 376*7384ecabSDarren Ye FREQ_TUNER_EN_MASK_SFT, 377*7384ecabSDarren Ye 0x1 << FREQ_TUNER_EN_SFT); 378*7384ecabSDarren Ye 379*7384ecabSDarren Ye /* audio apll2 on */ 380*7384ecabSDarren Ye mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_APLL2_EN_ON); 381*7384ecabSDarren Ye return 0; 382*7384ecabSDarren Ye 383*7384ecabSDarren Ye err_clk_apll2_tuner: 384*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER2); 385*7384ecabSDarren Ye err_clk_apll2: 386*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL2_CK); 387*7384ecabSDarren Ye return 0; 388*7384ecabSDarren Ye } 389*7384ecabSDarren Ye 390*7384ecabSDarren Ye void mt8196_apll2_disable(struct mtk_base_afe *afe) 391*7384ecabSDarren Ye { 392*7384ecabSDarren Ye /* audio apll2 off */ 393*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_APLL2_EN_ON); 394*7384ecabSDarren Ye 395*7384ecabSDarren Ye /* apll2 freq tuner disable */ 396*7384ecabSDarren Ye regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 397*7384ecabSDarren Ye FREQ_TUNER_EN_MASK_SFT, 398*7384ecabSDarren Ye 0x0); 399*7384ecabSDarren Ye 400*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER2); 401*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL2_CK); 402*7384ecabSDarren Ye apll2_mux_setting(afe, false); 403*7384ecabSDarren Ye } 404*7384ecabSDarren Ye 405*7384ecabSDarren Ye int mt8196_get_apll_rate(struct mtk_base_afe *afe, int apll) 406*7384ecabSDarren Ye { 407*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 408*7384ecabSDarren Ye int clk_id = 0; 409*7384ecabSDarren Ye 410*7384ecabSDarren Ye if (apll < MT8196_APLL1 || apll > MT8196_APLL2) { 411*7384ecabSDarren Ye dev_warn(afe->dev, "invalid clk id %d\n", apll); 412*7384ecabSDarren Ye return 0; 413*7384ecabSDarren Ye } 414*7384ecabSDarren Ye 415*7384ecabSDarren Ye if (apll == MT8196_APLL1) 416*7384ecabSDarren Ye clk_id = MT8196_CLK_TOP_APLL1_CK; 417*7384ecabSDarren Ye else 418*7384ecabSDarren Ye clk_id = MT8196_CLK_TOP_APLL2_CK; 419*7384ecabSDarren Ye 420*7384ecabSDarren Ye return clk_get_rate(afe_priv->clk[clk_id]); 421*7384ecabSDarren Ye } 422*7384ecabSDarren Ye 423*7384ecabSDarren Ye /* 48K: select APLL2; 44.1k: select APLL1 */ 424*7384ecabSDarren Ye int mt8196_get_apll_by_rate(struct mtk_base_afe *afe, int rate) 425*7384ecabSDarren Ye { 426*7384ecabSDarren Ye return (rate % 8000) ? MT8196_APLL1 : MT8196_APLL2; 427*7384ecabSDarren Ye } 428*7384ecabSDarren Ye 429*7384ecabSDarren Ye int mt8196_get_apll_by_name(struct mtk_base_afe *afe, const char *name) 430*7384ecabSDarren Ye { 431*7384ecabSDarren Ye if (strcmp(name, APLL1_W_NAME) == 0) 432*7384ecabSDarren Ye return MT8196_APLL1; 433*7384ecabSDarren Ye 434*7384ecabSDarren Ye return MT8196_APLL2; 435*7384ecabSDarren Ye } 436*7384ecabSDarren Ye 437*7384ecabSDarren Ye static const int mck_div[MT8196_MCK_NUM] = { 438*7384ecabSDarren Ye [MT8196_I2SIN0_MCK] = MT8196_CLK_TOP_APLL12_DIV_I2SIN0, 439*7384ecabSDarren Ye [MT8196_I2SIN1_MCK] = MT8196_CLK_TOP_APLL12_DIV_I2SIN1, 440*7384ecabSDarren Ye [MT8196_FMI2S_MCK] = MT8196_CLK_TOP_APLL12_DIV_FMI2S, 441*7384ecabSDarren Ye [MT8196_TDMOUT_MCK] = MT8196_CLK_TOP_APLL12_DIV_TDMOUT_M, 442*7384ecabSDarren Ye [MT8196_TDMOUT_BCK] = MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B, 443*7384ecabSDarren Ye }; 444*7384ecabSDarren Ye 445*7384ecabSDarren Ye int mt8196_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate) 446*7384ecabSDarren Ye { 447*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 448*7384ecabSDarren Ye int div_clk_id; 449*7384ecabSDarren Ye int ret; 450*7384ecabSDarren Ye 451*7384ecabSDarren Ye dev_dbg(afe->dev, "mck_id: %d, rate: %d\n", mck_id, rate); 452*7384ecabSDarren Ye 453*7384ecabSDarren Ye if (mck_id >= MT8196_MCK_NUM || mck_id < 0) 454*7384ecabSDarren Ye return -EINVAL; 455*7384ecabSDarren Ye 456*7384ecabSDarren Ye div_clk_id = mck_div[mck_id]; 457*7384ecabSDarren Ye 458*7384ecabSDarren Ye /* enable div, set rate */ 459*7384ecabSDarren Ye if (div_clk_id < 0) { 460*7384ecabSDarren Ye dev_err(afe->dev, "invalid div_clk_id %d\n", div_clk_id); 461*7384ecabSDarren Ye return -EINVAL; 462*7384ecabSDarren Ye } 463*7384ecabSDarren Ye 464*7384ecabSDarren Ye if (div_clk_id == MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B) 465*7384ecabSDarren Ye rate *= 16; 466*7384ecabSDarren Ye 467*7384ecabSDarren Ye ret = mt8196_afe_enable_clk(afe, afe_priv->clk[div_clk_id]); 468*7384ecabSDarren Ye if (ret) 469*7384ecabSDarren Ye return ret; 470*7384ecabSDarren Ye 471*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[div_clk_id], rate); 472*7384ecabSDarren Ye if (ret) 473*7384ecabSDarren Ye return ret; 474*7384ecabSDarren Ye 475*7384ecabSDarren Ye return 0; 476*7384ecabSDarren Ye } 477*7384ecabSDarren Ye 478*7384ecabSDarren Ye int mt8196_mck_disable(struct mtk_base_afe *afe, int mck_id) 479*7384ecabSDarren Ye { 480*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 481*7384ecabSDarren Ye int div_clk_id; 482*7384ecabSDarren Ye int ret; 483*7384ecabSDarren Ye 484*7384ecabSDarren Ye dev_dbg(afe->dev, "mck_id: %d.\n", mck_id); 485*7384ecabSDarren Ye 486*7384ecabSDarren Ye if (mck_id < 0) { 487*7384ecabSDarren Ye dev_err(afe->dev, "mck_id = %d < 0\n", mck_id); 488*7384ecabSDarren Ye return -EINVAL; 489*7384ecabSDarren Ye } 490*7384ecabSDarren Ye 491*7384ecabSDarren Ye div_clk_id = mck_div[mck_id]; 492*7384ecabSDarren Ye 493*7384ecabSDarren Ye if (div_clk_id < 0) { 494*7384ecabSDarren Ye dev_err(afe->dev, "div_clk_id = %d < 0\n", 495*7384ecabSDarren Ye div_clk_id); 496*7384ecabSDarren Ye return -EINVAL; 497*7384ecabSDarren Ye } 498*7384ecabSDarren Ye 499*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[div_clk_id], MT8196_AFE_26M); 500*7384ecabSDarren Ye if (ret) 501*7384ecabSDarren Ye return ret; 502*7384ecabSDarren Ye 503*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[div_clk_id]); 504*7384ecabSDarren Ye 505*7384ecabSDarren Ye return 0; 506*7384ecabSDarren Ye } 507*7384ecabSDarren Ye 508*7384ecabSDarren Ye int mt8196_afe_enable_reg_rw_clk(struct mtk_base_afe *afe) 509*7384ecabSDarren Ye { 510*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 511*7384ecabSDarren Ye int ret; 512*7384ecabSDarren Ye 513*7384ecabSDarren Ye /* bus clock for AFE external access, like DRAM */ 514*7384ecabSDarren Ye mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]); 515*7384ecabSDarren Ye 516*7384ecabSDarren Ye /* bus clock for AFE internal access, like AFE SRAM */ 517*7384ecabSDarren Ye mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]); 518*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS], 519*7384ecabSDarren Ye MT8196_AFE_26M); 520*7384ecabSDarren Ye if (ret) 521*7384ecabSDarren Ye return ret; 522*7384ecabSDarren Ye 523*7384ecabSDarren Ye /* enable audio h clock */ 524*7384ecabSDarren Ye mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 525*7384ecabSDarren Ye ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H], 526*7384ecabSDarren Ye MT8196_AFE_26M); 527*7384ecabSDarren Ye if (ret) 528*7384ecabSDarren Ye return ret; 529*7384ecabSDarren Ye 530*7384ecabSDarren Ye /* AFE hw clock */ 531*7384ecabSDarren Ye /* IPM2.0: USE HOPPING & 26M */ 532*7384ecabSDarren Ye /* set in the regmap_register_patch */ 533*7384ecabSDarren Ye return 0; 534*7384ecabSDarren Ye } 535*7384ecabSDarren Ye 536*7384ecabSDarren Ye int mt8196_afe_disable_reg_rw_clk(struct mtk_base_afe *afe) 537*7384ecabSDarren Ye { 538*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 539*7384ecabSDarren Ye 540*7384ecabSDarren Ye /* IPM2.0: Use HOPPING & 26M */ 541*7384ecabSDarren Ye /* set in the regmap_register_patch */ 542*7384ecabSDarren Ye 543*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]); 544*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]); 545*7384ecabSDarren Ye mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]); 546*7384ecabSDarren Ye return 0; 547*7384ecabSDarren Ye } 548*7384ecabSDarren Ye 549*7384ecabSDarren Ye int mt8196_afe_enable_main_clock(struct mtk_base_afe *afe) 550*7384ecabSDarren Ye { 551*7384ecabSDarren Ye mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_26M_EN_ON); 552*7384ecabSDarren Ye return 0; 553*7384ecabSDarren Ye } 554*7384ecabSDarren Ye 555*7384ecabSDarren Ye int mt8196_afe_disable_main_clock(struct mtk_base_afe *afe) 556*7384ecabSDarren Ye { 557*7384ecabSDarren Ye mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_26M_EN_ON); 558*7384ecabSDarren Ye return 0; 559*7384ecabSDarren Ye } 560*7384ecabSDarren Ye 561*7384ecabSDarren Ye int mt8196_init_clock(struct mtk_base_afe *afe) 562*7384ecabSDarren Ye { 563*7384ecabSDarren Ye struct mt8196_afe_private *afe_priv = afe->platform_priv; 564*7384ecabSDarren Ye int i; 565*7384ecabSDarren Ye 566*7384ecabSDarren Ye afe_priv->clk = devm_kcalloc(afe->dev, MT8196_CLK_NUM, sizeof(*afe_priv->clk), 567*7384ecabSDarren Ye GFP_KERNEL); 568*7384ecabSDarren Ye if (!afe_priv->clk) 569*7384ecabSDarren Ye return -ENOMEM; 570*7384ecabSDarren Ye 571*7384ecabSDarren Ye for (i = 0; i < MT8196_CLK_NUM; i++) { 572*7384ecabSDarren Ye afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]); 573*7384ecabSDarren Ye if (IS_ERR(afe_priv->clk[i])) { 574*7384ecabSDarren Ye dev_err(afe->dev, "devm_clk_get %s fail\n", aud_clks[i]); 575*7384ecabSDarren Ye return PTR_ERR(afe_priv->clk[i]); 576*7384ecabSDarren Ye } 577*7384ecabSDarren Ye } 578*7384ecabSDarren Ye 579*7384ecabSDarren Ye return 0; 580*7384ecabSDarren Ye } 581*7384ecabSDarren Ye 582