1 /*
2 * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
3 *
4 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
5 * the the people's Republic of China and other countries.
6 * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
7 *
8 * DISCLAIMER
9 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
10 * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
11 * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
12 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
13 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
14 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
15 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
16 *
17 *
18 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
19 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
20 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
21 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
22 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30 * OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <sound/snd_core.h>
36 #include <sound/snd_pcm.h>
37 
38 static struct snd_dai_ops dummy_codec_dai_ops = {
39     .hw_params  = NULL,
40     .shutdown   = NULL,
41     .startup    = NULL,
42     .trigger    = NULL,
43     .prepare    = NULL,
44 };
45 
46 static struct snd_dai dummy_codec_dai[] = {
47     {
48         .name       = "dummy-codecdai",
49         .playback   = {
50             .stream_name    = "Playback",
51             .channels_min   = 1,
52             .channels_max   = 16,
53             .rates      = SNDRV_PCM_RATE_8000_192000
54                     | SNDRV_PCM_RATE_KNOT,
55             .formats    = SNDRV_PCM_FMTBIT_S16_LE
56                     | SNDRV_PCM_FMTBIT_S24_LE
57                     | SNDRV_PCM_FMTBIT_S32_LE,
58             .rate_min       = 8000,
59             .rate_max       = 192000,
60         },
61         .capture    = {
62             .stream_name    = "Capture",
63             .channels_min   = 1,
64             .channels_max   = 16,
65             .rates      = SNDRV_PCM_RATE_8000_192000
66                     | SNDRV_PCM_RATE_KNOT,
67             .formats    = SNDRV_PCM_FMTBIT_S16_LE
68                     | SNDRV_PCM_FMTBIT_S24_LE
69                     | SNDRV_PCM_FMTBIT_S32_LE,
70             .rate_min       = 8000,
71             .rate_max       = 192000,
72         },
73         .ops        = &dummy_codec_dai_ops,
74     },
75 };
76 
77 struct snd_codec dummy_codec = {
78     .name       = "dummy_codec",
79     .codec_dai  = dummy_codec_dai,
80     .codec_dai_num  = ARRAY_SIZE(dummy_codec_dai),
81     .private_data   = NULL,
82     .probe          = NULL,
83     .remove         = NULL,
84 };
85 
86 static struct snd_dai dmic_codec_dai[] = {
87     {
88         .name       = "dmic-codecdai",
89         .capture    = {
90             .stream_name    = "Capture",
91             .channels_min   = 1,
92             .channels_max   = 8,
93             .rates      = SNDRV_PCM_RATE_8000_48000
94                     | SNDRV_PCM_RATE_KNOT,
95             .formats    = SNDRV_PCM_FMTBIT_S16_LE
96                     | SNDRV_PCM_FMTBIT_S24_LE
97                     | SNDRV_PCM_FMTBIT_S32_LE,
98             .rate_min       = 8000,
99             .rate_max       = 48000,
100         },
101         .ops        = &dummy_codec_dai_ops,
102     },
103 };
104 
105 struct snd_codec dmic_codec = {
106     .name       = "dmic_codec",
107     .capture_only = 1,
108     .codec_dai  = dmic_codec_dai,
109     .codec_dai_num  = ARRAY_SIZE(dmic_codec_dai),
110     .private_data   = NULL,
111     .probe          = NULL,
112     .remove         = NULL,
113     .read           = NULL,
114     .write          = NULL,
115 };
116 
117 static struct snd_dai spdif_codec_dai[] = {
118     {
119         .name       = "spdif-codecdai",
120         .playback   = {
121             .stream_name    = "Playback",
122             .channels_min   = 1,
123             .channels_max   = 2,
124             .rates      = SNDRV_PCM_RATE_8000_192000
125                     | SNDRV_PCM_RATE_KNOT,
126             .formats    = SNDRV_PCM_FMTBIT_S16_LE
127                     | SNDRV_PCM_FMTBIT_S24_LE
128                     | SNDRV_PCM_FMTBIT_S32_LE,
129             .rate_min       = 8000,
130             .rate_max       = 192000,
131         },
132         .capture    = {
133             .stream_name    = "Capture",
134             .channels_min   = 1,
135             .channels_max   = 2,
136             .rates      = SNDRV_PCM_RATE_8000_192000
137                     | SNDRV_PCM_RATE_KNOT,
138             .formats    = SNDRV_PCM_FMTBIT_S16_LE
139                     | SNDRV_PCM_FMTBIT_S24_LE
140                     | SNDRV_PCM_FMTBIT_S32_LE,
141             .rate_min       = 8000,
142             .rate_max       = 192000,
143         },
144         .ops        = &dummy_codec_dai_ops,
145     },
146 };
147 
148 struct snd_codec spdif_codec = {
149     .name       = "spdif_codec",
150     .codec_dai  = spdif_codec_dai,
151     .codec_dai_num  = ARRAY_SIZE(spdif_codec_dai),
152     .private_data   = NULL,
153     .probe          = NULL,
154     .remove         = NULL,
155     .read           = NULL,
156     .write          = NULL,
157 };
158