Path: blob/master/sound/soc/mediatek/mt8183/mt8183-afe-clk.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// mt8183-afe-clk.c -- Mediatek 8183 afe clock ctrl3//4// Copyright (c) 2018 MediaTek Inc.5// Author: KaiChieh Chuang <[email protected]>67#include <linux/clk.h>89#include "mt8183-afe-common.h"10#include "mt8183-afe-clk.h"11#include "mt8183-reg.h"1213enum {14CLK_AFE = 0,15CLK_TML,16CLK_APLL22M,17CLK_APLL24M,18CLK_APLL1_TUNER,19CLK_APLL2_TUNER,20CLK_I2S1_BCLK_SW,21CLK_I2S2_BCLK_SW,22CLK_I2S3_BCLK_SW,23CLK_I2S4_BCLK_SW,24CLK_INFRA_SYS_AUDIO,25CLK_MUX_AUDIO,26CLK_MUX_AUDIOINTBUS,27CLK_TOP_SYSPLL_D2_D4,28/* apll related mux */29CLK_TOP_MUX_AUD_1,30CLK_TOP_APLL1_CK,31CLK_TOP_MUX_AUD_2,32CLK_TOP_APLL2_CK,33CLK_TOP_MUX_AUD_ENG1,34CLK_TOP_APLL1_D8,35CLK_TOP_MUX_AUD_ENG2,36CLK_TOP_APLL2_D8,37CLK_TOP_I2S0_M_SEL,38CLK_TOP_I2S1_M_SEL,39CLK_TOP_I2S2_M_SEL,40CLK_TOP_I2S3_M_SEL,41CLK_TOP_I2S4_M_SEL,42CLK_TOP_I2S5_M_SEL,43CLK_TOP_APLL12_DIV0,44CLK_TOP_APLL12_DIV1,45CLK_TOP_APLL12_DIV2,46CLK_TOP_APLL12_DIV3,47CLK_TOP_APLL12_DIV4,48CLK_TOP_APLL12_DIVB,49CLK_CLK26M,50CLK_NUM51};5253static const char *aud_clks[CLK_NUM] = {54[CLK_AFE] = "aud_afe_clk",55[CLK_TML] = "aud_tml_clk",56[CLK_APLL22M] = "aud_apll22m_clk",57[CLK_APLL24M] = "aud_apll24m_clk",58[CLK_APLL1_TUNER] = "aud_apll1_tuner_clk",59[CLK_APLL2_TUNER] = "aud_apll2_tuner_clk",60[CLK_I2S1_BCLK_SW] = "aud_i2s1_bclk_sw",61[CLK_I2S2_BCLK_SW] = "aud_i2s2_bclk_sw",62[CLK_I2S3_BCLK_SW] = "aud_i2s3_bclk_sw",63[CLK_I2S4_BCLK_SW] = "aud_i2s4_bclk_sw",64[CLK_INFRA_SYS_AUDIO] = "aud_infra_clk",65[CLK_MUX_AUDIO] = "top_mux_audio",66[CLK_MUX_AUDIOINTBUS] = "top_mux_aud_intbus",67[CLK_TOP_SYSPLL_D2_D4] = "top_syspll_d2_d4",68[CLK_TOP_MUX_AUD_1] = "top_mux_aud_1",69[CLK_TOP_APLL1_CK] = "top_apll1_ck",70[CLK_TOP_MUX_AUD_2] = "top_mux_aud_2",71[CLK_TOP_APLL2_CK] = "top_apll2_ck",72[CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1",73[CLK_TOP_APLL1_D8] = "top_apll1_d8",74[CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2",75[CLK_TOP_APLL2_D8] = "top_apll2_d8",76[CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel",77[CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel",78[CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel",79[CLK_TOP_I2S3_M_SEL] = "top_i2s3_m_sel",80[CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel",81[CLK_TOP_I2S5_M_SEL] = "top_i2s5_m_sel",82[CLK_TOP_APLL12_DIV0] = "top_apll12_div0",83[CLK_TOP_APLL12_DIV1] = "top_apll12_div1",84[CLK_TOP_APLL12_DIV2] = "top_apll12_div2",85[CLK_TOP_APLL12_DIV3] = "top_apll12_div3",86[CLK_TOP_APLL12_DIV4] = "top_apll12_div4",87[CLK_TOP_APLL12_DIVB] = "top_apll12_divb",88[CLK_CLK26M] = "top_clk26m_clk",89};9091int mt8183_init_clock(struct mtk_base_afe *afe)92{93struct mt8183_afe_private *afe_priv = afe->platform_priv;94int i;9596afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk),97GFP_KERNEL);98if (!afe_priv->clk)99return -ENOMEM;100101for (i = 0; i < CLK_NUM; i++) {102afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);103if (IS_ERR(afe_priv->clk[i])) {104dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",105__func__, aud_clks[i],106PTR_ERR(afe_priv->clk[i]));107return PTR_ERR(afe_priv->clk[i]);108}109}110111return 0;112}113114int mt8183_afe_enable_clock(struct mtk_base_afe *afe)115{116struct mt8183_afe_private *afe_priv = afe->platform_priv;117int ret;118119ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);120if (ret) {121dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",122__func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret);123goto CLK_INFRA_SYS_AUDIO_ERR;124}125126ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]);127if (ret) {128dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",129__func__, aud_clks[CLK_MUX_AUDIO], ret);130goto CLK_MUX_AUDIO_ERR;131}132133ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO],134afe_priv->clk[CLK_CLK26M]);135if (ret) {136dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",137__func__, aud_clks[CLK_MUX_AUDIO],138aud_clks[CLK_CLK26M], ret);139goto CLK_MUX_AUDIO_ERR;140}141142ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);143if (ret) {144dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",145__func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);146goto CLK_MUX_AUDIO_INTBUS_ERR;147}148149ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS],150afe_priv->clk[CLK_TOP_SYSPLL_D2_D4]);151if (ret) {152dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",153__func__, aud_clks[CLK_MUX_AUDIOINTBUS],154aud_clks[CLK_TOP_SYSPLL_D2_D4], ret);155goto CLK_MUX_AUDIO_INTBUS_ERR;156}157158ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]);159if (ret) {160dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",161__func__, aud_clks[CLK_AFE], ret);162goto CLK_AFE_ERR;163}164165ret = clk_prepare_enable(afe_priv->clk[CLK_I2S1_BCLK_SW]);166if (ret) {167dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",168__func__, aud_clks[CLK_I2S1_BCLK_SW], ret);169goto CLK_I2S1_BCLK_SW_ERR;170}171172ret = clk_prepare_enable(afe_priv->clk[CLK_I2S2_BCLK_SW]);173if (ret) {174dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",175__func__, aud_clks[CLK_I2S2_BCLK_SW], ret);176goto CLK_I2S2_BCLK_SW_ERR;177}178179ret = clk_prepare_enable(afe_priv->clk[CLK_I2S3_BCLK_SW]);180if (ret) {181dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",182__func__, aud_clks[CLK_I2S3_BCLK_SW], ret);183goto CLK_I2S3_BCLK_SW_ERR;184}185186ret = clk_prepare_enable(afe_priv->clk[CLK_I2S4_BCLK_SW]);187if (ret) {188dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",189__func__, aud_clks[CLK_I2S4_BCLK_SW], ret);190goto CLK_I2S4_BCLK_SW_ERR;191}192193return 0;194195CLK_I2S4_BCLK_SW_ERR:196clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);197CLK_I2S3_BCLK_SW_ERR:198clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);199CLK_I2S2_BCLK_SW_ERR:200clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);201CLK_I2S1_BCLK_SW_ERR:202clk_disable_unprepare(afe_priv->clk[CLK_AFE]);203CLK_AFE_ERR:204clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);205CLK_MUX_AUDIO_INTBUS_ERR:206clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);207CLK_MUX_AUDIO_ERR:208clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);209CLK_INFRA_SYS_AUDIO_ERR:210return ret;211}212213int mt8183_afe_disable_clock(struct mtk_base_afe *afe)214{215struct mt8183_afe_private *afe_priv = afe->platform_priv;216217clk_disable_unprepare(afe_priv->clk[CLK_I2S4_BCLK_SW]);218clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);219clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);220clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);221clk_disable_unprepare(afe_priv->clk[CLK_AFE]);222clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);223clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);224clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);225226return 0;227}228229/* apll */230static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)231{232struct mt8183_afe_private *afe_priv = afe->platform_priv;233int ret;234235if (enable) {236ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]);237if (ret) {238dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",239__func__, aud_clks[CLK_TOP_MUX_AUD_1], ret);240goto ERR_ENABLE_CLK_TOP_MUX_AUD_1;241}242ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],243afe_priv->clk[CLK_TOP_APLL1_CK]);244if (ret) {245dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",246__func__, aud_clks[CLK_TOP_MUX_AUD_1],247aud_clks[CLK_TOP_APLL1_CK], ret);248goto ERR_SELECT_CLK_TOP_MUX_AUD_1;249}250251/* 180.6336 / 8 = 22.5792MHz */252ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);253if (ret) {254dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",255__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret);256goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1;257}258ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],259afe_priv->clk[CLK_TOP_APLL1_D8]);260if (ret) {261dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",262__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],263aud_clks[CLK_TOP_APLL1_D8], ret);264goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG1;265}266} else {267ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],268afe_priv->clk[CLK_CLK26M]);269if (ret) {270dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",271__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],272aud_clks[CLK_CLK26M], ret);273goto EXIT;274}275clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);276277ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],278afe_priv->clk[CLK_CLK26M]);279if (ret) {280dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",281__func__, aud_clks[CLK_TOP_MUX_AUD_1],282aud_clks[CLK_CLK26M], ret);283goto EXIT;284}285clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);286}287288return 0;289290ERR_SELECT_CLK_TOP_MUX_AUD_ENG1:291clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],292afe_priv->clk[CLK_CLK26M]);293clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);294ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1:295ERR_SELECT_CLK_TOP_MUX_AUD_1:296clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],297afe_priv->clk[CLK_CLK26M]);298clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);299ERR_ENABLE_CLK_TOP_MUX_AUD_1:300EXIT:301return ret;302}303304static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)305{306struct mt8183_afe_private *afe_priv = afe->platform_priv;307int ret;308309if (enable) {310ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]);311if (ret) {312dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",313__func__, aud_clks[CLK_TOP_MUX_AUD_2], ret);314goto ERR_ENABLE_CLK_TOP_MUX_AUD_2;315}316ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],317afe_priv->clk[CLK_TOP_APLL2_CK]);318if (ret) {319dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",320__func__, aud_clks[CLK_TOP_MUX_AUD_2],321aud_clks[CLK_TOP_APLL2_CK], ret);322goto ERR_SELECT_CLK_TOP_MUX_AUD_2;323}324325/* 196.608 / 8 = 24.576MHz */326ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);327if (ret) {328dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",329__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret);330goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2;331}332ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],333afe_priv->clk[CLK_TOP_APLL2_D8]);334if (ret) {335dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",336__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],337aud_clks[CLK_TOP_APLL2_D8], ret);338goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG2;339}340} else {341ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],342afe_priv->clk[CLK_CLK26M]);343if (ret) {344dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",345__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],346aud_clks[CLK_CLK26M], ret);347goto EXIT;348}349clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);350351ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],352afe_priv->clk[CLK_CLK26M]);353if (ret) {354dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",355__func__, aud_clks[CLK_TOP_MUX_AUD_2],356aud_clks[CLK_CLK26M], ret);357goto EXIT;358}359clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);360}361362return 0;363364ERR_SELECT_CLK_TOP_MUX_AUD_ENG2:365clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],366afe_priv->clk[CLK_CLK26M]);367clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);368ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2:369ERR_SELECT_CLK_TOP_MUX_AUD_2:370clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],371afe_priv->clk[CLK_CLK26M]);372clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);373ERR_ENABLE_CLK_TOP_MUX_AUD_2:374EXIT:375return ret;376}377378int mt8183_apll1_enable(struct mtk_base_afe *afe)379{380struct mt8183_afe_private *afe_priv = afe->platform_priv;381int ret;382383/* setting for APLL */384apll1_mux_setting(afe, true);385386ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]);387if (ret) {388dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",389__func__, aud_clks[CLK_APLL22M], ret);390goto ERR_CLK_APLL22M;391}392393ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]);394if (ret) {395dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",396__func__, aud_clks[CLK_APLL1_TUNER], ret);397goto ERR_CLK_APLL1_TUNER;398}399400regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,4010x0000FFF7, 0x00000832);402regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1);403404regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,405AFE_22M_ON_MASK_SFT,4060x1 << AFE_22M_ON_SFT);407408return 0;409410ERR_CLK_APLL1_TUNER:411clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);412ERR_CLK_APLL22M:413return ret;414}415416void mt8183_apll1_disable(struct mtk_base_afe *afe)417{418struct mt8183_afe_private *afe_priv = afe->platform_priv;419420regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,421AFE_22M_ON_MASK_SFT,4220x0 << AFE_22M_ON_SFT);423424regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x0);425426clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);427clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);428429apll1_mux_setting(afe, false);430}431432int mt8183_apll2_enable(struct mtk_base_afe *afe)433{434struct mt8183_afe_private *afe_priv = afe->platform_priv;435int ret;436437/* setting for APLL */438apll2_mux_setting(afe, true);439440ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]);441if (ret) {442dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",443__func__, aud_clks[CLK_APLL24M], ret);444goto ERR_CLK_APLL24M;445}446447ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]);448if (ret) {449dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",450__func__, aud_clks[CLK_APLL2_TUNER], ret);451goto ERR_CLK_APLL2_TUNER;452}453454regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,4550x0000FFF7, 0x00000634);456regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1);457458regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,459AFE_24M_ON_MASK_SFT,4600x1 << AFE_24M_ON_SFT);461462return 0;463464ERR_CLK_APLL2_TUNER:465clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);466ERR_CLK_APLL24M:467return ret;468}469470void mt8183_apll2_disable(struct mtk_base_afe *afe)471{472struct mt8183_afe_private *afe_priv = afe->platform_priv;473474regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,475AFE_24M_ON_MASK_SFT,4760x0 << AFE_24M_ON_SFT);477478regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x0);479480clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);481clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);482483apll2_mux_setting(afe, false);484}485486int mt8183_get_apll_rate(struct mtk_base_afe *afe, int apll)487{488return (apll == MT8183_APLL1) ? 180633600 : 196608000;489}490491int mt8183_get_apll_by_rate(struct mtk_base_afe *afe, int rate)492{493return ((rate % 8000) == 0) ? MT8183_APLL2 : MT8183_APLL1;494}495496int mt8183_get_apll_by_name(struct mtk_base_afe *afe, const char *name)497{498if (strcmp(name, APLL1_W_NAME) == 0)499return MT8183_APLL1;500else501return MT8183_APLL2;502}503504/* mck */505struct mt8183_mck_div {506int m_sel_id;507int div_clk_id;508};509510static const struct mt8183_mck_div mck_div[MT8183_MCK_NUM] = {511[MT8183_I2S0_MCK] = {512.m_sel_id = CLK_TOP_I2S0_M_SEL,513.div_clk_id = CLK_TOP_APLL12_DIV0,514},515[MT8183_I2S1_MCK] = {516.m_sel_id = CLK_TOP_I2S1_M_SEL,517.div_clk_id = CLK_TOP_APLL12_DIV1,518},519[MT8183_I2S2_MCK] = {520.m_sel_id = CLK_TOP_I2S2_M_SEL,521.div_clk_id = CLK_TOP_APLL12_DIV2,522},523[MT8183_I2S3_MCK] = {524.m_sel_id = CLK_TOP_I2S3_M_SEL,525.div_clk_id = CLK_TOP_APLL12_DIV3,526},527[MT8183_I2S4_MCK] = {528.m_sel_id = CLK_TOP_I2S4_M_SEL,529.div_clk_id = CLK_TOP_APLL12_DIV4,530},531[MT8183_I2S4_BCK] = {532.m_sel_id = -1,533.div_clk_id = CLK_TOP_APLL12_DIVB,534},535[MT8183_I2S5_MCK] = {536.m_sel_id = -1,537.div_clk_id = -1,538},539};540541int mt8183_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)542{543struct mt8183_afe_private *afe_priv = afe->platform_priv;544int apll = mt8183_get_apll_by_rate(afe, rate);545int apll_clk_id = apll == MT8183_APLL1 ?546CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2;547int m_sel_id = mck_div[mck_id].m_sel_id;548int div_clk_id = mck_div[mck_id].div_clk_id;549int ret;550551/* i2s5 mck not support */552if (mck_id == MT8183_I2S5_MCK)553return 0;554555/* select apll */556if (m_sel_id >= 0) {557ret = clk_prepare_enable(afe_priv->clk[m_sel_id]);558if (ret) {559dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",560__func__, aud_clks[m_sel_id], ret);561goto ERR_ENABLE_MCLK;562}563ret = clk_set_parent(afe_priv->clk[m_sel_id],564afe_priv->clk[apll_clk_id]);565if (ret) {566dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",567__func__, aud_clks[m_sel_id],568aud_clks[apll_clk_id], ret);569goto ERR_SELECT_MCLK;570}571}572573/* enable div, set rate */574ret = clk_prepare_enable(afe_priv->clk[div_clk_id]);575if (ret) {576dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",577__func__, aud_clks[div_clk_id], ret);578goto ERR_ENABLE_MCLK_DIV;579}580ret = clk_set_rate(afe_priv->clk[div_clk_id], rate);581if (ret) {582dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n",583__func__, aud_clks[div_clk_id],584rate, ret);585goto ERR_SET_MCLK_RATE;586}587588return 0;589590ERR_SET_MCLK_RATE:591clk_disable_unprepare(afe_priv->clk[div_clk_id]);592ERR_ENABLE_MCLK_DIV:593ERR_SELECT_MCLK:594if (m_sel_id >= 0)595clk_disable_unprepare(afe_priv->clk[m_sel_id]);596ERR_ENABLE_MCLK:597return ret;598}599600void mt8183_mck_disable(struct mtk_base_afe *afe, int mck_id)601{602struct mt8183_afe_private *afe_priv = afe->platform_priv;603int m_sel_id = mck_div[mck_id].m_sel_id;604int div_clk_id = mck_div[mck_id].div_clk_id;605606/* i2s5 mck not support */607if (mck_id == MT8183_I2S5_MCK)608return;609610clk_disable_unprepare(afe_priv->clk[div_clk_id]);611if (m_sel_id >= 0)612clk_disable_unprepare(afe_priv->clk[m_sel_id]);613}614615616