GNU Linux-libre 4.19.245-gnu1
[releases.git] / sound / soc / mediatek / mt6797 / mt6797-dai-hostless.c
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 */
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
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 }