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