162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// mt8186-afe-clk.c -- Mediatek 8186 afe clock ctrl 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright (c) 2022 MediaTek Inc. 662306a36Sopenharmony_ci// Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/clk.h> 962306a36Sopenharmony_ci#include <linux/regmap.h> 1062306a36Sopenharmony_ci#include <linux/mfd/syscon.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "mt8186-afe-common.h" 1362306a36Sopenharmony_ci#include "mt8186-afe-clk.h" 1462306a36Sopenharmony_ci#include "mt8186-audsys-clk.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic const char *aud_clks[CLK_NUM] = { 1762306a36Sopenharmony_ci [CLK_AFE] = "aud_afe_clk", 1862306a36Sopenharmony_ci [CLK_DAC] = "aud_dac_clk", 1962306a36Sopenharmony_ci [CLK_DAC_PREDIS] = "aud_dac_predis_clk", 2062306a36Sopenharmony_ci [CLK_ADC] = "aud_adc_clk", 2162306a36Sopenharmony_ci [CLK_TML] = "aud_tml_clk", 2262306a36Sopenharmony_ci [CLK_APLL22M] = "aud_apll22m_clk", 2362306a36Sopenharmony_ci [CLK_APLL24M] = "aud_apll24m_clk", 2462306a36Sopenharmony_ci [CLK_APLL1_TUNER] = "aud_apll_tuner_clk", 2562306a36Sopenharmony_ci [CLK_APLL2_TUNER] = "aud_apll2_tuner_clk", 2662306a36Sopenharmony_ci [CLK_TDM] = "aud_tdm_clk", 2762306a36Sopenharmony_ci [CLK_NLE] = "aud_nle_clk", 2862306a36Sopenharmony_ci [CLK_DAC_HIRES] = "aud_dac_hires_clk", 2962306a36Sopenharmony_ci [CLK_ADC_HIRES] = "aud_adc_hires_clk", 3062306a36Sopenharmony_ci [CLK_I2S1_BCLK] = "aud_i2s1_bclk", 3162306a36Sopenharmony_ci [CLK_I2S2_BCLK] = "aud_i2s2_bclk", 3262306a36Sopenharmony_ci [CLK_I2S3_BCLK] = "aud_i2s3_bclk", 3362306a36Sopenharmony_ci [CLK_I2S4_BCLK] = "aud_i2s4_bclk", 3462306a36Sopenharmony_ci [CLK_CONNSYS_I2S_ASRC] = "aud_connsys_i2s_asrc", 3562306a36Sopenharmony_ci [CLK_GENERAL1_ASRC] = "aud_general1_asrc", 3662306a36Sopenharmony_ci [CLK_GENERAL2_ASRC] = "aud_general2_asrc", 3762306a36Sopenharmony_ci [CLK_ADC_HIRES_TML] = "aud_adc_hires_tml", 3862306a36Sopenharmony_ci [CLK_ADDA6_ADC] = "aud_adda6_adc", 3962306a36Sopenharmony_ci [CLK_ADDA6_ADC_HIRES] = "aud_adda6_adc_hires", 4062306a36Sopenharmony_ci [CLK_3RD_DAC] = "aud_3rd_dac", 4162306a36Sopenharmony_ci [CLK_3RD_DAC_PREDIS] = "aud_3rd_dac_predis", 4262306a36Sopenharmony_ci [CLK_3RD_DAC_TML] = "aud_3rd_dac_tml", 4362306a36Sopenharmony_ci [CLK_3RD_DAC_HIRES] = "aud_3rd_dac_hires", 4462306a36Sopenharmony_ci [CLK_ETDM_IN1_BCLK] = "aud_etdm_in1_bclk", 4562306a36Sopenharmony_ci [CLK_ETDM_OUT1_BCLK] = "aud_etdm_out1_bclk", 4662306a36Sopenharmony_ci [CLK_INFRA_SYS_AUDIO] = "aud_infra_clk", 4762306a36Sopenharmony_ci [CLK_INFRA_AUDIO_26M] = "mtkaif_26m_clk", 4862306a36Sopenharmony_ci [CLK_MUX_AUDIO] = "top_mux_audio", 4962306a36Sopenharmony_ci [CLK_MUX_AUDIOINTBUS] = "top_mux_audio_int", 5062306a36Sopenharmony_ci [CLK_TOP_MAINPLL_D2_D4] = "top_mainpll_d2_d4", 5162306a36Sopenharmony_ci [CLK_TOP_MUX_AUD_1] = "top_mux_aud_1", 5262306a36Sopenharmony_ci [CLK_TOP_APLL1_CK] = "top_apll1_ck", 5362306a36Sopenharmony_ci [CLK_TOP_MUX_AUD_2] = "top_mux_aud_2", 5462306a36Sopenharmony_ci [CLK_TOP_APLL2_CK] = "top_apll2_ck", 5562306a36Sopenharmony_ci [CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1", 5662306a36Sopenharmony_ci [CLK_TOP_APLL1_D8] = "top_apll1_d8", 5762306a36Sopenharmony_ci [CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2", 5862306a36Sopenharmony_ci [CLK_TOP_APLL2_D8] = "top_apll2_d8", 5962306a36Sopenharmony_ci [CLK_TOP_MUX_AUDIO_H] = "top_mux_audio_h", 6062306a36Sopenharmony_ci [CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel", 6162306a36Sopenharmony_ci [CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel", 6262306a36Sopenharmony_ci [CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel", 6362306a36Sopenharmony_ci [CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel", 6462306a36Sopenharmony_ci [CLK_TOP_TDM_M_SEL] = "top_tdm_m_sel", 6562306a36Sopenharmony_ci [CLK_TOP_APLL12_DIV0] = "top_apll12_div0", 6662306a36Sopenharmony_ci [CLK_TOP_APLL12_DIV1] = "top_apll12_div1", 6762306a36Sopenharmony_ci [CLK_TOP_APLL12_DIV2] = "top_apll12_div2", 6862306a36Sopenharmony_ci [CLK_TOP_APLL12_DIV4] = "top_apll12_div4", 6962306a36Sopenharmony_ci [CLK_TOP_APLL12_DIV_TDM] = "top_apll12_div_tdm", 7062306a36Sopenharmony_ci [CLK_CLK26M] = "top_clk26m_clk", 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ciint mt8186_set_audio_int_bus_parent(struct mtk_base_afe *afe, 7462306a36Sopenharmony_ci int clk_id) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 7762306a36Sopenharmony_ci int ret; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS], 8062306a36Sopenharmony_ci afe_priv->clk[clk_id]); 8162306a36Sopenharmony_ci if (ret) { 8262306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 8362306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIOINTBUS], 8462306a36Sopenharmony_ci aud_clks[clk_id], ret); 8562306a36Sopenharmony_ci return ret; 8662306a36Sopenharmony_ci } 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci return 0; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic int apll1_mux_setting(struct mtk_base_afe *afe, bool enable) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 9462306a36Sopenharmony_ci int ret; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci if (enable) { 9762306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]); 9862306a36Sopenharmony_ci if (ret) { 9962306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 10062306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_1], ret); 10162306a36Sopenharmony_ci return ret; 10262306a36Sopenharmony_ci } 10362306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1], 10462306a36Sopenharmony_ci afe_priv->clk[CLK_TOP_APLL1_CK]); 10562306a36Sopenharmony_ci if (ret) { 10662306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 10762306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_1], 10862306a36Sopenharmony_ci aud_clks[CLK_TOP_APLL1_CK], ret); 10962306a36Sopenharmony_ci return ret; 11062306a36Sopenharmony_ci } 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* 180.6336 / 8 = 22.5792MHz */ 11362306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]); 11462306a36Sopenharmony_ci if (ret) { 11562306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 11662306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret); 11762306a36Sopenharmony_ci return ret; 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1], 12062306a36Sopenharmony_ci afe_priv->clk[CLK_TOP_APLL1_D8]); 12162306a36Sopenharmony_ci if (ret) { 12262306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 12362306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], 12462306a36Sopenharmony_ci aud_clks[CLK_TOP_APLL1_D8], ret); 12562306a36Sopenharmony_ci return ret; 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci } else { 12862306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1], 12962306a36Sopenharmony_ci afe_priv->clk[CLK_CLK26M]); 13062306a36Sopenharmony_ci if (ret) { 13162306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 13262306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], 13362306a36Sopenharmony_ci aud_clks[CLK_CLK26M], ret); 13462306a36Sopenharmony_ci return ret; 13562306a36Sopenharmony_ci } 13662306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1], 13962306a36Sopenharmony_ci afe_priv->clk[CLK_CLK26M]); 14062306a36Sopenharmony_ci if (ret) { 14162306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 14262306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_1], 14362306a36Sopenharmony_ci aud_clks[CLK_CLK26M], ret); 14462306a36Sopenharmony_ci return ret; 14562306a36Sopenharmony_ci } 14662306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]); 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci return 0; 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic int apll2_mux_setting(struct mtk_base_afe *afe, bool enable) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 15562306a36Sopenharmony_ci int ret; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci if (enable) { 15862306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]); 15962306a36Sopenharmony_ci if (ret) { 16062306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 16162306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_2], ret); 16262306a36Sopenharmony_ci return ret; 16362306a36Sopenharmony_ci } 16462306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2], 16562306a36Sopenharmony_ci afe_priv->clk[CLK_TOP_APLL2_CK]); 16662306a36Sopenharmony_ci if (ret) { 16762306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 16862306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_2], 16962306a36Sopenharmony_ci aud_clks[CLK_TOP_APLL2_CK], ret); 17062306a36Sopenharmony_ci return ret; 17162306a36Sopenharmony_ci } 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /* 196.608 / 8 = 24.576MHz */ 17462306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]); 17562306a36Sopenharmony_ci if (ret) { 17662306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 17762306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret); 17862306a36Sopenharmony_ci return ret; 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2], 18162306a36Sopenharmony_ci afe_priv->clk[CLK_TOP_APLL2_D8]); 18262306a36Sopenharmony_ci if (ret) { 18362306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 18462306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], 18562306a36Sopenharmony_ci aud_clks[CLK_TOP_APLL2_D8], ret); 18662306a36Sopenharmony_ci return ret; 18762306a36Sopenharmony_ci } 18862306a36Sopenharmony_ci } else { 18962306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2], 19062306a36Sopenharmony_ci afe_priv->clk[CLK_CLK26M]); 19162306a36Sopenharmony_ci if (ret) { 19262306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 19362306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], 19462306a36Sopenharmony_ci aud_clks[CLK_CLK26M], ret); 19562306a36Sopenharmony_ci return ret; 19662306a36Sopenharmony_ci } 19762306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2], 20062306a36Sopenharmony_ci afe_priv->clk[CLK_CLK26M]); 20162306a36Sopenharmony_ci if (ret) { 20262306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 20362306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUD_2], 20462306a36Sopenharmony_ci aud_clks[CLK_CLK26M], ret); 20562306a36Sopenharmony_ci return ret; 20662306a36Sopenharmony_ci } 20762306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]); 20862306a36Sopenharmony_ci } 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci return 0; 21162306a36Sopenharmony_ci} 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ciint mt8186_afe_enable_cgs(struct mtk_base_afe *afe) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 21662306a36Sopenharmony_ci int ret = 0; 21762306a36Sopenharmony_ci int i; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci for (i = CLK_I2S1_BCLK; i <= CLK_ETDM_OUT1_BCLK; i++) { 22062306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[i]); 22162306a36Sopenharmony_ci if (ret) { 22262306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 22362306a36Sopenharmony_ci __func__, aud_clks[i], ret); 22462306a36Sopenharmony_ci return ret; 22562306a36Sopenharmony_ci } 22662306a36Sopenharmony_ci } 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci return 0; 22962306a36Sopenharmony_ci} 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_civoid mt8186_afe_disable_cgs(struct mtk_base_afe *afe) 23262306a36Sopenharmony_ci{ 23362306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 23462306a36Sopenharmony_ci int i; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci for (i = CLK_I2S1_BCLK; i <= CLK_ETDM_OUT1_BCLK; i++) 23762306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[i]); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ciint mt8186_afe_enable_clock(struct mtk_base_afe *afe) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 24362306a36Sopenharmony_ci int ret = 0; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]); 24662306a36Sopenharmony_ci if (ret) { 24762306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 24862306a36Sopenharmony_ci __func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret); 24962306a36Sopenharmony_ci goto clk_infra_sys_audio_err; 25062306a36Sopenharmony_ci } 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_AUDIO_26M]); 25362306a36Sopenharmony_ci if (ret) { 25462306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 25562306a36Sopenharmony_ci __func__, aud_clks[CLK_INFRA_AUDIO_26M], ret); 25662306a36Sopenharmony_ci goto clk_infra_audio_26m_err; 25762306a36Sopenharmony_ci } 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]); 26062306a36Sopenharmony_ci if (ret) { 26162306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 26262306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIO], ret); 26362306a36Sopenharmony_ci goto clk_mux_audio_err; 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO], 26662306a36Sopenharmony_ci afe_priv->clk[CLK_CLK26M]); 26762306a36Sopenharmony_ci if (ret) { 26862306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 26962306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIO], 27062306a36Sopenharmony_ci aud_clks[CLK_CLK26M], ret); 27162306a36Sopenharmony_ci goto clk_mux_audio_err; 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 27562306a36Sopenharmony_ci if (ret) { 27662306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 27762306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret); 27862306a36Sopenharmony_ci goto clk_mux_audio_intbus_err; 27962306a36Sopenharmony_ci } 28062306a36Sopenharmony_ci ret = mt8186_set_audio_int_bus_parent(afe, 28162306a36Sopenharmony_ci CLK_TOP_MAINPLL_D2_D4); 28262306a36Sopenharmony_ci if (ret) 28362306a36Sopenharmony_ci goto clk_mux_audio_intbus_parent_err; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUDIO_H], 28662306a36Sopenharmony_ci afe_priv->clk[CLK_TOP_APLL2_CK]); 28762306a36Sopenharmony_ci if (ret) { 28862306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n", 28962306a36Sopenharmony_ci __func__, aud_clks[CLK_TOP_MUX_AUDIO_H], 29062306a36Sopenharmony_ci aud_clks[CLK_TOP_APLL2_CK], ret); 29162306a36Sopenharmony_ci goto clk_mux_audio_h_parent_err; 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]); 29562306a36Sopenharmony_ci if (ret) { 29662306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 29762306a36Sopenharmony_ci __func__, aud_clks[CLK_AFE], ret); 29862306a36Sopenharmony_ci goto clk_afe_err; 29962306a36Sopenharmony_ci } 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci return 0; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ciclk_afe_err: 30462306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_AFE]); 30562306a36Sopenharmony_ciclk_mux_audio_h_parent_err: 30662306a36Sopenharmony_ciclk_mux_audio_intbus_parent_err: 30762306a36Sopenharmony_ci mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M); 30862306a36Sopenharmony_ciclk_mux_audio_intbus_err: 30962306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 31062306a36Sopenharmony_ciclk_mux_audio_err: 31162306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]); 31262306a36Sopenharmony_ciclk_infra_sys_audio_err: 31362306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]); 31462306a36Sopenharmony_ciclk_infra_audio_26m_err: 31562306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_INFRA_AUDIO_26M]); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci return ret; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_civoid mt8186_afe_disable_clock(struct mtk_base_afe *afe) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_AFE]); 32562306a36Sopenharmony_ci mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M); 32662306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 32762306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]); 32862306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_INFRA_AUDIO_26M]); 32962306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ciint mt8186_afe_suspend_clock(struct mtk_base_afe *afe) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 33562306a36Sopenharmony_ci int ret; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci /* set audio int bus to 26M */ 33862306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 33962306a36Sopenharmony_ci if (ret) { 34062306a36Sopenharmony_ci dev_info(afe->dev, "%s clk_prepare_enable %s fail %d\n", 34162306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret); 34262306a36Sopenharmony_ci goto clk_mux_audio_intbus_err; 34362306a36Sopenharmony_ci } 34462306a36Sopenharmony_ci ret = mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M); 34562306a36Sopenharmony_ci if (ret) 34662306a36Sopenharmony_ci goto clk_mux_audio_intbus_parent_err; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci return 0; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ciclk_mux_audio_intbus_parent_err: 35362306a36Sopenharmony_ci mt8186_set_audio_int_bus_parent(afe, CLK_TOP_MAINPLL_D2_D4); 35462306a36Sopenharmony_ciclk_mux_audio_intbus_err: 35562306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 35662306a36Sopenharmony_ci return ret; 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ciint mt8186_afe_resume_clock(struct mtk_base_afe *afe) 36062306a36Sopenharmony_ci{ 36162306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 36262306a36Sopenharmony_ci int ret; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci /* set audio int bus to normal working clock */ 36562306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 36662306a36Sopenharmony_ci if (ret) { 36762306a36Sopenharmony_ci dev_info(afe->dev, "%s clk_prepare_enable %s fail %d\n", 36862306a36Sopenharmony_ci __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret); 36962306a36Sopenharmony_ci goto clk_mux_audio_intbus_err; 37062306a36Sopenharmony_ci } 37162306a36Sopenharmony_ci ret = mt8186_set_audio_int_bus_parent(afe, 37262306a36Sopenharmony_ci CLK_TOP_MAINPLL_D2_D4); 37362306a36Sopenharmony_ci if (ret) 37462306a36Sopenharmony_ci goto clk_mux_audio_intbus_parent_err; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci return 0; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ciclk_mux_audio_intbus_parent_err: 38162306a36Sopenharmony_ci mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M); 38262306a36Sopenharmony_ciclk_mux_audio_intbus_err: 38362306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]); 38462306a36Sopenharmony_ci return ret; 38562306a36Sopenharmony_ci} 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ciint mt8186_apll1_enable(struct mtk_base_afe *afe) 38862306a36Sopenharmony_ci{ 38962306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 39062306a36Sopenharmony_ci int ret; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* setting for APLL */ 39362306a36Sopenharmony_ci apll1_mux_setting(afe, true); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]); 39662306a36Sopenharmony_ci if (ret) { 39762306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 39862306a36Sopenharmony_ci __func__, aud_clks[CLK_APLL22M], ret); 39962306a36Sopenharmony_ci goto err_clk_apll22m; 40062306a36Sopenharmony_ci } 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]); 40362306a36Sopenharmony_ci if (ret) { 40462306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 40562306a36Sopenharmony_ci __func__, aud_clks[CLK_APLL1_TUNER], ret); 40662306a36Sopenharmony_ci goto err_clk_apll1_tuner; 40762306a36Sopenharmony_ci } 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0xfff7, 0x832); 41062306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE, 41362306a36Sopenharmony_ci AFE_22M_ON_MASK_SFT, BIT(AFE_22M_ON_SFT)); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci return 0; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cierr_clk_apll1_tuner: 41862306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]); 41962306a36Sopenharmony_cierr_clk_apll22m: 42062306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]); 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci return ret; 42362306a36Sopenharmony_ci} 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_civoid mt8186_apll1_disable(struct mtk_base_afe *afe) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE, 43062306a36Sopenharmony_ci AFE_22M_ON_MASK_SFT, 0); 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0); 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]); 43562306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]); 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci apll1_mux_setting(afe, false); 43862306a36Sopenharmony_ci} 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ciint mt8186_apll2_enable(struct mtk_base_afe *afe) 44162306a36Sopenharmony_ci{ 44262306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 44362306a36Sopenharmony_ci int ret; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci /* setting for APLL */ 44662306a36Sopenharmony_ci apll2_mux_setting(afe, true); 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]); 44962306a36Sopenharmony_ci if (ret) { 45062306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 45162306a36Sopenharmony_ci __func__, aud_clks[CLK_APLL24M], ret); 45262306a36Sopenharmony_ci goto err_clk_apll24m; 45362306a36Sopenharmony_ci } 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]); 45662306a36Sopenharmony_ci if (ret) { 45762306a36Sopenharmony_ci dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n", 45862306a36Sopenharmony_ci __func__, aud_clks[CLK_APLL2_TUNER], ret); 45962306a36Sopenharmony_ci goto err_clk_apll2_tuner; 46062306a36Sopenharmony_ci } 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0xfff7, 0x634); 46362306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1); 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE, 46662306a36Sopenharmony_ci AFE_24M_ON_MASK_SFT, BIT(AFE_24M_ON_SFT)); 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci return 0; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cierr_clk_apll2_tuner: 47162306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]); 47262306a36Sopenharmony_cierr_clk_apll24m: 47362306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci return ret; 47662306a36Sopenharmony_ci} 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_civoid mt8186_apll2_disable(struct mtk_base_afe *afe) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE, 48362306a36Sopenharmony_ci AFE_24M_ON_MASK_SFT, 0); 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0); 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]); 48862306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]); 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci apll2_mux_setting(afe, false); 49162306a36Sopenharmony_ci} 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ciint mt8186_get_apll_rate(struct mtk_base_afe *afe, int apll) 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci return (apll == MT8186_APLL1) ? 180633600 : 196608000; 49662306a36Sopenharmony_ci} 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ciint mt8186_get_apll_by_rate(struct mtk_base_afe *afe, int rate) 49962306a36Sopenharmony_ci{ 50062306a36Sopenharmony_ci return ((rate % 8000) == 0) ? MT8186_APLL2 : MT8186_APLL1; 50162306a36Sopenharmony_ci} 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ciint mt8186_get_apll_by_name(struct mtk_base_afe *afe, const char *name) 50462306a36Sopenharmony_ci{ 50562306a36Sopenharmony_ci if (strcmp(name, APLL1_W_NAME) == 0) 50662306a36Sopenharmony_ci return MT8186_APLL1; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci return MT8186_APLL2; 50962306a36Sopenharmony_ci} 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ci/* mck */ 51262306a36Sopenharmony_cistruct mt8186_mck_div { 51362306a36Sopenharmony_ci u32 m_sel_id; 51462306a36Sopenharmony_ci u32 div_clk_id; 51562306a36Sopenharmony_ci}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic const struct mt8186_mck_div mck_div[MT8186_MCK_NUM] = { 51862306a36Sopenharmony_ci [MT8186_I2S0_MCK] = { 51962306a36Sopenharmony_ci .m_sel_id = CLK_TOP_I2S0_M_SEL, 52062306a36Sopenharmony_ci .div_clk_id = CLK_TOP_APLL12_DIV0, 52162306a36Sopenharmony_ci }, 52262306a36Sopenharmony_ci [MT8186_I2S1_MCK] = { 52362306a36Sopenharmony_ci .m_sel_id = CLK_TOP_I2S1_M_SEL, 52462306a36Sopenharmony_ci .div_clk_id = CLK_TOP_APLL12_DIV1, 52562306a36Sopenharmony_ci }, 52662306a36Sopenharmony_ci [MT8186_I2S2_MCK] = { 52762306a36Sopenharmony_ci .m_sel_id = CLK_TOP_I2S2_M_SEL, 52862306a36Sopenharmony_ci .div_clk_id = CLK_TOP_APLL12_DIV2, 52962306a36Sopenharmony_ci }, 53062306a36Sopenharmony_ci [MT8186_I2S4_MCK] = { 53162306a36Sopenharmony_ci .m_sel_id = CLK_TOP_I2S4_M_SEL, 53262306a36Sopenharmony_ci .div_clk_id = CLK_TOP_APLL12_DIV4, 53362306a36Sopenharmony_ci }, 53462306a36Sopenharmony_ci [MT8186_TDM_MCK] = { 53562306a36Sopenharmony_ci .m_sel_id = CLK_TOP_TDM_M_SEL, 53662306a36Sopenharmony_ci .div_clk_id = CLK_TOP_APLL12_DIV_TDM, 53762306a36Sopenharmony_ci }, 53862306a36Sopenharmony_ci}; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ciint mt8186_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate) 54162306a36Sopenharmony_ci{ 54262306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 54362306a36Sopenharmony_ci int apll = mt8186_get_apll_by_rate(afe, rate); 54462306a36Sopenharmony_ci int apll_clk_id = apll == MT8186_APLL1 ? 54562306a36Sopenharmony_ci CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2; 54662306a36Sopenharmony_ci int m_sel_id = mck_div[mck_id].m_sel_id; 54762306a36Sopenharmony_ci int div_clk_id = mck_div[mck_id].div_clk_id; 54862306a36Sopenharmony_ci int ret; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci /* select apll */ 55162306a36Sopenharmony_ci if (m_sel_id >= 0) { 55262306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[m_sel_id]); 55362306a36Sopenharmony_ci if (ret) { 55462306a36Sopenharmony_ci dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n", 55562306a36Sopenharmony_ci __func__, aud_clks[m_sel_id], ret); 55662306a36Sopenharmony_ci return ret; 55762306a36Sopenharmony_ci } 55862306a36Sopenharmony_ci ret = clk_set_parent(afe_priv->clk[m_sel_id], 55962306a36Sopenharmony_ci afe_priv->clk[apll_clk_id]); 56062306a36Sopenharmony_ci if (ret) { 56162306a36Sopenharmony_ci dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n", 56262306a36Sopenharmony_ci __func__, aud_clks[m_sel_id], 56362306a36Sopenharmony_ci aud_clks[apll_clk_id], ret); 56462306a36Sopenharmony_ci return ret; 56562306a36Sopenharmony_ci } 56662306a36Sopenharmony_ci } 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci /* enable div, set rate */ 56962306a36Sopenharmony_ci ret = clk_prepare_enable(afe_priv->clk[div_clk_id]); 57062306a36Sopenharmony_ci if (ret) { 57162306a36Sopenharmony_ci dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n", 57262306a36Sopenharmony_ci __func__, aud_clks[div_clk_id], ret); 57362306a36Sopenharmony_ci return ret; 57462306a36Sopenharmony_ci } 57562306a36Sopenharmony_ci ret = clk_set_rate(afe_priv->clk[div_clk_id], rate); 57662306a36Sopenharmony_ci if (ret) { 57762306a36Sopenharmony_ci dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n", 57862306a36Sopenharmony_ci __func__, aud_clks[div_clk_id], rate, ret); 57962306a36Sopenharmony_ci return ret; 58062306a36Sopenharmony_ci } 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci return 0; 58362306a36Sopenharmony_ci} 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_civoid mt8186_mck_disable(struct mtk_base_afe *afe, int mck_id) 58662306a36Sopenharmony_ci{ 58762306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 58862306a36Sopenharmony_ci int m_sel_id = mck_div[mck_id].m_sel_id; 58962306a36Sopenharmony_ci int div_clk_id = mck_div[mck_id].div_clk_id; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[div_clk_id]); 59262306a36Sopenharmony_ci if (m_sel_id >= 0) 59362306a36Sopenharmony_ci clk_disable_unprepare(afe_priv->clk[m_sel_id]); 59462306a36Sopenharmony_ci} 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ciint mt8186_init_clock(struct mtk_base_afe *afe) 59762306a36Sopenharmony_ci{ 59862306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 59962306a36Sopenharmony_ci struct device_node *of_node = afe->dev->of_node; 60062306a36Sopenharmony_ci int i = 0; 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci mt8186_audsys_clk_register(afe); 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk), 60562306a36Sopenharmony_ci GFP_KERNEL); 60662306a36Sopenharmony_ci if (!afe_priv->clk) 60762306a36Sopenharmony_ci return -ENOMEM; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci for (i = 0; i < CLK_NUM; i++) { 61062306a36Sopenharmony_ci afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]); 61162306a36Sopenharmony_ci if (IS_ERR(afe_priv->clk[i])) { 61262306a36Sopenharmony_ci dev_err(afe->dev, "%s devm_clk_get %s fail, ret %ld\n", 61362306a36Sopenharmony_ci __func__, 61462306a36Sopenharmony_ci aud_clks[i], PTR_ERR(afe_priv->clk[i])); 61562306a36Sopenharmony_ci afe_priv->clk[i] = NULL; 61662306a36Sopenharmony_ci } 61762306a36Sopenharmony_ci } 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci afe_priv->apmixedsys = syscon_regmap_lookup_by_phandle(of_node, 62062306a36Sopenharmony_ci "mediatek,apmixedsys"); 62162306a36Sopenharmony_ci if (IS_ERR(afe_priv->apmixedsys)) { 62262306a36Sopenharmony_ci dev_err(afe->dev, "%s() Cannot find apmixedsys controller: %ld\n", 62362306a36Sopenharmony_ci __func__, PTR_ERR(afe_priv->apmixedsys)); 62462306a36Sopenharmony_ci return PTR_ERR(afe_priv->apmixedsys); 62562306a36Sopenharmony_ci } 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci afe_priv->topckgen = syscon_regmap_lookup_by_phandle(of_node, 62862306a36Sopenharmony_ci "mediatek,topckgen"); 62962306a36Sopenharmony_ci if (IS_ERR(afe_priv->topckgen)) { 63062306a36Sopenharmony_ci dev_err(afe->dev, "%s() Cannot find topckgen controller: %ld\n", 63162306a36Sopenharmony_ci __func__, PTR_ERR(afe_priv->topckgen)); 63262306a36Sopenharmony_ci return PTR_ERR(afe_priv->topckgen); 63362306a36Sopenharmony_ci } 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci afe_priv->infracfg = syscon_regmap_lookup_by_phandle(of_node, 63662306a36Sopenharmony_ci "mediatek,infracfg"); 63762306a36Sopenharmony_ci if (IS_ERR(afe_priv->infracfg)) { 63862306a36Sopenharmony_ci dev_err(afe->dev, "%s() Cannot find infracfg: %ld\n", 63962306a36Sopenharmony_ci __func__, PTR_ERR(afe_priv->infracfg)); 64062306a36Sopenharmony_ci return PTR_ERR(afe_priv->infracfg); 64162306a36Sopenharmony_ci } 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci return 0; 64462306a36Sopenharmony_ci} 645