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