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