Path: blob/master/sound/soc/mediatek/mt8192/mt8192-afe-clk.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// mt8192-afe-clk.c -- Mediatek 8192 afe clock ctrl3//4// Copyright (c) 2020 MediaTek Inc.5// Author: Shane Chien <[email protected]>6//78#include <linux/arm-smccc.h>9#include <linux/clk.h>10#include <linux/mfd/syscon.h>11#include <linux/regmap.h>1213#include "mt8192-afe-clk.h"14#include "mt8192-afe-common.h"1516static const char *aud_clks[CLK_NUM] = {17[CLK_AFE] = "aud_afe_clk",18[CLK_TML] = "aud_tml_clk",19[CLK_APLL22M] = "aud_apll22m_clk",20[CLK_APLL24M] = "aud_apll24m_clk",21[CLK_APLL1_TUNER] = "aud_apll1_tuner_clk",22[CLK_APLL2_TUNER] = "aud_apll2_tuner_clk",23[CLK_NLE] = "aud_nle",24[CLK_INFRA_SYS_AUDIO] = "aud_infra_clk",25[CLK_INFRA_AUDIO_26M] = "aud_infra_26m_clk",26[CLK_MUX_AUDIO] = "top_mux_audio",27[CLK_MUX_AUDIOINTBUS] = "top_mux_audio_int",28[CLK_TOP_MAINPLL_D4_D4] = "top_mainpll_d4_d4",29[CLK_TOP_MUX_AUD_1] = "top_mux_aud_1",30[CLK_TOP_APLL1_CK] = "top_apll1_ck",31[CLK_TOP_MUX_AUD_2] = "top_mux_aud_2",32[CLK_TOP_APLL2_CK] = "top_apll2_ck",33[CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1",34[CLK_TOP_APLL1_D4] = "top_apll1_d4",35[CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2",36[CLK_TOP_APLL2_D4] = "top_apll2_d4",37[CLK_TOP_MUX_AUDIO_H] = "top_mux_audio_h",38[CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel",39[CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel",40[CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel",41[CLK_TOP_I2S3_M_SEL] = "top_i2s3_m_sel",42[CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel",43[CLK_TOP_I2S5_M_SEL] = "top_i2s5_m_sel",44[CLK_TOP_I2S6_M_SEL] = "top_i2s6_m_sel",45[CLK_TOP_I2S7_M_SEL] = "top_i2s7_m_sel",46[CLK_TOP_I2S8_M_SEL] = "top_i2s8_m_sel",47[CLK_TOP_I2S9_M_SEL] = "top_i2s9_m_sel",48[CLK_TOP_APLL12_DIV0] = "top_apll12_div0",49[CLK_TOP_APLL12_DIV1] = "top_apll12_div1",50[CLK_TOP_APLL12_DIV2] = "top_apll12_div2",51[CLK_TOP_APLL12_DIV3] = "top_apll12_div3",52[CLK_TOP_APLL12_DIV4] = "top_apll12_div4",53[CLK_TOP_APLL12_DIVB] = "top_apll12_divb",54[CLK_TOP_APLL12_DIV5] = "top_apll12_div5",55[CLK_TOP_APLL12_DIV6] = "top_apll12_div6",56[CLK_TOP_APLL12_DIV7] = "top_apll12_div7",57[CLK_TOP_APLL12_DIV8] = "top_apll12_div8",58[CLK_TOP_APLL12_DIV9] = "top_apll12_div9",59[CLK_CLK26M] = "top_clk26m_clk",60};6162int mt8192_set_audio_int_bus_parent(struct mtk_base_afe *afe,63int clk_id)64{65struct mt8192_afe_private *afe_priv = afe->platform_priv;66int ret;6768ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS],69afe_priv->clk[clk_id]);70if (ret) {71dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",72__func__, aud_clks[CLK_MUX_AUDIOINTBUS],73aud_clks[clk_id], ret);74}7576return ret;77}7879static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)80{81struct mt8192_afe_private *afe_priv = afe->platform_priv;82int ret;8384if (enable) {85ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]);86if (ret) {87dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",88__func__, aud_clks[CLK_TOP_MUX_AUD_1], ret);89goto EXIT;90}91ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],92afe_priv->clk[CLK_TOP_APLL1_CK]);93if (ret) {94dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",95__func__, aud_clks[CLK_TOP_MUX_AUD_1],96aud_clks[CLK_TOP_APLL1_CK], ret);97goto EXIT;98}99100/* 180.6336 / 4 = 45.1584MHz */101ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);102if (ret) {103dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",104__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret);105goto EXIT;106}107ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],108afe_priv->clk[CLK_TOP_APLL1_D4]);109if (ret) {110dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",111__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],112aud_clks[CLK_TOP_APLL1_D4], ret);113goto EXIT;114}115} else {116ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],117afe_priv->clk[CLK_CLK26M]);118if (ret) {119dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",120__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],121aud_clks[CLK_CLK26M], ret);122goto EXIT;123}124clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);125126ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],127afe_priv->clk[CLK_CLK26M]);128if (ret) {129dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",130__func__, aud_clks[CLK_TOP_MUX_AUD_1],131aud_clks[CLK_CLK26M], ret);132goto EXIT;133}134clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);135}136137EXIT:138return ret;139}140141static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)142{143struct mt8192_afe_private *afe_priv = afe->platform_priv;144int ret;145146if (enable) {147ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]);148if (ret) {149dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",150__func__, aud_clks[CLK_TOP_MUX_AUD_2], ret);151goto EXIT;152}153ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],154afe_priv->clk[CLK_TOP_APLL2_CK]);155if (ret) {156dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",157__func__, aud_clks[CLK_TOP_MUX_AUD_2],158aud_clks[CLK_TOP_APLL2_CK], ret);159goto EXIT;160}161162/* 196.608 / 4 = 49.152MHz */163ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);164if (ret) {165dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",166__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret);167goto EXIT;168}169ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],170afe_priv->clk[CLK_TOP_APLL2_D4]);171if (ret) {172dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",173__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],174aud_clks[CLK_TOP_APLL2_D4], ret);175goto EXIT;176}177} else {178ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],179afe_priv->clk[CLK_CLK26M]);180if (ret) {181dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",182__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],183aud_clks[CLK_CLK26M], ret);184goto EXIT;185}186clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);187188ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],189afe_priv->clk[CLK_CLK26M]);190if (ret) {191dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",192__func__, aud_clks[CLK_TOP_MUX_AUD_2],193aud_clks[CLK_CLK26M], ret);194goto EXIT;195}196clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);197}198199EXIT:200return ret;201}202203int mt8192_afe_enable_clock(struct mtk_base_afe *afe)204{205struct mt8192_afe_private *afe_priv = afe->platform_priv;206int ret;207208ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);209if (ret) {210dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",211__func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret);212goto EXIT;213}214215ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_AUDIO_26M]);216if (ret) {217dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",218__func__, aud_clks[CLK_INFRA_AUDIO_26M], ret);219goto EXIT;220}221222ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]);223if (ret) {224dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",225__func__, aud_clks[CLK_MUX_AUDIO], ret);226goto EXIT;227}228ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO],229afe_priv->clk[CLK_CLK26M]);230if (ret) {231dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",232__func__, aud_clks[CLK_MUX_AUDIO],233aud_clks[CLK_CLK26M], ret);234goto EXIT;235}236237ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);238if (ret) {239dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",240__func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);241goto EXIT;242}243244ret = mt8192_set_audio_int_bus_parent(afe, CLK_CLK26M);245if (ret) {246dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",247__func__, aud_clks[CLK_MUX_AUDIOINTBUS],248aud_clks[CLK_CLK26M], ret);249goto EXIT;250}251252ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUDIO_H],253afe_priv->clk[CLK_TOP_APLL2_CK]);254if (ret) {255dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",256__func__, aud_clks[CLK_TOP_MUX_AUDIO_H],257aud_clks[CLK_TOP_APLL2_CK], ret);258goto EXIT;259}260261ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]);262if (ret) {263dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",264__func__, aud_clks[CLK_AFE], ret);265goto EXIT;266}267268EXIT:269return ret;270}271272void mt8192_afe_disable_clock(struct mtk_base_afe *afe)273{274struct mt8192_afe_private *afe_priv = afe->platform_priv;275276clk_disable_unprepare(afe_priv->clk[CLK_AFE]);277mt8192_set_audio_int_bus_parent(afe, CLK_CLK26M);278clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);279clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);280clk_disable_unprepare(afe_priv->clk[CLK_INFRA_AUDIO_26M]);281clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);282}283284int mt8192_apll1_enable(struct mtk_base_afe *afe)285{286struct mt8192_afe_private *afe_priv = afe->platform_priv;287int ret;288289/* setting for APLL */290apll1_mux_setting(afe, true);291292ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]);293if (ret) {294dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",295__func__, aud_clks[CLK_APLL22M], ret);296goto EXIT;297}298299ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]);300if (ret) {301dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",302__func__, aud_clks[CLK_APLL1_TUNER], ret);303goto EXIT;304}305306regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,3070x0000FFF7, 0x00000832);308regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1);309310regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,311AFE_22M_ON_MASK_SFT,3120x1 << AFE_22M_ON_SFT);313314EXIT:315return ret;316}317318void mt8192_apll1_disable(struct mtk_base_afe *afe)319{320struct mt8192_afe_private *afe_priv = afe->platform_priv;321322regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,323AFE_22M_ON_MASK_SFT,3240x0 << AFE_22M_ON_SFT);325326regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x0);327328clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);329clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);330331apll1_mux_setting(afe, false);332}333334int mt8192_apll2_enable(struct mtk_base_afe *afe)335{336struct mt8192_afe_private *afe_priv = afe->platform_priv;337int ret;338339/* setting for APLL */340apll2_mux_setting(afe, true);341342ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]);343if (ret) {344dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",345__func__, aud_clks[CLK_APLL24M], ret);346goto EXIT;347}348349ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]);350if (ret) {351dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",352__func__, aud_clks[CLK_APLL2_TUNER], ret);353goto EXIT;354}355356regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,3570x0000FFF7, 0x00000634);358regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1);359360regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,361AFE_24M_ON_MASK_SFT,3620x1 << AFE_24M_ON_SFT);363364EXIT:365return ret;366}367368void mt8192_apll2_disable(struct mtk_base_afe *afe)369{370struct mt8192_afe_private *afe_priv = afe->platform_priv;371372regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,373AFE_24M_ON_MASK_SFT,3740x0 << AFE_24M_ON_SFT);375376regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x0);377378clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);379clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);380381apll2_mux_setting(afe, false);382}383384int mt8192_get_apll_rate(struct mtk_base_afe *afe, int apll)385{386return (apll == MT8192_APLL1) ? 180633600 : 196608000;387}388389int mt8192_get_apll_by_rate(struct mtk_base_afe *afe, int rate)390{391return ((rate % 8000) == 0) ? MT8192_APLL2 : MT8192_APLL1;392}393394int mt8192_get_apll_by_name(struct mtk_base_afe *afe, const char *name)395{396if (strcmp(name, APLL1_W_NAME) == 0)397return MT8192_APLL1;398else399return MT8192_APLL2;400}401402/* mck */403struct mt8192_mck_div {404int m_sel_id;405int div_clk_id;406/* below will be deprecated */407int div_pdn_reg;408int div_pdn_mask_sft;409int div_reg;410int div_mask_sft;411int div_mask;412int div_sft;413int div_apll_sel_reg;414int div_apll_sel_mask_sft;415int div_apll_sel_sft;416};417418static const struct mt8192_mck_div mck_div[MT8192_MCK_NUM] = {419[MT8192_I2S0_MCK] = {420.m_sel_id = CLK_TOP_I2S0_M_SEL,421.div_clk_id = CLK_TOP_APLL12_DIV0,422.div_pdn_reg = CLK_AUDDIV_0,423.div_pdn_mask_sft = APLL12_DIV0_PDN_MASK_SFT,424.div_reg = CLK_AUDDIV_2,425.div_mask_sft = APLL12_CK_DIV0_MASK_SFT,426.div_mask = APLL12_CK_DIV0_MASK,427.div_sft = APLL12_CK_DIV0_SFT,428.div_apll_sel_reg = CLK_AUDDIV_0,429.div_apll_sel_mask_sft = APLL_I2S0_MCK_SEL_MASK_SFT,430.div_apll_sel_sft = APLL_I2S0_MCK_SEL_SFT,431},432[MT8192_I2S1_MCK] = {433.m_sel_id = CLK_TOP_I2S1_M_SEL,434.div_clk_id = CLK_TOP_APLL12_DIV1,435.div_pdn_reg = CLK_AUDDIV_0,436.div_pdn_mask_sft = APLL12_DIV1_PDN_MASK_SFT,437.div_reg = CLK_AUDDIV_2,438.div_mask_sft = APLL12_CK_DIV1_MASK_SFT,439.div_mask = APLL12_CK_DIV1_MASK,440.div_sft = APLL12_CK_DIV1_SFT,441.div_apll_sel_reg = CLK_AUDDIV_0,442.div_apll_sel_mask_sft = APLL_I2S1_MCK_SEL_MASK_SFT,443.div_apll_sel_sft = APLL_I2S1_MCK_SEL_SFT,444},445[MT8192_I2S2_MCK] = {446.m_sel_id = CLK_TOP_I2S2_M_SEL,447.div_clk_id = CLK_TOP_APLL12_DIV2,448.div_pdn_reg = CLK_AUDDIV_0,449.div_pdn_mask_sft = APLL12_DIV2_PDN_MASK_SFT,450.div_reg = CLK_AUDDIV_2,451.div_mask_sft = APLL12_CK_DIV2_MASK_SFT,452.div_mask = APLL12_CK_DIV2_MASK,453.div_sft = APLL12_CK_DIV2_SFT,454.div_apll_sel_reg = CLK_AUDDIV_0,455.div_apll_sel_mask_sft = APLL_I2S2_MCK_SEL_MASK_SFT,456.div_apll_sel_sft = APLL_I2S2_MCK_SEL_SFT,457},458[MT8192_I2S3_MCK] = {459.m_sel_id = CLK_TOP_I2S3_M_SEL,460.div_clk_id = CLK_TOP_APLL12_DIV3,461.div_pdn_reg = CLK_AUDDIV_0,462.div_pdn_mask_sft = APLL12_DIV3_PDN_MASK_SFT,463.div_reg = CLK_AUDDIV_2,464.div_mask_sft = APLL12_CK_DIV3_MASK_SFT,465.div_mask = APLL12_CK_DIV3_MASK,466.div_sft = APLL12_CK_DIV3_SFT,467.div_apll_sel_reg = CLK_AUDDIV_0,468.div_apll_sel_mask_sft = APLL_I2S3_MCK_SEL_MASK_SFT,469.div_apll_sel_sft = APLL_I2S3_MCK_SEL_SFT,470},471[MT8192_I2S4_MCK] = {472.m_sel_id = CLK_TOP_I2S4_M_SEL,473.div_clk_id = CLK_TOP_APLL12_DIV4,474.div_pdn_reg = CLK_AUDDIV_0,475.div_pdn_mask_sft = APLL12_DIV4_PDN_MASK_SFT,476.div_reg = CLK_AUDDIV_3,477.div_mask_sft = APLL12_CK_DIV4_MASK_SFT,478.div_mask = APLL12_CK_DIV4_MASK,479.div_sft = APLL12_CK_DIV4_SFT,480.div_apll_sel_reg = CLK_AUDDIV_0,481.div_apll_sel_mask_sft = APLL_I2S4_MCK_SEL_MASK_SFT,482.div_apll_sel_sft = APLL_I2S4_MCK_SEL_SFT,483},484[MT8192_I2S4_BCK] = {485.m_sel_id = -1,486.div_clk_id = CLK_TOP_APLL12_DIVB,487.div_pdn_reg = CLK_AUDDIV_0,488.div_pdn_mask_sft = APLL12_DIVB_PDN_MASK_SFT,489.div_reg = CLK_AUDDIV_2,490.div_mask_sft = APLL12_CK_DIVB_MASK_SFT,491.div_mask = APLL12_CK_DIVB_MASK,492.div_sft = APLL12_CK_DIVB_SFT,493},494[MT8192_I2S5_MCK] = {495.m_sel_id = CLK_TOP_I2S5_M_SEL,496.div_clk_id = CLK_TOP_APLL12_DIV5,497.div_pdn_reg = CLK_AUDDIV_0,498.div_pdn_mask_sft = APLL12_DIV5_PDN_MASK_SFT,499.div_reg = CLK_AUDDIV_3,500.div_mask_sft = APLL12_CK_DIV5_MASK_SFT,501.div_mask = APLL12_CK_DIV5_MASK,502.div_sft = APLL12_CK_DIV5_SFT,503.div_apll_sel_reg = CLK_AUDDIV_0,504.div_apll_sel_mask_sft = APLL_I2S5_MCK_SEL_MASK_SFT,505.div_apll_sel_sft = APLL_I2S5_MCK_SEL_SFT,506},507[MT8192_I2S6_MCK] = {508.m_sel_id = CLK_TOP_I2S6_M_SEL,509.div_clk_id = CLK_TOP_APLL12_DIV6,510.div_pdn_reg = CLK_AUDDIV_0,511.div_pdn_mask_sft = APLL12_DIV6_PDN_MASK_SFT,512.div_reg = CLK_AUDDIV_3,513.div_mask_sft = APLL12_CK_DIV6_MASK_SFT,514.div_mask = APLL12_CK_DIV6_MASK,515.div_sft = APLL12_CK_DIV6_SFT,516.div_apll_sel_reg = CLK_AUDDIV_0,517.div_apll_sel_mask_sft = APLL_I2S6_MCK_SEL_MASK_SFT,518.div_apll_sel_sft = APLL_I2S6_MCK_SEL_SFT,519},520[MT8192_I2S7_MCK] = {521.m_sel_id = CLK_TOP_I2S7_M_SEL,522.div_clk_id = CLK_TOP_APLL12_DIV7,523.div_pdn_reg = CLK_AUDDIV_0,524.div_pdn_mask_sft = APLL12_DIV7_PDN_MASK_SFT,525.div_reg = CLK_AUDDIV_4,526.div_mask_sft = APLL12_CK_DIV7_MASK_SFT,527.div_mask = APLL12_CK_DIV7_MASK,528.div_sft = APLL12_CK_DIV7_SFT,529.div_apll_sel_reg = CLK_AUDDIV_0,530.div_apll_sel_mask_sft = APLL_I2S7_MCK_SEL_MASK_SFT,531.div_apll_sel_sft = APLL_I2S7_MCK_SEL_SFT,532},533[MT8192_I2S8_MCK] = {534.m_sel_id = CLK_TOP_I2S8_M_SEL,535.div_clk_id = CLK_TOP_APLL12_DIV8,536.div_pdn_reg = CLK_AUDDIV_0,537.div_pdn_mask_sft = APLL12_DIV8_PDN_MASK_SFT,538.div_reg = CLK_AUDDIV_4,539.div_mask_sft = APLL12_CK_DIV8_MASK_SFT,540.div_mask = APLL12_CK_DIV8_MASK,541.div_sft = APLL12_CK_DIV8_SFT,542.div_apll_sel_reg = CLK_AUDDIV_0,543.div_apll_sel_mask_sft = APLL_I2S8_MCK_SEL_MASK_SFT,544.div_apll_sel_sft = APLL_I2S8_MCK_SEL_SFT,545},546[MT8192_I2S9_MCK] = {547.m_sel_id = CLK_TOP_I2S9_M_SEL,548.div_clk_id = CLK_TOP_APLL12_DIV9,549.div_pdn_reg = CLK_AUDDIV_0,550.div_pdn_mask_sft = APLL12_DIV9_PDN_MASK_SFT,551.div_reg = CLK_AUDDIV_4,552.div_mask_sft = APLL12_CK_DIV9_MASK_SFT,553.div_mask = APLL12_CK_DIV9_MASK,554.div_sft = APLL12_CK_DIV9_SFT,555.div_apll_sel_reg = CLK_AUDDIV_0,556.div_apll_sel_mask_sft = APLL_I2S9_MCK_SEL_MASK_SFT,557.div_apll_sel_sft = APLL_I2S9_MCK_SEL_SFT,558},559};560561int mt8192_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)562{563struct mt8192_afe_private *afe_priv = afe->platform_priv;564int apll = mt8192_get_apll_by_rate(afe, rate);565int apll_clk_id = apll == MT8192_APLL1 ?566CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2;567int m_sel_id = mck_div[mck_id].m_sel_id;568int div_clk_id = mck_div[mck_id].div_clk_id;569int ret;570571/* select apll */572if (m_sel_id >= 0) {573ret = clk_prepare_enable(afe_priv->clk[m_sel_id]);574if (ret) {575dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",576__func__, aud_clks[m_sel_id], ret);577return ret;578}579ret = clk_set_parent(afe_priv->clk[m_sel_id],580afe_priv->clk[apll_clk_id]);581if (ret) {582dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",583__func__, aud_clks[m_sel_id],584aud_clks[apll_clk_id], ret);585return ret;586}587}588589/* enable div, set rate */590ret = clk_prepare_enable(afe_priv->clk[div_clk_id]);591if (ret) {592dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",593__func__, aud_clks[div_clk_id], ret);594return ret;595}596ret = clk_set_rate(afe_priv->clk[div_clk_id], rate);597if (ret) {598dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n",599__func__, aud_clks[div_clk_id],600rate, ret);601return ret;602}603604return 0;605}606607void mt8192_mck_disable(struct mtk_base_afe *afe, int mck_id)608{609struct mt8192_afe_private *afe_priv = afe->platform_priv;610int m_sel_id = mck_div[mck_id].m_sel_id;611int div_clk_id = mck_div[mck_id].div_clk_id;612613clk_disable_unprepare(afe_priv->clk[div_clk_id]);614if (m_sel_id >= 0)615clk_disable_unprepare(afe_priv->clk[m_sel_id]);616}617618int mt8192_init_clock(struct mtk_base_afe *afe)619{620struct mt8192_afe_private *afe_priv = afe->platform_priv;621struct device_node *of_node = afe->dev->of_node;622int i = 0;623624afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk),625GFP_KERNEL);626if (!afe_priv->clk)627return -ENOMEM;628629for (i = 0; i < CLK_NUM; i++) {630afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);631if (IS_ERR(afe_priv->clk[i])) {632dev_warn(afe->dev, "%s devm_clk_get %s fail, ret %ld\n",633__func__,634aud_clks[i], PTR_ERR(afe_priv->clk[i]));635afe_priv->clk[i] = NULL;636}637}638639afe_priv->apmixedsys = syscon_regmap_lookup_by_phandle(of_node,640"mediatek,apmixedsys");641if (IS_ERR(afe_priv->apmixedsys)) {642dev_err(afe->dev, "%s() Cannot find apmixedsys controller: %ld\n",643__func__, PTR_ERR(afe_priv->apmixedsys));644return PTR_ERR(afe_priv->apmixedsys);645}646647afe_priv->topckgen = syscon_regmap_lookup_by_phandle(of_node,648"mediatek,topckgen");649if (IS_ERR(afe_priv->topckgen)) {650dev_err(afe->dev, "%s() Cannot find topckgen controller: %ld\n",651__func__, PTR_ERR(afe_priv->topckgen));652return PTR_ERR(afe_priv->topckgen);653}654655afe_priv->infracfg = syscon_regmap_lookup_by_phandle(of_node,656"mediatek,infracfg");657if (IS_ERR(afe_priv->infracfg)) {658dev_err(afe->dev, "%s() Cannot find infracfg: %ld\n",659__func__, PTR_ERR(afe_priv->infracfg));660return PTR_ERR(afe_priv->infracfg);661}662663return 0;664}665666667