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
26struct 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
105static 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
125static const DECLARE_TLV_DB_MINMAX(adau1372_digital_tlv, -9563, 0);
126static const DECLARE_TLV_DB_SCALE(adau1372_pga_tlv, -1200, 75, 0);
127static const DECLARE_TLV_DB_SCALE(adau1372_pga_boost_tlv, 0, 1000, 0);
128
129static const char * const adau1372_bias_text[] = {
130	"Normal operation", "Extreme power saving", "Enhanced performance",
131	"Power saving",
132};
133
134static const unsigned int adau1372_bias_adc_values[] = {
135	0, 2, 3,
136};
137
138static const char * const adau1372_bias_adc_text[] = {
139	"Normal operation", "Enhanced performance", "Power saving",
140};
141
142static const char * const adau1372_bias_dac_text[] = {
143	"Normal operation", "Power saving", "Superior performance",
144	"Enhanced performance",
145};
146
147static SOC_ENUM_SINGLE_DECL(adau1372_bias_hp_enum,
148	ADAU1372_REG_BIAS_CTRL0, 6, adau1372_bias_text);
149static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe0_1_enum,
150	ADAU1372_REG_BIAS_CTRL0, 4, adau1372_bias_text);
151static 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);
154static 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);
157static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe2_3_enum,
158	ADAU1372_REG_BIAS_CTRL1, 4, adau1372_bias_text);
159static SOC_ENUM_SINGLE_DECL(adau1372_bias_mic_enum,
160	ADAU1372_REG_BIAS_CTRL1, 2, adau1372_bias_text);
161static SOC_ENUM_SINGLE_DECL(adau1372_bias_dac_enum,
162	ADAU1372_REG_BIAS_CTRL1, 0, adau1372_bias_dac_text);
163
164static const char * const adau1372_hpf_text[] = {
165	"Off",
166	"1 Hz",
167	"4 Hz",
168	"8 Hz",
169};
170
171static SOC_ENUM_SINGLE_DECL(adau1372_hpf0_1_enum, ADAU1372_REG_ADC_CTRL2, 5,
172			    adau1372_hpf_text);
173static SOC_ENUM_SINGLE_DECL(adau1372_hpf2_3_enum, ADAU1372_REG_ADC_CTRL3, 5,
174			    adau1372_hpf_text);
175static 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
229static const char * const adau1372_decimator_mux_text[] = {
230	"ADC",
231	"DMIC",
232};
233
234static SOC_ENUM_SINGLE_DECL(adau1372_decimator0_1_mux_enum, ADAU1372_REG_ADC_CTRL2,
235			    2, adau1372_decimator_mux_text);
236
237static 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
240static SOC_ENUM_SINGLE_DECL(adau1372_decimator2_3_mux_enum, ADAU1372_REG_ADC_CTRL3,
241			    2, adau1372_decimator_mux_text);
242
243static 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
246static const unsigned int adau1372_asrco_mux_values[] = {
247	4, 5, 6, 7,
248};
249
250static const char * const adau1372_asrco_mux_text[] = {
251	"Decimator0",
252	"Decimator1",
253	"Decimator2",
254	"Decimator3",
255};
256
257static 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);
259static 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);
261static 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);
263static 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
266static const struct snd_kcontrol_new adau1372_asrco0_mux_control =
267	SOC_DAPM_ENUM("Output ASRC0 Capture Mux", adau1372_asrco0_mux_enum);
268static const struct snd_kcontrol_new adau1372_asrco1_mux_control =
269	SOC_DAPM_ENUM("Output ASRC1 Capture Mux", adau1372_asrco1_mux_enum);
270static const struct snd_kcontrol_new adau1372_asrco2_mux_control =
271	SOC_DAPM_ENUM("Output ASRC2 Capture Mux", adau1372_asrco2_mux_enum);
272static const struct snd_kcontrol_new adau1372_asrco3_mux_control =
273	SOC_DAPM_ENUM("Output ASRC3 Capture Mux", adau1372_asrco3_mux_enum);
274
275static const unsigned int adau1372_sout_mux_values[] = {
276	4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
277};
278
279static 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
294static 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);
296static 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);
298static 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);
300static 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);
302static 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);
304static 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);
306static 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);
308static 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
311static const struct snd_kcontrol_new adau1372_sout0_mux_control =
312	SOC_DAPM_ENUM("Serial Output 0 Capture Mux", adau1372_sout0_mux_enum);
313static const struct snd_kcontrol_new adau1372_sout1_mux_control =
314	SOC_DAPM_ENUM("Serial Output 1 Capture Mux", adau1372_sout1_mux_enum);
315static const struct snd_kcontrol_new adau1372_sout2_mux_control =
316	SOC_DAPM_ENUM("Serial Output 2 Capture Mux", adau1372_sout2_mux_enum);
317static const struct snd_kcontrol_new adau1372_sout3_mux_control =
318	SOC_DAPM_ENUM("Serial Output 3 Capture Mux", adau1372_sout3_mux_enum);
319static const struct snd_kcontrol_new adau1372_sout4_mux_control =
320	SOC_DAPM_ENUM("Serial Output 4 Capture Mux", adau1372_sout4_mux_enum);
321static const struct snd_kcontrol_new adau1372_sout5_mux_control =
322	SOC_DAPM_ENUM("Serial Output 5 Capture Mux", adau1372_sout5_mux_enum);
323static const struct snd_kcontrol_new adau1372_sout6_mux_control =
324	SOC_DAPM_ENUM("Serial Output 6 Capture Mux", adau1372_sout6_mux_enum);
325static const struct snd_kcontrol_new adau1372_sout7_mux_control =
326	SOC_DAPM_ENUM("Serial Output 7 Capture Mux", adau1372_sout7_mux_enum);
327
328static 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
335static SOC_ENUM_SINGLE_DECL(adau1372_asrci_mux_enum,
336	ADAU1372_REG_ASRC_MODE, 2, adau1372_asrci_mux_text);
337
338static const struct snd_kcontrol_new adau1372_asrci_mux_control =
339	SOC_DAPM_ENUM("Input ASRC Playback Mux", adau1372_asrci_mux_enum);
340
341static const unsigned int adau1372_dac_mux_values[] = {
342	12, 13
343};
344
345static const char * const adau1372_dac_mux_text[] = {
346	"Input ASRC0",
347	"Input ASRC1",
348};
349
350static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_dac0_mux_enum, ADAU1372_REG_DAC_SOURCE,
351				  0, 0xf, adau1372_dac_mux_text, adau1372_dac_mux_values);
352static 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
355static const struct snd_kcontrol_new adau1372_dac0_mux_control =
356	SOC_DAPM_ENUM("DAC 0 Playback Mux", adau1372_dac0_mux_enum);
357static const struct snd_kcontrol_new adau1372_dac1_mux_control =
358	SOC_DAPM_ENUM("DAC 1 Playback Mux", adau1372_dac1_mux_enum);
359
360static 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
481static 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
573static 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
637static 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
678static 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
741static 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
754static 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
764static 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
784static 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
833static 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
854static 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
865static 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
877static 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
899static 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
915int 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}
991EXPORT_SYMBOL(adau1372_probe);
992
993static 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
1043static 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
1051const 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_MAPLE,
1060};
1061EXPORT_SYMBOL_GPL(adau1372_regmap_config);
1062
1063MODULE_DESCRIPTION("ASoC ADAU1372 CODEC driver");
1064MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
1065MODULE_LICENSE("GPL v2");
1066