Lines Matching +full:playback +full:- +full:codecs

1 // SPDX-License-Identifier: GPL-2.0
3 * mt8188-mt6359.c -- MT8188-MT6359 ALSA SoC machine driver
17 #include "mt8188-afe-common.h"
18 #include "../../codecs/nau8825.h"
19 #include "../../codecs/mt6359.h"
20 #include "../../codecs/mt6359-accdet.h"
21 #include "../../codecs/rt5682.h"
22 #include "../common/mtk-afe-platform-driver.h"
23 #include "../common/mtk-soundcard-driver.h"
24 #include "../common/mtk-dsp-sof-common.h"
25 #include "../common/mtk-soc-card.h"
43 #define MAX98390_CODEC_DAI "max98390-aif1"
44 #define MAX98390_DEV0_NAME "max98390.0-0038" /* rear right */
45 #define MAX98390_DEV1_NAME "max98390.0-0039" /* rear left */
46 #define MAX98390_DEV2_NAME "max98390.0-003a" /* front right */
47 #define MAX98390_DEV3_NAME "max98390.0-003b" /* front left */
52 #define NAU8825_CODEC_DAI "nau8825-hifi"
64 #define RT5682S_CODEC_DAI "rt5682s-aif1"
150 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
151 "mt6359-snd-codec-aif1")),
196 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
197 "mt6359-snd-codec-aif1")),
362 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_mt6359_mtkaif_calibration()
381 return -EINVAL; in mt8188_mt6359_mtkaif_calibration()
384 afe_priv = afe->platform_priv; in mt8188_mt6359_mtkaif_calibration()
385 param = &afe_priv->mtkaif_params; in mt8188_mt6359_mtkaif_calibration()
387 dev_dbg(afe->dev, "%s(), start\n", __func__); in mt8188_mt6359_mtkaif_calibration()
389 param->mtkaif_calibration_ok = false; in mt8188_mt6359_mtkaif_calibration()
391 param->mtkaif_chosen_phase[i] = -1; in mt8188_mt6359_mtkaif_calibration()
392 param->mtkaif_phase_cycle[i] = 0; in mt8188_mt6359_mtkaif_calibration()
393 mtkaif_chosen_phase[i] = -1; in mt8188_mt6359_mtkaif_calibration()
397 if (IS_ERR(afe_priv->topckgen)) { in mt8188_mt6359_mtkaif_calibration()
398 dev_info(afe->dev, "%s() Cannot find topckgen controller\n", in mt8188_mt6359_mtkaif_calibration()
403 for_each_card_widgets(rtd->card, w) { in mt8188_mt6359_mtkaif_calibration()
404 if (!strcmp(w->name, "MTKAIF_PIN")) { in mt8188_mt6359_mtkaif_calibration()
413 dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__); in mt8188_mt6359_mtkaif_calibration()
415 pm_runtime_get_sync(afe->dev); in mt8188_mt6359_mtkaif_calibration()
419 regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE); in mt8188_mt6359_mtkaif_calibration()
429 regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON); in mt8188_mt6359_mtkaif_calibration()
434 cycle_1 = -1; in mt8188_mt6359_mtkaif_calibration()
435 cycle_2 = -1; in mt8188_mt6359_mtkaif_calibration()
439 regmap_read(afe_priv->topckgen, in mt8188_mt6359_mtkaif_calibration()
452 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n", in mt8188_mt6359_mtkaif_calibration()
466 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1; in mt8188_mt6359_mtkaif_calibration()
472 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1; in mt8188_mt6359_mtkaif_calibration()
476 regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON); in mt8188_mt6359_mtkaif_calibration()
503 pm_runtime_put(afe->dev); in mt8188_mt6359_mtkaif_calibration()
505 param->mtkaif_calibration_ok = mtkaif_calibration_ok; in mt8188_mt6359_mtkaif_calibration()
506 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1; in mt8188_mt6359_mtkaif_calibration()
507 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2; in mt8188_mt6359_mtkaif_calibration()
510 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i]; in mt8188_mt6359_mtkaif_calibration()
515 dev_dbg(afe->dev, "%s(), end, calibration ok %d\n", in mt8188_mt6359_mtkaif_calibration()
516 __func__, param->mtkaif_calibration_ok); in mt8188_mt6359_mtkaif_calibration()
523 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); in mt8188_mt6359_accdet_init()
524 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET]; in mt8188_mt6359_accdet_init()
527 if (!soc_card_data->accdet) in mt8188_mt6359_accdet_init()
530 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", in mt8188_mt6359_accdet_init()
537 dev_err(rtd->dev, "Headset Jack create failed: %d\n", ret); in mt8188_mt6359_accdet_init()
541 ret = mt6359_accdet_enable_jack_detect(soc_card_data->accdet, jack); in mt8188_mt6359_accdet_init()
543 dev_err(rtd->dev, "Headset Jack enable failed: %d\n", ret); in mt8188_mt6359_accdet_init()
553 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_mt6359_init()
635 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); in mt8188_hdmi_codec_init()
636 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI]; in mt8188_hdmi_codec_init()
637 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_hdmi_codec_init()
640 ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack", in mt8188_hdmi_codec_init()
645 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); in mt8188_hdmi_codec_init()
651 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", in mt8188_hdmi_codec_init()
652 __func__, component->name, ret); in mt8188_hdmi_codec_init()
661 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); in mt8188_dptx_codec_init()
662 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP]; in mt8188_dptx_codec_init()
663 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_dptx_codec_init()
666 ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT, in mt8188_dptx_codec_init()
670 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); in mt8188_dptx_codec_init()
676 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", in mt8188_dptx_codec_init()
677 __func__, component->name, ret); in mt8188_dptx_codec_init()
686 struct snd_soc_card *card = rtd->card; in mt8188_dumb_amp_init()
689 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets, in mt8188_dumb_amp_init()
692 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret); in mt8188_dumb_amp_init()
699 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret); in mt8188_dumb_amp_init()
718 if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME)) in mt8188_max98390_hw_params()
721 if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME)) in mt8188_max98390_hw_params()
724 if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME)) in mt8188_max98390_hw_params()
727 if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME)) in mt8188_max98390_hw_params()
739 struct snd_soc_card *card = rtd->card; in mt8188_max98390_codec_init()
743 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets, in mt8188_max98390_codec_init()
746 dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret); in mt8188_max98390_codec_init()
753 dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret); in mt8188_max98390_codec_init()
757 if (rtd->dai_link->num_codecs <= 2) in mt8188_max98390_codec_init()
761 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets, in mt8188_max98390_codec_init()
764 dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret); in mt8188_max98390_codec_init()
772 dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret); in mt8188_max98390_codec_init()
781 struct snd_soc_card *card = rtd->card; in mt8188_headset_codec_init()
782 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); in mt8188_headset_codec_init()
783 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET]; in mt8188_headset_codec_init()
784 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_headset_codec_init()
785 struct mtk_platform_card_data *card_data = soc_card_data->card_data; in mt8188_headset_codec_init()
788 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets, in mt8188_headset_codec_init()
791 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret); in mt8188_headset_codec_init()
798 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret); in mt8188_headset_codec_init()
802 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", in mt8188_headset_codec_init()
810 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); in mt8188_headset_codec_init()
814 if (card_data->flags & ES8326_HS_PRESENT) { in mt8188_headset_codec_init()
815 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); in mt8188_headset_codec_init()
816 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); in mt8188_headset_codec_init()
817 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); in mt8188_headset_codec_init()
818 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); in mt8188_headset_codec_init()
820 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); in mt8188_headset_codec_init()
821 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); in mt8188_headset_codec_init()
822 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); in mt8188_headset_codec_init()
823 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); in mt8188_headset_codec_init()
829 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); in mt8188_headset_codec_init()
838 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; in mt8188_headset_codec_exit()
859 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret); in mt8188_nau8825_hw_params()
867 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret); in mt8188_nau8825_hw_params()
882 struct snd_soc_card *card = rtd->card; in mt8188_rt5682s_i2s_hw_params()
891 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); in mt8188_rt5682s_i2s_hw_params()
897 dev_err(card->dev, "failed to set tdm slot\n"); in mt8188_rt5682s_i2s_hw_params()
904 dev_err(card->dev, "failed to set pll\n"); in mt8188_rt5682s_i2s_hw_params()
911 dev_err(card->dev, "failed to set sysclk\n"); in mt8188_rt5682s_i2s_hw_params()
931 for_each_card_rtds(rtd->card, runtime) { in mt8188_sof_be_hw_params()
937 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) { in mt8188_sof_be_hw_params()
938 dev_err(rtd->dev, "afe pm runtime is not active!!\n"); in mt8188_sof_be_hw_params()
939 return -EINVAL; in mt8188_sof_be_hw_params()
961 dev_err(codec_dai->dev, "can't set MCLK %d\n", ret); in mt8188_es8326_hw_params()
977 .stream_name = "DL2 Playback",
991 .stream_name = "DL3 Playback",
1005 .stream_name = "DL6 Playback",
1019 .stream_name = "DL7 Playback",
1030 .stream_name = "DL8 Playback",
1041 .stream_name = "DL10 Playback",
1052 .stream_name = "DL11 Playback",
1283 struct mtk_platform_card_data *card_data = soc_card_data->card_data; in mt8188_fixup_controls()
1286 if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) { in mt8188_fixup_controls()
1290 if (strcmp(w->name, "Headphone")) in mt8188_fixup_controls()
1296 kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch"); in mt8188_fixup_controls()
1298 snd_ctl_remove(card->snd_card, kctl); in mt8188_fixup_controls()
1300 dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n"); in mt8188_fixup_controls()
1319 struct mtk_platform_card_data *card_data = soc_card_data->card_data; in mt8188_mt6359_soc_card_probe()
1320 struct snd_soc_card *card = soc_card_data->card_data->card; in mt8188_mt6359_soc_card_probe()
1331 return -EINVAL; in mt8188_mt6359_soc_card_probe()
1334 if (strcmp(dai_link->name, "DPTX_BE") == 0) { in mt8188_mt6359_soc_card_probe()
1335 if (dai_link->num_codecs && in mt8188_mt6359_soc_card_probe()
1336 !snd_soc_dlc_is_dummy(dai_link->codecs)) in mt8188_mt6359_soc_card_probe()
1337 dai_link->init = mt8188_dptx_codec_init; in mt8188_mt6359_soc_card_probe()
1338 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { in mt8188_mt6359_soc_card_probe()
1339 if (dai_link->num_codecs && in mt8188_mt6359_soc_card_probe()
1340 !snd_soc_dlc_is_dummy(dai_link->codecs)) in mt8188_mt6359_soc_card_probe()
1341 dai_link->init = mt8188_hdmi_codec_init; in mt8188_mt6359_soc_card_probe()
1342 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || in mt8188_mt6359_soc_card_probe()
1343 strcmp(dai_link->name, "UL_SRC_BE") == 0) { in mt8188_mt6359_soc_card_probe()
1345 dai_link->init = mt8188_mt6359_init; in mt8188_mt6359_soc_card_probe()
1348 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 || in mt8188_mt6359_soc_card_probe()
1349 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 || in mt8188_mt6359_soc_card_probe()
1350 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || in mt8188_mt6359_soc_card_probe()
1351 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { in mt8188_mt6359_soc_card_probe()
1352 if (!dai_link->num_codecs) in mt8188_mt6359_soc_card_probe()
1355 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { in mt8188_mt6359_soc_card_probe()
1361 if (!(card_data->flags & MAX98390_TWO_AMP)) { in mt8188_mt6359_soc_card_probe()
1362 dai_link->ops = &mt8188_max98390_ops; in mt8188_mt6359_soc_card_probe()
1365 dai_link->init = mt8188_max98390_codec_init; in mt8188_mt6359_soc_card_probe()
1368 } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) { in mt8188_mt6359_soc_card_probe()
1369 dai_link->ops = &mt8188_nau8825_ops; in mt8188_mt6359_soc_card_probe()
1371 dai_link->init = mt8188_headset_codec_init; in mt8188_mt6359_soc_card_probe()
1372 dai_link->exit = mt8188_headset_codec_exit; in mt8188_mt6359_soc_card_probe()
1375 } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { in mt8188_mt6359_soc_card_probe()
1376 dai_link->ops = &mt8188_rt5682s_i2s_ops; in mt8188_mt6359_soc_card_probe()
1378 dai_link->init = mt8188_headset_codec_init; in mt8188_mt6359_soc_card_probe()
1379 dai_link->exit = mt8188_headset_codec_exit; in mt8188_mt6359_soc_card_probe()
1382 } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) { in mt8188_mt6359_soc_card_probe()
1383 dai_link->ops = &mt8188_es8326_ops; in mt8188_mt6359_soc_card_probe()
1385 dai_link->init = mt8188_headset_codec_init; in mt8188_mt6359_soc_card_probe()
1386 dai_link->exit = mt8188_headset_codec_exit; in mt8188_mt6359_soc_card_probe()
1390 if (!snd_soc_dlc_is_dummy(dai_link->codecs)) { in mt8188_mt6359_soc_card_probe()
1392 dai_link->init = mt8188_dumb_amp_init; in mt8188_mt6359_soc_card_probe()
1452 { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1453 { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1454 { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1455 { .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
1472 MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");