1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // MediaTek ALSA SoC Audio Control 4 // 5 // Copyright (c) 2022 MediaTek Inc. 6 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 7 8 #include "mt8186-afe-common.h" 9 10 enum { 11 MTK_AFE_RATE_8K = 0, 12 MTK_AFE_RATE_11K, 13 MTK_AFE_RATE_12K, 14 MTK_AFE_RATE_384K, 15 MTK_AFE_RATE_16K, 16 MTK_AFE_RATE_22K, 17 MTK_AFE_RATE_24K, 18 MTK_AFE_RATE_352K, 19 MTK_AFE_RATE_32K, 20 MTK_AFE_RATE_44K, 21 MTK_AFE_RATE_48K, 22 MTK_AFE_RATE_88K, 23 MTK_AFE_RATE_96K, 24 MTK_AFE_RATE_176K, 25 MTK_AFE_RATE_192K, 26 MTK_AFE_RATE_260K, 27 }; 28 29 enum { 30 MTK_AFE_PCM_RATE_8K = 0, 31 MTK_AFE_PCM_RATE_16K, 32 MTK_AFE_PCM_RATE_32K, 33 MTK_AFE_PCM_RATE_48K, 34 }; 35 36 enum { 37 MTK_AFE_TDM_RATE_8K = 0, 38 MTK_AFE_TDM_RATE_12K, 39 MTK_AFE_TDM_RATE_16K, 40 MTK_AFE_TDM_RATE_24K, 41 MTK_AFE_TDM_RATE_32K, 42 MTK_AFE_TDM_RATE_48K, 43 MTK_AFE_TDM_RATE_64K, 44 MTK_AFE_TDM_RATE_96K, 45 MTK_AFE_TDM_RATE_128K, 46 MTK_AFE_TDM_RATE_192K, 47 MTK_AFE_TDM_RATE_256K, 48 MTK_AFE_TDM_RATE_384K, 49 MTK_AFE_TDM_RATE_11K, 50 MTK_AFE_TDM_RATE_22K, 51 MTK_AFE_TDM_RATE_44K, 52 MTK_AFE_TDM_RATE_88K, 53 MTK_AFE_TDM_RATE_176K, 54 MTK_AFE_TDM_RATE_352K, 55 }; 56 57 enum { 58 MTK_AFE_TDM_RELATCH_RATE_8K = 0, 59 MTK_AFE_TDM_RELATCH_RATE_11K, 60 MTK_AFE_TDM_RELATCH_RATE_12K, 61 MTK_AFE_TDM_RELATCH_RATE_16K, 62 MTK_AFE_TDM_RELATCH_RATE_22K, 63 MTK_AFE_TDM_RELATCH_RATE_24K, 64 MTK_AFE_TDM_RELATCH_RATE_32K, 65 MTK_AFE_TDM_RELATCH_RATE_44K, 66 MTK_AFE_TDM_RELATCH_RATE_48K, 67 MTK_AFE_TDM_RELATCH_RATE_88K, 68 MTK_AFE_TDM_RELATCH_RATE_96K, 69 MTK_AFE_TDM_RELATCH_RATE_176K, 70 MTK_AFE_TDM_RELATCH_RATE_192K, 71 MTK_AFE_TDM_RELATCH_RATE_352K, 72 MTK_AFE_TDM_RELATCH_RATE_384K, 73 }; 74 75 unsigned int mt8186_general_rate_transform(struct device *dev, unsigned int rate) 76 { 77 switch (rate) { 78 case 8000: 79 return MTK_AFE_RATE_8K; 80 case 11025: 81 return MTK_AFE_RATE_11K; 82 case 12000: 83 return MTK_AFE_RATE_12K; 84 case 16000: 85 return MTK_AFE_RATE_16K; 86 case 22050: 87 return MTK_AFE_RATE_22K; 88 case 24000: 89 return MTK_AFE_RATE_24K; 90 case 32000: 91 return MTK_AFE_RATE_32K; 92 case 44100: 93 return MTK_AFE_RATE_44K; 94 case 48000: 95 return MTK_AFE_RATE_48K; 96 case 88200: 97 return MTK_AFE_RATE_88K; 98 case 96000: 99 return MTK_AFE_RATE_96K; 100 case 176400: 101 return MTK_AFE_RATE_176K; 102 case 192000: 103 return MTK_AFE_RATE_192K; 104 case 260000: 105 return MTK_AFE_RATE_260K; 106 case 352800: 107 return MTK_AFE_RATE_352K; 108 case 384000: 109 return MTK_AFE_RATE_384K; 110 default: 111 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 112 __func__, rate, MTK_AFE_RATE_48K); 113 } 114 115 return MTK_AFE_RATE_48K; 116 } 117 118 static unsigned int tdm_rate_transform(struct device *dev, unsigned int rate) 119 { 120 switch (rate) { 121 case 8000: 122 return MTK_AFE_TDM_RATE_8K; 123 case 11025: 124 return MTK_AFE_TDM_RATE_11K; 125 case 12000: 126 return MTK_AFE_TDM_RATE_12K; 127 case 16000: 128 return MTK_AFE_TDM_RATE_16K; 129 case 22050: 130 return MTK_AFE_TDM_RATE_22K; 131 case 24000: 132 return MTK_AFE_TDM_RATE_24K; 133 case 32000: 134 return MTK_AFE_TDM_RATE_32K; 135 case 44100: 136 return MTK_AFE_TDM_RATE_44K; 137 case 48000: 138 return MTK_AFE_TDM_RATE_48K; 139 case 64000: 140 return MTK_AFE_TDM_RATE_64K; 141 case 88200: 142 return MTK_AFE_TDM_RATE_88K; 143 case 96000: 144 return MTK_AFE_TDM_RATE_96K; 145 case 128000: 146 return MTK_AFE_TDM_RATE_128K; 147 case 176400: 148 return MTK_AFE_TDM_RATE_176K; 149 case 192000: 150 return MTK_AFE_TDM_RATE_192K; 151 case 256000: 152 return MTK_AFE_TDM_RATE_256K; 153 case 352800: 154 return MTK_AFE_TDM_RATE_352K; 155 case 384000: 156 return MTK_AFE_TDM_RATE_384K; 157 default: 158 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 159 __func__, rate, MTK_AFE_TDM_RATE_48K); 160 } 161 162 return MTK_AFE_TDM_RATE_48K; 163 } 164 165 static unsigned int pcm_rate_transform(struct device *dev, unsigned int rate) 166 { 167 switch (rate) { 168 case 8000: 169 return MTK_AFE_PCM_RATE_8K; 170 case 16000: 171 return MTK_AFE_PCM_RATE_16K; 172 case 32000: 173 return MTK_AFE_PCM_RATE_32K; 174 case 48000: 175 return MTK_AFE_PCM_RATE_48K; 176 default: 177 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 178 __func__, rate, MTK_AFE_PCM_RATE_48K); 179 } 180 181 return MTK_AFE_PCM_RATE_48K; 182 } 183 184 unsigned int mt8186_tdm_relatch_rate_transform(struct device *dev, unsigned int rate) 185 { 186 switch (rate) { 187 case 8000: 188 return MTK_AFE_TDM_RELATCH_RATE_8K; 189 case 11025: 190 return MTK_AFE_TDM_RELATCH_RATE_11K; 191 case 12000: 192 return MTK_AFE_TDM_RELATCH_RATE_12K; 193 case 16000: 194 return MTK_AFE_TDM_RELATCH_RATE_16K; 195 case 22050: 196 return MTK_AFE_TDM_RELATCH_RATE_22K; 197 case 24000: 198 return MTK_AFE_TDM_RELATCH_RATE_24K; 199 case 32000: 200 return MTK_AFE_TDM_RELATCH_RATE_32K; 201 case 44100: 202 return MTK_AFE_TDM_RELATCH_RATE_44K; 203 case 48000: 204 return MTK_AFE_TDM_RELATCH_RATE_48K; 205 case 88200: 206 return MTK_AFE_TDM_RELATCH_RATE_88K; 207 case 96000: 208 return MTK_AFE_TDM_RELATCH_RATE_96K; 209 case 176400: 210 return MTK_AFE_TDM_RELATCH_RATE_176K; 211 case 192000: 212 return MTK_AFE_TDM_RELATCH_RATE_192K; 213 case 352800: 214 return MTK_AFE_TDM_RELATCH_RATE_352K; 215 case 384000: 216 return MTK_AFE_TDM_RELATCH_RATE_384K; 217 default: 218 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 219 __func__, rate, MTK_AFE_TDM_RELATCH_RATE_48K); 220 } 221 222 return MTK_AFE_TDM_RELATCH_RATE_48K; 223 } 224 225 unsigned int mt8186_rate_transform(struct device *dev, unsigned int rate, int aud_blk) 226 { 227 switch (aud_blk) { 228 case MT8186_DAI_PCM: 229 return pcm_rate_transform(dev, rate); 230 case MT8186_DAI_TDM_IN: 231 return tdm_rate_transform(dev, rate); 232 default: 233 return mt8186_general_rate_transform(dev, rate); 234 } 235 } 236 237 int mt8186_dai_set_priv(struct mtk_base_afe *afe, int id, int priv_size, const void *priv_data) 238 { 239 struct mt8186_afe_private *afe_priv = afe->platform_priv; 240 void *temp_data; 241 242 temp_data = devm_kzalloc(afe->dev, 243 priv_size, 244 GFP_KERNEL); 245 if (!temp_data) 246 return -ENOMEM; 247 248 if (priv_data) 249 memcpy(temp_data, priv_data, priv_size); 250 251 afe_priv->dai_priv[id] = temp_data; 252 253 return 0; 254 } 255