Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8186/mt8186-afe-control.c
26488 views
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 <[email protected]>
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
256