Lines Matching +full:bt +full:- +full:pcm +full:- +full:int +full:- +full:params
1 // SPDX-License-Identifier: GPL-2.0
3 // mt8186-mt6366.c
4 // -- MT8186-MT6366 ALSA SoC machine driver
25 #include "../common/mtk-afe-platform-driver.h"
26 #include "../common/mtk-dsp-sof-common.h"
27 #include "../common/mtk-soc-card.h"
28 #include "../common/mtk-soundcard-driver.h"
29 #include "mt8186-afe-common.h"
30 #include "mt8186-afe-clk.h"
31 #include "mt8186-afe-gpio.h"
32 #include "mt8186-mt6366-common.h"
37 #define RT5682S_CODEC_DAI "rt5682s-aif1"
38 #define RT5682S_DEV0_NAME "rt5682s.5-001a"
40 #define DA7219_CODEC_DAI "da7219-hifi"
41 #define DA7219_DEV_NAME "da7219.5-001a"
52 int dmic_switch;
75 .dlc = COMP_CODEC_CONF("mt6358-sound"),
79 .dlc = COMP_CODEC_CONF("bt-sco"),
80 .name_prefix = "Mt8186 bt",
83 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
88 static int dmic_get(struct snd_kcontrol *kcontrol, in dmic_get()
93 snd_soc_card_get_drvdata(dapm->card); in dmic_get()
94 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in dmic_get()
96 ucontrol->value.integer.value[0] = priv->dmic_switch; in dmic_get()
100 static int dmic_set(struct snd_kcontrol *kcontrol, in dmic_set()
105 snd_soc_card_get_drvdata(dapm->card); in dmic_set()
106 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in dmic_set()
108 priv->dmic_switch = ucontrol->value.integer.value[0]; in dmic_set()
109 if (priv->dmic_sel) { in dmic_set()
110 gpiod_set_value(priv->dmic_sel, priv->dmic_switch); in dmic_set()
111 dev_dbg(dapm->card->dev, "dmic_set_value %d\n", in dmic_set()
112 priv->dmic_switch); in dmic_set()
140 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd) in primary_codec_init()
142 struct snd_soc_card *card = rtd->card; in primary_codec_init()
144 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in primary_codec_init()
145 int ret; in primary_codec_init()
150 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret); in primary_codec_init()
154 if (!priv->dmic_sel) { in primary_codec_init()
155 dev_dbg(card->dev, "dmic_sel is null\n"); in primary_codec_init()
159 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, in primary_codec_init()
162 dev_err(card->dev, "DMic widget addition failed: %d\n", ret); in primary_codec_init()
167 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, in primary_codec_init()
171 dev_err(card->dev, "DMic map addition failed: %d\n", ret); in primary_codec_init()
176 static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd) in mt8186_headset_codec_init()
182 snd_soc_card_get_drvdata(rtd->card); in mt8186_headset_codec_init()
183 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET]; in mt8186_headset_codec_init()
185 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8186_headset_codec_init()
186 const int hs_keys_rt5682[] = { in mt8186_headset_codec_init()
189 const int hs_keys_da7219[] = { in mt8186_headset_codec_init()
192 const int *hs_keys; in mt8186_headset_codec_init()
193 int ret; in mt8186_headset_codec_init()
194 int type; in mt8186_headset_codec_init()
198 dev_err(rtd->dev, "Failed to set up shared clocks\n"); in mt8186_headset_codec_init()
202 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", in mt8186_headset_codec_init()
209 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); in mt8186_headset_codec_init()
213 if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT) in mt8186_headset_codec_init()
218 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]); in mt8186_headset_codec_init()
219 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]); in mt8186_headset_codec_init()
220 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]); in mt8186_headset_codec_init()
221 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]); in mt8186_headset_codec_init()
227 static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream, in mt8186_da7219_i2s_hw_params()
228 struct snd_pcm_hw_params *params) in mt8186_da7219_i2s_hw_params() argument
233 unsigned int rate = params_rate(params); in mt8186_da7219_i2s_hw_params()
234 unsigned int mclk_fs_ratio = 256; in mt8186_da7219_i2s_hw_params()
235 unsigned int mclk_fs = rate * mclk_fs_ratio; in mt8186_da7219_i2s_hw_params()
236 unsigned int freq; in mt8186_da7219_i2s_hw_params()
237 int ret, j; in mt8186_da7219_i2s_hw_params()
241 dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret); in mt8186_da7219_i2s_hw_params()
246 if (strcmp(codec_dai->component->name, DA7219_DEV_NAME)) in mt8186_da7219_i2s_hw_params()
252 dev_err(rtd->dev, "failed to set sysclk: %d\n", ret); in mt8186_da7219_i2s_hw_params()
264 dev_err(rtd->dev, "failed to start PLL: %d\n", ret); in mt8186_da7219_i2s_hw_params()
272 static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream) in mt8186_da7219_i2s_hw_free()
276 int j, ret; in mt8186_da7219_i2s_hw_free()
279 if (strcmp(codec_dai->component->name, DA7219_DEV_NAME)) in mt8186_da7219_i2s_hw_free()
284 dev_err(rtd->dev, "failed to stop PLL: %d\n", ret); in mt8186_da7219_i2s_hw_free()
297 static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream, in mt8186_rt5682s_i2s_hw_params()
298 struct snd_pcm_hw_params *params) in mt8186_rt5682s_i2s_hw_params() argument
301 struct snd_soc_card *card = rtd->card; in mt8186_rt5682s_i2s_hw_params()
304 unsigned int rate = params_rate(params); in mt8186_rt5682s_i2s_hw_params()
305 unsigned int mclk_fs_ratio = 128; in mt8186_rt5682s_i2s_hw_params()
306 unsigned int mclk_fs = rate * mclk_fs_ratio; in mt8186_rt5682s_i2s_hw_params()
307 int bitwidth; in mt8186_rt5682s_i2s_hw_params()
308 int ret; in mt8186_rt5682s_i2s_hw_params()
310 bitwidth = snd_pcm_format_width(params_format(params)); in mt8186_rt5682s_i2s_hw_params()
312 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); in mt8186_rt5682s_i2s_hw_params()
318 dev_err(card->dev, "failed to set tdm slot\n"); in mt8186_rt5682s_i2s_hw_params()
324 params_rate(params) * 64, in mt8186_rt5682s_i2s_hw_params()
325 params_rate(params) * 512); in mt8186_rt5682s_i2s_hw_params()
327 dev_err(card->dev, "failed to set pll\n"); in mt8186_rt5682s_i2s_hw_params()
333 params_rate(params) * 512, in mt8186_rt5682s_i2s_hw_params()
336 dev_err(card->dev, "failed to set sysclk\n"); in mt8186_rt5682s_i2s_hw_params()
347 static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd) in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
353 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
355 snd_soc_card_get_drvdata(rtd->card); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
356 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI]; in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
357 int ret; in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
361 dev_err(rtd->dev, "Failed to set up shared clocks\n"); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
365 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
367 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
374 static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, in mt8186_hw_params_fixup()
375 struct snd_pcm_hw_params *params, in mt8186_hw_params_fixup() argument
378 struct snd_interval *channels = hw_param_interval(params, in mt8186_hw_params_fixup()
381 dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt); in mt8186_hw_params_fixup()
384 channels->min = 2; in mt8186_hw_params_fixup()
385 channels->max = 2; in mt8186_hw_params_fixup()
388 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), in mt8186_hw_params_fixup()
389 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); in mt8186_hw_params_fixup()
391 params_set_format(params, fmt); in mt8186_hw_params_fixup()
396 static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd, in mt8186_i2s_hw_params_24le_fixup()
397 struct snd_pcm_hw_params *params) in mt8186_i2s_hw_params_24le_fixup() argument
399 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE); in mt8186_i2s_hw_params_24le_fixup()
402 static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd, in mt8186_i2s_hw_params_32le_fixup()
403 struct snd_pcm_hw_params *params) in mt8186_i2s_hw_params_32le_fixup() argument
405 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE); in mt8186_i2s_hw_params_32le_fixup()
409 static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, in mt8186_sof_dai_link_fixup()
410 struct snd_pcm_hw_params *params) in mt8186_sof_dai_link_fixup() argument
412 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); in mt8186_sof_dai_link_fixup()
413 int ret; in mt8186_sof_dai_link_fixup()
415 ret = mtk_sof_dai_link_fixup(rtd, params); in mt8186_sof_dai_link_fixup()
417 if (!strcmp(rtd->dai_link->name, "I2S0") || in mt8186_sof_dai_link_fixup()
418 !strcmp(rtd->dai_link->name, "I2S1") || in mt8186_sof_dai_link_fixup()
419 !strcmp(rtd->dai_link->name, "I2S2")) { in mt8186_sof_dai_link_fixup()
420 if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT) in mt8186_sof_dai_link_fixup()
421 mt8186_i2s_hw_params_32le_fixup(rtd, params); in mt8186_sof_dai_link_fixup()
423 mt8186_i2s_hw_params_24le_fixup(rtd, params); in mt8186_sof_dai_link_fixup()
424 } else if (!strcmp(rtd->dai_link->name, "I2S3")) { in mt8186_sof_dai_link_fixup()
425 if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT) in mt8186_sof_dai_link_fixup()
426 mt8186_i2s_hw_params_24le_fixup(rtd, params); in mt8186_sof_dai_link_fixup()
428 mt8186_i2s_hw_params_32le_fixup(rtd, params); in mt8186_sof_dai_link_fixup()
536 DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
537 "mt6358-snd-codec-aif1"),
538 COMP_CODEC("dmic-codec",
539 "dmic-hifi")),
578 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
579 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
939 .name = "PCM 1",
1158 static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data) in mt8186_mt6366_legacy_probe()
1160 struct mtk_platform_card_data *card_data = soc_card_data->card_data; in mt8186_mt6366_legacy_probe()
1161 struct snd_soc_card *card = card_data->card; in mt8186_mt6366_legacy_probe()
1162 struct device *dev = card->dev; in mt8186_mt6366_legacy_probe()
1165 int ret, i; in mt8186_mt6366_legacy_probe()
1167 playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs"); in mt8186_mt6366_legacy_probe()
1169 return dev_err_probe(dev, -EINVAL, in mt8186_mt6366_legacy_probe()
1170 "Property 'playback-codecs' missing or invalid\n"); in mt8186_mt6366_legacy_probe()
1172 headset_codec = of_get_child_by_name(dev->of_node, "headset-codec"); in mt8186_mt6366_legacy_probe()
1175 return dev_err_probe(dev, -EINVAL, in mt8186_mt6366_legacy_probe()
1176 "Property 'headset-codec' missing or invalid\n"); in mt8186_mt6366_legacy_probe()
1183 dai_link->name); in mt8186_mt6366_legacy_probe()
1190 dai_link->name); in mt8186_mt6366_legacy_probe()
1197 dai_link->name); in mt8186_mt6366_legacy_probe()
1207 static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) in mt8186_mt6366_soc_card_probe()
1209 struct mtk_platform_card_data *card_data = soc_card_data->card_data; in mt8186_mt6366_soc_card_probe()
1210 struct snd_soc_card *card = card_data->card; in mt8186_mt6366_soc_card_probe()
1213 int i, ret; in mt8186_mt6366_soc_card_probe()
1215 mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL); in mt8186_mt6366_soc_card_probe()
1217 return -ENOMEM; in mt8186_mt6366_soc_card_probe()
1219 soc_card_data->mach_priv = mach_priv; in mt8186_mt6366_soc_card_probe()
1221 mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev, in mt8186_mt6366_soc_card_probe()
1223 if (IS_ERR(mach_priv->dmic_sel)) in mt8186_mt6366_soc_card_probe()
1224 return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel), in mt8186_mt6366_soc_card_probe()
1228 if (strcmp(dai_link->name, "I2S0") == 0 || in mt8186_mt6366_soc_card_probe()
1229 strcmp(dai_link->name, "I2S1") == 0 || in mt8186_mt6366_soc_card_probe()
1230 strcmp(dai_link->name, "I2S2") == 0) { in mt8186_mt6366_soc_card_probe()
1231 if (card_data->flags & DA7219_CODEC_PRESENT) { in mt8186_mt6366_soc_card_probe()
1232 dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup; in mt8186_mt6366_soc_card_probe()
1233 dai_link->ops = &mt8186_da7219_i2s_ops; in mt8186_mt6366_soc_card_probe()
1235 dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup; in mt8186_mt6366_soc_card_probe()
1236 dai_link->ops = &mt8186_rt5682s_i2s_ops; in mt8186_mt6366_soc_card_probe()
1238 } else if (strcmp(dai_link->name, "I2S3") == 0) { in mt8186_mt6366_soc_card_probe()
1239 if (card_data->flags & DA7219_CODEC_PRESENT) in mt8186_mt6366_soc_card_probe()
1240 dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup; in mt8186_mt6366_soc_card_probe()
1242 dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup; in mt8186_mt6366_soc_card_probe()
1252 ret = mt8186_afe_gpio_init(card->dev); in mt8186_mt6366_soc_card_probe()
1254 return dev_err_probe(card->dev, ret, "init AFE gpio error\n"); in mt8186_mt6366_soc_card_probe()
1259 static const unsigned int mt8186_pcm_playback_channels[] = { 2 };
1260 static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };
1261 static const unsigned int mt8186_pcm_rates[] = { 48000 };
1339 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1343 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1347 .compatible = "mediatek,mt8186-mt6366-rt5650-sound",
1351 .compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",
1373 MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");