1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * wm8998.c -- ALSA SoC Audio driver for WM8998 codecs
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2015 Cirrus Logic, Inc.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/moduleparam.h>
12*4882a593Smuzhiyun #include <linux/init.h>
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/pm.h>
15*4882a593Smuzhiyun #include <linux/pm_runtime.h>
16*4882a593Smuzhiyun #include <linux/regmap.h>
17*4882a593Smuzhiyun #include <linux/slab.h>
18*4882a593Smuzhiyun #include <sound/core.h>
19*4882a593Smuzhiyun #include <sound/pcm.h>
20*4882a593Smuzhiyun #include <sound/pcm_params.h>
21*4882a593Smuzhiyun #include <sound/soc.h>
22*4882a593Smuzhiyun #include <sound/jack.h>
23*4882a593Smuzhiyun #include <sound/initval.h>
24*4882a593Smuzhiyun #include <sound/tlv.h>
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #include <linux/mfd/arizona/core.h>
27*4882a593Smuzhiyun #include <linux/mfd/arizona/registers.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #include "arizona.h"
30*4882a593Smuzhiyun #include "wm8998.h"
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct wm8998_priv {
33*4882a593Smuzhiyun struct arizona_priv core;
34*4882a593Smuzhiyun struct arizona_fll fll[2];
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
wm8998_asrc_ev(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)37*4882a593Smuzhiyun static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w,
38*4882a593Smuzhiyun struct snd_kcontrol *kcontrol,
39*4882a593Smuzhiyun int event)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
42*4882a593Smuzhiyun unsigned int val;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun switch (event) {
45*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
46*4882a593Smuzhiyun val = snd_soc_component_read(component, ARIZONA_ASRC_RATE1);
47*4882a593Smuzhiyun val &= ARIZONA_ASRC_RATE1_MASK;
48*4882a593Smuzhiyun val >>= ARIZONA_ASRC_RATE1_SHIFT;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun switch (val) {
51*4882a593Smuzhiyun case 0:
52*4882a593Smuzhiyun case 1:
53*4882a593Smuzhiyun case 2:
54*4882a593Smuzhiyun val = snd_soc_component_read(component,
55*4882a593Smuzhiyun ARIZONA_SAMPLE_RATE_1 + val);
56*4882a593Smuzhiyun if (val >= 0x11) {
57*4882a593Smuzhiyun dev_warn(component->dev,
58*4882a593Smuzhiyun "Unsupported ASRC rate1 (%s)\n",
59*4882a593Smuzhiyun arizona_sample_rate_val_to_name(val));
60*4882a593Smuzhiyun return -EINVAL;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun break;
63*4882a593Smuzhiyun default:
64*4882a593Smuzhiyun dev_err(component->dev,
65*4882a593Smuzhiyun "Illegal ASRC rate1 selector (0x%x)\n",
66*4882a593Smuzhiyun val);
67*4882a593Smuzhiyun return -EINVAL;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun val = snd_soc_component_read(component, ARIZONA_ASRC_RATE2);
71*4882a593Smuzhiyun val &= ARIZONA_ASRC_RATE2_MASK;
72*4882a593Smuzhiyun val >>= ARIZONA_ASRC_RATE2_SHIFT;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun switch (val) {
75*4882a593Smuzhiyun case 8:
76*4882a593Smuzhiyun case 9:
77*4882a593Smuzhiyun val -= 0x8;
78*4882a593Smuzhiyun val = snd_soc_component_read(component,
79*4882a593Smuzhiyun ARIZONA_ASYNC_SAMPLE_RATE_1 + val);
80*4882a593Smuzhiyun if (val >= 0x11) {
81*4882a593Smuzhiyun dev_warn(component->dev,
82*4882a593Smuzhiyun "Unsupported ASRC rate2 (%s)\n",
83*4882a593Smuzhiyun arizona_sample_rate_val_to_name(val));
84*4882a593Smuzhiyun return -EINVAL;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun break;
87*4882a593Smuzhiyun default:
88*4882a593Smuzhiyun dev_err(component->dev,
89*4882a593Smuzhiyun "Illegal ASRC rate2 selector (0x%x)\n",
90*4882a593Smuzhiyun val);
91*4882a593Smuzhiyun return -EINVAL;
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun break;
94*4882a593Smuzhiyun default:
95*4882a593Smuzhiyun return -EINVAL;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun return 0;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
wm8998_inmux_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)101*4882a593Smuzhiyun static int wm8998_inmux_put(struct snd_kcontrol *kcontrol,
102*4882a593Smuzhiyun struct snd_ctl_elem_value *ucontrol)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol);
105*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
106*4882a593Smuzhiyun struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component);
107*4882a593Smuzhiyun struct arizona *arizona = wm8998->core.arizona;
108*4882a593Smuzhiyun struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
109*4882a593Smuzhiyun unsigned int mode_reg, mode_index;
110*4882a593Smuzhiyun unsigned int mux, inmode, src_val, mode_val;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun mux = ucontrol->value.enumerated.item[0];
113*4882a593Smuzhiyun if (mux > 1)
114*4882a593Smuzhiyun return -EINVAL;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun switch (e->reg) {
117*4882a593Smuzhiyun case ARIZONA_ADC_DIGITAL_VOLUME_2L:
118*4882a593Smuzhiyun mode_reg = ARIZONA_IN2L_CONTROL;
119*4882a593Smuzhiyun mode_index = 1 + (2 * mux);
120*4882a593Smuzhiyun break;
121*4882a593Smuzhiyun default:
122*4882a593Smuzhiyun mode_reg = ARIZONA_IN1L_CONTROL;
123*4882a593Smuzhiyun mode_index = (2 * mux);
124*4882a593Smuzhiyun break;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun inmode = arizona->pdata.inmode[mode_index];
128*4882a593Smuzhiyun if (inmode & ARIZONA_INMODE_DMIC)
129*4882a593Smuzhiyun mode_val = 1 << ARIZONA_IN1_MODE_SHIFT;
130*4882a593Smuzhiyun else
131*4882a593Smuzhiyun mode_val = 0;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun src_val = mux << ARIZONA_IN1L_SRC_SHIFT;
134*4882a593Smuzhiyun if (inmode & ARIZONA_INMODE_SE)
135*4882a593Smuzhiyun src_val |= 1 << ARIZONA_IN1L_SRC_SE_SHIFT;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun snd_soc_component_update_bits(component, mode_reg,
138*4882a593Smuzhiyun ARIZONA_IN1_MODE_MASK, mode_val);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun snd_soc_component_update_bits(component, e->reg,
141*4882a593Smuzhiyun ARIZONA_IN1L_SRC_MASK |
142*4882a593Smuzhiyun ARIZONA_IN1L_SRC_SE_MASK,
143*4882a593Smuzhiyun src_val);
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun return snd_soc_dapm_mux_update_power(dapm, kcontrol,
146*4882a593Smuzhiyun ucontrol->value.enumerated.item[0],
147*4882a593Smuzhiyun e, NULL);
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun static const char * const wm8998_inmux_texts[] = {
151*4882a593Smuzhiyun "A",
152*4882a593Smuzhiyun "B",
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(wm8998_in1muxl_enum,
156*4882a593Smuzhiyun ARIZONA_ADC_DIGITAL_VOLUME_1L,
157*4882a593Smuzhiyun ARIZONA_IN1L_SRC_SHIFT,
158*4882a593Smuzhiyun wm8998_inmux_texts);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(wm8998_in1muxr_enum,
161*4882a593Smuzhiyun ARIZONA_ADC_DIGITAL_VOLUME_1R,
162*4882a593Smuzhiyun ARIZONA_IN1R_SRC_SHIFT,
163*4882a593Smuzhiyun wm8998_inmux_texts);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(wm8998_in2mux_enum,
166*4882a593Smuzhiyun ARIZONA_ADC_DIGITAL_VOLUME_2L,
167*4882a593Smuzhiyun ARIZONA_IN2L_SRC_SHIFT,
168*4882a593Smuzhiyun wm8998_inmux_texts);
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun static const struct snd_kcontrol_new wm8998_in1mux[2] = {
171*4882a593Smuzhiyun SOC_DAPM_ENUM_EXT("IN1L Mux", wm8998_in1muxl_enum,
172*4882a593Smuzhiyun snd_soc_dapm_get_enum_double, wm8998_inmux_put),
173*4882a593Smuzhiyun SOC_DAPM_ENUM_EXT("IN1R Mux", wm8998_in1muxr_enum,
174*4882a593Smuzhiyun snd_soc_dapm_get_enum_double, wm8998_inmux_put),
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun static const struct snd_kcontrol_new wm8998_in2mux =
178*4882a593Smuzhiyun SOC_DAPM_ENUM_EXT("IN2 Mux", wm8998_in2mux_enum,
179*4882a593Smuzhiyun snd_soc_dapm_get_enum_double, wm8998_inmux_put);
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
182*4882a593Smuzhiyun static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
183*4882a593Smuzhiyun static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
184*4882a593Smuzhiyun static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun #define WM8998_NG_SRC(name, base) \
187*4882a593Smuzhiyun SOC_SINGLE(name " NG HPOUTL Switch", base, 0, 1, 0), \
188*4882a593Smuzhiyun SOC_SINGLE(name " NG HPOUTR Switch", base, 1, 1, 0), \
189*4882a593Smuzhiyun SOC_SINGLE(name " NG LINEOUTL Switch", base, 2, 1, 0), \
190*4882a593Smuzhiyun SOC_SINGLE(name " NG LINEOUTR Switch", base, 3, 1, 0), \
191*4882a593Smuzhiyun SOC_SINGLE(name " NG EPOUT Switch", base, 4, 1, 0), \
192*4882a593Smuzhiyun SOC_SINGLE(name " NG SPKOUTL Switch", base, 6, 1, 0), \
193*4882a593Smuzhiyun SOC_SINGLE(name " NG SPKOUTR Switch", base, 7, 1, 0)
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun static const struct snd_kcontrol_new wm8998_snd_controls[] = {
196*4882a593Smuzhiyun SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
197*4882a593Smuzhiyun SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun SOC_SINGLE_RANGE_TLV("IN1L Volume", ARIZONA_IN1L_CONTROL,
200*4882a593Smuzhiyun ARIZONA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
201*4882a593Smuzhiyun SOC_SINGLE_RANGE_TLV("IN1R Volume", ARIZONA_IN1R_CONTROL,
202*4882a593Smuzhiyun ARIZONA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
203*4882a593Smuzhiyun SOC_SINGLE_RANGE_TLV("IN2 Volume", ARIZONA_IN2L_CONTROL,
204*4882a593Smuzhiyun ARIZONA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum),
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL,
209*4882a593Smuzhiyun ARIZONA_IN1L_HPF_SHIFT, 1, 0),
210*4882a593Smuzhiyun SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL,
211*4882a593Smuzhiyun ARIZONA_IN1R_HPF_SHIFT, 1, 0),
212*4882a593Smuzhiyun SOC_SINGLE("IN2 HPF Switch", ARIZONA_IN2L_CONTROL,
213*4882a593Smuzhiyun ARIZONA_IN2L_HPF_SHIFT, 1, 0),
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
216*4882a593Smuzhiyun ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
217*4882a593Smuzhiyun SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
218*4882a593Smuzhiyun ARIZONA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
219*4882a593Smuzhiyun SOC_SINGLE_TLV("IN2 Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
220*4882a593Smuzhiyun ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
223*4882a593Smuzhiyun SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
226*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
227*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
228*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun SND_SOC_BYTES("EQ1 Coefficients", ARIZONA_EQ1_3, 19),
231*4882a593Smuzhiyun SOC_SINGLE("EQ1 Mode Switch", ARIZONA_EQ1_2, ARIZONA_EQ1_B1_MODE_SHIFT, 1, 0),
232*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
233*4882a593Smuzhiyun 24, 0, eq_tlv),
234*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ1 B2 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B2_GAIN_SHIFT,
235*4882a593Smuzhiyun 24, 0, eq_tlv),
236*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ1 B3 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B3_GAIN_SHIFT,
237*4882a593Smuzhiyun 24, 0, eq_tlv),
238*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ1 B4 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B4_GAIN_SHIFT,
239*4882a593Smuzhiyun 24, 0, eq_tlv),
240*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ1 B5 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B5_GAIN_SHIFT,
241*4882a593Smuzhiyun 24, 0, eq_tlv),
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun SND_SOC_BYTES("EQ2 Coefficients", ARIZONA_EQ2_3, 19),
244*4882a593Smuzhiyun SOC_SINGLE("EQ2 Mode Switch", ARIZONA_EQ2_2, ARIZONA_EQ2_B1_MODE_SHIFT, 1, 0),
245*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ2 B1 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B1_GAIN_SHIFT,
246*4882a593Smuzhiyun 24, 0, eq_tlv),
247*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ2 B2 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B2_GAIN_SHIFT,
248*4882a593Smuzhiyun 24, 0, eq_tlv),
249*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ2 B3 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B3_GAIN_SHIFT,
250*4882a593Smuzhiyun 24, 0, eq_tlv),
251*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ2 B4 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B4_GAIN_SHIFT,
252*4882a593Smuzhiyun 24, 0, eq_tlv),
253*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ2 B5 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B5_GAIN_SHIFT,
254*4882a593Smuzhiyun 24, 0, eq_tlv),
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun SND_SOC_BYTES("EQ3 Coefficients", ARIZONA_EQ3_3, 19),
257*4882a593Smuzhiyun SOC_SINGLE("EQ3 Mode Switch", ARIZONA_EQ3_2, ARIZONA_EQ3_B1_MODE_SHIFT, 1, 0),
258*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ3 B1 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B1_GAIN_SHIFT,
259*4882a593Smuzhiyun 24, 0, eq_tlv),
260*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ3 B2 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B2_GAIN_SHIFT,
261*4882a593Smuzhiyun 24, 0, eq_tlv),
262*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ3 B3 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B3_GAIN_SHIFT,
263*4882a593Smuzhiyun 24, 0, eq_tlv),
264*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ3 B4 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B4_GAIN_SHIFT,
265*4882a593Smuzhiyun 24, 0, eq_tlv),
266*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ3 B5 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B5_GAIN_SHIFT,
267*4882a593Smuzhiyun 24, 0, eq_tlv),
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun SND_SOC_BYTES("EQ4 Coefficients", ARIZONA_EQ4_3, 19),
270*4882a593Smuzhiyun SOC_SINGLE("EQ4 Mode Switch", ARIZONA_EQ4_2, ARIZONA_EQ4_B1_MODE_SHIFT, 1, 0),
271*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ4 B1 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B1_GAIN_SHIFT,
272*4882a593Smuzhiyun 24, 0, eq_tlv),
273*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ4 B2 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B2_GAIN_SHIFT,
274*4882a593Smuzhiyun 24, 0, eq_tlv),
275*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ4 B3 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B3_GAIN_SHIFT,
276*4882a593Smuzhiyun 24, 0, eq_tlv),
277*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ4 B4 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B4_GAIN_SHIFT,
278*4882a593Smuzhiyun 24, 0, eq_tlv),
279*4882a593Smuzhiyun SOC_SINGLE_TLV("EQ4 B5 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B5_GAIN_SHIFT,
280*4882a593Smuzhiyun 24, 0, eq_tlv),
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
283*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
286*4882a593Smuzhiyun ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE),
289*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE),
290*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE),
291*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE),
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1),
294*4882a593Smuzhiyun SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1),
295*4882a593Smuzhiyun SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1),
296*4882a593Smuzhiyun SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1),
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
299*4882a593Smuzhiyun SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
300*4882a593Smuzhiyun SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
301*4882a593Smuzhiyun SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
304*4882a593Smuzhiyun SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
305*4882a593Smuzhiyun SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
306*4882a593Smuzhiyun SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
307*4882a593Smuzhiyun SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("HPOUTL", ARIZONA_OUT1LMIX_INPUT_1_SOURCE),
310*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("HPOUTR", ARIZONA_OUT1RMIX_INPUT_1_SOURCE),
311*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LINEOUTL", ARIZONA_OUT2LMIX_INPUT_1_SOURCE),
312*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("LINEOUTR", ARIZONA_OUT2RMIX_INPUT_1_SOURCE),
313*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("EPOUT", ARIZONA_OUT3LMIX_INPUT_1_SOURCE),
314*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("SPKOUTL", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
315*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("SPKOUTR", ARIZONA_OUT4RMIX_INPUT_1_SOURCE),
316*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("SPKDATL", ARIZONA_OUT5LMIX_INPUT_1_SOURCE),
317*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("SPKDATR", ARIZONA_OUT5RMIX_INPUT_1_SOURCE),
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun SOC_DOUBLE_R("HPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
320*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
321*4882a593Smuzhiyun SOC_DOUBLE_R("LINEOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
322*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
323*4882a593Smuzhiyun SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
324*4882a593Smuzhiyun ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
325*4882a593Smuzhiyun SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
326*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
327*4882a593Smuzhiyun SOC_DOUBLE_R("SPKDAT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
328*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_MUTE_SHIFT, 1, 1),
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun SOC_DOUBLE_R_TLV("HPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
331*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
332*4882a593Smuzhiyun 0xbf, 0, digital_tlv),
333*4882a593Smuzhiyun SOC_DOUBLE_R_TLV("LINEOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
334*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
335*4882a593Smuzhiyun 0xbf, 0, digital_tlv),
336*4882a593Smuzhiyun SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
337*4882a593Smuzhiyun ARIZONA_OUT3L_VOL_SHIFT, 0xbf, 0, digital_tlv),
338*4882a593Smuzhiyun SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
339*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_VOL_SHIFT,
340*4882a593Smuzhiyun 0xbf, 0, digital_tlv),
341*4882a593Smuzhiyun SOC_DOUBLE_R_TLV("SPKDAT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
342*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_VOL_SHIFT,
343*4882a593Smuzhiyun 0xbf, 0, digital_tlv),
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun SOC_DOUBLE("SPKDAT Switch", ARIZONA_PDM_SPK1_CTRL_1, ARIZONA_SPK1L_MUTE_SHIFT,
346*4882a593Smuzhiyun ARIZONA_SPK1R_MUTE_SHIFT, 1, 1),
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
349*4882a593Smuzhiyun SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun SOC_SINGLE("Noise Gate Switch", ARIZONA_NOISE_GATE_CONTROL,
352*4882a593Smuzhiyun ARIZONA_NGATE_ENA_SHIFT, 1, 0),
353*4882a593Smuzhiyun SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
354*4882a593Smuzhiyun ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
355*4882a593Smuzhiyun SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun WM8998_NG_SRC("HPOUTL", ARIZONA_NOISE_GATE_SELECT_1L),
358*4882a593Smuzhiyun WM8998_NG_SRC("HPOUTR", ARIZONA_NOISE_GATE_SELECT_1R),
359*4882a593Smuzhiyun WM8998_NG_SRC("LINEOUTL", ARIZONA_NOISE_GATE_SELECT_2L),
360*4882a593Smuzhiyun WM8998_NG_SRC("LINEOUTR", ARIZONA_NOISE_GATE_SELECT_2R),
361*4882a593Smuzhiyun WM8998_NG_SRC("EPOUT", ARIZONA_NOISE_GATE_SELECT_3L),
362*4882a593Smuzhiyun WM8998_NG_SRC("SPKOUTL", ARIZONA_NOISE_GATE_SELECT_4L),
363*4882a593Smuzhiyun WM8998_NG_SRC("SPKOUTR", ARIZONA_NOISE_GATE_SELECT_4R),
364*4882a593Smuzhiyun WM8998_NG_SRC("SPKDATL", ARIZONA_NOISE_GATE_SELECT_5L),
365*4882a593Smuzhiyun WM8998_NG_SRC("SPKDATR", ARIZONA_NOISE_GATE_SELECT_5R),
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX1", ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE),
368*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX2", ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE),
369*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX3", ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE),
370*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX4", ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE),
371*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX5", ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE),
372*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF1TX6", ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE),
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),
375*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
376*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE),
377*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE),
378*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE),
379*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
382*4882a593Smuzhiyun ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX1", ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE),
385*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX2", ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE),
386*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX3", ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE),
387*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX4", ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE),
388*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX5", ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE),
389*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SLIMTX6", ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE),
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SPDIFTX1", ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE),
392*4882a593Smuzhiyun ARIZONA_GAINMUX_CONTROLS("SPDIFTX2", ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE),
393*4882a593Smuzhiyun };
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
396*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
397*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
398*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(EQ4, ARIZONA_EQ4MIX_INPUT_1_SOURCE);
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
401*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE);
404*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
405*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);
406*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE);
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(PWM1, ARIZONA_PWM1MIX_INPUT_1_SOURCE);
409*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(PWM2, ARIZONA_PWM2MIX_INPUT_1_SOURCE);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(OUT1L, ARIZONA_OUT1LMIX_INPUT_1_SOURCE);
412*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(OUT1R, ARIZONA_OUT1RMIX_INPUT_1_SOURCE);
413*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(OUT2L, ARIZONA_OUT2LMIX_INPUT_1_SOURCE);
414*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(OUT2R, ARIZONA_OUT2RMIX_INPUT_1_SOURCE);
415*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(OUT3, ARIZONA_OUT3LMIX_INPUT_1_SOURCE);
416*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(SPKOUTL, ARIZONA_OUT4LMIX_INPUT_1_SOURCE);
417*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(SPKOUTR, ARIZONA_OUT4RMIX_INPUT_1_SOURCE);
418*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(SPKDATL, ARIZONA_OUT5LMIX_INPUT_1_SOURCE);
419*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(SPKDATR, ARIZONA_OUT5RMIX_INPUT_1_SOURCE);
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX1, ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE);
422*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX2, ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE);
423*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX3, ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE);
424*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX4, ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE);
425*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX5, ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE);
426*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF1TX6, ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE);
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);
429*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
430*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE);
431*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE);
432*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE);
433*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
436*4882a593Smuzhiyun ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX1, ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE);
439*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX2, ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE);
440*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX3, ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE);
441*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX4, ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE);
442*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX5, ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE);
443*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SLIMTX6, ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE);
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SPD1TX1, ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE);
446*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(SPD1TX2, ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
449*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
450*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
451*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ASRC2R, ARIZONA_ASRC2RMIX_INPUT_1_SOURCE);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1INT1, ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE);
454*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1INT2, ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE);
455*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1INT3, ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE);
456*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1INT4, ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE);
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1DEC1, ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE);
459*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1DEC2, ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE);
460*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1DEC3, ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE);
461*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC1DEC4, ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE);
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC2INT1, ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE);
464*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC2INT2, ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE);
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE);
467*4882a593Smuzhiyun ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE);
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun static const char * const wm8998_aec_loopback_texts[] = {
470*4882a593Smuzhiyun "HPOUTL", "HPOUTR", "LINEOUTL", "LINEOUTR", "EPOUT",
471*4882a593Smuzhiyun "SPKOUTL", "SPKOUTR", "SPKDATL", "SPKDATR",
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun static const unsigned int wm8998_aec_loopback_values[] = {
475*4882a593Smuzhiyun 0, 1, 2, 3, 4, 6, 7, 8, 9,
476*4882a593Smuzhiyun };
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec1_loopback,
479*4882a593Smuzhiyun ARIZONA_DAC_AEC_CONTROL_1,
480*4882a593Smuzhiyun ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
481*4882a593Smuzhiyun wm8998_aec_loopback_texts,
482*4882a593Smuzhiyun wm8998_aec_loopback_values);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec2_loopback,
485*4882a593Smuzhiyun ARIZONA_DAC_AEC_CONTROL_2,
486*4882a593Smuzhiyun ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
487*4882a593Smuzhiyun wm8998_aec_loopback_texts,
488*4882a593Smuzhiyun wm8998_aec_loopback_values);
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun static const struct snd_kcontrol_new wm8998_aec_loopback_mux[] = {
491*4882a593Smuzhiyun SOC_DAPM_ENUM("AEC1 Loopback", wm8998_aec1_loopback),
492*4882a593Smuzhiyun SOC_DAPM_ENUM("AEC2 Loopback", wm8998_aec2_loopback),
493*4882a593Smuzhiyun };
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun static const struct snd_soc_dapm_widget wm8998_dapm_widgets[] = {
496*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
497*4882a593Smuzhiyun ARIZONA_SYSCLK_ENA_SHIFT, 0, arizona_clk_ev,
498*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
499*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
500*4882a593Smuzhiyun ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
501*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
502*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
503*4882a593Smuzhiyun ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
504*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
505*4882a593Smuzhiyun ARIZONA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
508*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
509*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
510*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
511*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDL", 0, 0),
512*4882a593Smuzhiyun SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDR", 0, 0),
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun SND_SOC_DAPM_SIGGEN("TONE"),
515*4882a593Smuzhiyun SND_SOC_DAPM_SIGGEN("HAPTICS"),
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1AL"),
518*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1AR"),
519*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1BL"),
520*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1BR"),
521*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN2A"),
522*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN2B"),
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IN1L Mux", SND_SOC_NOPM, 0, 0, &wm8998_in1mux[0]),
525*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IN1R Mux", SND_SOC_NOPM, 0, 0, &wm8998_in1mux[1]),
526*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IN2 Mux", SND_SOC_NOPM, 0, 0, &wm8998_in2mux),
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT,
531*4882a593Smuzhiyun 0, NULL, 0, arizona_in_ev,
532*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
533*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
534*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT,
535*4882a593Smuzhiyun 0, NULL, 0, arizona_in_ev,
536*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
537*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
538*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("IN2 PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT,
539*4882a593Smuzhiyun 0, NULL, 0, arizona_in_ev,
540*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
541*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1,
544*4882a593Smuzhiyun ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
545*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS2", ARIZONA_MIC_BIAS_CTRL_2,
546*4882a593Smuzhiyun ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
547*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS3", ARIZONA_MIC_BIAS_CTRL_3,
548*4882a593Smuzhiyun ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Tone Generator 1", ARIZONA_TONE_GENERATOR_1,
551*4882a593Smuzhiyun ARIZONA_TONE1_ENA_SHIFT, 0, NULL, 0),
552*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Tone Generator 2", ARIZONA_TONE_GENERATOR_1,
553*4882a593Smuzhiyun ARIZONA_TONE2_ENA_SHIFT, 0, NULL, 0),
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun SND_SOC_DAPM_PGA("EQ1", ARIZONA_EQ1_1, ARIZONA_EQ1_ENA_SHIFT, 0, NULL, 0),
556*4882a593Smuzhiyun SND_SOC_DAPM_PGA("EQ2", ARIZONA_EQ2_1, ARIZONA_EQ2_ENA_SHIFT, 0, NULL, 0),
557*4882a593Smuzhiyun SND_SOC_DAPM_PGA("EQ3", ARIZONA_EQ3_1, ARIZONA_EQ3_ENA_SHIFT, 0, NULL, 0),
558*4882a593Smuzhiyun SND_SOC_DAPM_PGA("EQ4", ARIZONA_EQ4_1, ARIZONA_EQ4_ENA_SHIFT, 0, NULL, 0),
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
561*4882a593Smuzhiyun NULL, 0),
562*4882a593Smuzhiyun SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
563*4882a593Smuzhiyun NULL, 0),
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0,
566*4882a593Smuzhiyun NULL, 0),
567*4882a593Smuzhiyun SND_SOC_DAPM_PGA("LHPF2", ARIZONA_HPLPF2_1, ARIZONA_LHPF2_ENA_SHIFT, 0,
568*4882a593Smuzhiyun NULL, 0),
569*4882a593Smuzhiyun SND_SOC_DAPM_PGA("LHPF3", ARIZONA_HPLPF3_1, ARIZONA_LHPF3_ENA_SHIFT, 0,
570*4882a593Smuzhiyun NULL, 0),
571*4882a593Smuzhiyun SND_SOC_DAPM_PGA("LHPF4", ARIZONA_HPLPF4_1, ARIZONA_LHPF4_ENA_SHIFT, 0,
572*4882a593Smuzhiyun NULL, 0),
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun SND_SOC_DAPM_PGA("PWM1 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM1_ENA_SHIFT,
575*4882a593Smuzhiyun 0, NULL, 0),
576*4882a593Smuzhiyun SND_SOC_DAPM_PGA("PWM2 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM2_ENA_SHIFT,
577*4882a593Smuzhiyun 0, NULL, 0),
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("ASRC1L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1L_ENA_SHIFT, 0,
580*4882a593Smuzhiyun NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
581*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("ASRC1R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1R_ENA_SHIFT, 0,
582*4882a593Smuzhiyun NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
583*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
584*4882a593Smuzhiyun NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
585*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
586*4882a593Smuzhiyun NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1INT1", ARIZONA_ISRC_1_CTRL_3,
589*4882a593Smuzhiyun ARIZONA_ISRC1_INT0_ENA_SHIFT, 0, NULL, 0),
590*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1INT2", ARIZONA_ISRC_1_CTRL_3,
591*4882a593Smuzhiyun ARIZONA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),
592*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1INT3", ARIZONA_ISRC_1_CTRL_3,
593*4882a593Smuzhiyun ARIZONA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),
594*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1INT4", ARIZONA_ISRC_1_CTRL_3,
595*4882a593Smuzhiyun ARIZONA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1DEC1", ARIZONA_ISRC_1_CTRL_3,
598*4882a593Smuzhiyun ARIZONA_ISRC1_DEC0_ENA_SHIFT, 0, NULL, 0),
599*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1DEC2", ARIZONA_ISRC_1_CTRL_3,
600*4882a593Smuzhiyun ARIZONA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),
601*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1DEC3", ARIZONA_ISRC_1_CTRL_3,
602*4882a593Smuzhiyun ARIZONA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),
603*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC1DEC4", ARIZONA_ISRC_1_CTRL_3,
604*4882a593Smuzhiyun ARIZONA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC2INT1", ARIZONA_ISRC_2_CTRL_3,
607*4882a593Smuzhiyun ARIZONA_ISRC2_INT0_ENA_SHIFT, 0, NULL, 0),
608*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC2INT2", ARIZONA_ISRC_2_CTRL_3,
609*4882a593Smuzhiyun ARIZONA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC2DEC1", ARIZONA_ISRC_2_CTRL_3,
612*4882a593Smuzhiyun ARIZONA_ISRC2_DEC0_ENA_SHIFT, 0, NULL, 0),
613*4882a593Smuzhiyun SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3,
614*4882a593Smuzhiyun ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun SND_SOC_DAPM_MUX("AEC1 Loopback", ARIZONA_DAC_AEC_CONTROL_1,
617*4882a593Smuzhiyun ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
618*4882a593Smuzhiyun &wm8998_aec_loopback_mux[0]),
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun SND_SOC_DAPM_MUX("AEC2 Loopback", ARIZONA_DAC_AEC_CONTROL_2,
621*4882a593Smuzhiyun ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
622*4882a593Smuzhiyun &wm8998_aec_loopback_mux[1]),
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
625*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
626*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 1,
627*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX2_ENA_SHIFT, 0),
628*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 2,
629*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX3_ENA_SHIFT, 0),
630*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 3,
631*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX4_ENA_SHIFT, 0),
632*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 4,
633*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX5_ENA_SHIFT, 0),
634*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 5,
635*4882a593Smuzhiyun ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX6_ENA_SHIFT, 0),
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
638*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX1_ENA_SHIFT, 0),
639*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 1,
640*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX2_ENA_SHIFT, 0),
641*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 2,
642*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX3_ENA_SHIFT, 0),
643*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 3,
644*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX4_ENA_SHIFT, 0),
645*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 4,
646*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX5_ENA_SHIFT, 0),
647*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 5,
648*4882a593Smuzhiyun ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX6_ENA_SHIFT, 0),
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
651*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
652*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 1,
653*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
654*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 2,
655*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
656*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 3,
657*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
658*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 4,
659*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
660*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 5,
661*4882a593Smuzhiyun ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
664*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),
665*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 1,
666*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
667*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 2,
668*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
669*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 3,
670*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
671*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 4,
672*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
673*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 5,
674*4882a593Smuzhiyun ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,
677*4882a593Smuzhiyun ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
678*4882a593Smuzhiyun ARIZONA_SLIMRX1_ENA_SHIFT, 0),
679*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("SLIMRX2", NULL, 1,
680*4882a593Smuzhiyun ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
681*4882a593Smuzhiyun ARIZONA_SLIMRX2_ENA_SHIFT, 0),
682*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("SLIMRX3", NULL, 2,
683*4882a593Smuzhiyun ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
684*4882a593Smuzhiyun ARIZONA_SLIMRX3_ENA_SHIFT, 0),
685*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("SLIMRX4", NULL, 3,
686*4882a593Smuzhiyun ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
687*4882a593Smuzhiyun ARIZONA_SLIMRX4_ENA_SHIFT, 0),
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX1", NULL, 0,
690*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
691*4882a593Smuzhiyun ARIZONA_SLIMTX1_ENA_SHIFT, 0),
692*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX2", NULL, 1,
693*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
694*4882a593Smuzhiyun ARIZONA_SLIMTX2_ENA_SHIFT, 0),
695*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX3", NULL, 2,
696*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
697*4882a593Smuzhiyun ARIZONA_SLIMTX3_ENA_SHIFT, 0),
698*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX4", NULL, 3,
699*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
700*4882a593Smuzhiyun ARIZONA_SLIMTX4_ENA_SHIFT, 0),
701*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX5", NULL, 4,
702*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
703*4882a593Smuzhiyun ARIZONA_SLIMTX5_ENA_SHIFT, 0),
704*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SLIMTX6", NULL, 5,
705*4882a593Smuzhiyun ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
706*4882a593Smuzhiyun ARIZONA_SLIMTX6_ENA_SHIFT, 0),
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
709*4882a593Smuzhiyun ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
710*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 1,
711*4882a593Smuzhiyun ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX2_ENA_SHIFT, 0),
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
714*4882a593Smuzhiyun ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX1_ENA_SHIFT, 0),
715*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 1,
716*4882a593Smuzhiyun ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0),
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
719*4882a593Smuzhiyun ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
720*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
721*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
722*4882a593Smuzhiyun ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
723*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
724*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
725*4882a593Smuzhiyun ARIZONA_OUT2L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
726*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
727*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
728*4882a593Smuzhiyun ARIZONA_OUT2R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
729*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
730*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT3", ARIZONA_OUTPUT_ENABLES_1,
731*4882a593Smuzhiyun ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
732*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
733*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
734*4882a593Smuzhiyun ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
735*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
736*4882a593Smuzhiyun SND_SOC_DAPM_PGA_E("OUT5R", ARIZONA_OUTPUT_ENABLES_1,
737*4882a593Smuzhiyun ARIZONA_OUT5R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
738*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun SND_SOC_DAPM_PGA("SPD1TX1", ARIZONA_SPD1_TX_CONTROL,
741*4882a593Smuzhiyun ARIZONA_SPD1_VAL1_SHIFT, 0, NULL, 0),
742*4882a593Smuzhiyun SND_SOC_DAPM_PGA("SPD1TX2", ARIZONA_SPD1_TX_CONTROL,
743*4882a593Smuzhiyun ARIZONA_SPD1_VAL2_SHIFT, 0, NULL, 0),
744*4882a593Smuzhiyun SND_SOC_DAPM_OUT_DRV("SPD1", ARIZONA_SPD1_TX_CONTROL,
745*4882a593Smuzhiyun ARIZONA_SPD1_ENA_SHIFT, 0, NULL, 0),
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(EQ1, "EQ1"),
748*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(EQ2, "EQ2"),
749*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(EQ3, "EQ3"),
750*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(EQ4, "EQ4"),
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(DRC1L, "DRC1L"),
753*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(DRC1R, "DRC1R"),
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"),
756*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"),
757*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(LHPF3, "LHPF3"),
758*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(LHPF4, "LHPF4"),
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(PWM1, "PWM1"),
761*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(PWM2, "PWM2"),
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(OUT1L, "HPOUTL"),
764*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUTR"),
765*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(OUT2L, "LINEOUTL"),
766*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(OUT2R, "LINEOUTR"),
767*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(OUT3, "EPOUT"),
768*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
769*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(SPKOUTR, "SPKOUTR"),
770*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(SPKDATL, "SPKDATL"),
771*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(SPKDATR, "SPKDATR"),
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
774*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
775*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
776*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
777*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
778*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
781*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
782*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
783*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
784*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"),
785*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
788*4882a593Smuzhiyun ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX1, "SLIMTX1"),
791*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX2, "SLIMTX2"),
792*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX3, "SLIMTX3"),
793*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX4, "SLIMTX4"),
794*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX5, "SLIMTX5"),
795*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SLIMTX6, "SLIMTX6"),
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SPD1TX1, "SPDIFTX1"),
798*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(SPD1TX2, "SPDIFTX2"),
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
801*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
802*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
803*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),
806*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),
807*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),
808*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),
811*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),
812*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),
813*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),
816*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
819*4882a593Smuzhiyun ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOUTL"),
822*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOUTR"),
823*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("LINEOUTL"),
824*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("LINEOUTR"),
825*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("EPOUT"),
826*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKOUTLN"),
827*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKOUTLP"),
828*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKOUTRN"),
829*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKOUTRP"),
830*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKDATL"),
831*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPKDATR"),
832*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPDIF"),
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("MICSUPP"),
835*4882a593Smuzhiyun };
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun #define ARIZONA_MIXER_INPUT_ROUTES(name) \
838*4882a593Smuzhiyun { name, "Tone Generator 1", "Tone Generator 1" }, \
839*4882a593Smuzhiyun { name, "Tone Generator 2", "Tone Generator 2" }, \
840*4882a593Smuzhiyun { name, "Haptics", "HAPTICS" }, \
841*4882a593Smuzhiyun { name, "AEC", "AEC1 Loopback" }, \
842*4882a593Smuzhiyun { name, "AEC2", "AEC2 Loopback" }, \
843*4882a593Smuzhiyun { name, "IN1L", "IN1L PGA" }, \
844*4882a593Smuzhiyun { name, "IN1R", "IN1R PGA" }, \
845*4882a593Smuzhiyun { name, "IN2L", "IN2 PGA" }, \
846*4882a593Smuzhiyun { name, "AIF1RX1", "AIF1RX1" }, \
847*4882a593Smuzhiyun { name, "AIF1RX2", "AIF1RX2" }, \
848*4882a593Smuzhiyun { name, "AIF1RX3", "AIF1RX3" }, \
849*4882a593Smuzhiyun { name, "AIF1RX4", "AIF1RX4" }, \
850*4882a593Smuzhiyun { name, "AIF1RX5", "AIF1RX5" }, \
851*4882a593Smuzhiyun { name, "AIF1RX6", "AIF1RX6" }, \
852*4882a593Smuzhiyun { name, "AIF2RX1", "AIF2RX1" }, \
853*4882a593Smuzhiyun { name, "AIF2RX2", "AIF2RX2" }, \
854*4882a593Smuzhiyun { name, "AIF2RX3", "AIF2RX3" }, \
855*4882a593Smuzhiyun { name, "AIF2RX4", "AIF2RX4" }, \
856*4882a593Smuzhiyun { name, "AIF2RX5", "AIF2RX5" }, \
857*4882a593Smuzhiyun { name, "AIF2RX6", "AIF2RX6" }, \
858*4882a593Smuzhiyun { name, "AIF3RX1", "AIF3RX1" }, \
859*4882a593Smuzhiyun { name, "AIF3RX2", "AIF3RX2" }, \
860*4882a593Smuzhiyun { name, "SLIMRX1", "SLIMRX1" }, \
861*4882a593Smuzhiyun { name, "SLIMRX2", "SLIMRX2" }, \
862*4882a593Smuzhiyun { name, "SLIMRX3", "SLIMRX3" }, \
863*4882a593Smuzhiyun { name, "SLIMRX4", "SLIMRX4" }, \
864*4882a593Smuzhiyun { name, "EQ1", "EQ1" }, \
865*4882a593Smuzhiyun { name, "EQ2", "EQ2" }, \
866*4882a593Smuzhiyun { name, "EQ3", "EQ3" }, \
867*4882a593Smuzhiyun { name, "EQ4", "EQ4" }, \
868*4882a593Smuzhiyun { name, "DRC1L", "DRC1L" }, \
869*4882a593Smuzhiyun { name, "DRC1R", "DRC1R" }, \
870*4882a593Smuzhiyun { name, "LHPF1", "LHPF1" }, \
871*4882a593Smuzhiyun { name, "LHPF2", "LHPF2" }, \
872*4882a593Smuzhiyun { name, "LHPF3", "LHPF3" }, \
873*4882a593Smuzhiyun { name, "LHPF4", "LHPF4" }, \
874*4882a593Smuzhiyun { name, "ASRC1L", "ASRC1L" }, \
875*4882a593Smuzhiyun { name, "ASRC1R", "ASRC1R" }, \
876*4882a593Smuzhiyun { name, "ASRC2L", "ASRC2L" }, \
877*4882a593Smuzhiyun { name, "ASRC2R", "ASRC2R" }, \
878*4882a593Smuzhiyun { name, "ISRC1DEC1", "ISRC1DEC1" }, \
879*4882a593Smuzhiyun { name, "ISRC1DEC2", "ISRC1DEC2" }, \
880*4882a593Smuzhiyun { name, "ISRC1DEC3", "ISRC1DEC3" }, \
881*4882a593Smuzhiyun { name, "ISRC1DEC4", "ISRC1DEC4" }, \
882*4882a593Smuzhiyun { name, "ISRC1INT1", "ISRC1INT1" }, \
883*4882a593Smuzhiyun { name, "ISRC1INT2", "ISRC1INT2" }, \
884*4882a593Smuzhiyun { name, "ISRC1INT3", "ISRC1INT3" }, \
885*4882a593Smuzhiyun { name, "ISRC1INT4", "ISRC1INT4" }, \
886*4882a593Smuzhiyun { name, "ISRC2DEC1", "ISRC2DEC1" }, \
887*4882a593Smuzhiyun { name, "ISRC2DEC2", "ISRC2DEC2" }, \
888*4882a593Smuzhiyun { name, "ISRC2INT1", "ISRC2INT1" }, \
889*4882a593Smuzhiyun { name, "ISRC2INT2", "ISRC2INT2" }
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun static const struct snd_soc_dapm_route wm8998_dapm_routes[] = {
892*4882a593Smuzhiyun { "AIF2 Capture", NULL, "DBVDD2" },
893*4882a593Smuzhiyun { "AIF2 Playback", NULL, "DBVDD2" },
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun { "AIF3 Capture", NULL, "DBVDD3" },
896*4882a593Smuzhiyun { "AIF3 Playback", NULL, "DBVDD3" },
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun { "OUT1L", NULL, "CPVDD" },
899*4882a593Smuzhiyun { "OUT1R", NULL, "CPVDD" },
900*4882a593Smuzhiyun { "OUT2L", NULL, "CPVDD" },
901*4882a593Smuzhiyun { "OUT2R", NULL, "CPVDD" },
902*4882a593Smuzhiyun { "OUT3", NULL, "CPVDD" },
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun { "OUT4L", NULL, "SPKVDDL" },
905*4882a593Smuzhiyun { "OUT4R", NULL, "SPKVDDR" },
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun { "OUT1L", NULL, "SYSCLK" },
908*4882a593Smuzhiyun { "OUT1R", NULL, "SYSCLK" },
909*4882a593Smuzhiyun { "OUT2L", NULL, "SYSCLK" },
910*4882a593Smuzhiyun { "OUT2R", NULL, "SYSCLK" },
911*4882a593Smuzhiyun { "OUT3", NULL, "SYSCLK" },
912*4882a593Smuzhiyun { "OUT4L", NULL, "SYSCLK" },
913*4882a593Smuzhiyun { "OUT4R", NULL, "SYSCLK" },
914*4882a593Smuzhiyun { "OUT5L", NULL, "SYSCLK" },
915*4882a593Smuzhiyun { "OUT5R", NULL, "SYSCLK" },
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun { "IN1AL", NULL, "SYSCLK" },
918*4882a593Smuzhiyun { "IN1AR", NULL, "SYSCLK" },
919*4882a593Smuzhiyun { "IN1BL", NULL, "SYSCLK" },
920*4882a593Smuzhiyun { "IN1BR", NULL, "SYSCLK" },
921*4882a593Smuzhiyun { "IN2A", NULL, "SYSCLK" },
922*4882a593Smuzhiyun { "IN2B", NULL, "SYSCLK" },
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun { "ASRC1L", NULL, "SYSCLK" },
925*4882a593Smuzhiyun { "ASRC1R", NULL, "SYSCLK" },
926*4882a593Smuzhiyun { "ASRC2L", NULL, "SYSCLK" },
927*4882a593Smuzhiyun { "ASRC2R", NULL, "SYSCLK" },
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun { "ASRC1L", NULL, "ASYNCCLK" },
930*4882a593Smuzhiyun { "ASRC1R", NULL, "ASYNCCLK" },
931*4882a593Smuzhiyun { "ASRC2L", NULL, "ASYNCCLK" },
932*4882a593Smuzhiyun { "ASRC2R", NULL, "ASYNCCLK" },
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun { "SPD1", NULL, "SYSCLK" },
935*4882a593Smuzhiyun { "SPD1", NULL, "SPD1TX1" },
936*4882a593Smuzhiyun { "SPD1", NULL, "SPD1TX2" },
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun { "MICBIAS1", NULL, "MICVDD" },
939*4882a593Smuzhiyun { "MICBIAS2", NULL, "MICVDD" },
940*4882a593Smuzhiyun { "MICBIAS3", NULL, "MICVDD" },
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun { "Tone Generator 1", NULL, "SYSCLK" },
943*4882a593Smuzhiyun { "Tone Generator 2", NULL, "SYSCLK" },
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun { "Tone Generator 1", NULL, "TONE" },
946*4882a593Smuzhiyun { "Tone Generator 2", NULL, "TONE" },
947*4882a593Smuzhiyun
948*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX1" },
949*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX2" },
950*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX3" },
951*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX4" },
952*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX5" },
953*4882a593Smuzhiyun { "AIF1 Capture", NULL, "AIF1TX6" },
954*4882a593Smuzhiyun
955*4882a593Smuzhiyun { "AIF1RX1", NULL, "AIF1 Playback" },
956*4882a593Smuzhiyun { "AIF1RX2", NULL, "AIF1 Playback" },
957*4882a593Smuzhiyun { "AIF1RX3", NULL, "AIF1 Playback" },
958*4882a593Smuzhiyun { "AIF1RX4", NULL, "AIF1 Playback" },
959*4882a593Smuzhiyun { "AIF1RX5", NULL, "AIF1 Playback" },
960*4882a593Smuzhiyun { "AIF1RX6", NULL, "AIF1 Playback" },
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX1" },
963*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX2" },
964*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX3" },
965*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX4" },
966*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX5" },
967*4882a593Smuzhiyun { "AIF2 Capture", NULL, "AIF2TX6" },
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun { "AIF2RX1", NULL, "AIF2 Playback" },
970*4882a593Smuzhiyun { "AIF2RX2", NULL, "AIF2 Playback" },
971*4882a593Smuzhiyun { "AIF2RX3", NULL, "AIF2 Playback" },
972*4882a593Smuzhiyun { "AIF2RX4", NULL, "AIF2 Playback" },
973*4882a593Smuzhiyun { "AIF2RX5", NULL, "AIF2 Playback" },
974*4882a593Smuzhiyun { "AIF2RX6", NULL, "AIF2 Playback" },
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun { "AIF3 Capture", NULL, "AIF3TX1" },
977*4882a593Smuzhiyun { "AIF3 Capture", NULL, "AIF3TX2" },
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun { "AIF3RX1", NULL, "AIF3 Playback" },
980*4882a593Smuzhiyun { "AIF3RX2", NULL, "AIF3 Playback" },
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun { "Slim1 Capture", NULL, "SLIMTX1" },
983*4882a593Smuzhiyun { "Slim1 Capture", NULL, "SLIMTX2" },
984*4882a593Smuzhiyun { "Slim1 Capture", NULL, "SLIMTX3" },
985*4882a593Smuzhiyun { "Slim1 Capture", NULL, "SLIMTX4" },
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun { "Slim2 Capture", NULL, "SLIMTX5" },
988*4882a593Smuzhiyun { "Slim2 Capture", NULL, "SLIMTX6" },
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun { "SLIMRX1", NULL, "Slim1 Playback" },
991*4882a593Smuzhiyun { "SLIMRX2", NULL, "Slim1 Playback" },
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun { "SLIMRX3", NULL, "Slim2 Playback" },
994*4882a593Smuzhiyun { "SLIMRX4", NULL, "Slim2 Playback" },
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun { "AIF1 Playback", NULL, "SYSCLK" },
997*4882a593Smuzhiyun { "AIF2 Playback", NULL, "SYSCLK" },
998*4882a593Smuzhiyun { "AIF3 Playback", NULL, "SYSCLK" },
999*4882a593Smuzhiyun { "Slim1 Playback", NULL, "SYSCLK" },
1000*4882a593Smuzhiyun { "Slim2 Playback", NULL, "SYSCLK" },
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun { "AIF1 Capture", NULL, "SYSCLK" },
1003*4882a593Smuzhiyun { "AIF2 Capture", NULL, "SYSCLK" },
1004*4882a593Smuzhiyun { "AIF3 Capture", NULL, "SYSCLK" },
1005*4882a593Smuzhiyun { "Slim1 Capture", NULL, "SYSCLK" },
1006*4882a593Smuzhiyun { "Slim2 Capture", NULL, "SYSCLK" },
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun { "IN1L Mux", "A", "IN1AL" },
1009*4882a593Smuzhiyun { "IN1R Mux", "A", "IN1AR" },
1010*4882a593Smuzhiyun { "IN1L Mux", "B", "IN1BL" },
1011*4882a593Smuzhiyun { "IN1R Mux", "B", "IN1BR" },
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun { "IN2 Mux", "A", "IN2A" },
1014*4882a593Smuzhiyun { "IN2 Mux", "B", "IN2B" },
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun { "IN1L PGA", NULL, "IN1L Mux" },
1017*4882a593Smuzhiyun { "IN1R PGA", NULL, "IN1R Mux" },
1018*4882a593Smuzhiyun { "IN2 PGA", NULL, "IN2 Mux" },
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT1L", "HPOUTL"),
1021*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT1R", "HPOUTR"),
1022*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT2L", "LINEOUTL"),
1023*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT2R", "LINEOUTR"),
1024*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT3", "EPOUT"),
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUTL"),
1027*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT4R", "SPKOUTR"),
1028*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT5L", "SPKDATL"),
1029*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("OUT5R", "SPKDATR"),
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("PWM1 Driver", "PWM1"),
1032*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("PWM2 Driver", "PWM2"),
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
1035*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
1036*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
1037*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
1038*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
1039*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
1042*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
1043*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
1044*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
1045*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"),
1046*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
1049*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX1", "SLIMTX1"),
1052*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX2", "SLIMTX2"),
1053*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX3", "SLIMTX3"),
1054*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX4", "SLIMTX4"),
1055*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX5", "SLIMTX5"),
1056*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SLIMTX6", "SLIMTX6"),
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SPD1TX1", "SPDIFTX1"),
1059*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("SPD1TX2", "SPDIFTX2"),
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("EQ1", "EQ1"),
1062*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("EQ2", "EQ2"),
1063*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("EQ3", "EQ3"),
1064*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("EQ4", "EQ4"),
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("DRC1L", "DRC1L"),
1067*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("DRC1R", "DRC1R"),
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"),
1070*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"),
1071*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("LHPF3", "LHPF3"),
1072*4882a593Smuzhiyun ARIZONA_MIXER_ROUTES("LHPF4", "LHPF4"),
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ASRC1L", "ASRC1L"),
1075*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ASRC1R", "ASRC1R"),
1076*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
1077*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
1080*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
1081*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),
1082*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
1085*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
1086*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
1087*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
1090*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
1093*4882a593Smuzhiyun ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun { "AEC1 Loopback", "HPOUTL", "OUT1L" },
1096*4882a593Smuzhiyun { "AEC1 Loopback", "HPOUTR", "OUT1R" },
1097*4882a593Smuzhiyun { "AEC2 Loopback", "HPOUTL", "OUT1L" },
1098*4882a593Smuzhiyun { "AEC2 Loopback", "HPOUTR", "OUT1R" },
1099*4882a593Smuzhiyun { "HPOUTL", NULL, "OUT1L" },
1100*4882a593Smuzhiyun { "HPOUTR", NULL, "OUT1R" },
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun { "AEC1 Loopback", "LINEOUTL", "OUT2L" },
1103*4882a593Smuzhiyun { "AEC1 Loopback", "LINEOUTR", "OUT2R" },
1104*4882a593Smuzhiyun { "AEC2 Loopback", "LINEOUTL", "OUT2L" },
1105*4882a593Smuzhiyun { "AEC2 Loopback", "LINEOUTR", "OUT2R" },
1106*4882a593Smuzhiyun { "LINEOUTL", NULL, "OUT2L" },
1107*4882a593Smuzhiyun { "LINEOUTR", NULL, "OUT2R" },
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun { "AEC1 Loopback", "EPOUT", "OUT3" },
1110*4882a593Smuzhiyun { "AEC2 Loopback", "EPOUT", "OUT3" },
1111*4882a593Smuzhiyun { "EPOUT", NULL, "OUT3" },
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun { "AEC1 Loopback", "SPKOUTL", "OUT4L" },
1114*4882a593Smuzhiyun { "AEC2 Loopback", "SPKOUTL", "OUT4L" },
1115*4882a593Smuzhiyun { "SPKOUTLN", NULL, "OUT4L" },
1116*4882a593Smuzhiyun { "SPKOUTLP", NULL, "OUT4L" },
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun { "AEC1 Loopback", "SPKOUTR", "OUT4R" },
1119*4882a593Smuzhiyun { "AEC2 Loopback", "SPKOUTR", "OUT4R" },
1120*4882a593Smuzhiyun { "SPKOUTRN", NULL, "OUT4R" },
1121*4882a593Smuzhiyun { "SPKOUTRP", NULL, "OUT4R" },
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun { "SPDIF", NULL, "SPD1" },
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun { "AEC1 Loopback", "SPKDATL", "OUT5L" },
1126*4882a593Smuzhiyun { "AEC1 Loopback", "SPKDATR", "OUT5R" },
1127*4882a593Smuzhiyun { "AEC2 Loopback", "SPKDATL", "OUT5L" },
1128*4882a593Smuzhiyun { "AEC2 Loopback", "SPKDATR", "OUT5R" },
1129*4882a593Smuzhiyun { "SPKDATL", NULL, "OUT5L" },
1130*4882a593Smuzhiyun { "SPKDATR", NULL, "OUT5R" },
1131*4882a593Smuzhiyun
1132*4882a593Smuzhiyun { "MICSUPP", NULL, "SYSCLK" },
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun { "DRC1 Signal Activity", NULL, "SYSCLK" },
1135*4882a593Smuzhiyun { "DRC1 Signal Activity", NULL, "DRC1L" },
1136*4882a593Smuzhiyun { "DRC1 Signal Activity", NULL, "DRC1R" },
1137*4882a593Smuzhiyun };
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun #define WM8998_RATES SNDRV_PCM_RATE_KNOT
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun #define WM8998_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1142*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun static struct snd_soc_dai_driver wm8998_dai[] = {
1145*4882a593Smuzhiyun {
1146*4882a593Smuzhiyun .name = "wm8998-aif1",
1147*4882a593Smuzhiyun .id = 1,
1148*4882a593Smuzhiyun .base = ARIZONA_AIF1_BCLK_CTRL,
1149*4882a593Smuzhiyun .playback = {
1150*4882a593Smuzhiyun .stream_name = "AIF1 Playback",
1151*4882a593Smuzhiyun .channels_min = 1,
1152*4882a593Smuzhiyun .channels_max = 6,
1153*4882a593Smuzhiyun .rates = WM8998_RATES,
1154*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1155*4882a593Smuzhiyun },
1156*4882a593Smuzhiyun .capture = {
1157*4882a593Smuzhiyun .stream_name = "AIF1 Capture",
1158*4882a593Smuzhiyun .channels_min = 1,
1159*4882a593Smuzhiyun .channels_max = 6,
1160*4882a593Smuzhiyun .rates = WM8998_RATES,
1161*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1162*4882a593Smuzhiyun },
1163*4882a593Smuzhiyun .ops = &arizona_dai_ops,
1164*4882a593Smuzhiyun .symmetric_rates = 1,
1165*4882a593Smuzhiyun .symmetric_samplebits = 1,
1166*4882a593Smuzhiyun },
1167*4882a593Smuzhiyun {
1168*4882a593Smuzhiyun .name = "wm8998-aif2",
1169*4882a593Smuzhiyun .id = 2,
1170*4882a593Smuzhiyun .base = ARIZONA_AIF2_BCLK_CTRL,
1171*4882a593Smuzhiyun .playback = {
1172*4882a593Smuzhiyun .stream_name = "AIF2 Playback",
1173*4882a593Smuzhiyun .channels_min = 1,
1174*4882a593Smuzhiyun .channels_max = 6,
1175*4882a593Smuzhiyun .rates = WM8998_RATES,
1176*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1177*4882a593Smuzhiyun },
1178*4882a593Smuzhiyun .capture = {
1179*4882a593Smuzhiyun .stream_name = "AIF2 Capture",
1180*4882a593Smuzhiyun .channels_min = 1,
1181*4882a593Smuzhiyun .channels_max = 6,
1182*4882a593Smuzhiyun .rates = WM8998_RATES,
1183*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1184*4882a593Smuzhiyun },
1185*4882a593Smuzhiyun .ops = &arizona_dai_ops,
1186*4882a593Smuzhiyun .symmetric_rates = 1,
1187*4882a593Smuzhiyun .symmetric_samplebits = 1,
1188*4882a593Smuzhiyun },
1189*4882a593Smuzhiyun {
1190*4882a593Smuzhiyun .name = "wm8998-aif3",
1191*4882a593Smuzhiyun .id = 3,
1192*4882a593Smuzhiyun .base = ARIZONA_AIF3_BCLK_CTRL,
1193*4882a593Smuzhiyun .playback = {
1194*4882a593Smuzhiyun .stream_name = "AIF3 Playback",
1195*4882a593Smuzhiyun .channels_min = 1,
1196*4882a593Smuzhiyun .channels_max = 2,
1197*4882a593Smuzhiyun .rates = WM8998_RATES,
1198*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1199*4882a593Smuzhiyun },
1200*4882a593Smuzhiyun .capture = {
1201*4882a593Smuzhiyun .stream_name = "AIF3 Capture",
1202*4882a593Smuzhiyun .channels_min = 1,
1203*4882a593Smuzhiyun .channels_max = 2,
1204*4882a593Smuzhiyun .rates = WM8998_RATES,
1205*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1206*4882a593Smuzhiyun },
1207*4882a593Smuzhiyun .ops = &arizona_dai_ops,
1208*4882a593Smuzhiyun .symmetric_rates = 1,
1209*4882a593Smuzhiyun .symmetric_samplebits = 1,
1210*4882a593Smuzhiyun },
1211*4882a593Smuzhiyun {
1212*4882a593Smuzhiyun .name = "wm8998-slim1",
1213*4882a593Smuzhiyun .id = 4,
1214*4882a593Smuzhiyun .playback = {
1215*4882a593Smuzhiyun .stream_name = "Slim1 Playback",
1216*4882a593Smuzhiyun .channels_min = 1,
1217*4882a593Smuzhiyun .channels_max = 2,
1218*4882a593Smuzhiyun .rates = WM8998_RATES,
1219*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1220*4882a593Smuzhiyun },
1221*4882a593Smuzhiyun .capture = {
1222*4882a593Smuzhiyun .stream_name = "Slim1 Capture",
1223*4882a593Smuzhiyun .channels_min = 1,
1224*4882a593Smuzhiyun .channels_max = 4,
1225*4882a593Smuzhiyun .rates = WM8998_RATES,
1226*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1227*4882a593Smuzhiyun },
1228*4882a593Smuzhiyun .ops = &arizona_simple_dai_ops,
1229*4882a593Smuzhiyun },
1230*4882a593Smuzhiyun {
1231*4882a593Smuzhiyun .name = "wm8998-slim2",
1232*4882a593Smuzhiyun .id = 5,
1233*4882a593Smuzhiyun .playback = {
1234*4882a593Smuzhiyun .stream_name = "Slim2 Playback",
1235*4882a593Smuzhiyun .channels_min = 1,
1236*4882a593Smuzhiyun .channels_max = 2,
1237*4882a593Smuzhiyun .rates = WM8998_RATES,
1238*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1239*4882a593Smuzhiyun },
1240*4882a593Smuzhiyun .capture = {
1241*4882a593Smuzhiyun .stream_name = "Slim2 Capture",
1242*4882a593Smuzhiyun .channels_min = 1,
1243*4882a593Smuzhiyun .channels_max = 2,
1244*4882a593Smuzhiyun .rates = WM8998_RATES,
1245*4882a593Smuzhiyun .formats = WM8998_FORMATS,
1246*4882a593Smuzhiyun },
1247*4882a593Smuzhiyun .ops = &arizona_simple_dai_ops,
1248*4882a593Smuzhiyun },
1249*4882a593Smuzhiyun };
1250*4882a593Smuzhiyun
wm8998_set_fll(struct snd_soc_component * component,int fll_id,int source,unsigned int Fref,unsigned int Fout)1251*4882a593Smuzhiyun static int wm8998_set_fll(struct snd_soc_component *component, int fll_id,
1252*4882a593Smuzhiyun int source, unsigned int Fref, unsigned int Fout)
1253*4882a593Smuzhiyun {
1254*4882a593Smuzhiyun struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component);
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun switch (fll_id) {
1257*4882a593Smuzhiyun case WM8998_FLL1:
1258*4882a593Smuzhiyun return arizona_set_fll(&wm8998->fll[0], source, Fref, Fout);
1259*4882a593Smuzhiyun case WM8998_FLL2:
1260*4882a593Smuzhiyun return arizona_set_fll(&wm8998->fll[1], source, Fref, Fout);
1261*4882a593Smuzhiyun case WM8998_FLL1_REFCLK:
1262*4882a593Smuzhiyun return arizona_set_fll_refclk(&wm8998->fll[0], source, Fref,
1263*4882a593Smuzhiyun Fout);
1264*4882a593Smuzhiyun case WM8998_FLL2_REFCLK:
1265*4882a593Smuzhiyun return arizona_set_fll_refclk(&wm8998->fll[1], source, Fref,
1266*4882a593Smuzhiyun Fout);
1267*4882a593Smuzhiyun default:
1268*4882a593Smuzhiyun return -EINVAL;
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun
wm8998_component_probe(struct snd_soc_component * component)1272*4882a593Smuzhiyun static int wm8998_component_probe(struct snd_soc_component *component)
1273*4882a593Smuzhiyun {
1274*4882a593Smuzhiyun struct wm8998_priv *priv = snd_soc_component_get_drvdata(component);
1275*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1276*4882a593Smuzhiyun struct arizona *arizona = priv->core.arizona;
1277*4882a593Smuzhiyun int ret;
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun arizona->dapm = dapm;
1280*4882a593Smuzhiyun snd_soc_component_init_regmap(component, arizona->regmap);
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun ret = arizona_init_spk(component);
1283*4882a593Smuzhiyun if (ret < 0)
1284*4882a593Smuzhiyun return ret;
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun arizona_init_gpio(component);
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun snd_soc_component_disable_pin(component, "HAPTICS");
1289*4882a593Smuzhiyun
1290*4882a593Smuzhiyun return 0;
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun
wm8998_component_remove(struct snd_soc_component * component)1293*4882a593Smuzhiyun static void wm8998_component_remove(struct snd_soc_component *component)
1294*4882a593Smuzhiyun {
1295*4882a593Smuzhiyun struct wm8998_priv *priv = snd_soc_component_get_drvdata(component);
1296*4882a593Smuzhiyun
1297*4882a593Smuzhiyun priv->core.arizona->dapm = NULL;
1298*4882a593Smuzhiyun }
1299*4882a593Smuzhiyun
1300*4882a593Smuzhiyun #define WM8998_DIG_VU 0x0200
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun static unsigned int wm8998_digital_vu[] = {
1303*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_1L,
1304*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_1R,
1305*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_2L,
1306*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_2R,
1307*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_3L,
1308*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_4L,
1309*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_4R,
1310*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_5L,
1311*4882a593Smuzhiyun ARIZONA_DAC_DIGITAL_VOLUME_5R,
1312*4882a593Smuzhiyun };
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun static const struct snd_soc_component_driver soc_component_dev_wm8998 = {
1315*4882a593Smuzhiyun .probe = wm8998_component_probe,
1316*4882a593Smuzhiyun .remove = wm8998_component_remove,
1317*4882a593Smuzhiyun .set_sysclk = arizona_set_sysclk,
1318*4882a593Smuzhiyun .set_pll = wm8998_set_fll,
1319*4882a593Smuzhiyun .controls = wm8998_snd_controls,
1320*4882a593Smuzhiyun .num_controls = ARRAY_SIZE(wm8998_snd_controls),
1321*4882a593Smuzhiyun .dapm_widgets = wm8998_dapm_widgets,
1322*4882a593Smuzhiyun .num_dapm_widgets = ARRAY_SIZE(wm8998_dapm_widgets),
1323*4882a593Smuzhiyun .dapm_routes = wm8998_dapm_routes,
1324*4882a593Smuzhiyun .num_dapm_routes = ARRAY_SIZE(wm8998_dapm_routes),
1325*4882a593Smuzhiyun .use_pmdown_time = 1,
1326*4882a593Smuzhiyun .endianness = 1,
1327*4882a593Smuzhiyun .non_legacy_dai_naming = 1,
1328*4882a593Smuzhiyun };
1329*4882a593Smuzhiyun
wm8998_probe(struct platform_device * pdev)1330*4882a593Smuzhiyun static int wm8998_probe(struct platform_device *pdev)
1331*4882a593Smuzhiyun {
1332*4882a593Smuzhiyun struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1333*4882a593Smuzhiyun struct wm8998_priv *wm8998;
1334*4882a593Smuzhiyun int i, ret;
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv),
1337*4882a593Smuzhiyun GFP_KERNEL);
1338*4882a593Smuzhiyun if (!wm8998)
1339*4882a593Smuzhiyun return -ENOMEM;
1340*4882a593Smuzhiyun platform_set_drvdata(pdev, wm8998);
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_OF)) {
1343*4882a593Smuzhiyun if (!dev_get_platdata(arizona->dev)) {
1344*4882a593Smuzhiyun ret = arizona_of_get_audio_pdata(arizona);
1345*4882a593Smuzhiyun if (ret < 0)
1346*4882a593Smuzhiyun return ret;
1347*4882a593Smuzhiyun }
1348*4882a593Smuzhiyun }
1349*4882a593Smuzhiyun
1350*4882a593Smuzhiyun wm8998->core.arizona = arizona;
1351*4882a593Smuzhiyun wm8998->core.num_inputs = 3; /* IN1L, IN1R, IN2 */
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(wm8998->fll); i++)
1354*4882a593Smuzhiyun wm8998->fll[i].vco_mult = 1;
1355*4882a593Smuzhiyun
1356*4882a593Smuzhiyun arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
1357*4882a593Smuzhiyun ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
1358*4882a593Smuzhiyun &wm8998->fll[0]);
1359*4882a593Smuzhiyun arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
1360*4882a593Smuzhiyun ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
1361*4882a593Smuzhiyun &wm8998->fll[1]);
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(wm8998_dai); i++)
1364*4882a593Smuzhiyun arizona_init_dai(&wm8998->core, i);
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun /* Latch volume update bits */
1367*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(wm8998_digital_vu); i++)
1368*4882a593Smuzhiyun regmap_update_bits(arizona->regmap, wm8998_digital_vu[i],
1369*4882a593Smuzhiyun WM8998_DIG_VU, WM8998_DIG_VU);
1370*4882a593Smuzhiyun
1371*4882a593Smuzhiyun pm_runtime_enable(&pdev->dev);
1372*4882a593Smuzhiyun pm_runtime_idle(&pdev->dev);
1373*4882a593Smuzhiyun
1374*4882a593Smuzhiyun arizona_init_common(arizona);
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun ret = arizona_init_spk_irqs(arizona);
1377*4882a593Smuzhiyun if (ret < 0)
1378*4882a593Smuzhiyun goto err_pm_disable;
1379*4882a593Smuzhiyun
1380*4882a593Smuzhiyun ret = devm_snd_soc_register_component(&pdev->dev,
1381*4882a593Smuzhiyun &soc_component_dev_wm8998,
1382*4882a593Smuzhiyun wm8998_dai,
1383*4882a593Smuzhiyun ARRAY_SIZE(wm8998_dai));
1384*4882a593Smuzhiyun if (ret < 0) {
1385*4882a593Smuzhiyun dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
1386*4882a593Smuzhiyun goto err_spk_irqs;
1387*4882a593Smuzhiyun }
1388*4882a593Smuzhiyun
1389*4882a593Smuzhiyun return ret;
1390*4882a593Smuzhiyun
1391*4882a593Smuzhiyun err_spk_irqs:
1392*4882a593Smuzhiyun arizona_free_spk_irqs(arizona);
1393*4882a593Smuzhiyun err_pm_disable:
1394*4882a593Smuzhiyun pm_runtime_disable(&pdev->dev);
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyun return ret;
1397*4882a593Smuzhiyun }
1398*4882a593Smuzhiyun
wm8998_remove(struct platform_device * pdev)1399*4882a593Smuzhiyun static int wm8998_remove(struct platform_device *pdev)
1400*4882a593Smuzhiyun {
1401*4882a593Smuzhiyun struct wm8998_priv *wm8998 = platform_get_drvdata(pdev);
1402*4882a593Smuzhiyun struct arizona *arizona = wm8998->core.arizona;
1403*4882a593Smuzhiyun
1404*4882a593Smuzhiyun pm_runtime_disable(&pdev->dev);
1405*4882a593Smuzhiyun
1406*4882a593Smuzhiyun arizona_free_spk_irqs(arizona);
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun return 0;
1409*4882a593Smuzhiyun }
1410*4882a593Smuzhiyun
1411*4882a593Smuzhiyun static struct platform_driver wm8998_codec_driver = {
1412*4882a593Smuzhiyun .driver = {
1413*4882a593Smuzhiyun .name = "wm8998-codec",
1414*4882a593Smuzhiyun },
1415*4882a593Smuzhiyun .probe = wm8998_probe,
1416*4882a593Smuzhiyun .remove = wm8998_remove,
1417*4882a593Smuzhiyun };
1418*4882a593Smuzhiyun
1419*4882a593Smuzhiyun module_platform_driver(wm8998_codec_driver);
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun MODULE_DESCRIPTION("ASoC WM8998 driver");
1422*4882a593Smuzhiyun MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.wolfsonmicro.com>");
1423*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1424*4882a593Smuzhiyun MODULE_ALIAS("platform:wm8998-codec");
1425