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