Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/codecs/adau1372.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Analog Devices ADAU1372 Audio Codec driver
4
*
5
* Copyright 2016 Analog Devices Inc.
6
* Author: Lars-Peter Clausen <[email protected]>
7
*/
8
9
#include <linux/clk.h>
10
#include <linux/delay.h>
11
#include <linux/gpio/consumer.h>
12
#include <linux/init.h>
13
#include <linux/module.h>
14
#include <linux/mod_devicetable.h>
15
#include <linux/pm.h>
16
#include <linux/slab.h>
17
18
#include <sound/core.h>
19
#include <sound/pcm.h>
20
#include <sound/pcm_params.h>
21
#include <sound/tlv.h>
22
#include <sound/soc.h>
23
24
#include "adau1372.h"
25
#include "adau-utils.h"
26
27
struct adau1372 {
28
struct regmap *regmap;
29
void (*switch_mode)(struct device *dev);
30
bool use_pll;
31
bool enabled;
32
bool clock_provider;
33
34
struct snd_pcm_hw_constraint_list rate_constraints;
35
unsigned int slot_width;
36
37
struct clk *mclk;
38
struct gpio_desc *pd_gpio;
39
struct device *dev;
40
};
41
42
#define ADAU1372_REG_CLK_CTRL 0x00
43
#define ADAU1372_REG_PLL(x) (0x01 + (x))
44
#define ADAU1372_REG_DAC_SOURCE 0x11
45
#define ADAU1372_REG_SOUT_SOURCE_0_1 0x13
46
#define ADAU1372_REG_SOUT_SOURCE_2_3 0x14
47
#define ADAU1372_REG_SOUT_SOURCE_4_5 0x15
48
#define ADAU1372_REG_SOUT_SOURCE_6_7 0x16
49
#define ADAU1372_REG_ADC_SDATA_CH 0x17
50
#define ADAU1372_REG_ASRCO_SOURCE_0_1 0x18
51
#define ADAU1372_REG_ASRCO_SOURCE_2_3 0x19
52
#define ADAU1372_REG_ASRC_MODE 0x1a
53
#define ADAU1372_REG_ADC_CTRL0 0x1b
54
#define ADAU1372_REG_ADC_CTRL1 0x1c
55
#define ADAU1372_REG_ADC_CTRL2 0x1d
56
#define ADAU1372_REG_ADC_CTRL3 0x1e
57
#define ADAU1372_REG_ADC_VOL(x) (0x1f + (x))
58
#define ADAU1372_REG_PGA_CTRL(x) (0x23 + (x))
59
#define ADAU1372_REG_PGA_BOOST 0x28
60
#define ADAU1372_REG_MICBIAS 0x2d
61
#define ADAU1372_REG_DAC_CTRL 0x2e
62
#define ADAU1372_REG_DAC_VOL(x) (0x2f + (x))
63
#define ADAU1372_REG_OP_STAGE_MUTE 0x31
64
#define ADAU1372_REG_SAI0 0x32
65
#define ADAU1372_REG_SAI1 0x33
66
#define ADAU1372_REG_SOUT_CTRL 0x34
67
#define ADAU1372_REG_MODE_MP(x) (0x38 + (x))
68
#define ADAU1372_REG_OP_STAGE_CTRL 0x43
69
#define ADAU1372_REG_DECIM_PWR 0x44
70
#define ADAU1372_REG_INTERP_PWR 0x45
71
#define ADAU1372_REG_BIAS_CTRL0 0x46
72
#define ADAU1372_REG_BIAS_CTRL1 0x47
73
74
#define ADAU1372_CLK_CTRL_PLL_EN BIT(7)
75
#define ADAU1372_CLK_CTRL_XTAL_DIS BIT(4)
76
#define ADAU1372_CLK_CTRL_CLKSRC BIT(3)
77
#define ADAU1372_CLK_CTRL_CC_MDIV BIT(1)
78
#define ADAU1372_CLK_CTRL_MCLK_EN BIT(0)
79
80
#define ADAU1372_SAI0_DELAY1 (0x0 << 6)
81
#define ADAU1372_SAI0_DELAY0 (0x1 << 6)
82
#define ADAU1372_SAI0_DELAY_MASK (0x3 << 6)
83
#define ADAU1372_SAI0_SAI_I2S (0x0 << 4)
84
#define ADAU1372_SAI0_SAI_TDM2 (0x1 << 4)
85
#define ADAU1372_SAI0_SAI_TDM4 (0x2 << 4)
86
#define ADAU1372_SAI0_SAI_TDM8 (0x3 << 4)
87
#define ADAU1372_SAI0_SAI_MASK (0x3 << 4)
88
#define ADAU1372_SAI0_FS_48 0x0
89
#define ADAU1372_SAI0_FS_8 0x1
90
#define ADAU1372_SAI0_FS_12 0x2
91
#define ADAU1372_SAI0_FS_16 0x3
92
#define ADAU1372_SAI0_FS_24 0x4
93
#define ADAU1372_SAI0_FS_32 0x5
94
#define ADAU1372_SAI0_FS_96 0x6
95
#define ADAU1372_SAI0_FS_192 0x7
96
#define ADAU1372_SAI0_FS_MASK 0xf
97
98
#define ADAU1372_SAI1_TDM_TS BIT(7)
99
#define ADAU1372_SAI1_BCLK_TDMC BIT(6)
100
#define ADAU1372_SAI1_LR_MODE BIT(5)
101
#define ADAU1372_SAI1_LR_POL BIT(4)
102
#define ADAU1372_SAI1_BCLKRATE BIT(2)
103
#define ADAU1372_SAI1_BCLKEDGE BIT(1)
104
#define ADAU1372_SAI1_MS BIT(0)
105
106
static const unsigned int adau1372_rates[] = {
107
[ADAU1372_SAI0_FS_8] = 8000,
108
[ADAU1372_SAI0_FS_12] = 12000,
109
[ADAU1372_SAI0_FS_16] = 16000,
110
[ADAU1372_SAI0_FS_24] = 24000,
111
[ADAU1372_SAI0_FS_32] = 32000,
112
[ADAU1372_SAI0_FS_48] = 48000,
113
[ADAU1372_SAI0_FS_96] = 96000,
114
[ADAU1372_SAI0_FS_192] = 192000,
115
};
116
117
/* 8k, 12k, 24k, 48k */
118
#define ADAU1372_RATE_MASK_TDM8 0x17
119
/* + 16k, 96k */
120
#define ADAU1372_RATE_MASK_TDM4_MASTER (ADAU1372_RATE_MASK_TDM8 | 0x48 | 0x20)
121
/* +32k */
122
#define ADAU1372_RATE_MASK_TDM4 (ADAU1372_RATE_MASK_TDM4_MASTER | 0x20)
123
/* + 192k */
124
#define ADAU1372_RATE_MASK_TDM2 (ADAU1372_RATE_MASK_TDM4 | 0x80)
125
126
static const DECLARE_TLV_DB_MINMAX(adau1372_digital_tlv, -9563, 0);
127
static const DECLARE_TLV_DB_SCALE(adau1372_pga_tlv, -1200, 75, 0);
128
static const DECLARE_TLV_DB_SCALE(adau1372_pga_boost_tlv, 0, 1000, 0);
129
130
static const char * const adau1372_bias_text[] = {
131
"Normal operation", "Extreme power saving", "Enhanced performance",
132
"Power saving",
133
};
134
135
static const unsigned int adau1372_bias_adc_values[] = {
136
0, 2, 3,
137
};
138
139
static const char * const adau1372_bias_adc_text[] = {
140
"Normal operation", "Enhanced performance", "Power saving",
141
};
142
143
static const char * const adau1372_bias_dac_text[] = {
144
"Normal operation", "Power saving", "Superior performance",
145
"Enhanced performance",
146
};
147
148
static SOC_ENUM_SINGLE_DECL(adau1372_bias_hp_enum,
149
ADAU1372_REG_BIAS_CTRL0, 6, adau1372_bias_text);
150
static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe0_1_enum,
151
ADAU1372_REG_BIAS_CTRL0, 4, adau1372_bias_text);
152
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_bias_adc2_3_enum,
153
ADAU1372_REG_BIAS_CTRL0, 2, 0x3, adau1372_bias_adc_text,
154
adau1372_bias_adc_values);
155
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_bias_adc0_1_enum,
156
ADAU1372_REG_BIAS_CTRL0, 0, 0x3, adau1372_bias_adc_text,
157
adau1372_bias_adc_values);
158
static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe2_3_enum,
159
ADAU1372_REG_BIAS_CTRL1, 4, adau1372_bias_text);
160
static SOC_ENUM_SINGLE_DECL(adau1372_bias_mic_enum,
161
ADAU1372_REG_BIAS_CTRL1, 2, adau1372_bias_text);
162
static SOC_ENUM_SINGLE_DECL(adau1372_bias_dac_enum,
163
ADAU1372_REG_BIAS_CTRL1, 0, adau1372_bias_dac_text);
164
165
static const char * const adau1372_hpf_text[] = {
166
"Off",
167
"1 Hz",
168
"4 Hz",
169
"8 Hz",
170
};
171
172
static SOC_ENUM_SINGLE_DECL(adau1372_hpf0_1_enum, ADAU1372_REG_ADC_CTRL2, 5,
173
adau1372_hpf_text);
174
static SOC_ENUM_SINGLE_DECL(adau1372_hpf2_3_enum, ADAU1372_REG_ADC_CTRL3, 5,
175
adau1372_hpf_text);
176
static const struct snd_kcontrol_new adau1372_controls[] = {
177
SOC_SINGLE_TLV("ADC 0 Capture Volume", ADAU1372_REG_ADC_VOL(0),
178
0, 0xff, 1, adau1372_digital_tlv),
179
SOC_SINGLE_TLV("ADC 1 Capture Volume", ADAU1372_REG_ADC_VOL(1),
180
0, 0xff, 1, adau1372_digital_tlv),
181
SOC_SINGLE_TLV("ADC 2 Capture Volume", ADAU1372_REG_ADC_VOL(2),
182
0, 0xff, 1, adau1372_digital_tlv),
183
SOC_SINGLE_TLV("ADC 3 Capture Volume", ADAU1372_REG_ADC_VOL(3),
184
0, 0xff, 1, adau1372_digital_tlv),
185
SOC_SINGLE("ADC 0 Capture Switch", ADAU1372_REG_ADC_CTRL0, 3, 1, 1),
186
SOC_SINGLE("ADC 1 Capture Switch", ADAU1372_REG_ADC_CTRL0, 4, 1, 1),
187
SOC_SINGLE("ADC 2 Capture Switch", ADAU1372_REG_ADC_CTRL1, 3, 1, 1),
188
SOC_SINGLE("ADC 3 Capture Switch", ADAU1372_REG_ADC_CTRL1, 4, 1, 1),
189
190
SOC_ENUM("ADC 0+1 High-Pass-Filter", adau1372_hpf0_1_enum),
191
SOC_ENUM("ADC 2+3 High-Pass-Filter", adau1372_hpf2_3_enum),
192
193
SOC_SINGLE_TLV("PGA 0 Capture Volume", ADAU1372_REG_PGA_CTRL(0),
194
0, 0x3f, 0, adau1372_pga_tlv),
195
SOC_SINGLE_TLV("PGA 1 Capture Volume", ADAU1372_REG_PGA_CTRL(1),
196
0, 0x3f, 0, adau1372_pga_tlv),
197
SOC_SINGLE_TLV("PGA 2 Capture Volume", ADAU1372_REG_PGA_CTRL(2),
198
0, 0x3f, 0, adau1372_pga_tlv),
199
SOC_SINGLE_TLV("PGA 3 Capture Volume", ADAU1372_REG_PGA_CTRL(3),
200
0, 0x3f, 0, adau1372_pga_tlv),
201
SOC_SINGLE_TLV("PGA 0 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
202
0, 1, 0, adau1372_pga_boost_tlv),
203
SOC_SINGLE_TLV("PGA 1 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
204
1, 1, 0, adau1372_pga_boost_tlv),
205
SOC_SINGLE_TLV("PGA 2 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
206
2, 1, 0, adau1372_pga_boost_tlv),
207
SOC_SINGLE_TLV("PGA 3 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
208
3, 1, 0, adau1372_pga_boost_tlv),
209
SOC_SINGLE("PGA 0 Capture Switch", ADAU1372_REG_PGA_CTRL(0), 7, 1, 0),
210
SOC_SINGLE("PGA 1 Capture Switch", ADAU1372_REG_PGA_CTRL(1), 7, 1, 0),
211
SOC_SINGLE("PGA 2 Capture Switch", ADAU1372_REG_PGA_CTRL(2), 7, 1, 0),
212
SOC_SINGLE("PGA 3 Capture Switch", ADAU1372_REG_PGA_CTRL(3), 7, 1, 0),
213
214
SOC_SINGLE_TLV("DAC 0 Playback Volume", ADAU1372_REG_DAC_VOL(0),
215
0, 0xff, 1, adau1372_digital_tlv),
216
SOC_SINGLE_TLV("DAC 1 Playback Volume", ADAU1372_REG_DAC_VOL(1),
217
0, 0xff, 1, adau1372_digital_tlv),
218
SOC_SINGLE("DAC 0 Playback Switch", ADAU1372_REG_DAC_CTRL, 3, 1, 1),
219
SOC_SINGLE("DAC 1 Playback Switch", ADAU1372_REG_DAC_CTRL, 4, 1, 1),
220
221
SOC_ENUM("Headphone Bias", adau1372_bias_hp_enum),
222
SOC_ENUM("Microphone Bias", adau1372_bias_mic_enum),
223
SOC_ENUM("AFE 0+1 Bias", adau1372_bias_afe0_1_enum),
224
SOC_ENUM("AFE 2+3 Bias", adau1372_bias_afe2_3_enum),
225
SOC_ENUM("ADC 0+1 Bias", adau1372_bias_adc0_1_enum),
226
SOC_ENUM("ADC 2+3 Bias", adau1372_bias_adc2_3_enum),
227
SOC_ENUM("DAC 0+1 Bias", adau1372_bias_dac_enum),
228
};
229
230
static const char * const adau1372_decimator_mux_text[] = {
231
"ADC",
232
"DMIC",
233
};
234
235
static SOC_ENUM_SINGLE_DECL(adau1372_decimator0_1_mux_enum, ADAU1372_REG_ADC_CTRL2,
236
2, adau1372_decimator_mux_text);
237
238
static const struct snd_kcontrol_new adau1372_decimator0_1_mux_control =
239
SOC_DAPM_ENUM("Decimator 0+1 Capture Mux", adau1372_decimator0_1_mux_enum);
240
241
static SOC_ENUM_SINGLE_DECL(adau1372_decimator2_3_mux_enum, ADAU1372_REG_ADC_CTRL3,
242
2, adau1372_decimator_mux_text);
243
244
static const struct snd_kcontrol_new adau1372_decimator2_3_mux_control =
245
SOC_DAPM_ENUM("Decimator 2+3 Capture Mux", adau1372_decimator2_3_mux_enum);
246
247
static const unsigned int adau1372_asrco_mux_values[] = {
248
4, 5, 6, 7,
249
};
250
251
static const char * const adau1372_asrco_mux_text[] = {
252
"Decimator0",
253
"Decimator1",
254
"Decimator2",
255
"Decimator3",
256
};
257
258
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco0_mux_enum, ADAU1372_REG_ASRCO_SOURCE_0_1,
259
0, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
260
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco1_mux_enum, ADAU1372_REG_ASRCO_SOURCE_0_1,
261
4, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
262
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco2_mux_enum, ADAU1372_REG_ASRCO_SOURCE_2_3,
263
0, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
264
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco3_mux_enum, ADAU1372_REG_ASRCO_SOURCE_2_3,
265
4, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
266
267
static const struct snd_kcontrol_new adau1372_asrco0_mux_control =
268
SOC_DAPM_ENUM("Output ASRC0 Capture Mux", adau1372_asrco0_mux_enum);
269
static const struct snd_kcontrol_new adau1372_asrco1_mux_control =
270
SOC_DAPM_ENUM("Output ASRC1 Capture Mux", adau1372_asrco1_mux_enum);
271
static const struct snd_kcontrol_new adau1372_asrco2_mux_control =
272
SOC_DAPM_ENUM("Output ASRC2 Capture Mux", adau1372_asrco2_mux_enum);
273
static const struct snd_kcontrol_new adau1372_asrco3_mux_control =
274
SOC_DAPM_ENUM("Output ASRC3 Capture Mux", adau1372_asrco3_mux_enum);
275
276
static const unsigned int adau1372_sout_mux_values[] = {
277
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
278
};
279
280
static const char * const adau1372_sout_mux_text[] = {
281
"Output ASRC0",
282
"Output ASRC1",
283
"Output ASRC2",
284
"Output ASRC3",
285
"Serial Input 0",
286
"Serial Input 1",
287
"Serial Input 2",
288
"Serial Input 3",
289
"Serial Input 4",
290
"Serial Input 5",
291
"Serial Input 6",
292
"Serial Input 7",
293
};
294
295
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout0_mux_enum, ADAU1372_REG_SOUT_SOURCE_0_1,
296
0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
297
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout1_mux_enum, ADAU1372_REG_SOUT_SOURCE_0_1,
298
4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
299
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout2_mux_enum, ADAU1372_REG_SOUT_SOURCE_2_3,
300
0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
301
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout3_mux_enum, ADAU1372_REG_SOUT_SOURCE_2_3,
302
4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
303
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout4_mux_enum, ADAU1372_REG_SOUT_SOURCE_4_5,
304
0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
305
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout5_mux_enum, ADAU1372_REG_SOUT_SOURCE_4_5,
306
4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
307
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout6_mux_enum, ADAU1372_REG_SOUT_SOURCE_6_7,
308
0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
309
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout7_mux_enum, ADAU1372_REG_SOUT_SOURCE_6_7,
310
4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
311
312
static const struct snd_kcontrol_new adau1372_sout0_mux_control =
313
SOC_DAPM_ENUM("Serial Output 0 Capture Mux", adau1372_sout0_mux_enum);
314
static const struct snd_kcontrol_new adau1372_sout1_mux_control =
315
SOC_DAPM_ENUM("Serial Output 1 Capture Mux", adau1372_sout1_mux_enum);
316
static const struct snd_kcontrol_new adau1372_sout2_mux_control =
317
SOC_DAPM_ENUM("Serial Output 2 Capture Mux", adau1372_sout2_mux_enum);
318
static const struct snd_kcontrol_new adau1372_sout3_mux_control =
319
SOC_DAPM_ENUM("Serial Output 3 Capture Mux", adau1372_sout3_mux_enum);
320
static const struct snd_kcontrol_new adau1372_sout4_mux_control =
321
SOC_DAPM_ENUM("Serial Output 4 Capture Mux", adau1372_sout4_mux_enum);
322
static const struct snd_kcontrol_new adau1372_sout5_mux_control =
323
SOC_DAPM_ENUM("Serial Output 5 Capture Mux", adau1372_sout5_mux_enum);
324
static const struct snd_kcontrol_new adau1372_sout6_mux_control =
325
SOC_DAPM_ENUM("Serial Output 6 Capture Mux", adau1372_sout6_mux_enum);
326
static const struct snd_kcontrol_new adau1372_sout7_mux_control =
327
SOC_DAPM_ENUM("Serial Output 7 Capture Mux", adau1372_sout7_mux_enum);
328
329
static const char * const adau1372_asrci_mux_text[] = {
330
"Serial Input 0+1",
331
"Serial Input 2+3",
332
"Serial Input 4+5",
333
"Serial Input 6+7",
334
};
335
336
static SOC_ENUM_SINGLE_DECL(adau1372_asrci_mux_enum,
337
ADAU1372_REG_ASRC_MODE, 2, adau1372_asrci_mux_text);
338
339
static const struct snd_kcontrol_new adau1372_asrci_mux_control =
340
SOC_DAPM_ENUM("Input ASRC Playback Mux", adau1372_asrci_mux_enum);
341
342
static const unsigned int adau1372_dac_mux_values[] = {
343
12, 13
344
};
345
346
static const char * const adau1372_dac_mux_text[] = {
347
"Input ASRC0",
348
"Input ASRC1",
349
};
350
351
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_dac0_mux_enum, ADAU1372_REG_DAC_SOURCE,
352
0, 0xf, adau1372_dac_mux_text, adau1372_dac_mux_values);
353
static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_dac1_mux_enum, ADAU1372_REG_DAC_SOURCE,
354
4, 0xf, adau1372_dac_mux_text, adau1372_dac_mux_values);
355
356
static const struct snd_kcontrol_new adau1372_dac0_mux_control =
357
SOC_DAPM_ENUM("DAC 0 Playback Mux", adau1372_dac0_mux_enum);
358
static const struct snd_kcontrol_new adau1372_dac1_mux_control =
359
SOC_DAPM_ENUM("DAC 1 Playback Mux", adau1372_dac1_mux_enum);
360
361
static const struct snd_soc_dapm_widget adau1372_dapm_widgets[] = {
362
SND_SOC_DAPM_INPUT("AIN0"),
363
SND_SOC_DAPM_INPUT("AIN1"),
364
SND_SOC_DAPM_INPUT("AIN2"),
365
SND_SOC_DAPM_INPUT("AIN3"),
366
SND_SOC_DAPM_INPUT("DMIC0_1"),
367
SND_SOC_DAPM_INPUT("DMIC2_3"),
368
369
SND_SOC_DAPM_SUPPLY("MICBIAS0", ADAU1372_REG_MICBIAS, 4, 0, NULL, 0),
370
SND_SOC_DAPM_SUPPLY("MICBIAS1", ADAU1372_REG_MICBIAS, 5, 0, NULL, 0),
371
372
SND_SOC_DAPM_PGA("PGA0", ADAU1372_REG_PGA_CTRL(0), 6, 1, NULL, 0),
373
SND_SOC_DAPM_PGA("PGA1", ADAU1372_REG_PGA_CTRL(1), 6, 1, NULL, 0),
374
SND_SOC_DAPM_PGA("PGA2", ADAU1372_REG_PGA_CTRL(2), 6, 1, NULL, 0),
375
SND_SOC_DAPM_PGA("PGA3", ADAU1372_REG_PGA_CTRL(3), 6, 1, NULL, 0),
376
SND_SOC_DAPM_ADC("ADC0", NULL, ADAU1372_REG_ADC_CTRL2, 0, 0),
377
SND_SOC_DAPM_ADC("ADC1", NULL, ADAU1372_REG_ADC_CTRL2, 1, 0),
378
SND_SOC_DAPM_ADC("ADC2", NULL, ADAU1372_REG_ADC_CTRL3, 0, 0),
379
SND_SOC_DAPM_ADC("ADC3", NULL, ADAU1372_REG_ADC_CTRL3, 1, 0),
380
381
SND_SOC_DAPM_SUPPLY("ADC0 Filter", ADAU1372_REG_DECIM_PWR, 0, 0, NULL, 0),
382
SND_SOC_DAPM_SUPPLY("ADC1 Filter", ADAU1372_REG_DECIM_PWR, 1, 0, NULL, 0),
383
SND_SOC_DAPM_SUPPLY("ADC2 Filter", ADAU1372_REG_DECIM_PWR, 2, 0, NULL, 0),
384
SND_SOC_DAPM_SUPPLY("ADC3 Filter", ADAU1372_REG_DECIM_PWR, 3, 0, NULL, 0),
385
SND_SOC_DAPM_SUPPLY("Output ASRC0 Decimator", ADAU1372_REG_DECIM_PWR, 4, 0, NULL, 0),
386
SND_SOC_DAPM_SUPPLY("Output ASRC1 Decimator", ADAU1372_REG_DECIM_PWR, 5, 0, NULL, 0),
387
SND_SOC_DAPM_SUPPLY("Output ASRC2 Decimator", ADAU1372_REG_DECIM_PWR, 6, 0, NULL, 0),
388
SND_SOC_DAPM_SUPPLY("Output ASRC3 Decimator", ADAU1372_REG_DECIM_PWR, 7, 0, NULL, 0),
389
390
SND_SOC_DAPM_MUX("Decimator0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator0_1_mux_control),
391
SND_SOC_DAPM_MUX("Decimator1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator0_1_mux_control),
392
SND_SOC_DAPM_MUX("Decimator2 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator2_3_mux_control),
393
SND_SOC_DAPM_MUX("Decimator3 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator2_3_mux_control),
394
395
SND_SOC_DAPM_MUX("Output ASRC0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco0_mux_control),
396
SND_SOC_DAPM_MUX("Output ASRC1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco1_mux_control),
397
SND_SOC_DAPM_MUX("Output ASRC2 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco2_mux_control),
398
SND_SOC_DAPM_MUX("Output ASRC3 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco3_mux_control),
399
SND_SOC_DAPM_MUX("Serial Output 0 Capture Mux", SND_SOC_NOPM, 0, 0,
400
&adau1372_sout0_mux_control),
401
SND_SOC_DAPM_MUX("Serial Output 1 Capture Mux", SND_SOC_NOPM, 0, 0,
402
&adau1372_sout1_mux_control),
403
SND_SOC_DAPM_MUX("Serial Output 2 Capture Mux", SND_SOC_NOPM, 0, 0,
404
&adau1372_sout2_mux_control),
405
SND_SOC_DAPM_MUX("Serial Output 3 Capture Mux", SND_SOC_NOPM, 0, 0,
406
&adau1372_sout3_mux_control),
407
SND_SOC_DAPM_MUX("Serial Output 4 Capture Mux", SND_SOC_NOPM, 0, 0,
408
&adau1372_sout4_mux_control),
409
SND_SOC_DAPM_MUX("Serial Output 5 Capture Mux", SND_SOC_NOPM, 0, 0,
410
&adau1372_sout5_mux_control),
411
SND_SOC_DAPM_MUX("Serial Output 6 Capture Mux", SND_SOC_NOPM, 0, 0,
412
&adau1372_sout6_mux_control),
413
SND_SOC_DAPM_MUX("Serial Output 7 Capture Mux", SND_SOC_NOPM, 0, 0,
414
&adau1372_sout7_mux_control),
415
416
SND_SOC_DAPM_AIF_IN("Serial Input 0", NULL, 0, SND_SOC_NOPM, 0, 0),
417
SND_SOC_DAPM_AIF_IN("Serial Input 1", NULL, 1, SND_SOC_NOPM, 0, 0),
418
SND_SOC_DAPM_AIF_IN("Serial Input 2", NULL, 2, SND_SOC_NOPM, 0, 0),
419
SND_SOC_DAPM_AIF_IN("Serial Input 3", NULL, 3, SND_SOC_NOPM, 0, 0),
420
SND_SOC_DAPM_AIF_IN("Serial Input 4", NULL, 4, SND_SOC_NOPM, 0, 0),
421
SND_SOC_DAPM_AIF_IN("Serial Input 5", NULL, 5, SND_SOC_NOPM, 0, 0),
422
SND_SOC_DAPM_AIF_IN("Serial Input 6", NULL, 6, SND_SOC_NOPM, 0, 0),
423
SND_SOC_DAPM_AIF_IN("Serial Input 7", NULL, 7, SND_SOC_NOPM, 0, 0),
424
425
SND_SOC_DAPM_AIF_OUT("Serial Output 0", NULL, 0, SND_SOC_NOPM, 0, 0),
426
SND_SOC_DAPM_AIF_OUT("Serial Output 1", NULL, 1, SND_SOC_NOPM, 0, 0),
427
SND_SOC_DAPM_AIF_OUT("Serial Output 2", NULL, 2, SND_SOC_NOPM, 0, 0),
428
SND_SOC_DAPM_AIF_OUT("Serial Output 3", NULL, 3, SND_SOC_NOPM, 0, 0),
429
SND_SOC_DAPM_AIF_OUT("Serial Output 4", NULL, 4, SND_SOC_NOPM, 0, 0),
430
SND_SOC_DAPM_AIF_OUT("Serial Output 5", NULL, 5, SND_SOC_NOPM, 0, 0),
431
SND_SOC_DAPM_AIF_OUT("Serial Output 6", NULL, 6, SND_SOC_NOPM, 0, 0),
432
SND_SOC_DAPM_AIF_OUT("Serial Output 7", NULL, 7, SND_SOC_NOPM, 0, 0),
433
434
SND_SOC_DAPM_SUPPLY("Output ASRC Supply", ADAU1372_REG_ASRC_MODE, 1, 0, NULL, 0),
435
SND_SOC_DAPM_SUPPLY("Input ASRC Supply", ADAU1372_REG_ASRC_MODE, 0, 0, NULL, 0),
436
437
SND_SOC_DAPM_SUPPLY("DAC1 Modulator", ADAU1372_REG_INTERP_PWR, 3, 0, NULL, 0),
438
SND_SOC_DAPM_SUPPLY("DAC0 Modulator", ADAU1372_REG_INTERP_PWR, 2, 0, NULL, 0),
439
SND_SOC_DAPM_SUPPLY("Input ASRC1 Interpolator", ADAU1372_REG_INTERP_PWR, 1, 0, NULL, 0),
440
SND_SOC_DAPM_SUPPLY("Input ASRC0 Interpolator", ADAU1372_REG_INTERP_PWR, 0, 0, NULL, 0),
441
442
SND_SOC_DAPM_MUX("Input ASRC0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrci_mux_control),
443
SND_SOC_DAPM_MUX("Input ASRC1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrci_mux_control),
444
445
SND_SOC_DAPM_MUX("DAC 0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_dac0_mux_control),
446
SND_SOC_DAPM_MUX("DAC 1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_dac1_mux_control),
447
448
SND_SOC_DAPM_DAC("DAC0", NULL, ADAU1372_REG_DAC_CTRL, 0, 0),
449
SND_SOC_DAPM_DAC("DAC1", NULL, ADAU1372_REG_DAC_CTRL, 1, 0),
450
451
SND_SOC_DAPM_OUT_DRV("OP_STAGE_LP", ADAU1372_REG_OP_STAGE_CTRL, 0, 1, NULL, 0),
452
SND_SOC_DAPM_OUT_DRV("OP_STAGE_LN", ADAU1372_REG_OP_STAGE_CTRL, 1, 1, NULL, 0),
453
SND_SOC_DAPM_OUT_DRV("OP_STAGE_RP", ADAU1372_REG_OP_STAGE_CTRL, 2, 1, NULL, 0),
454
SND_SOC_DAPM_OUT_DRV("OP_STAGE_RN", ADAU1372_REG_OP_STAGE_CTRL, 3, 1, NULL, 0),
455
456
SND_SOC_DAPM_OUTPUT("HPOUTL"),
457
SND_SOC_DAPM_OUTPUT("HPOUTR"),
458
};
459
460
#define ADAU1372_SOUT_ROUTES(x) \
461
{ "Serial Output " #x " Capture Mux", "Output ASRC0", "Output ASRC0 Mux" }, \
462
{ "Serial Output " #x " Capture Mux", "Output ASRC1", "Output ASRC1 Mux" }, \
463
{ "Serial Output " #x " Capture Mux", "Output ASRC2", "Output ASRC2 Mux" }, \
464
{ "Serial Output " #x " Capture Mux", "Output ASRC3", "Output ASRC3 Mux" }, \
465
{ "Serial Output " #x " Capture Mux", "Serial Input 0", "Serial Input 0" }, \
466
{ "Serial Output " #x " Capture Mux", "Serial Input 1", "Serial Input 1" }, \
467
{ "Serial Output " #x " Capture Mux", "Serial Input 2", "Serial Input 2" }, \
468
{ "Serial Output " #x " Capture Mux", "Serial Input 3", "Serial Input 3" }, \
469
{ "Serial Output " #x " Capture Mux", "Serial Input 4", "Serial Input 4" }, \
470
{ "Serial Output " #x " Capture Mux", "Serial Input 5", "Serial Input 5" }, \
471
{ "Serial Output " #x " Capture Mux", "Serial Input 6", "Serial Input 6" }, \
472
{ "Serial Output " #x " Capture Mux", "Serial Input 7", "Serial Input 7" }, \
473
{ "Serial Output " #x, NULL, "Serial Output " #x " Capture Mux" }, \
474
{ "Capture", NULL, "Serial Output " #x }
475
476
#define ADAU1372_ASRCO_ROUTES(x) \
477
{ "Output ASRC" #x " Mux", "Decimator0", "Decimator0 Mux" }, \
478
{ "Output ASRC" #x " Mux", "Decimator1", "Decimator1 Mux" }, \
479
{ "Output ASRC" #x " Mux", "Decimator2", "Decimator2 Mux" }, \
480
{ "Output ASRC" #x " Mux", "Decimator3", "Decimator3 Mux" }
481
482
static const struct snd_soc_dapm_route adau1372_dapm_routes[] = {
483
{ "PGA0", NULL, "AIN0" },
484
{ "PGA1", NULL, "AIN1" },
485
{ "PGA2", NULL, "AIN2" },
486
{ "PGA3", NULL, "AIN3" },
487
488
{ "ADC0", NULL, "PGA0" },
489
{ "ADC1", NULL, "PGA1" },
490
{ "ADC2", NULL, "PGA2" },
491
{ "ADC3", NULL, "PGA3" },
492
493
{ "Decimator0 Mux", "ADC", "ADC0" },
494
{ "Decimator1 Mux", "ADC", "ADC1" },
495
{ "Decimator2 Mux", "ADC", "ADC2" },
496
{ "Decimator3 Mux", "ADC", "ADC3" },
497
498
{ "Decimator0 Mux", "DMIC", "DMIC0_1" },
499
{ "Decimator1 Mux", "DMIC", "DMIC0_1" },
500
{ "Decimator2 Mux", "DMIC", "DMIC2_3" },
501
{ "Decimator3 Mux", "DMIC", "DMIC2_3" },
502
503
{ "Decimator0 Mux", NULL, "ADC0 Filter" },
504
{ "Decimator1 Mux", NULL, "ADC1 Filter" },
505
{ "Decimator2 Mux", NULL, "ADC2 Filter" },
506
{ "Decimator3 Mux", NULL, "ADC3 Filter" },
507
508
{ "Output ASRC0 Mux", NULL, "Output ASRC Supply" },
509
{ "Output ASRC1 Mux", NULL, "Output ASRC Supply" },
510
{ "Output ASRC2 Mux", NULL, "Output ASRC Supply" },
511
{ "Output ASRC3 Mux", NULL, "Output ASRC Supply" },
512
{ "Output ASRC0 Mux", NULL, "Output ASRC0 Decimator" },
513
{ "Output ASRC1 Mux", NULL, "Output ASRC1 Decimator" },
514
{ "Output ASRC2 Mux", NULL, "Output ASRC2 Decimator" },
515
{ "Output ASRC3 Mux", NULL, "Output ASRC3 Decimator" },
516
517
ADAU1372_ASRCO_ROUTES(0),
518
ADAU1372_ASRCO_ROUTES(1),
519
ADAU1372_ASRCO_ROUTES(2),
520
ADAU1372_ASRCO_ROUTES(3),
521
522
ADAU1372_SOUT_ROUTES(0),
523
ADAU1372_SOUT_ROUTES(1),
524
ADAU1372_SOUT_ROUTES(2),
525
ADAU1372_SOUT_ROUTES(3),
526
ADAU1372_SOUT_ROUTES(4),
527
ADAU1372_SOUT_ROUTES(5),
528
ADAU1372_SOUT_ROUTES(6),
529
ADAU1372_SOUT_ROUTES(7),
530
531
{ "Serial Input 0", NULL, "Playback" },
532
{ "Serial Input 1", NULL, "Playback" },
533
{ "Serial Input 2", NULL, "Playback" },
534
{ "Serial Input 3", NULL, "Playback" },
535
{ "Serial Input 4", NULL, "Playback" },
536
{ "Serial Input 5", NULL, "Playback" },
537
{ "Serial Input 6", NULL, "Playback" },
538
{ "Serial Input 7", NULL, "Playback" },
539
540
{ "Input ASRC0 Mux", "Serial Input 0+1", "Serial Input 0" },
541
{ "Input ASRC1 Mux", "Serial Input 0+1", "Serial Input 1" },
542
{ "Input ASRC0 Mux", "Serial Input 2+3", "Serial Input 2" },
543
{ "Input ASRC1 Mux", "Serial Input 2+3", "Serial Input 3" },
544
{ "Input ASRC0 Mux", "Serial Input 4+5", "Serial Input 4" },
545
{ "Input ASRC1 Mux", "Serial Input 4+5", "Serial Input 5" },
546
{ "Input ASRC0 Mux", "Serial Input 6+7", "Serial Input 6" },
547
{ "Input ASRC1 Mux", "Serial Input 6+7", "Serial Input 7" },
548
{ "Input ASRC0 Mux", NULL, "Input ASRC Supply" },
549
{ "Input ASRC1 Mux", NULL, "Input ASRC Supply" },
550
{ "Input ASRC0 Mux", NULL, "Input ASRC0 Interpolator" },
551
{ "Input ASRC1 Mux", NULL, "Input ASRC1 Interpolator" },
552
553
{ "DAC 0 Mux", "Input ASRC0", "Input ASRC0 Mux" },
554
{ "DAC 0 Mux", "Input ASRC1", "Input ASRC1 Mux" },
555
{ "DAC 1 Mux", "Input ASRC0", "Input ASRC0 Mux" },
556
{ "DAC 1 Mux", "Input ASRC1", "Input ASRC1 Mux" },
557
558
{ "DAC0", NULL, "DAC 0 Mux" },
559
{ "DAC1", NULL, "DAC 1 Mux" },
560
{ "DAC0", NULL, "DAC0 Modulator" },
561
{ "DAC1", NULL, "DAC1 Modulator" },
562
563
{ "OP_STAGE_LP", NULL, "DAC0" },
564
{ "OP_STAGE_LN", NULL, "DAC0" },
565
{ "OP_STAGE_RP", NULL, "DAC1" },
566
{ "OP_STAGE_RN", NULL, "DAC1" },
567
568
{ "HPOUTL", NULL, "OP_STAGE_LP" },
569
{ "HPOUTL", NULL, "OP_STAGE_LN" },
570
{ "HPOUTR", NULL, "OP_STAGE_RP" },
571
{ "HPOUTR", NULL, "OP_STAGE_RN" },
572
};
573
574
static int adau1372_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
575
{
576
struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
577
unsigned int sai0 = 0, sai1 = 0;
578
bool invert_lrclk = false;
579
580
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
581
case SND_SOC_DAIFMT_CBP_CFP:
582
adau1372->clock_provider = true;
583
sai1 |= ADAU1372_SAI1_MS;
584
break;
585
case SND_SOC_DAIFMT_CBC_CFC:
586
adau1372->clock_provider = false;
587
break;
588
default:
589
return -EINVAL;
590
}
591
592
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
593
case SND_SOC_DAIFMT_NB_NF:
594
invert_lrclk = false;
595
break;
596
case SND_SOC_DAIFMT_NB_IF:
597
invert_lrclk = true;
598
break;
599
case SND_SOC_DAIFMT_IB_NF:
600
invert_lrclk = false;
601
sai1 |= ADAU1372_SAI1_BCLKEDGE;
602
break;
603
case SND_SOC_DAIFMT_IB_IF:
604
invert_lrclk = true;
605
sai1 |= ADAU1372_SAI1_BCLKEDGE;
606
break;
607
}
608
609
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
610
case SND_SOC_DAIFMT_I2S:
611
sai0 |= ADAU1372_SAI0_DELAY1;
612
break;
613
case SND_SOC_DAIFMT_LEFT_J:
614
sai0 |= ADAU1372_SAI0_DELAY0;
615
invert_lrclk = !invert_lrclk;
616
break;
617
case SND_SOC_DAIFMT_DSP_A:
618
sai0 |= ADAU1372_SAI0_DELAY1;
619
sai1 |= ADAU1372_SAI1_LR_MODE;
620
break;
621
case SND_SOC_DAIFMT_DSP_B:
622
sai0 |= ADAU1372_SAI0_DELAY0;
623
sai1 |= ADAU1372_SAI1_LR_MODE;
624
break;
625
}
626
627
if (invert_lrclk)
628
sai1 |= ADAU1372_SAI1_LR_POL;
629
630
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_DELAY_MASK, sai0);
631
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1,
632
ADAU1372_SAI1_MS | ADAU1372_SAI1_BCLKEDGE |
633
ADAU1372_SAI1_LR_MODE | ADAU1372_SAI1_LR_POL, sai1);
634
635
return 0;
636
}
637
638
static int adau1372_hw_params(struct snd_pcm_substream *substream,
639
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
640
{
641
struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
642
unsigned int rate = params_rate(params);
643
unsigned int slot_width;
644
unsigned int sai0, sai1;
645
unsigned int i;
646
647
for (i = 0; i < ARRAY_SIZE(adau1372_rates); i++) {
648
if (rate == adau1372_rates[i])
649
break;
650
}
651
652
if (i == ARRAY_SIZE(adau1372_rates))
653
return -EINVAL;
654
655
sai0 = i;
656
657
slot_width = adau1372->slot_width;
658
if (slot_width == 0)
659
slot_width = params_width(params);
660
661
switch (slot_width) {
662
case 16:
663
sai1 = ADAU1372_SAI1_BCLKRATE;
664
break;
665
case 24:
666
case 32:
667
sai1 = 0;
668
break;
669
default:
670
return -EINVAL;
671
}
672
673
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_FS_MASK, sai0);
674
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_BCLKRATE, sai1);
675
676
return 0;
677
}
678
679
static int adau1372_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
680
unsigned int rx_mask, int slots, int width)
681
{
682
struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
683
unsigned int sai0, sai1;
684
685
/* I2S mode */
686
if (slots == 0) {
687
/* The other settings dont matter in I2S mode */
688
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0,
689
ADAU1372_SAI0_SAI_MASK, ADAU1372_SAI0_SAI_I2S);
690
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
691
adau1372->slot_width = 0;
692
return 0;
693
}
694
695
/* We have 8 channels anything outside that is not supported */
696
if ((tx_mask & ~0xff) != 0 || (rx_mask & ~0xff) != 0)
697
return -EINVAL;
698
699
switch (width) {
700
case 16:
701
sai1 = ADAU1372_SAI1_BCLK_TDMC;
702
break;
703
case 24:
704
case 32:
705
sai1 = 0;
706
break;
707
default:
708
return -EINVAL;
709
}
710
711
switch (slots) {
712
case 2:
713
sai0 = ADAU1372_SAI0_SAI_TDM2;
714
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
715
break;
716
case 4:
717
sai0 = ADAU1372_SAI0_SAI_TDM4;
718
if (adau1372->clock_provider)
719
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM4_MASTER;
720
else
721
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM4;
722
break;
723
case 8:
724
sai0 = ADAU1372_SAI0_SAI_TDM8;
725
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM8;
726
break;
727
default:
728
return -EINVAL;
729
}
730
731
adau1372->slot_width = width;
732
733
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_SAI_MASK, sai0);
734
regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_BCLK_TDMC, sai1);
735
736
/* Mask is inverted in hardware */
737
regmap_write(adau1372->regmap, ADAU1372_REG_SOUT_CTRL, ~tx_mask);
738
739
return 0;
740
}
741
742
static int adau1372_set_tristate(struct snd_soc_dai *dai, int tristate)
743
{
744
struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
745
unsigned int sai1;
746
747
if (tristate)
748
sai1 = ADAU1372_SAI1_TDM_TS;
749
else
750
sai1 = 0;
751
752
return regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_TDM_TS, sai1);
753
}
754
755
static int adau1372_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
756
{
757
struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
758
759
snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
760
&adau1372->rate_constraints);
761
762
return 0;
763
}
764
765
static void adau1372_enable_pll(struct adau1372 *adau1372)
766
{
767
unsigned int val, timeout = 0;
768
int ret;
769
770
regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
771
ADAU1372_CLK_CTRL_PLL_EN, ADAU1372_CLK_CTRL_PLL_EN);
772
do {
773
/* Takes about 1ms to lock */
774
usleep_range(1000, 2000);
775
ret = regmap_read(adau1372->regmap, ADAU1372_REG_PLL(5), &val);
776
if (ret)
777
break;
778
timeout++;
779
} while (!(val & 1) && timeout < 3);
780
781
if (ret < 0 || !(val & 1))
782
dev_err(adau1372->dev, "Failed to lock PLL\n");
783
}
784
785
static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
786
{
787
if (adau1372->enabled == enable)
788
return;
789
790
if (enable) {
791
unsigned int clk_ctrl = ADAU1372_CLK_CTRL_MCLK_EN;
792
793
clk_prepare_enable(adau1372->mclk);
794
if (adau1372->pd_gpio)
795
gpiod_set_value(adau1372->pd_gpio, 0);
796
797
if (adau1372->switch_mode)
798
adau1372->switch_mode(adau1372->dev);
799
800
regcache_cache_only(adau1372->regmap, false);
801
802
/*
803
* Clocks needs to be enabled before any other register can be
804
* accessed.
805
*/
806
if (adau1372->use_pll) {
807
adau1372_enable_pll(adau1372);
808
clk_ctrl |= ADAU1372_CLK_CTRL_CLKSRC;
809
}
810
811
regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
812
ADAU1372_CLK_CTRL_MCLK_EN | ADAU1372_CLK_CTRL_CLKSRC, clk_ctrl);
813
regcache_sync(adau1372->regmap);
814
} else {
815
if (adau1372->pd_gpio) {
816
/*
817
* This will turn everything off and reset the register
818
* map. No need to do any register writes to manually
819
* turn things off.
820
*/
821
gpiod_set_value(adau1372->pd_gpio, 1);
822
regcache_mark_dirty(adau1372->regmap);
823
} else {
824
regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
825
ADAU1372_CLK_CTRL_MCLK_EN | ADAU1372_CLK_CTRL_PLL_EN, 0);
826
}
827
clk_disable_unprepare(adau1372->mclk);
828
regcache_cache_only(adau1372->regmap, true);
829
}
830
831
adau1372->enabled = enable;
832
}
833
834
static int adau1372_set_bias_level(struct snd_soc_component *component,
835
enum snd_soc_bias_level level)
836
{
837
struct adau1372 *adau1372 = snd_soc_component_get_drvdata(component);
838
839
switch (level) {
840
case SND_SOC_BIAS_ON:
841
break;
842
case SND_SOC_BIAS_PREPARE:
843
break;
844
case SND_SOC_BIAS_STANDBY:
845
adau1372_set_power(adau1372, true);
846
break;
847
case SND_SOC_BIAS_OFF:
848
adau1372_set_power(adau1372, false);
849
break;
850
}
851
852
return 0;
853
}
854
855
static const struct snd_soc_component_driver adau1372_driver = {
856
.set_bias_level = adau1372_set_bias_level,
857
.controls = adau1372_controls,
858
.num_controls = ARRAY_SIZE(adau1372_controls),
859
.dapm_widgets = adau1372_dapm_widgets,
860
.num_dapm_widgets = ARRAY_SIZE(adau1372_dapm_widgets),
861
.dapm_routes = adau1372_dapm_routes,
862
.num_dapm_routes = ARRAY_SIZE(adau1372_dapm_routes),
863
.endianness = 1,
864
};
865
866
static const struct snd_soc_dai_ops adau1372_dai_ops = {
867
.set_fmt = adau1372_set_dai_fmt,
868
.set_tdm_slot = adau1372_set_tdm_slot,
869
.set_tristate = adau1372_set_tristate,
870
.hw_params = adau1372_hw_params,
871
.startup = adau1372_startup,
872
};
873
874
#define ADAU1372_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
875
SNDRV_PCM_FMTBIT_S24_LE | \
876
SNDRV_PCM_FMTBIT_S32_LE)
877
878
static struct snd_soc_dai_driver adau1372_dai_driver = {
879
.name = "adau1372",
880
.playback = {
881
.stream_name = "Playback",
882
.channels_min = 2,
883
.channels_max = 8,
884
.rates = SNDRV_PCM_RATE_KNOT,
885
.formats = ADAU1372_FORMATS,
886
.sig_bits = 24,
887
},
888
.capture = {
889
.stream_name = "Capture",
890
.channels_min = 2,
891
.channels_max = 8,
892
.rates = SNDRV_PCM_RATE_KNOT,
893
.formats = ADAU1372_FORMATS,
894
.sig_bits = 24,
895
},
896
.ops = &adau1372_dai_ops,
897
.symmetric_rate = 1,
898
};
899
900
static int adau1372_setup_pll(struct adau1372 *adau1372, unsigned int rate)
901
{
902
u8 regs[5];
903
unsigned int i;
904
int ret;
905
906
ret = adau_calc_pll_cfg(rate, 49152000, regs);
907
if (ret < 0)
908
return ret;
909
910
for (i = 0; i < ARRAY_SIZE(regs); i++)
911
regmap_write(adau1372->regmap, ADAU1372_REG_PLL(i), regs[i]);
912
913
return 0;
914
}
915
916
int adau1372_probe(struct device *dev, struct regmap *regmap,
917
void (*switch_mode)(struct device *dev))
918
{
919
struct adau1372 *adau1372;
920
unsigned int clk_ctrl;
921
unsigned long rate;
922
int ret;
923
924
if (IS_ERR(regmap))
925
return PTR_ERR(regmap);
926
927
adau1372 = devm_kzalloc(dev, sizeof(*adau1372), GFP_KERNEL);
928
if (!adau1372)
929
return -ENOMEM;
930
931
adau1372->mclk = devm_clk_get(dev, "mclk");
932
if (IS_ERR(adau1372->mclk))
933
return PTR_ERR(adau1372->mclk);
934
935
adau1372->pd_gpio = devm_gpiod_get_optional(dev, "powerdown", GPIOD_OUT_HIGH);
936
if (IS_ERR(adau1372->pd_gpio))
937
return PTR_ERR(adau1372->pd_gpio);
938
939
adau1372->regmap = regmap;
940
adau1372->switch_mode = switch_mode;
941
adau1372->dev = dev;
942
adau1372->rate_constraints.list = adau1372_rates;
943
adau1372->rate_constraints.count = ARRAY_SIZE(adau1372_rates);
944
adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
945
946
dev_set_drvdata(dev, adau1372);
947
948
/*
949
* The datasheet says that the internal MCLK always needs to run at
950
* 12.288MHz. Automatically choose a valid configuration from the
951
* external clock.
952
*/
953
rate = clk_get_rate(adau1372->mclk);
954
955
switch (rate) {
956
case 12288000:
957
clk_ctrl = ADAU1372_CLK_CTRL_CC_MDIV;
958
break;
959
case 24576000:
960
clk_ctrl = 0;
961
break;
962
default:
963
clk_ctrl = 0;
964
ret = adau1372_setup_pll(adau1372, rate);
965
if (ret < 0)
966
return ret;
967
adau1372->use_pll = true;
968
break;
969
}
970
971
/*
972
* Most of the registers are inaccessible unless the internal clock is
973
* enabled.
974
*/
975
regcache_cache_only(regmap, true);
976
977
regmap_update_bits(regmap, ADAU1372_REG_CLK_CTRL, ADAU1372_CLK_CTRL_CC_MDIV, clk_ctrl);
978
979
/*
980
* No pinctrl support yet, put the multi-purpose pins in the most
981
* sensible mode for general purpose CODEC operation.
982
*/
983
regmap_write(regmap, ADAU1372_REG_MODE_MP(1), 0x00); /* SDATA OUT */
984
regmap_write(regmap, ADAU1372_REG_MODE_MP(6), 0x12); /* CLOCKOUT */
985
986
regmap_write(regmap, ADAU1372_REG_OP_STAGE_MUTE, 0x0);
987
988
regmap_write(regmap, 0x7, 0x01); /* CLOCK OUT */
989
990
return devm_snd_soc_register_component(dev, &adau1372_driver, &adau1372_dai_driver, 1);
991
}
992
EXPORT_SYMBOL(adau1372_probe);
993
994
static const struct reg_default adau1372_reg_defaults[] = {
995
{ ADAU1372_REG_CLK_CTRL, 0x00 },
996
{ ADAU1372_REG_PLL(0), 0x00 },
997
{ ADAU1372_REG_PLL(1), 0x00 },
998
{ ADAU1372_REG_PLL(2), 0x00 },
999
{ ADAU1372_REG_PLL(3), 0x00 },
1000
{ ADAU1372_REG_PLL(4), 0x00 },
1001
{ ADAU1372_REG_PLL(5), 0x00 },
1002
{ ADAU1372_REG_DAC_SOURCE, 0x10 },
1003
{ ADAU1372_REG_SOUT_SOURCE_0_1, 0x54 },
1004
{ ADAU1372_REG_SOUT_SOURCE_2_3, 0x76 },
1005
{ ADAU1372_REG_SOUT_SOURCE_4_5, 0x54 },
1006
{ ADAU1372_REG_SOUT_SOURCE_6_7, 0x76 },
1007
{ ADAU1372_REG_ADC_SDATA_CH, 0x04 },
1008
{ ADAU1372_REG_ASRCO_SOURCE_0_1, 0x10 },
1009
{ ADAU1372_REG_ASRCO_SOURCE_2_3, 0x32 },
1010
{ ADAU1372_REG_ASRC_MODE, 0x00 },
1011
{ ADAU1372_REG_ADC_CTRL0, 0x19 },
1012
{ ADAU1372_REG_ADC_CTRL1, 0x19 },
1013
{ ADAU1372_REG_ADC_CTRL2, 0x00 },
1014
{ ADAU1372_REG_ADC_CTRL3, 0x00 },
1015
{ ADAU1372_REG_ADC_VOL(0), 0x00 },
1016
{ ADAU1372_REG_ADC_VOL(1), 0x00 },
1017
{ ADAU1372_REG_ADC_VOL(2), 0x00 },
1018
{ ADAU1372_REG_ADC_VOL(3), 0x00 },
1019
{ ADAU1372_REG_PGA_CTRL(0), 0x40 },
1020
{ ADAU1372_REG_PGA_CTRL(1), 0x40 },
1021
{ ADAU1372_REG_PGA_CTRL(2), 0x40 },
1022
{ ADAU1372_REG_PGA_CTRL(3), 0x40 },
1023
{ ADAU1372_REG_PGA_BOOST, 0x00 },
1024
{ ADAU1372_REG_MICBIAS, 0x00 },
1025
{ ADAU1372_REG_DAC_CTRL, 0x18 },
1026
{ ADAU1372_REG_DAC_VOL(0), 0x00 },
1027
{ ADAU1372_REG_DAC_VOL(1), 0x00 },
1028
{ ADAU1372_REG_OP_STAGE_MUTE, 0x0f },
1029
{ ADAU1372_REG_SAI0, 0x00 },
1030
{ ADAU1372_REG_SAI1, 0x00 },
1031
{ ADAU1372_REG_SOUT_CTRL, 0x00 },
1032
{ ADAU1372_REG_MODE_MP(0), 0x00 },
1033
{ ADAU1372_REG_MODE_MP(1), 0x10 },
1034
{ ADAU1372_REG_MODE_MP(4), 0x00 },
1035
{ ADAU1372_REG_MODE_MP(5), 0x00 },
1036
{ ADAU1372_REG_MODE_MP(6), 0x11 },
1037
{ ADAU1372_REG_OP_STAGE_CTRL, 0x0f },
1038
{ ADAU1372_REG_DECIM_PWR, 0x00 },
1039
{ ADAU1372_REG_INTERP_PWR, 0x00 },
1040
{ ADAU1372_REG_BIAS_CTRL0, 0x00 },
1041
{ ADAU1372_REG_BIAS_CTRL1, 0x00 },
1042
};
1043
1044
static bool adau1372_volatile_register(struct device *dev, unsigned int reg)
1045
{
1046
if (reg == ADAU1372_REG_PLL(5))
1047
return true;
1048
1049
return false;
1050
}
1051
1052
const struct regmap_config adau1372_regmap_config = {
1053
.val_bits = 8,
1054
.reg_bits = 16,
1055
.max_register = 0x4d,
1056
1057
.reg_defaults = adau1372_reg_defaults,
1058
.num_reg_defaults = ARRAY_SIZE(adau1372_reg_defaults),
1059
.volatile_reg = adau1372_volatile_register,
1060
.cache_type = REGCACHE_MAPLE,
1061
};
1062
EXPORT_SYMBOL_GPL(adau1372_regmap_config);
1063
1064
const struct of_device_id adau1372_of_match[] = {
1065
{ .compatible = "adi,adau1372" },
1066
{ }
1067
};
1068
EXPORT_SYMBOL_GPL(adau1372_of_match);
1069
MODULE_DEVICE_TABLE(of, adau1372_of_match);
1070
1071
MODULE_DESCRIPTION("ASoC ADAU1372 CODEC driver");
1072
MODULE_AUTHOR("Lars-Peter Clausen <[email protected]>");
1073
MODULE_LICENSE("GPL v2");
1074
1075