0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/regmap.h>
0009 #include <sound/pcm_params.h>
0010
0011 #include "mt8186-afe-clk.h"
0012 #include "mt8186-afe-common.h"
0013 #include "mt8186-afe-gpio.h"
0014 #include "mt8186-interconnection.h"
0015
0016 #define TDM_HD_EN_W_NAME "TDM_HD_EN"
0017 #define TDM_MCLK_EN_W_NAME "TDM_MCLK_EN"
0018 #define MTK_AFE_TDM_KCONTROL_NAME "TDM_HD_Mux"
0019
0020 struct mtk_afe_tdm_priv {
0021 unsigned int id;
0022 unsigned int rate;
0023 unsigned int bck_invert;
0024 unsigned int lck_invert;
0025 unsigned int lrck_width;
0026 unsigned int mclk_id;
0027 unsigned int mclk_multiple;
0028 unsigned int mclk_rate;
0029 unsigned int mclk_apll;
0030 unsigned int tdm_mode;
0031 unsigned int data_mode;
0032 unsigned int slave_mode;
0033 unsigned int low_jitter_en;
0034 };
0035
0036 enum {
0037 TDM_IN_I2S = 0,
0038 TDM_IN_LJ = 1,
0039 TDM_IN_RJ = 2,
0040 TDM_IN_DSP_A = 4,
0041 TDM_IN_DSP_B = 5,
0042 };
0043
0044 enum {
0045 TDM_DATA_ONE_PIN = 0,
0046 TDM_DATA_MULTI_PIN,
0047 };
0048
0049 enum {
0050 TDM_BCK_NON_INV = 0,
0051 TDM_BCK_INV = 1,
0052 };
0053
0054 enum {
0055 TDM_LCK_NON_INV = 0,
0056 TDM_LCK_INV = 1,
0057 };
0058
0059 static unsigned int get_tdm_lrck_width(snd_pcm_format_t format,
0060 unsigned int mode)
0061 {
0062 if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B)
0063 return 0;
0064
0065 return snd_pcm_format_physical_width(format) - 1;
0066 }
0067
0068 static unsigned int get_tdm_ch_fixup(unsigned int channels)
0069 {
0070 if (channels > 4)
0071 return 8;
0072 else if (channels > 2)
0073 return 4;
0074
0075 return 2;
0076 }
0077
0078 static unsigned int get_tdm_ch_per_sdata(unsigned int mode,
0079 unsigned int channels)
0080 {
0081 if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B)
0082 return get_tdm_ch_fixup(channels);
0083
0084 return 2;
0085 }
0086
0087 enum {
0088 SUPPLY_SEQ_APLL,
0089 SUPPLY_SEQ_TDM_MCK_EN,
0090 SUPPLY_SEQ_TDM_HD_EN,
0091 SUPPLY_SEQ_TDM_EN,
0092 };
0093
0094 static int get_tdm_id_by_name(const char *name)
0095 {
0096 return MT8186_DAI_TDM_IN;
0097 }
0098
0099 static int mtk_tdm_en_event(struct snd_soc_dapm_widget *w,
0100 struct snd_kcontrol *kcontrol,
0101 int event)
0102 {
0103 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0104 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0105 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0106 int dai_id = get_tdm_id_by_name(w->name);
0107 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0108
0109 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
0110 __func__, w->name, event);
0111
0112 switch (event) {
0113 case SND_SOC_DAPM_PRE_PMU:
0114 mt8186_afe_gpio_request(afe->dev, true, tdm_priv->id, 0);
0115 break;
0116 case SND_SOC_DAPM_POST_PMD:
0117 mt8186_afe_gpio_request(afe->dev, false, tdm_priv->id, 0);
0118 break;
0119 default:
0120 break;
0121 }
0122
0123 return 0;
0124 }
0125
0126 static int mtk_tdm_mck_en_event(struct snd_soc_dapm_widget *w,
0127 struct snd_kcontrol *kcontrol,
0128 int event)
0129 {
0130 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0131 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0132 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0133 int dai_id = get_tdm_id_by_name(w->name);
0134 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0135
0136 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x, dai_id %d\n",
0137 __func__, w->name, event, dai_id);
0138
0139 switch (event) {
0140 case SND_SOC_DAPM_PRE_PMU:
0141 mt8186_mck_enable(afe, tdm_priv->mclk_id, tdm_priv->mclk_rate);
0142 break;
0143 case SND_SOC_DAPM_POST_PMD:
0144 tdm_priv->mclk_rate = 0;
0145 mt8186_mck_disable(afe, tdm_priv->mclk_id);
0146 break;
0147 default:
0148 break;
0149 }
0150
0151 return 0;
0152 }
0153
0154
0155
0156 static const char * const tdm_mux_map[] = {
0157 "Normal", "Dummy_Widget",
0158 };
0159
0160 static int tdm_mux_map_value[] = {
0161 0, 1,
0162 };
0163
0164 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(tdm_mux_map_enum,
0165 SND_SOC_NOPM,
0166 0,
0167 1,
0168 tdm_mux_map,
0169 tdm_mux_map_value);
0170
0171 static const struct snd_kcontrol_new tdm_in_mux_control =
0172 SOC_DAPM_ENUM("TDM In Select", tdm_mux_map_enum);
0173
0174 static const struct snd_soc_dapm_widget mtk_dai_tdm_widgets[] = {
0175 SND_SOC_DAPM_CLOCK_SUPPLY("aud_tdm_clk"),
0176
0177 SND_SOC_DAPM_SUPPLY_S("TDM_EN", SUPPLY_SEQ_TDM_EN,
0178 ETDM_IN1_CON0, ETDM_IN1_CON0_REG_ETDM_IN_EN_SFT,
0179 0, mtk_tdm_en_event,
0180 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0181
0182 SND_SOC_DAPM_SUPPLY_S(TDM_HD_EN_W_NAME, SUPPLY_SEQ_TDM_HD_EN,
0183 ETDM_IN1_CON2, ETDM_IN1_CON2_REG_CLOCK_SOURCE_SEL_SFT,
0184 0, NULL,
0185 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0186
0187 SND_SOC_DAPM_SUPPLY_S(TDM_MCLK_EN_W_NAME, SUPPLY_SEQ_TDM_MCK_EN,
0188 SND_SOC_NOPM, 0, 0,
0189 mtk_tdm_mck_en_event,
0190 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0191
0192 SND_SOC_DAPM_INPUT("TDM_DUMMY_IN"),
0193
0194 SND_SOC_DAPM_MUX("TDM_In_Mux",
0195 SND_SOC_NOPM, 0, 0, &tdm_in_mux_control),
0196 };
0197
0198 static int mtk_afe_tdm_mclk_connect(struct snd_soc_dapm_widget *source,
0199 struct snd_soc_dapm_widget *sink)
0200 {
0201 struct snd_soc_dapm_widget *w = sink;
0202 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0203 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0204 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0205 int dai_id = get_tdm_id_by_name(w->name);
0206 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0207
0208 return (tdm_priv->mclk_rate > 0) ? 1 : 0;
0209 }
0210
0211 static int mtk_afe_tdm_mclk_apll_connect(struct snd_soc_dapm_widget *source,
0212 struct snd_soc_dapm_widget *sink)
0213 {
0214 struct snd_soc_dapm_widget *w = sink;
0215 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0216 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0217 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0218 int dai_id = get_tdm_id_by_name(w->name);
0219 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0220 int cur_apll;
0221
0222
0223 cur_apll = mt8186_get_apll_by_name(afe, source->name);
0224
0225 return (tdm_priv->mclk_apll == cur_apll) ? 1 : 0;
0226 }
0227
0228 static int mtk_afe_tdm_hd_connect(struct snd_soc_dapm_widget *source,
0229 struct snd_soc_dapm_widget *sink)
0230 {
0231 struct snd_soc_dapm_widget *w = sink;
0232 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0233 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0234 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0235 int dai_id = get_tdm_id_by_name(w->name);
0236 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0237
0238 return tdm_priv->low_jitter_en;
0239 }
0240
0241 static int mtk_afe_tdm_apll_connect(struct snd_soc_dapm_widget *source,
0242 struct snd_soc_dapm_widget *sink)
0243 {
0244 struct snd_soc_dapm_widget *w = sink;
0245 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0246 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0247 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0248 int dai_id = get_tdm_id_by_name(w->name);
0249 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0250 int cur_apll;
0251 int tdm_need_apll;
0252
0253
0254 cur_apll = mt8186_get_apll_by_name(afe, source->name);
0255
0256
0257 tdm_need_apll = mt8186_get_apll_by_rate(afe, tdm_priv->rate);
0258
0259 return (tdm_need_apll == cur_apll) ? 1 : 0;
0260 }
0261
0262
0263 static const char * const mt8186_tdm_hd_str[] = {
0264 "Normal", "Low_Jitter"
0265 };
0266
0267 static const struct soc_enum mt8186_tdm_enum[] = {
0268 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mt8186_tdm_hd_str),
0269 mt8186_tdm_hd_str),
0270 };
0271
0272 static int mt8186_tdm_hd_get(struct snd_kcontrol *kcontrol,
0273 struct snd_ctl_elem_value *ucontrol)
0274 {
0275 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0276 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0277 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0278 int dai_id = get_tdm_id_by_name(kcontrol->id.name);
0279 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0280
0281 ucontrol->value.integer.value[0] = tdm_priv->low_jitter_en;
0282
0283 return 0;
0284 }
0285
0286 static int mt8186_tdm_hd_set(struct snd_kcontrol *kcontrol,
0287 struct snd_ctl_elem_value *ucontrol)
0288 {
0289 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0290 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0291 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0292 int dai_id = get_tdm_id_by_name(kcontrol->id.name);
0293 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
0294 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
0295 int hd_en;
0296
0297 if (ucontrol->value.enumerated.item[0] >= e->items)
0298 return -EINVAL;
0299
0300 hd_en = ucontrol->value.integer.value[0];
0301
0302 dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n",
0303 __func__, kcontrol->id.name, hd_en);
0304
0305 if (tdm_priv->low_jitter_en == hd_en)
0306 return 0;
0307
0308 tdm_priv->low_jitter_en = hd_en;
0309
0310 return 1;
0311 }
0312
0313 static const struct snd_kcontrol_new mtk_dai_tdm_controls[] = {
0314 SOC_ENUM_EXT(MTK_AFE_TDM_KCONTROL_NAME, mt8186_tdm_enum[0],
0315 mt8186_tdm_hd_get, mt8186_tdm_hd_set),
0316 };
0317
0318 static const struct snd_soc_dapm_route mtk_dai_tdm_routes[] = {
0319 {"TDM IN", NULL, "aud_tdm_clk"},
0320 {"TDM IN", NULL, "TDM_EN"},
0321 {"TDM IN", NULL, TDM_HD_EN_W_NAME, mtk_afe_tdm_hd_connect},
0322 {TDM_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_apll_connect},
0323 {TDM_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_apll_connect},
0324
0325 {"TDM IN", NULL, TDM_MCLK_EN_W_NAME, mtk_afe_tdm_mclk_connect},
0326 {TDM_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_mclk_apll_connect},
0327 {TDM_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_mclk_apll_connect},
0328
0329
0330 {"TDM IN", NULL, "TDM_In_Mux"},
0331 {"TDM_In_Mux", "Dummy_Widget", "TDM_DUMMY_IN"},
0332 };
0333
0334
0335 static int mtk_dai_tdm_cal_mclk(struct mtk_base_afe *afe,
0336 struct mtk_afe_tdm_priv *tdm_priv,
0337 int freq)
0338 {
0339 int apll;
0340 int apll_rate;
0341
0342 apll = mt8186_get_apll_by_rate(afe, freq);
0343 apll_rate = mt8186_get_apll_rate(afe, apll);
0344
0345 if (!freq || freq > apll_rate) {
0346 dev_err(afe->dev,
0347 "%s(), freq(%d Hz) invalid\n", __func__, freq);
0348 return -EINVAL;
0349 }
0350
0351 if (apll_rate % freq != 0) {
0352 dev_err(afe->dev,
0353 "%s(), APLL cannot generate %d Hz", __func__, freq);
0354 return -EINVAL;
0355 }
0356
0357 tdm_priv->mclk_rate = freq;
0358 tdm_priv->mclk_apll = apll;
0359
0360 return 0;
0361 }
0362
0363 static int mtk_dai_tdm_hw_params(struct snd_pcm_substream *substream,
0364 struct snd_pcm_hw_params *params,
0365 struct snd_soc_dai *dai)
0366 {
0367 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
0368 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0369 int tdm_id = dai->id;
0370 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[tdm_id];
0371 unsigned int tdm_mode = tdm_priv->tdm_mode;
0372 unsigned int data_mode = tdm_priv->data_mode;
0373 unsigned int rate = params_rate(params);
0374 unsigned int channels = params_channels(params);
0375 snd_pcm_format_t format = params_format(params);
0376 unsigned int bit_width =
0377 snd_pcm_format_physical_width(format);
0378 unsigned int tdm_channels = (data_mode == TDM_DATA_ONE_PIN) ?
0379 get_tdm_ch_per_sdata(tdm_mode, channels) : 2;
0380 unsigned int lrck_width =
0381 get_tdm_lrck_width(format, tdm_mode);
0382 unsigned int tdm_con = 0;
0383 bool slave_mode = tdm_priv->slave_mode;
0384 bool lrck_inv = tdm_priv->lck_invert;
0385 bool bck_inv = tdm_priv->bck_invert;
0386 unsigned int tran_rate;
0387 unsigned int tran_relatch_rate;
0388
0389 tdm_priv->rate = rate;
0390 tran_rate = mt8186_rate_transform(afe->dev, rate, dai->id);
0391 tran_relatch_rate = mt8186_tdm_relatch_rate_transform(afe->dev, rate);
0392
0393
0394 if (!tdm_priv->mclk_rate) {
0395 tdm_priv->mclk_rate = rate * tdm_priv->mclk_multiple;
0396 mtk_dai_tdm_cal_mclk(afe, tdm_priv, tdm_priv->mclk_rate);
0397 }
0398
0399
0400 tdm_con |= slave_mode << ETDM_IN1_CON0_REG_SLAVE_MODE_SFT;
0401 tdm_con |= tdm_mode << ETDM_IN1_CON0_REG_FMT_SFT;
0402 tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_BIT_LENGTH_SFT;
0403 tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_WORD_LENGTH_SFT;
0404 tdm_con |= (tdm_channels - 1) << ETDM_IN1_CON0_REG_CH_NUM_SFT;
0405
0406 tdm_con |= 0 << ETDM_IN1_CON0_REG_SYNC_MODE_SFT;
0407
0408 tdm_con |= 0 << ETDM_IN1_CON0_REG_RELATCH_1X_EN_SEL_DOMAIN_SFT;
0409 regmap_update_bits(afe->regmap, ETDM_IN1_CON0, ETDM_IN_CON0_CTRL_MASK, tdm_con);
0410
0411
0412 tdm_con = 0;
0413 tdm_con |= 0 << ETDM_IN1_CON1_REG_LRCK_AUTO_MODE_SFT;
0414 tdm_con |= 1 << ETDM_IN1_CON1_PINMUX_MCLK_CTRL_OE_SFT;
0415 tdm_con |= (lrck_width - 1) << ETDM_IN1_CON1_REG_LRCK_WIDTH_SFT;
0416 regmap_update_bits(afe->regmap, ETDM_IN1_CON1, ETDM_IN_CON1_CTRL_MASK, tdm_con);
0417
0418
0419 tdm_con = 0;
0420 tdm_con = ETDM_IN_CON3_FS(tran_rate);
0421 regmap_update_bits(afe->regmap, ETDM_IN1_CON3, ETDM_IN_CON3_CTRL_MASK, tdm_con);
0422
0423
0424 tdm_con = 0;
0425 tdm_con = ETDM_IN_CON4_FS(tran_relatch_rate);
0426 if (slave_mode) {
0427 if (lrck_inv)
0428 tdm_con |= ETDM_IN_CON4_CON0_SLAVE_LRCK_INV;
0429 if (bck_inv)
0430 tdm_con |= ETDM_IN_CON4_CON0_SLAVE_BCK_INV;
0431 } else {
0432 if (lrck_inv)
0433 tdm_con |= ETDM_IN_CON4_CON0_MASTER_LRCK_INV;
0434 if (bck_inv)
0435 tdm_con |= ETDM_IN_CON4_CON0_MASTER_BCK_INV;
0436 }
0437 regmap_update_bits(afe->regmap, ETDM_IN1_CON4, ETDM_IN_CON4_CTRL_MASK, tdm_con);
0438
0439
0440 tdm_con = 0;
0441 if (data_mode == TDM_DATA_MULTI_PIN) {
0442 tdm_con |= ETDM_IN_CON2_MULTI_IP_2CH_MODE;
0443 tdm_con |= ETDM_IN_CON2_MULTI_IP_CH(channels);
0444 }
0445 regmap_update_bits(afe->regmap, ETDM_IN1_CON2, ETDM_IN_CON2_CTRL_MASK, tdm_con);
0446
0447
0448 tdm_con = 0;
0449 if (slave_mode) {
0450 tdm_con |= 1 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT;
0451 tdm_con |= 0 << ETDM_IN1_CON8_REG_AFIFO_CLOCK_DOMAIN_SEL_SFT;
0452 tdm_con |= ETDM_IN_CON8_FS(tran_relatch_rate);
0453 } else {
0454 tdm_con |= 0 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT;
0455 }
0456 regmap_update_bits(afe->regmap, ETDM_IN1_CON8, ETDM_IN_CON8_CTRL_MASK, tdm_con);
0457
0458 return 0;
0459 }
0460
0461 static int mtk_dai_tdm_set_sysclk(struct snd_soc_dai *dai,
0462 int clk_id, unsigned int freq, int dir)
0463 {
0464 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
0465 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0466 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
0467
0468 if (dir != SND_SOC_CLOCK_IN) {
0469 dev_err(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__);
0470 return -EINVAL;
0471 }
0472
0473 dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq);
0474
0475 return mtk_dai_tdm_cal_mclk(afe, tdm_priv, freq);
0476 }
0477
0478 static int mtk_dai_tdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
0479 {
0480 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
0481 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0482 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
0483
0484
0485 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
0486 case SND_SOC_DAIFMT_I2S:
0487 tdm_priv->tdm_mode = TDM_IN_I2S;
0488 tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
0489 break;
0490 case SND_SOC_DAIFMT_LEFT_J:
0491 tdm_priv->tdm_mode = TDM_IN_LJ;
0492 tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
0493 break;
0494 case SND_SOC_DAIFMT_RIGHT_J:
0495 tdm_priv->tdm_mode = TDM_IN_RJ;
0496 tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
0497 break;
0498 case SND_SOC_DAIFMT_DSP_A:
0499 tdm_priv->tdm_mode = TDM_IN_DSP_A;
0500 tdm_priv->data_mode = TDM_DATA_ONE_PIN;
0501 break;
0502 case SND_SOC_DAIFMT_DSP_B:
0503 tdm_priv->tdm_mode = TDM_IN_DSP_B;
0504 tdm_priv->data_mode = TDM_DATA_ONE_PIN;
0505 break;
0506 default:
0507 dev_err(afe->dev, "%s(), invalid DAIFMT_FORMAT_MASK", __func__);
0508 return -EINVAL;
0509 }
0510
0511
0512 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
0513 case SND_SOC_DAIFMT_NB_NF:
0514 tdm_priv->bck_invert = TDM_BCK_NON_INV;
0515 tdm_priv->lck_invert = TDM_LCK_NON_INV;
0516 break;
0517 case SND_SOC_DAIFMT_NB_IF:
0518 tdm_priv->bck_invert = TDM_BCK_NON_INV;
0519 tdm_priv->lck_invert = TDM_LCK_INV;
0520 break;
0521 case SND_SOC_DAIFMT_IB_NF:
0522 tdm_priv->bck_invert = TDM_BCK_INV;
0523 tdm_priv->lck_invert = TDM_LCK_NON_INV;
0524 break;
0525 case SND_SOC_DAIFMT_IB_IF:
0526 tdm_priv->bck_invert = TDM_BCK_INV;
0527 tdm_priv->lck_invert = TDM_LCK_INV;
0528 break;
0529 default:
0530 dev_err(afe->dev, "%s(), invalid DAIFMT_INV_MASK", __func__);
0531 return -EINVAL;
0532 }
0533
0534 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
0535 case SND_SOC_DAIFMT_BP_FP:
0536 tdm_priv->slave_mode = false;
0537 break;
0538 case SND_SOC_DAIFMT_BC_FC:
0539 tdm_priv->slave_mode = true;
0540 break;
0541 default:
0542 dev_err(afe->dev, "%s(), invalid DAIFMT_CLOCK_PROVIDER_MASK",
0543 __func__);
0544 return -EINVAL;
0545 }
0546
0547 return 0;
0548 }
0549
0550 static int mtk_dai_tdm_set_tdm_slot(struct snd_soc_dai *dai,
0551 unsigned int tx_mask,
0552 unsigned int rx_mask,
0553 int slots,
0554 int slot_width)
0555 {
0556 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
0557 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0558 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
0559
0560 dev_dbg(dai->dev, "%s %d slot_width %d\n", __func__, dai->id, slot_width);
0561
0562 tdm_priv->lrck_width = slot_width;
0563
0564 return 0;
0565 }
0566
0567 static const struct snd_soc_dai_ops mtk_dai_tdm_ops = {
0568 .hw_params = mtk_dai_tdm_hw_params,
0569 .set_sysclk = mtk_dai_tdm_set_sysclk,
0570 .set_fmt = mtk_dai_tdm_set_fmt,
0571 .set_tdm_slot = mtk_dai_tdm_set_tdm_slot,
0572 };
0573
0574
0575 #define MTK_TDM_RATES (SNDRV_PCM_RATE_8000_48000 |\
0576 SNDRV_PCM_RATE_88200 |\
0577 SNDRV_PCM_RATE_96000 |\
0578 SNDRV_PCM_RATE_176400 |\
0579 SNDRV_PCM_RATE_192000)
0580
0581 #define MTK_TDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
0582 SNDRV_PCM_FMTBIT_S24_LE |\
0583 SNDRV_PCM_FMTBIT_S32_LE)
0584
0585 static struct snd_soc_dai_driver mtk_dai_tdm_driver[] = {
0586 {
0587 .name = "TDM IN",
0588 .id = MT8186_DAI_TDM_IN,
0589 .capture = {
0590 .stream_name = "TDM IN",
0591 .channels_min = 2,
0592 .channels_max = 8,
0593 .rates = MTK_TDM_RATES,
0594 .formats = MTK_TDM_FORMATS,
0595 },
0596 .ops = &mtk_dai_tdm_ops,
0597 },
0598 };
0599
0600 static struct mtk_afe_tdm_priv *init_tdm_priv_data(struct mtk_base_afe *afe)
0601 {
0602 struct mtk_afe_tdm_priv *tdm_priv;
0603
0604 tdm_priv = devm_kzalloc(afe->dev, sizeof(struct mtk_afe_tdm_priv),
0605 GFP_KERNEL);
0606 if (!tdm_priv)
0607 return NULL;
0608
0609 tdm_priv->mclk_multiple = 512;
0610 tdm_priv->mclk_id = MT8186_TDM_MCK;
0611 tdm_priv->id = MT8186_DAI_TDM_IN;
0612
0613 return tdm_priv;
0614 }
0615
0616 int mt8186_dai_tdm_register(struct mtk_base_afe *afe)
0617 {
0618 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0619 struct mtk_afe_tdm_priv *tdm_priv;
0620 struct mtk_base_afe_dai *dai;
0621
0622 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
0623 if (!dai)
0624 return -ENOMEM;
0625
0626 list_add(&dai->list, &afe->sub_dais);
0627
0628 dai->dai_drivers = mtk_dai_tdm_driver;
0629 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_tdm_driver);
0630
0631 dai->controls = mtk_dai_tdm_controls;
0632 dai->num_controls = ARRAY_SIZE(mtk_dai_tdm_controls);
0633 dai->dapm_widgets = mtk_dai_tdm_widgets;
0634 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_tdm_widgets);
0635 dai->dapm_routes = mtk_dai_tdm_routes;
0636 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_tdm_routes);
0637
0638 tdm_priv = init_tdm_priv_data(afe);
0639 if (!tdm_priv)
0640 return -ENOMEM;
0641
0642 afe_priv->dai_priv[MT8186_DAI_TDM_IN] = tdm_priv;
0643
0644 return 0;
0645 }