^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // MediaTek ALSA SoC Audio DAI Hostless Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) // Copyright (c) 2018 MediaTek Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "mt8183-afe-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* dai component */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) static const struct snd_soc_dapm_route mtk_dai_hostless_routes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* Hostless ADDA Loopback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {"ADDA_DL_CH1", "ADDA_UL_CH1", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) {"ADDA_DL_CH1", "ADDA_UL_CH2", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) {"ADDA_DL_CH2", "ADDA_UL_CH1", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) {"ADDA_DL_CH2", "ADDA_UL_CH2", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {"Hostless LPBK UL", NULL, "ADDA Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* Hostless Speech */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {"ADDA_DL_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {"ADDA_DL_CH2", "PCM_1_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) {"ADDA_DL_CH2", "PCM_1_CAP_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {"ADDA_DL_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {"ADDA_DL_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {"ADDA_DL_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) {"PCM_1_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {"PCM_1_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {"PCM_2_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {"PCM_2_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) {"Hostless Speech UL", NULL, "PCM 1 Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {"Hostless Speech UL", NULL, "PCM 2 Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) {"Hostless Speech UL", NULL, "ADDA Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* dai ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static int mtk_dai_hostless_startup(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct snd_soc_dai *dai)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static const struct snd_soc_dai_ops mtk_dai_hostless_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .startup = mtk_dai_hostless_startup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* dai driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define MTK_HOSTLESS_RATES (SNDRV_PCM_RATE_8000_48000 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) SNDRV_PCM_RATE_88200 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) SNDRV_PCM_RATE_96000 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) SNDRV_PCM_RATE_176400 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) SNDRV_PCM_RATE_192000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define MTK_HOSTLESS_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) SNDRV_PCM_FMTBIT_S24_LE |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) SNDRV_PCM_FMTBIT_S32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static struct snd_soc_dai_driver mtk_dai_hostless_driver[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .name = "Hostless LPBK DAI",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .id = MT8183_DAI_HOSTLESS_LPBK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .playback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .stream_name = "Hostless LPBK DL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .capture = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .stream_name = "Hostless LPBK UL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .ops = &mtk_dai_hostless_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .name = "Hostless Speech DAI",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .id = MT8183_DAI_HOSTLESS_SPEECH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .playback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .stream_name = "Hostless Speech DL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .capture = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .stream_name = "Hostless Speech UL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .ops = &mtk_dai_hostless_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) int mt8183_dai_hostless_register(struct mtk_base_afe *afe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct mtk_base_afe_dai *dai;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (!dai)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) list_add(&dai->list, &afe->sub_dais);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) dai->dai_drivers = mtk_dai_hostless_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_hostless_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) dai->dapm_routes = mtk_dai_hostless_routes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_hostless_routes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }