Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 //
0003 // MediaTek ALSA SoC Audio DAI Hostless Control
0004 //
0005 // Copyright (c) 2018 MediaTek Inc.
0006 // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
0007 
0008 #include "mt6797-afe-common.h"
0009 
0010 /* dai component */
0011 static const struct snd_soc_dapm_route mtk_dai_hostless_routes[] = {
0012     /* Hostless ADDA Loopback */
0013     {"ADDA_DL_CH1", "ADDA_UL_CH1", "Hostless LPBK DL"},
0014     {"ADDA_DL_CH1", "ADDA_UL_CH2", "Hostless LPBK DL"},
0015     {"ADDA_DL_CH2", "ADDA_UL_CH1", "Hostless LPBK DL"},
0016     {"ADDA_DL_CH2", "ADDA_UL_CH2", "Hostless LPBK DL"},
0017     {"Hostless LPBK UL", NULL, "ADDA Capture"},
0018 
0019     /* Hostless Speech */
0020     {"ADDA_DL_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
0021     {"ADDA_DL_CH2", "PCM_1_CAP_CH1", "Hostless Speech DL"},
0022     {"ADDA_DL_CH2", "PCM_1_CAP_CH2", "Hostless Speech DL"},
0023     {"ADDA_DL_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
0024     {"ADDA_DL_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
0025     {"ADDA_DL_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
0026     {"PCM_1_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
0027     {"PCM_1_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
0028     {"PCM_2_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
0029     {"PCM_2_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
0030 
0031     {"Hostless Speech UL", NULL, "PCM 1 Capture"},
0032     {"Hostless Speech UL", NULL, "PCM 2 Capture"},
0033     {"Hostless Speech UL", NULL, "ADDA Capture"},
0034 };
0035 
0036 /* dai ops */
0037 static int mtk_dai_hostless_startup(struct snd_pcm_substream *substream,
0038                     struct snd_soc_dai *dai)
0039 {
0040     struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
0041 
0042     return snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware);
0043 }
0044 
0045 static const struct snd_soc_dai_ops mtk_dai_hostless_ops = {
0046     .startup = mtk_dai_hostless_startup,
0047 };
0048 
0049 /* dai driver */
0050 #define MTK_HOSTLESS_RATES (SNDRV_PCM_RATE_8000_48000 |\
0051                SNDRV_PCM_RATE_88200 |\
0052                SNDRV_PCM_RATE_96000 |\
0053                SNDRV_PCM_RATE_176400 |\
0054                SNDRV_PCM_RATE_192000)
0055 
0056 #define MTK_HOSTLESS_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
0057                  SNDRV_PCM_FMTBIT_S24_LE |\
0058                  SNDRV_PCM_FMTBIT_S32_LE)
0059 
0060 static struct snd_soc_dai_driver mtk_dai_hostless_driver[] = {
0061     {
0062         .name = "Hostless LPBK DAI",
0063         .id = MT6797_DAI_HOSTLESS_LPBK,
0064         .playback = {
0065             .stream_name = "Hostless LPBK DL",
0066             .channels_min = 1,
0067             .channels_max = 2,
0068             .rates = MTK_HOSTLESS_RATES,
0069             .formats = MTK_HOSTLESS_FORMATS,
0070         },
0071         .capture = {
0072             .stream_name = "Hostless LPBK UL",
0073             .channels_min = 1,
0074             .channels_max = 2,
0075             .rates = MTK_HOSTLESS_RATES,
0076             .formats = MTK_HOSTLESS_FORMATS,
0077         },
0078         .ops = &mtk_dai_hostless_ops,
0079     },
0080     {
0081         .name = "Hostless Speech DAI",
0082         .id = MT6797_DAI_HOSTLESS_SPEECH,
0083         .playback = {
0084             .stream_name = "Hostless Speech DL",
0085             .channels_min = 1,
0086             .channels_max = 2,
0087             .rates = MTK_HOSTLESS_RATES,
0088             .formats = MTK_HOSTLESS_FORMATS,
0089         },
0090         .capture = {
0091             .stream_name = "Hostless Speech UL",
0092             .channels_min = 1,
0093             .channels_max = 2,
0094             .rates = MTK_HOSTLESS_RATES,
0095             .formats = MTK_HOSTLESS_FORMATS,
0096         },
0097         .ops = &mtk_dai_hostless_ops,
0098     },
0099 };
0100 
0101 int mt6797_dai_hostless_register(struct mtk_base_afe *afe)
0102 {
0103     struct mtk_base_afe_dai *dai;
0104 
0105     dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
0106     if (!dai)
0107         return -ENOMEM;
0108 
0109     list_add(&dai->list, &afe->sub_dais);
0110 
0111     dai->dai_drivers = mtk_dai_hostless_driver;
0112     dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_hostless_driver);
0113 
0114     dai->dapm_routes = mtk_dai_hostless_routes;
0115     dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_hostless_routes);
0116 
0117     return 0;
0118 }