0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "mt2701-afe-common.h"
0011 #include "mt2701-afe-clock-ctrl.h"
0012
0013 static const char *const base_clks[] = {
0014 [MT2701_INFRA_SYS_AUDIO] = "infra_sys_audio_clk",
0015 [MT2701_TOP_AUD_MCLK_SRC0] = "top_audio_mux1_sel",
0016 [MT2701_TOP_AUD_MCLK_SRC1] = "top_audio_mux2_sel",
0017 [MT2701_TOP_AUD_A1SYS] = "top_audio_a1sys_hp",
0018 [MT2701_TOP_AUD_A2SYS] = "top_audio_a2sys_hp",
0019 [MT2701_AUDSYS_AFE] = "audio_afe_pd",
0020 [MT2701_AUDSYS_AFE_CONN] = "audio_afe_conn_pd",
0021 [MT2701_AUDSYS_A1SYS] = "audio_a1sys_pd",
0022 [MT2701_AUDSYS_A2SYS] = "audio_a2sys_pd",
0023 };
0024
0025 int mt2701_init_clock(struct mtk_base_afe *afe)
0026 {
0027 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0028 int i;
0029
0030 for (i = 0; i < MT2701_BASE_CLK_NUM; i++) {
0031 afe_priv->base_ck[i] = devm_clk_get(afe->dev, base_clks[i]);
0032 if (IS_ERR(afe_priv->base_ck[i])) {
0033 dev_err(afe->dev, "failed to get %s\n", base_clks[i]);
0034 return PTR_ERR(afe_priv->base_ck[i]);
0035 }
0036 }
0037
0038
0039 for (i = 0; i < afe_priv->soc->i2s_num; i++) {
0040 struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[i];
0041 struct clk *i2s_ck;
0042 char name[13];
0043
0044 snprintf(name, sizeof(name), "i2s%d_src_sel", i);
0045 i2s_path->sel_ck = devm_clk_get(afe->dev, name);
0046 if (IS_ERR(i2s_path->sel_ck)) {
0047 dev_err(afe->dev, "failed to get %s\n", name);
0048 return PTR_ERR(i2s_path->sel_ck);
0049 }
0050
0051 snprintf(name, sizeof(name), "i2s%d_src_div", i);
0052 i2s_path->div_ck = devm_clk_get(afe->dev, name);
0053 if (IS_ERR(i2s_path->div_ck)) {
0054 dev_err(afe->dev, "failed to get %s\n", name);
0055 return PTR_ERR(i2s_path->div_ck);
0056 }
0057
0058 snprintf(name, sizeof(name), "i2s%d_mclk_en", i);
0059 i2s_path->mclk_ck = devm_clk_get(afe->dev, name);
0060 if (IS_ERR(i2s_path->mclk_ck)) {
0061 dev_err(afe->dev, "failed to get %s\n", name);
0062 return PTR_ERR(i2s_path->mclk_ck);
0063 }
0064
0065 snprintf(name, sizeof(name), "i2so%d_hop_ck", i);
0066 i2s_ck = devm_clk_get(afe->dev, name);
0067 if (IS_ERR(i2s_ck)) {
0068 dev_err(afe->dev, "failed to get %s\n", name);
0069 return PTR_ERR(i2s_ck);
0070 }
0071 i2s_path->hop_ck[SNDRV_PCM_STREAM_PLAYBACK] = i2s_ck;
0072
0073 snprintf(name, sizeof(name), "i2si%d_hop_ck", i);
0074 i2s_ck = devm_clk_get(afe->dev, name);
0075 if (IS_ERR(i2s_ck)) {
0076 dev_err(afe->dev, "failed to get %s\n", name);
0077 return PTR_ERR(i2s_ck);
0078 }
0079 i2s_path->hop_ck[SNDRV_PCM_STREAM_CAPTURE] = i2s_ck;
0080
0081 snprintf(name, sizeof(name), "asrc%d_out_ck", i);
0082 i2s_path->asrco_ck = devm_clk_get(afe->dev, name);
0083 if (IS_ERR(i2s_path->asrco_ck)) {
0084 dev_err(afe->dev, "failed to get %s\n", name);
0085 return PTR_ERR(i2s_path->asrco_ck);
0086 }
0087 }
0088
0089
0090 afe_priv->mrgif_ck = devm_clk_get(afe->dev, "audio_mrgif_pd");
0091 if (IS_ERR(afe_priv->mrgif_ck)) {
0092 if (PTR_ERR(afe_priv->mrgif_ck) == -EPROBE_DEFER)
0093 return -EPROBE_DEFER;
0094
0095 afe_priv->mrgif_ck = NULL;
0096 }
0097
0098 return 0;
0099 }
0100
0101 int mt2701_afe_enable_i2s(struct mtk_base_afe *afe,
0102 struct mt2701_i2s_path *i2s_path,
0103 int dir)
0104 {
0105 int ret;
0106
0107 ret = clk_prepare_enable(i2s_path->asrco_ck);
0108 if (ret) {
0109 dev_err(afe->dev, "failed to enable ASRC clock %d\n", ret);
0110 return ret;
0111 }
0112
0113 ret = clk_prepare_enable(i2s_path->hop_ck[dir]);
0114 if (ret) {
0115 dev_err(afe->dev, "failed to enable I2S clock %d\n", ret);
0116 goto err_hop_ck;
0117 }
0118
0119 return 0;
0120
0121 err_hop_ck:
0122 clk_disable_unprepare(i2s_path->asrco_ck);
0123
0124 return ret;
0125 }
0126
0127 void mt2701_afe_disable_i2s(struct mtk_base_afe *afe,
0128 struct mt2701_i2s_path *i2s_path,
0129 int dir)
0130 {
0131 clk_disable_unprepare(i2s_path->hop_ck[dir]);
0132 clk_disable_unprepare(i2s_path->asrco_ck);
0133 }
0134
0135 int mt2701_afe_enable_mclk(struct mtk_base_afe *afe, int id)
0136 {
0137 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0138 struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[id];
0139
0140 return clk_prepare_enable(i2s_path->mclk_ck);
0141 }
0142
0143 void mt2701_afe_disable_mclk(struct mtk_base_afe *afe, int id)
0144 {
0145 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0146 struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[id];
0147
0148 clk_disable_unprepare(i2s_path->mclk_ck);
0149 }
0150
0151 int mt2701_enable_btmrg_clk(struct mtk_base_afe *afe)
0152 {
0153 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0154
0155 return clk_prepare_enable(afe_priv->mrgif_ck);
0156 }
0157
0158 void mt2701_disable_btmrg_clk(struct mtk_base_afe *afe)
0159 {
0160 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0161
0162 clk_disable_unprepare(afe_priv->mrgif_ck);
0163 }
0164
0165 static int mt2701_afe_enable_audsys(struct mtk_base_afe *afe)
0166 {
0167 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0168 int ret;
0169
0170
0171 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
0172 if (ret)
0173 return ret;
0174
0175
0176 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
0177 if (ret)
0178 goto err_a1sys;
0179
0180
0181 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
0182 if (ret)
0183 goto err_a2sys;
0184
0185
0186 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
0187 if (ret)
0188 goto err_afe;
0189
0190 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
0191 if (ret)
0192 goto err_audio_a1sys;
0193
0194 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
0195 if (ret)
0196 goto err_audio_a2sys;
0197
0198 ret = clk_prepare_enable(afe_priv->base_ck[MT2701_AUDSYS_AFE_CONN]);
0199 if (ret)
0200 goto err_afe_conn;
0201
0202 return 0;
0203
0204 err_afe_conn:
0205 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
0206 err_audio_a2sys:
0207 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
0208 err_audio_a1sys:
0209 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
0210 err_afe:
0211 clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
0212 err_a2sys:
0213 clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
0214 err_a1sys:
0215 clk_disable_unprepare(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
0216
0217 return ret;
0218 }
0219
0220 static void mt2701_afe_disable_audsys(struct mtk_base_afe *afe)
0221 {
0222 struct mt2701_afe_private *afe_priv = afe->platform_priv;
0223
0224 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE_CONN]);
0225 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A2SYS]);
0226 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_A1SYS]);
0227 clk_disable_unprepare(afe_priv->base_ck[MT2701_AUDSYS_AFE]);
0228 clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A1SYS]);
0229 clk_disable_unprepare(afe_priv->base_ck[MT2701_TOP_AUD_A2SYS]);
0230 clk_disable_unprepare(afe_priv->base_ck[MT2701_INFRA_SYS_AUDIO]);
0231 }
0232
0233 int mt2701_afe_enable_clock(struct mtk_base_afe *afe)
0234 {
0235 int ret;
0236
0237
0238 ret = mt2701_afe_enable_audsys(afe);
0239 if (ret) {
0240 dev_err(afe->dev, "failed to enable audio system %d\n", ret);
0241 return ret;
0242 }
0243
0244 regmap_update_bits(afe->regmap, ASYS_TOP_CON,
0245 ASYS_TOP_CON_ASYS_TIMING_ON,
0246 ASYS_TOP_CON_ASYS_TIMING_ON);
0247 regmap_update_bits(afe->regmap, AFE_DAC_CON0,
0248 AFE_DAC_CON0_AFE_ON,
0249 AFE_DAC_CON0_AFE_ON);
0250
0251
0252 regmap_write(afe->regmap, PWR1_ASM_CON1, PWR1_ASM_CON1_INIT_VAL);
0253 regmap_write(afe->regmap, PWR2_ASM_CON1, PWR2_ASM_CON1_INIT_VAL);
0254
0255 return 0;
0256 }
0257
0258 int mt2701_afe_disable_clock(struct mtk_base_afe *afe)
0259 {
0260 regmap_update_bits(afe->regmap, ASYS_TOP_CON,
0261 ASYS_TOP_CON_ASYS_TIMING_ON, 0);
0262 regmap_update_bits(afe->regmap, AFE_DAC_CON0,
0263 AFE_DAC_CON0_AFE_ON, 0);
0264
0265 mt2701_afe_disable_audsys(afe);
0266
0267 return 0;
0268 }
0269
0270 int mt2701_mclk_configuration(struct mtk_base_afe *afe, int id)
0271
0272 {
0273 struct mt2701_afe_private *priv = afe->platform_priv;
0274 struct mt2701_i2s_path *i2s_path = &priv->i2s_path[id];
0275 int ret = -EINVAL;
0276
0277
0278 if (!(MT2701_PLL_DOMAIN_0_RATE % i2s_path->mclk_rate))
0279 ret = clk_set_parent(i2s_path->sel_ck,
0280 priv->base_ck[MT2701_TOP_AUD_MCLK_SRC0]);
0281 else if (!(MT2701_PLL_DOMAIN_1_RATE % i2s_path->mclk_rate))
0282 ret = clk_set_parent(i2s_path->sel_ck,
0283 priv->base_ck[MT2701_TOP_AUD_MCLK_SRC1]);
0284
0285 if (ret) {
0286 dev_err(afe->dev, "failed to set mclk source\n");
0287 return ret;
0288 }
0289
0290
0291 ret = clk_set_rate(i2s_path->div_ck, i2s_path->mclk_rate);
0292 if (ret) {
0293 dev_err(afe->dev, "failed to set mclk divider %d\n", ret);
0294 return ret;
0295 }
0296
0297 return 0;
0298 }