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