xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/madera.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Cirrus Logic Madera class codecs common support
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2015-2018 Cirrus Logic, Inc. and
6*4882a593Smuzhiyun  *                         Cirrus Logic International Semiconductor Ltd.
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef ASOC_MADERA_H
10*4882a593Smuzhiyun #define ASOC_MADERA_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/completion.h>
13*4882a593Smuzhiyun #include <sound/soc.h>
14*4882a593Smuzhiyun #include <sound/madera-pdata.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include "wm_adsp.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define MADERA_FLL1_REFCLK		1
19*4882a593Smuzhiyun #define MADERA_FLL2_REFCLK		2
20*4882a593Smuzhiyun #define MADERA_FLL3_REFCLK		3
21*4882a593Smuzhiyun #define MADERA_FLLAO_REFCLK		4
22*4882a593Smuzhiyun #define MADERA_FLL1_SYNCCLK		5
23*4882a593Smuzhiyun #define MADERA_FLL2_SYNCCLK		6
24*4882a593Smuzhiyun #define MADERA_FLL3_SYNCCLK		7
25*4882a593Smuzhiyun #define MADERA_FLLAO_SYNCCLK		8
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define MADERA_FLL_SRC_NONE		-1
28*4882a593Smuzhiyun #define MADERA_FLL_SRC_MCLK1		0
29*4882a593Smuzhiyun #define MADERA_FLL_SRC_MCLK2		1
30*4882a593Smuzhiyun #define MADERA_FLL_SRC_MCLK3		2
31*4882a593Smuzhiyun #define MADERA_FLL_SRC_SLIMCLK		3
32*4882a593Smuzhiyun #define MADERA_FLL_SRC_FLL1		4
33*4882a593Smuzhiyun #define MADERA_FLL_SRC_FLL2		5
34*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF1BCLK		8
35*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF2BCLK		9
36*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF3BCLK		10
37*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF4BCLK		11
38*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF1LRCLK	12
39*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF2LRCLK	13
40*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF3LRCLK	14
41*4882a593Smuzhiyun #define MADERA_FLL_SRC_AIF4LRCLK	15
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define MADERA_CLK_SYSCLK_1		1
44*4882a593Smuzhiyun #define MADERA_CLK_ASYNCCLK_1		2
45*4882a593Smuzhiyun #define MADERA_CLK_OPCLK		3
46*4882a593Smuzhiyun #define MADERA_CLK_ASYNC_OPCLK		4
47*4882a593Smuzhiyun #define MADERA_CLK_SYSCLK_2		5
48*4882a593Smuzhiyun #define MADERA_CLK_SYSCLK_3		6
49*4882a593Smuzhiyun #define MADERA_CLK_ASYNCCLK_2		7
50*4882a593Smuzhiyun #define MADERA_CLK_DSPCLK		8
51*4882a593Smuzhiyun #define MADERA_CLK_OUTCLK		9
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define MADERA_CLK_SRC_MCLK1		0x0
54*4882a593Smuzhiyun #define MADERA_CLK_SRC_MCLK2		0x1
55*4882a593Smuzhiyun #define MADERA_CLK_SRC_MCLK3		0x2
56*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLL1		0x4
57*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLL2		0x5
58*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLL3		0x6
59*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLLAO_HI		0x7
60*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLL1_DIV6	0x7
61*4882a593Smuzhiyun #define MADERA_CLK_SRC_AIF1BCLK		0x8
62*4882a593Smuzhiyun #define MADERA_CLK_SRC_AIF2BCLK		0x9
63*4882a593Smuzhiyun #define MADERA_CLK_SRC_AIF3BCLK		0xA
64*4882a593Smuzhiyun #define MADERA_CLK_SRC_AIF4BCLK		0xB
65*4882a593Smuzhiyun #define MADERA_CLK_SRC_FLLAO		0xF
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define MADERA_OUTCLK_SYSCLK		0
68*4882a593Smuzhiyun #define MADERA_OUTCLK_ASYNCCLK		1
69*4882a593Smuzhiyun #define MADERA_OUTCLK_MCLK1		4
70*4882a593Smuzhiyun #define MADERA_OUTCLK_MCLK2		5
71*4882a593Smuzhiyun #define MADERA_OUTCLK_MCLK3		6
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define MADERA_MIXER_VOL_MASK		0x00FE
74*4882a593Smuzhiyun #define MADERA_MIXER_VOL_SHIFT		1
75*4882a593Smuzhiyun #define MADERA_MIXER_VOL_WIDTH		7
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define MADERA_DOM_GRP_FX		0
78*4882a593Smuzhiyun #define MADERA_DOM_GRP_ASRC1		1
79*4882a593Smuzhiyun #define MADERA_DOM_GRP_ASRC2		2
80*4882a593Smuzhiyun #define MADERA_DOM_GRP_ISRC1		3
81*4882a593Smuzhiyun #define MADERA_DOM_GRP_ISRC2		4
82*4882a593Smuzhiyun #define MADERA_DOM_GRP_ISRC3		5
83*4882a593Smuzhiyun #define MADERA_DOM_GRP_ISRC4		6
84*4882a593Smuzhiyun #define MADERA_DOM_GRP_OUT		7
85*4882a593Smuzhiyun #define MADERA_DOM_GRP_SPD		8
86*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP1		9
87*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP2		10
88*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP3		11
89*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP4		12
90*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP5		13
91*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP6		14
92*4882a593Smuzhiyun #define MADERA_DOM_GRP_DSP7		15
93*4882a593Smuzhiyun #define MADERA_DOM_GRP_AIF1		16
94*4882a593Smuzhiyun #define MADERA_DOM_GRP_AIF2		17
95*4882a593Smuzhiyun #define MADERA_DOM_GRP_AIF3		18
96*4882a593Smuzhiyun #define MADERA_DOM_GRP_AIF4		19
97*4882a593Smuzhiyun #define MADERA_DOM_GRP_SLIMBUS		20
98*4882a593Smuzhiyun #define MADERA_DOM_GRP_PWM		21
99*4882a593Smuzhiyun #define MADERA_DOM_GRP_DFC		22
100*4882a593Smuzhiyun #define MADERA_N_DOM_GRPS		23
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define MADERA_MAX_DAI			11
103*4882a593Smuzhiyun #define MADERA_MAX_ADSP			7
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define MADERA_NUM_MIXER_INPUTS		148
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun struct madera;
108*4882a593Smuzhiyun struct wm_adsp;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun struct madera_voice_trigger_info {
111*4882a593Smuzhiyun 	/** Which core triggered, 1-based (1 = DSP1, ...) */
112*4882a593Smuzhiyun 	int core_num;
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun struct madera_dai_priv {
116*4882a593Smuzhiyun 	int clk;
117*4882a593Smuzhiyun 	struct snd_pcm_hw_constraint_list constraint;
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun struct madera_priv {
121*4882a593Smuzhiyun 	struct wm_adsp adsp[MADERA_MAX_ADSP];
122*4882a593Smuzhiyun 	struct madera *madera;
123*4882a593Smuzhiyun 	struct device *dev;
124*4882a593Smuzhiyun 	int sysclk;
125*4882a593Smuzhiyun 	int asyncclk;
126*4882a593Smuzhiyun 	int dspclk;
127*4882a593Smuzhiyun 	struct madera_dai_priv dai[MADERA_MAX_DAI];
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	int num_inputs;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	unsigned int in_pending;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	unsigned int out_up_pending;
134*4882a593Smuzhiyun 	unsigned int out_up_delay;
135*4882a593Smuzhiyun 	unsigned int out_down_pending;
136*4882a593Smuzhiyun 	unsigned int out_down_delay;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	unsigned int adsp_rate_cache[MADERA_MAX_ADSP];
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	struct mutex rate_lock;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	int tdm_width[MADERA_MAX_AIF];
143*4882a593Smuzhiyun 	int tdm_slots[MADERA_MAX_AIF];
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	int domain_group_ref[MADERA_N_DOM_GRPS];
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun struct madera_fll_cfg {
149*4882a593Smuzhiyun 	int n;
150*4882a593Smuzhiyun 	unsigned int theta;
151*4882a593Smuzhiyun 	unsigned int lambda;
152*4882a593Smuzhiyun 	int refdiv;
153*4882a593Smuzhiyun 	int fratio;
154*4882a593Smuzhiyun 	int gain;
155*4882a593Smuzhiyun 	int alt_gain;
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct madera_fll {
159*4882a593Smuzhiyun 	struct madera *madera;
160*4882a593Smuzhiyun 	int id;
161*4882a593Smuzhiyun 	unsigned int base;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	unsigned int fout;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	int sync_src;
166*4882a593Smuzhiyun 	unsigned int sync_freq;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	int ref_src;
169*4882a593Smuzhiyun 	unsigned int ref_freq;
170*4882a593Smuzhiyun 	struct madera_fll_cfg ref_cfg;
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun struct madera_enum {
174*4882a593Smuzhiyun 	struct soc_enum mixer_enum;
175*4882a593Smuzhiyun 	int val;
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun extern const unsigned int madera_ana_tlv[];
179*4882a593Smuzhiyun extern const unsigned int madera_eq_tlv[];
180*4882a593Smuzhiyun extern const unsigned int madera_digital_tlv[];
181*4882a593Smuzhiyun extern const unsigned int madera_noise_tlv[];
182*4882a593Smuzhiyun extern const unsigned int madera_ng_tlv[];
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun extern const unsigned int madera_mixer_tlv[];
185*4882a593Smuzhiyun extern const char * const madera_mixer_texts[MADERA_NUM_MIXER_INPUTS];
186*4882a593Smuzhiyun extern const unsigned int madera_mixer_values[MADERA_NUM_MIXER_INPUTS];
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #define MADERA_GAINMUX_CONTROLS(name, base) \
189*4882a593Smuzhiyun 	SOC_SINGLE_RANGE_TLV(name " Input Volume", base + 1,		\
190*4882a593Smuzhiyun 			     MADERA_MIXER_VOL_SHIFT, 0x20, 0x50, 0,	\
191*4882a593Smuzhiyun 			     madera_mixer_tlv)
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #define MADERA_MIXER_CONTROLS(name, base) \
194*4882a593Smuzhiyun 	SOC_SINGLE_RANGE_TLV(name " Input 1 Volume", base + 1,		\
195*4882a593Smuzhiyun 			     MADERA_MIXER_VOL_SHIFT, 0x20, 0x50, 0,	\
196*4882a593Smuzhiyun 			     madera_mixer_tlv),			\
197*4882a593Smuzhiyun 	SOC_SINGLE_RANGE_TLV(name " Input 2 Volume", base + 3,		\
198*4882a593Smuzhiyun 			     MADERA_MIXER_VOL_SHIFT, 0x20, 0x50, 0,	\
199*4882a593Smuzhiyun 			     madera_mixer_tlv),			\
200*4882a593Smuzhiyun 	SOC_SINGLE_RANGE_TLV(name " Input 3 Volume", base + 5,		\
201*4882a593Smuzhiyun 			     MADERA_MIXER_VOL_SHIFT, 0x20, 0x50, 0,	\
202*4882a593Smuzhiyun 			     madera_mixer_tlv),			\
203*4882a593Smuzhiyun 	SOC_SINGLE_RANGE_TLV(name " Input 4 Volume", base + 7,		\
204*4882a593Smuzhiyun 			     MADERA_MIXER_VOL_SHIFT, 0x20, 0x50, 0,	\
205*4882a593Smuzhiyun 			     madera_mixer_tlv)
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #define MADERA_MUX_ENUM_DECL(name, reg) \
208*4882a593Smuzhiyun 	SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL( \
209*4882a593Smuzhiyun 		name, reg, 0, 0xff, madera_mixer_texts, madera_mixer_values)
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #define MADERA_MUX_CTL_DECL(name) \
212*4882a593Smuzhiyun 	const struct snd_kcontrol_new name##_mux =	\
213*4882a593Smuzhiyun 		SOC_DAPM_ENUM("Route", name##_enum)
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #define MADERA_MUX_ENUMS(name, base_reg) \
216*4882a593Smuzhiyun 	static MADERA_MUX_ENUM_DECL(name##_enum, base_reg);	\
217*4882a593Smuzhiyun 	static MADERA_MUX_CTL_DECL(name)
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define MADERA_MIXER_ENUMS(name, base_reg) \
220*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_in1, base_reg);     \
221*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_in2, base_reg + 2); \
222*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_in3, base_reg + 4); \
223*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_in4, base_reg + 6)
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #define MADERA_DSP_AUX_ENUMS(name, base_reg) \
226*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux1, base_reg);	\
227*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux2, base_reg + 8);	\
228*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux3, base_reg + 16);	\
229*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux4, base_reg + 24);	\
230*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux5, base_reg + 32);	\
231*4882a593Smuzhiyun 	MADERA_MUX_ENUMS(name##_aux6, base_reg + 40)
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #define MADERA_MUX(name, ctrl) \
234*4882a593Smuzhiyun 	SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun #define MADERA_MUX_WIDGETS(name, name_str) \
237*4882a593Smuzhiyun 	MADERA_MUX(name_str " Input 1", &name##_mux)
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #define MADERA_MIXER_WIDGETS(name, name_str)	\
240*4882a593Smuzhiyun 	MADERA_MUX(name_str " Input 1", &name##_in1_mux), \
241*4882a593Smuzhiyun 	MADERA_MUX(name_str " Input 2", &name##_in2_mux), \
242*4882a593Smuzhiyun 	MADERA_MUX(name_str " Input 3", &name##_in3_mux), \
243*4882a593Smuzhiyun 	MADERA_MUX(name_str " Input 4", &name##_in4_mux), \
244*4882a593Smuzhiyun 	SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #define MADERA_DSP_WIDGETS(name, name_str)			\
247*4882a593Smuzhiyun 	MADERA_MIXER_WIDGETS(name##L, name_str "L"),		\
248*4882a593Smuzhiyun 	MADERA_MIXER_WIDGETS(name##R, name_str "R"),		\
249*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 1", &name##_aux1_mux),	\
250*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 2", &name##_aux2_mux),	\
251*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 3", &name##_aux3_mux),	\
252*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 4", &name##_aux4_mux),	\
253*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 5", &name##_aux5_mux),	\
254*4882a593Smuzhiyun 	MADERA_MUX(name_str " Aux 6", &name##_aux6_mux)
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun #define MADERA_MUX_ROUTES(widget, name) \
257*4882a593Smuzhiyun 	{ widget, NULL, name " Input 1" }, \
258*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Input 1")
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun #define MADERA_MIXER_ROUTES(widget, name)		\
261*4882a593Smuzhiyun 	{ widget, NULL, name " Mixer" },		\
262*4882a593Smuzhiyun 	{ name " Mixer", NULL, name " Input 1" },	\
263*4882a593Smuzhiyun 	{ name " Mixer", NULL, name " Input 2" },	\
264*4882a593Smuzhiyun 	{ name " Mixer", NULL, name " Input 3" },	\
265*4882a593Smuzhiyun 	{ name " Mixer", NULL, name " Input 4" },	\
266*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Input 1"),	\
267*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Input 2"),	\
268*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Input 3"),	\
269*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Input 4")
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #define MADERA_DSP_ROUTES(name)				\
272*4882a593Smuzhiyun 	{ name, NULL, name " Preloader"},		\
273*4882a593Smuzhiyun 	{ name " Preload", NULL, name " Preloader"},	\
274*4882a593Smuzhiyun 	{ name, NULL, "SYSCLK"},			\
275*4882a593Smuzhiyun 	{ name, NULL, "DSPCLK"},			\
276*4882a593Smuzhiyun 	{ name, NULL, name " Aux 1" },			\
277*4882a593Smuzhiyun 	{ name, NULL, name " Aux 2" },			\
278*4882a593Smuzhiyun 	{ name, NULL, name " Aux 3" },			\
279*4882a593Smuzhiyun 	{ name, NULL, name " Aux 4" },			\
280*4882a593Smuzhiyun 	{ name, NULL, name " Aux 5" },			\
281*4882a593Smuzhiyun 	{ name, NULL, name " Aux 6" },			\
282*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 1"),	\
283*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 2"),	\
284*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 3"),	\
285*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 4"),	\
286*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 5"),	\
287*4882a593Smuzhiyun 	MADERA_MIXER_INPUT_ROUTES(name " Aux 6"),	\
288*4882a593Smuzhiyun 	MADERA_MIXER_ROUTES(name, name "L"),		\
289*4882a593Smuzhiyun 	MADERA_MIXER_ROUTES(name, name "R")
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun #define MADERA_RATE_ENUM(xname, xenum) \
292*4882a593Smuzhiyun {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
293*4882a593Smuzhiyun 	.info = snd_soc_info_enum_double, \
294*4882a593Smuzhiyun 	.get = snd_soc_get_enum_double, .put = madera_rate_put, \
295*4882a593Smuzhiyun 	.private_value = (unsigned long)&xenum }
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun #define MADERA_EQ_CONTROL(xname, xbase)				\
298*4882a593Smuzhiyun {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
299*4882a593Smuzhiyun 	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get,	\
300*4882a593Smuzhiyun 	.put = madera_eq_coeff_put, .private_value =		\
301*4882a593Smuzhiyun 	((unsigned long)&(struct soc_bytes) { .base = xbase,	\
302*4882a593Smuzhiyun 	 .num_regs = 20, .mask = ~MADERA_EQ1_B1_MODE }) }
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #define MADERA_LHPF_CONTROL(xname, xbase)			\
305*4882a593Smuzhiyun {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
306*4882a593Smuzhiyun 	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get,	\
307*4882a593Smuzhiyun 	.put = madera_lhpf_coeff_put, .private_value =		\
308*4882a593Smuzhiyun 	((unsigned long)&(struct soc_bytes) { .base = xbase,	\
309*4882a593Smuzhiyun 	 .num_regs = 1 }) }
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun #define MADERA_RATES SNDRV_PCM_RATE_KNOT
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun #define MADERA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
314*4882a593Smuzhiyun 			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun #define MADERA_OSR_ENUM_SIZE		5
317*4882a593Smuzhiyun #define MADERA_SYNC_RATE_ENUM_SIZE	3
318*4882a593Smuzhiyun #define MADERA_ASYNC_RATE_ENUM_SIZE	2
319*4882a593Smuzhiyun #define MADERA_RATE_ENUM_SIZE \
320*4882a593Smuzhiyun 		(MADERA_SYNC_RATE_ENUM_SIZE + MADERA_ASYNC_RATE_ENUM_SIZE)
321*4882a593Smuzhiyun #define MADERA_SAMPLE_RATE_ENUM_SIZE	16
322*4882a593Smuzhiyun #define MADERA_DFC_TYPE_ENUM_SIZE	5
323*4882a593Smuzhiyun #define MADERA_DFC_WIDTH_ENUM_SIZE	5
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun extern const struct snd_soc_dai_ops madera_dai_ops;
326*4882a593Smuzhiyun extern const struct snd_soc_dai_ops madera_simple_dai_ops;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun extern const struct snd_kcontrol_new madera_inmux[];
329*4882a593Smuzhiyun extern const struct snd_kcontrol_new madera_inmode[];
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun extern const char * const madera_rate_text[MADERA_RATE_ENUM_SIZE];
332*4882a593Smuzhiyun extern const unsigned int madera_rate_val[MADERA_RATE_ENUM_SIZE];
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun extern const struct soc_enum madera_sample_rate[];
335*4882a593Smuzhiyun extern const struct soc_enum madera_isrc_fsl[];
336*4882a593Smuzhiyun extern const struct soc_enum madera_isrc_fsh[];
337*4882a593Smuzhiyun extern const struct soc_enum madera_asrc1_rate[];
338*4882a593Smuzhiyun extern const struct soc_enum madera_asrc1_bidir_rate[];
339*4882a593Smuzhiyun extern const struct soc_enum madera_asrc2_rate[];
340*4882a593Smuzhiyun extern const struct soc_enum madera_dfc_width[];
341*4882a593Smuzhiyun extern const struct soc_enum madera_dfc_type[];
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun extern const struct soc_enum madera_in_vi_ramp;
344*4882a593Smuzhiyun extern const struct soc_enum madera_in_vd_ramp;
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun extern const struct soc_enum madera_out_vi_ramp;
347*4882a593Smuzhiyun extern const struct soc_enum madera_out_vd_ramp;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun extern const struct soc_enum madera_lhpf1_mode;
350*4882a593Smuzhiyun extern const struct soc_enum madera_lhpf2_mode;
351*4882a593Smuzhiyun extern const struct soc_enum madera_lhpf3_mode;
352*4882a593Smuzhiyun extern const struct soc_enum madera_lhpf4_mode;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun extern const struct soc_enum madera_ng_hold;
355*4882a593Smuzhiyun extern const struct soc_enum madera_in_hpf_cut_enum;
356*4882a593Smuzhiyun extern const struct soc_enum madera_in_dmic_osr[];
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun extern const struct soc_enum madera_output_anc_src[];
359*4882a593Smuzhiyun extern const struct soc_enum madera_anc_input_src[];
360*4882a593Smuzhiyun extern const struct soc_enum madera_anc_ng_enum;
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun extern const struct snd_kcontrol_new madera_dsp_trigger_output_mux[];
363*4882a593Smuzhiyun extern const struct snd_kcontrol_new madera_drc_activity_output_mux[];
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun extern const struct snd_kcontrol_new madera_adsp_rate_controls[];
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun int madera_dfc_put(struct snd_kcontrol *kcontrol,
368*4882a593Smuzhiyun 		   struct snd_ctl_elem_value *ucontrol);
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun int madera_lp_mode_put(struct snd_kcontrol *kcontrol,
371*4882a593Smuzhiyun 		       struct snd_ctl_elem_value *ucontrol);
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun int madera_out1_demux_put(struct snd_kcontrol *kcontrol,
374*4882a593Smuzhiyun 			  struct snd_ctl_elem_value *ucontrol);
375*4882a593Smuzhiyun int madera_out1_demux_get(struct snd_kcontrol *kcontrol,
376*4882a593Smuzhiyun 			  struct snd_ctl_elem_value *ucontrol);
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun int madera_rate_put(struct snd_kcontrol *kcontrol,
379*4882a593Smuzhiyun 		    struct snd_ctl_elem_value *ucontrol);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun int madera_eq_coeff_put(struct snd_kcontrol *kcontrol,
382*4882a593Smuzhiyun 			struct snd_ctl_elem_value *ucontrol);
383*4882a593Smuzhiyun int madera_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
384*4882a593Smuzhiyun 			  struct snd_ctl_elem_value *ucontrol);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun int madera_clk_ev(struct snd_soc_dapm_widget *w,
387*4882a593Smuzhiyun 		  struct snd_kcontrol *kcontrol, int event);
388*4882a593Smuzhiyun int madera_sysclk_ev(struct snd_soc_dapm_widget *w,
389*4882a593Smuzhiyun 		     struct snd_kcontrol *kcontrol, int event);
390*4882a593Smuzhiyun int madera_spk_ev(struct snd_soc_dapm_widget *w,
391*4882a593Smuzhiyun 		  struct snd_kcontrol *kcontrol, int event);
392*4882a593Smuzhiyun int madera_in_ev(struct snd_soc_dapm_widget *w,
393*4882a593Smuzhiyun 		 struct snd_kcontrol *kcontrol, int event);
394*4882a593Smuzhiyun int madera_out_ev(struct snd_soc_dapm_widget *w,
395*4882a593Smuzhiyun 		  struct snd_kcontrol *kcontrol, int event);
396*4882a593Smuzhiyun int madera_hp_ev(struct snd_soc_dapm_widget *w,
397*4882a593Smuzhiyun 		 struct snd_kcontrol *kcontrol, int event);
398*4882a593Smuzhiyun int madera_anc_ev(struct snd_soc_dapm_widget *w,
399*4882a593Smuzhiyun 		  struct snd_kcontrol *kcontrol, int event);
400*4882a593Smuzhiyun int madera_domain_clk_ev(struct snd_soc_dapm_widget *w,
401*4882a593Smuzhiyun 			 struct snd_kcontrol *kcontrol,
402*4882a593Smuzhiyun 			 int event);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun int madera_set_adsp_clk(struct madera_priv *priv, int dsp_num,
405*4882a593Smuzhiyun 			unsigned int freq);
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun int madera_set_sysclk(struct snd_soc_component *component, int clk_id,
408*4882a593Smuzhiyun 		      int source, unsigned int freq, int dir);
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun int madera_init_fll(struct madera *madera, int id, int base,
411*4882a593Smuzhiyun 		    struct madera_fll *fll);
412*4882a593Smuzhiyun int madera_set_fll_refclk(struct madera_fll *fll, int source,
413*4882a593Smuzhiyun 			  unsigned int fref, unsigned int fout);
414*4882a593Smuzhiyun int madera_set_fll_syncclk(struct madera_fll *fll, int source,
415*4882a593Smuzhiyun 			   unsigned int fref, unsigned int fout);
416*4882a593Smuzhiyun int madera_set_fll_ao_refclk(struct madera_fll *fll, int source,
417*4882a593Smuzhiyun 			     unsigned int fin, unsigned int fout);
418*4882a593Smuzhiyun int madera_fllhj_set_refclk(struct madera_fll *fll, int source,
419*4882a593Smuzhiyun 			    unsigned int fin, unsigned int fout);
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun int madera_core_init(struct madera_priv *priv);
422*4882a593Smuzhiyun int madera_core_free(struct madera_priv *priv);
423*4882a593Smuzhiyun int madera_init_overheat(struct madera_priv *priv);
424*4882a593Smuzhiyun int madera_free_overheat(struct madera_priv *priv);
425*4882a593Smuzhiyun int madera_init_inputs(struct snd_soc_component *component);
426*4882a593Smuzhiyun int madera_init_outputs(struct snd_soc_component *component,
427*4882a593Smuzhiyun 			const struct snd_soc_dapm_route *routes,
428*4882a593Smuzhiyun 			int n_mono_routes, int n_real);
429*4882a593Smuzhiyun int madera_init_bus_error_irq(struct madera_priv *priv, int dsp_num,
430*4882a593Smuzhiyun 			      irq_handler_t handler);
431*4882a593Smuzhiyun void madera_free_bus_error_irq(struct madera_priv *priv, int dsp_num);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun int madera_init_dai(struct madera_priv *priv, int dai);
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun int madera_set_output_mode(struct snd_soc_component *component, int output,
436*4882a593Smuzhiyun 			   bool differential);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun /* Following functions are for use by machine drivers */
madera_register_notifier(struct snd_soc_component * component,struct notifier_block * nb)439*4882a593Smuzhiyun static inline int madera_register_notifier(struct snd_soc_component *component,
440*4882a593Smuzhiyun 					   struct notifier_block *nb)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun 	struct madera_priv *priv = snd_soc_component_get_drvdata(component);
443*4882a593Smuzhiyun 	struct madera *madera = priv->madera;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	return blocking_notifier_chain_register(&madera->notifier, nb);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun static inline int
madera_unregister_notifier(struct snd_soc_component * component,struct notifier_block * nb)449*4882a593Smuzhiyun madera_unregister_notifier(struct snd_soc_component *component,
450*4882a593Smuzhiyun 			   struct notifier_block *nb)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun 	struct madera_priv *priv = snd_soc_component_get_drvdata(component);
453*4882a593Smuzhiyun 	struct madera *madera = priv->madera;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	return blocking_notifier_chain_unregister(&madera->notifier, nb);
456*4882a593Smuzhiyun }
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun #endif
459