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