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