xref: /openbmc/linux/sound/soc/codecs/cs47l15.c (revision e22a907d)
19cba2d6aSRichard Fitzgerald // SPDX-License-Identifier: GPL-2.0-only
29cba2d6aSRichard Fitzgerald //
39cba2d6aSRichard Fitzgerald // ALSA SoC Audio driver for CS47L15 codec
49cba2d6aSRichard Fitzgerald //
59cba2d6aSRichard Fitzgerald // Copyright (C) 2016-2019 Cirrus Logic, Inc. and
69cba2d6aSRichard Fitzgerald //                         Cirrus Logic International Semiconductor Ltd.
79cba2d6aSRichard Fitzgerald //
89cba2d6aSRichard Fitzgerald 
99cba2d6aSRichard Fitzgerald #include <linux/module.h>
109cba2d6aSRichard Fitzgerald #include <linux/moduleparam.h>
119cba2d6aSRichard Fitzgerald #include <linux/device.h>
129cba2d6aSRichard Fitzgerald #include <linux/delay.h>
139cba2d6aSRichard Fitzgerald #include <linux/init.h>
149cba2d6aSRichard Fitzgerald #include <linux/pm.h>
159cba2d6aSRichard Fitzgerald #include <linux/pm_runtime.h>
169cba2d6aSRichard Fitzgerald #include <linux/regmap.h>
179cba2d6aSRichard Fitzgerald #include <sound/core.h>
189cba2d6aSRichard Fitzgerald #include <sound/pcm.h>
199cba2d6aSRichard Fitzgerald #include <sound/pcm_params.h>
209cba2d6aSRichard Fitzgerald #include <sound/soc.h>
219cba2d6aSRichard Fitzgerald #include <sound/tlv.h>
229cba2d6aSRichard Fitzgerald 
239cba2d6aSRichard Fitzgerald #include <linux/irqchip/irq-madera.h>
249cba2d6aSRichard Fitzgerald #include <linux/mfd/madera/core.h>
259cba2d6aSRichard Fitzgerald #include <linux/mfd/madera/registers.h>
269cba2d6aSRichard Fitzgerald 
279cba2d6aSRichard Fitzgerald #include "madera.h"
289cba2d6aSRichard Fitzgerald #include "wm_adsp.h"
299cba2d6aSRichard Fitzgerald 
309cba2d6aSRichard Fitzgerald #define CS47L15_NUM_ADSP 1
319cba2d6aSRichard Fitzgerald #define CS47L15_MONO_OUTPUTS 1
329cba2d6aSRichard Fitzgerald 
339cba2d6aSRichard Fitzgerald /* Mid-mode registers */
349cba2d6aSRichard Fitzgerald #define CS47L15_ADC_INT_BIAS_MASK	0x3800
359cba2d6aSRichard Fitzgerald #define CS47L15_ADC_INT_BIAS_SHIFT	11
369cba2d6aSRichard Fitzgerald #define CS47L15_PGA_BIAS_SEL_MASK	0x03
379cba2d6aSRichard Fitzgerald #define CS47L15_PGA_BIAS_SEL_SHIFT	0
389cba2d6aSRichard Fitzgerald 
399cba2d6aSRichard Fitzgerald #define DRV_NAME "cs47l15-codec"
409cba2d6aSRichard Fitzgerald 
419cba2d6aSRichard Fitzgerald struct cs47l15 {
429cba2d6aSRichard Fitzgerald 	struct madera_priv core;
439cba2d6aSRichard Fitzgerald 	struct madera_fll fll[2];
449cba2d6aSRichard Fitzgerald 
459cba2d6aSRichard Fitzgerald 	bool in1_lp_mode;
469cba2d6aSRichard Fitzgerald };
479cba2d6aSRichard Fitzgerald 
485beb8eeaSSimon Trimmer static const struct cs_dsp_region cs47l15_dsp1_regions[] = {
499cba2d6aSRichard Fitzgerald 	{ .type = WMFW_ADSP2_PM, .base = 0x080000 },
509cba2d6aSRichard Fitzgerald 	{ .type = WMFW_ADSP2_ZM, .base = 0x0e0000 },
519cba2d6aSRichard Fitzgerald 	{ .type = WMFW_ADSP2_XM, .base = 0x0a0000 },
529cba2d6aSRichard Fitzgerald 	{ .type = WMFW_ADSP2_YM, .base = 0x0c0000 },
539cba2d6aSRichard Fitzgerald };
549cba2d6aSRichard Fitzgerald 
559cba2d6aSRichard Fitzgerald static const char * const cs47l15_outdemux_texts[] = {
569cba2d6aSRichard Fitzgerald 	"HPOUT",
579cba2d6aSRichard Fitzgerald 	"EPOUT",
589cba2d6aSRichard Fitzgerald };
599cba2d6aSRichard Fitzgerald 
609cba2d6aSRichard Fitzgerald static SOC_ENUM_SINGLE_DECL(cs47l15_outdemux_enum, SND_SOC_NOPM, 0,
619cba2d6aSRichard Fitzgerald 			    cs47l15_outdemux_texts);
629cba2d6aSRichard Fitzgerald 
639cba2d6aSRichard Fitzgerald static const struct snd_kcontrol_new cs47l15_outdemux =
649cba2d6aSRichard Fitzgerald 	SOC_DAPM_ENUM_EXT("HPOUT1 Demux", cs47l15_outdemux_enum,
659cba2d6aSRichard Fitzgerald 			  madera_out1_demux_get, madera_out1_demux_put);
669cba2d6aSRichard Fitzgerald 
cs47l15_adsp_power_ev(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)679cba2d6aSRichard Fitzgerald static int cs47l15_adsp_power_ev(struct snd_soc_dapm_widget *w,
689cba2d6aSRichard Fitzgerald 				 struct snd_kcontrol *kcontrol,
699cba2d6aSRichard Fitzgerald 				 int event)
709cba2d6aSRichard Fitzgerald {
719cba2d6aSRichard Fitzgerald 	struct snd_soc_component *component =
729cba2d6aSRichard Fitzgerald 		snd_soc_dapm_to_component(w->dapm);
739cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
749cba2d6aSRichard Fitzgerald 	struct madera_priv *priv = &cs47l15->core;
759cba2d6aSRichard Fitzgerald 	struct madera *madera = priv->madera;
769cba2d6aSRichard Fitzgerald 	unsigned int freq;
779cba2d6aSRichard Fitzgerald 	int ret;
789cba2d6aSRichard Fitzgerald 
799cba2d6aSRichard Fitzgerald 	ret = regmap_read(madera->regmap, MADERA_DSP_CLOCK_2, &freq);
809cba2d6aSRichard Fitzgerald 	if (ret != 0) {
819cba2d6aSRichard Fitzgerald 		dev_err(madera->dev,
829cba2d6aSRichard Fitzgerald 			"Failed to read MADERA_DSP_CLOCK_2: %d\n", ret);
839cba2d6aSRichard Fitzgerald 		return ret;
849cba2d6aSRichard Fitzgerald 	}
859cba2d6aSRichard Fitzgerald 
869cba2d6aSRichard Fitzgerald 	switch (event) {
879cba2d6aSRichard Fitzgerald 	case SND_SOC_DAPM_PRE_PMU:
889cba2d6aSRichard Fitzgerald 		ret = madera_set_adsp_clk(&cs47l15->core, w->shift, freq);
899cba2d6aSRichard Fitzgerald 		if (ret)
909cba2d6aSRichard Fitzgerald 			return ret;
919cba2d6aSRichard Fitzgerald 		break;
929cba2d6aSRichard Fitzgerald 	default:
939cba2d6aSRichard Fitzgerald 		break;
949cba2d6aSRichard Fitzgerald 	}
959cba2d6aSRichard Fitzgerald 
969cba2d6aSRichard Fitzgerald 	return wm_adsp_early_event(w, kcontrol, event);
979cba2d6aSRichard Fitzgerald }
989cba2d6aSRichard Fitzgerald 
999cba2d6aSRichard Fitzgerald #define CS47L15_NG_SRC(name, base) \
1009cba2d6aSRichard Fitzgerald 	SOC_SINGLE(name " NG HPOUT1L Switch",  base,  0, 1, 0), \
1019cba2d6aSRichard Fitzgerald 	SOC_SINGLE(name " NG HPOUT1R Switch",  base,  1, 1, 0), \
1029cba2d6aSRichard Fitzgerald 	SOC_SINGLE(name " NG SPKOUTL Switch",  base,  6, 1, 0), \
1039cba2d6aSRichard Fitzgerald 	SOC_SINGLE(name " NG SPKDAT1L Switch", base,  8, 1, 0), \
1049cba2d6aSRichard Fitzgerald 	SOC_SINGLE(name " NG SPKDAT1R Switch", base,  9, 1, 0)
1059cba2d6aSRichard Fitzgerald 
cs47l15_in1_adc_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1069cba2d6aSRichard Fitzgerald static int cs47l15_in1_adc_get(struct snd_kcontrol *kcontrol,
1079cba2d6aSRichard Fitzgerald 			       struct snd_ctl_elem_value *ucontrol)
1089cba2d6aSRichard Fitzgerald {
1099cba2d6aSRichard Fitzgerald 	struct snd_soc_component *component =
1109cba2d6aSRichard Fitzgerald 		snd_soc_kcontrol_component(kcontrol);
1119cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
1129cba2d6aSRichard Fitzgerald 
1139cba2d6aSRichard Fitzgerald 	ucontrol->value.integer.value[0] = !!cs47l15->in1_lp_mode;
1149cba2d6aSRichard Fitzgerald 
1159cba2d6aSRichard Fitzgerald 	return 0;
1169cba2d6aSRichard Fitzgerald }
1179cba2d6aSRichard Fitzgerald 
cs47l15_in1_adc_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1189cba2d6aSRichard Fitzgerald static int cs47l15_in1_adc_put(struct snd_kcontrol *kcontrol,
1199cba2d6aSRichard Fitzgerald 			       struct snd_ctl_elem_value *ucontrol)
1209cba2d6aSRichard Fitzgerald {
1219cba2d6aSRichard Fitzgerald 	struct snd_soc_component *component =
1229cba2d6aSRichard Fitzgerald 		snd_soc_kcontrol_component(kcontrol);
1239cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
1249cba2d6aSRichard Fitzgerald 
1257f103af4SCharles Keepax 	if (!!ucontrol->value.integer.value[0] == cs47l15->in1_lp_mode)
1267f103af4SCharles Keepax 		return 0;
1277f103af4SCharles Keepax 
1289cba2d6aSRichard Fitzgerald 	switch (ucontrol->value.integer.value[0]) {
1299cba2d6aSRichard Fitzgerald 	case 0:
1309cba2d6aSRichard Fitzgerald 		/* Set IN1 to normal mode */
1319cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, MADERA_DMIC1L_CONTROL,
1329cba2d6aSRichard Fitzgerald 					      MADERA_IN1_OSR_MASK,
1339cba2d6aSRichard Fitzgerald 					      5 << MADERA_IN1_OSR_SHIFT);
1349cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, CS47L15_ADC_INT_BIAS,
1359cba2d6aSRichard Fitzgerald 					      CS47L15_ADC_INT_BIAS_MASK,
1369cba2d6aSRichard Fitzgerald 					      4 << CS47L15_ADC_INT_BIAS_SHIFT);
1379cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, CS47L15_PGA_BIAS_SEL,
1389cba2d6aSRichard Fitzgerald 					      CS47L15_PGA_BIAS_SEL_MASK, 0);
1399cba2d6aSRichard Fitzgerald 		cs47l15->in1_lp_mode = false;
1409cba2d6aSRichard Fitzgerald 		break;
1419cba2d6aSRichard Fitzgerald 	default:
1429cba2d6aSRichard Fitzgerald 		/* Set IN1 to LP mode */
1439cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, MADERA_DMIC1L_CONTROL,
1449cba2d6aSRichard Fitzgerald 					      MADERA_IN1_OSR_MASK,
1459cba2d6aSRichard Fitzgerald 					      4 << MADERA_IN1_OSR_SHIFT);
1469cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, CS47L15_ADC_INT_BIAS,
1479cba2d6aSRichard Fitzgerald 					      CS47L15_ADC_INT_BIAS_MASK,
1489cba2d6aSRichard Fitzgerald 					      1 << CS47L15_ADC_INT_BIAS_SHIFT);
1499cba2d6aSRichard Fitzgerald 		snd_soc_component_update_bits(component, CS47L15_PGA_BIAS_SEL,
1509cba2d6aSRichard Fitzgerald 					      CS47L15_PGA_BIAS_SEL_MASK,
1519cba2d6aSRichard Fitzgerald 					      3 << CS47L15_PGA_BIAS_SEL_SHIFT);
1529cba2d6aSRichard Fitzgerald 		cs47l15->in1_lp_mode = true;
1539cba2d6aSRichard Fitzgerald 		break;
1549cba2d6aSRichard Fitzgerald 	}
1559cba2d6aSRichard Fitzgerald 
1567f103af4SCharles Keepax 	return 1;
1579cba2d6aSRichard Fitzgerald }
1589cba2d6aSRichard Fitzgerald 
1599cba2d6aSRichard Fitzgerald static const struct snd_kcontrol_new cs47l15_snd_controls[] = {
1609cba2d6aSRichard Fitzgerald SOC_ENUM("IN1 OSR", madera_in_dmic_osr[0]),
1619cba2d6aSRichard Fitzgerald SOC_ENUM("IN2 OSR", madera_in_dmic_osr[1]),
1629cba2d6aSRichard Fitzgerald 
1639cba2d6aSRichard Fitzgerald SOC_SINGLE_RANGE_TLV("IN1L Volume", MADERA_IN1L_CONTROL,
1649cba2d6aSRichard Fitzgerald 		     MADERA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),
1659cba2d6aSRichard Fitzgerald SOC_SINGLE_RANGE_TLV("IN1R Volume", MADERA_IN1R_CONTROL,
1669cba2d6aSRichard Fitzgerald 		     MADERA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),
1679cba2d6aSRichard Fitzgerald 
1689cba2d6aSRichard Fitzgerald SOC_ENUM("IN HPF Cutoff Frequency", madera_in_hpf_cut_enum),
1699cba2d6aSRichard Fitzgerald 
1709cba2d6aSRichard Fitzgerald SOC_SINGLE("IN1L HPF Switch", MADERA_IN1L_CONTROL, MADERA_IN1L_HPF_SHIFT, 1, 0),
1719cba2d6aSRichard Fitzgerald SOC_SINGLE("IN1R HPF Switch", MADERA_IN1R_CONTROL, MADERA_IN1R_HPF_SHIFT, 1, 0),
1729cba2d6aSRichard Fitzgerald SOC_SINGLE("IN2L HPF Switch", MADERA_IN2L_CONTROL, MADERA_IN2L_HPF_SHIFT, 1, 0),
1739cba2d6aSRichard Fitzgerald SOC_SINGLE("IN2R HPF Switch", MADERA_IN2R_CONTROL, MADERA_IN2R_HPF_SHIFT, 1, 0),
1749cba2d6aSRichard Fitzgerald 
1759cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("IN1L Digital Volume", MADERA_ADC_DIGITAL_VOLUME_1L,
1769cba2d6aSRichard Fitzgerald 	       MADERA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),
1779cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("IN1R Digital Volume", MADERA_ADC_DIGITAL_VOLUME_1R,
1789cba2d6aSRichard Fitzgerald 	       MADERA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),
1799cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("IN2L Digital Volume", MADERA_ADC_DIGITAL_VOLUME_2L,
1809cba2d6aSRichard Fitzgerald 	       MADERA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),
1819cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("IN2R Digital Volume", MADERA_ADC_DIGITAL_VOLUME_2R,
1829cba2d6aSRichard Fitzgerald 	       MADERA_IN2R_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),
1839cba2d6aSRichard Fitzgerald 
1849cba2d6aSRichard Fitzgerald SOC_ENUM("Input Ramp Up", madera_in_vi_ramp),
1859cba2d6aSRichard Fitzgerald SOC_ENUM("Input Ramp Down", madera_in_vd_ramp),
1869cba2d6aSRichard Fitzgerald 
1879cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("EQ1", MADERA_EQ1MIX_INPUT_1_SOURCE),
1889cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("EQ2", MADERA_EQ2MIX_INPUT_1_SOURCE),
1899cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("EQ3", MADERA_EQ3MIX_INPUT_1_SOURCE),
1909cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("EQ4", MADERA_EQ4MIX_INPUT_1_SOURCE),
1919cba2d6aSRichard Fitzgerald 
1929cba2d6aSRichard Fitzgerald MADERA_EQ_CONTROL("EQ1 Coefficients", MADERA_EQ1_2),
1939cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ1 B1 Volume", MADERA_EQ1_1, MADERA_EQ1_B1_GAIN_SHIFT,
1949cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
1959cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ1 B2 Volume", MADERA_EQ1_1, MADERA_EQ1_B2_GAIN_SHIFT,
1969cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
1979cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ1 B3 Volume", MADERA_EQ1_1, MADERA_EQ1_B3_GAIN_SHIFT,
1989cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
1999cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ1 B4 Volume", MADERA_EQ1_2, MADERA_EQ1_B4_GAIN_SHIFT,
2009cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2019cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ1 B5 Volume", MADERA_EQ1_2, MADERA_EQ1_B5_GAIN_SHIFT,
2029cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2039cba2d6aSRichard Fitzgerald 
2049cba2d6aSRichard Fitzgerald MADERA_EQ_CONTROL("EQ2 Coefficients", MADERA_EQ2_2),
2059cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ2 B1 Volume", MADERA_EQ2_1, MADERA_EQ2_B1_GAIN_SHIFT,
2069cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2079cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ2 B2 Volume", MADERA_EQ2_1, MADERA_EQ2_B2_GAIN_SHIFT,
2089cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2099cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ2 B3 Volume", MADERA_EQ2_1, MADERA_EQ2_B3_GAIN_SHIFT,
2109cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2119cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ2 B4 Volume", MADERA_EQ2_2, MADERA_EQ2_B4_GAIN_SHIFT,
2129cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2139cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ2 B5 Volume", MADERA_EQ2_2, MADERA_EQ2_B5_GAIN_SHIFT,
2149cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2159cba2d6aSRichard Fitzgerald 
2169cba2d6aSRichard Fitzgerald MADERA_EQ_CONTROL("EQ3 Coefficients", MADERA_EQ3_2),
2179cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ3 B1 Volume", MADERA_EQ3_1, MADERA_EQ3_B1_GAIN_SHIFT,
2189cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2199cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ3 B2 Volume", MADERA_EQ3_1, MADERA_EQ3_B2_GAIN_SHIFT,
2209cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2219cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ3 B3 Volume", MADERA_EQ3_1, MADERA_EQ3_B3_GAIN_SHIFT,
2229cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2239cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ3 B4 Volume", MADERA_EQ3_2, MADERA_EQ3_B4_GAIN_SHIFT,
2249cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2259cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ3 B5 Volume", MADERA_EQ3_2, MADERA_EQ3_B5_GAIN_SHIFT,
2269cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2279cba2d6aSRichard Fitzgerald 
2289cba2d6aSRichard Fitzgerald MADERA_EQ_CONTROL("EQ4 Coefficients", MADERA_EQ4_2),
2299cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ4 B1 Volume", MADERA_EQ4_1, MADERA_EQ4_B1_GAIN_SHIFT,
2309cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2319cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ4 B2 Volume", MADERA_EQ4_1, MADERA_EQ4_B2_GAIN_SHIFT,
2329cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2339cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ4 B3 Volume", MADERA_EQ4_1, MADERA_EQ4_B3_GAIN_SHIFT,
2349cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2359cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ4 B4 Volume", MADERA_EQ4_2, MADERA_EQ4_B4_GAIN_SHIFT,
2369cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2379cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("EQ4 B5 Volume", MADERA_EQ4_2, MADERA_EQ4_B5_GAIN_SHIFT,
2389cba2d6aSRichard Fitzgerald 	       24, 0, madera_eq_tlv),
2399cba2d6aSRichard Fitzgerald 
2409cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DRC1L", MADERA_DRC1LMIX_INPUT_1_SOURCE),
2419cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DRC1R", MADERA_DRC1RMIX_INPUT_1_SOURCE),
2429cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DRC2L", MADERA_DRC2LMIX_INPUT_1_SOURCE),
2439cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DRC2R", MADERA_DRC2RMIX_INPUT_1_SOURCE),
2449cba2d6aSRichard Fitzgerald 
2459cba2d6aSRichard Fitzgerald SND_SOC_BYTES_MASK("DRC1", MADERA_DRC1_CTRL1, 5,
2469cba2d6aSRichard Fitzgerald 		   MADERA_DRC1R_ENA | MADERA_DRC1L_ENA),
2479cba2d6aSRichard Fitzgerald SND_SOC_BYTES_MASK("DRC2", MADERA_DRC2_CTRL1, 5,
2489cba2d6aSRichard Fitzgerald 		   MADERA_DRC2R_ENA | MADERA_DRC2L_ENA),
2499cba2d6aSRichard Fitzgerald 
2509cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("LHPF1", MADERA_HPLP1MIX_INPUT_1_SOURCE),
2519cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("LHPF2", MADERA_HPLP2MIX_INPUT_1_SOURCE),
2529cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("LHPF3", MADERA_HPLP3MIX_INPUT_1_SOURCE),
2539cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("LHPF4", MADERA_HPLP4MIX_INPUT_1_SOURCE),
2549cba2d6aSRichard Fitzgerald 
2559cba2d6aSRichard Fitzgerald MADERA_LHPF_CONTROL("LHPF1 Coefficients", MADERA_HPLPF1_2),
2569cba2d6aSRichard Fitzgerald MADERA_LHPF_CONTROL("LHPF2 Coefficients", MADERA_HPLPF2_2),
2579cba2d6aSRichard Fitzgerald MADERA_LHPF_CONTROL("LHPF3 Coefficients", MADERA_HPLPF3_2),
2589cba2d6aSRichard Fitzgerald MADERA_LHPF_CONTROL("LHPF4 Coefficients", MADERA_HPLPF4_2),
2599cba2d6aSRichard Fitzgerald 
2609cba2d6aSRichard Fitzgerald SOC_ENUM("LHPF1 Mode", madera_lhpf1_mode),
2619cba2d6aSRichard Fitzgerald SOC_ENUM("LHPF2 Mode", madera_lhpf2_mode),
2629cba2d6aSRichard Fitzgerald SOC_ENUM("LHPF3 Mode", madera_lhpf3_mode),
2639cba2d6aSRichard Fitzgerald SOC_ENUM("LHPF4 Mode", madera_lhpf4_mode),
2649cba2d6aSRichard Fitzgerald 
2659cba2d6aSRichard Fitzgerald MADERA_RATE_ENUM("ISRC1 FSL", madera_isrc_fsl[0]),
2669cba2d6aSRichard Fitzgerald MADERA_RATE_ENUM("ISRC2 FSL", madera_isrc_fsl[1]),
2679cba2d6aSRichard Fitzgerald MADERA_RATE_ENUM("ISRC1 FSH", madera_isrc_fsh[0]),
2689cba2d6aSRichard Fitzgerald MADERA_RATE_ENUM("ISRC2 FSH", madera_isrc_fsh[1]),
2699cba2d6aSRichard Fitzgerald 
2709cba2d6aSRichard Fitzgerald WM_ADSP2_PRELOAD_SWITCH("DSP1", 1),
2719cba2d6aSRichard Fitzgerald 
2729cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DSP1L", MADERA_DSP1LMIX_INPUT_1_SOURCE),
2739cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("DSP1R", MADERA_DSP1RMIX_INPUT_1_SOURCE),
2749cba2d6aSRichard Fitzgerald 
2759cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("Noise Generator Volume", MADERA_COMFORT_NOISE_GENERATOR,
2769cba2d6aSRichard Fitzgerald 	       MADERA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, madera_noise_tlv),
2779cba2d6aSRichard Fitzgerald 
2789cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("HPOUT1L", MADERA_OUT1LMIX_INPUT_1_SOURCE),
2799cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("HPOUT1R", MADERA_OUT1RMIX_INPUT_1_SOURCE),
2809cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("SPKOUTL", MADERA_OUT4LMIX_INPUT_1_SOURCE),
2819cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("SPKDAT1L", MADERA_OUT5LMIX_INPUT_1_SOURCE),
2829cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("SPKDAT1R", MADERA_OUT5RMIX_INPUT_1_SOURCE),
2839cba2d6aSRichard Fitzgerald 
2849cba2d6aSRichard Fitzgerald SOC_SINGLE("HPOUT1 SC Protect Switch", MADERA_HP1_SHORT_CIRCUIT_CTRL,
2859cba2d6aSRichard Fitzgerald 	   MADERA_HP1_SC_ENA_SHIFT, 1, 0),
2869cba2d6aSRichard Fitzgerald 
2879cba2d6aSRichard Fitzgerald SOC_SINGLE("SPKDAT1 High Performance Switch", MADERA_OUTPUT_PATH_CONFIG_5L,
2889cba2d6aSRichard Fitzgerald 	   MADERA_OUT5_OSR_SHIFT, 1, 0),
2899cba2d6aSRichard Fitzgerald 
2909cba2d6aSRichard Fitzgerald SOC_DOUBLE_R("HPOUT1 Digital Switch", MADERA_DAC_DIGITAL_VOLUME_1L,
2919cba2d6aSRichard Fitzgerald 	     MADERA_DAC_DIGITAL_VOLUME_1R, MADERA_OUT1L_MUTE_SHIFT, 1, 1),
2929cba2d6aSRichard Fitzgerald SOC_SINGLE("Speaker Digital Switch", MADERA_DAC_DIGITAL_VOLUME_4L,
2939cba2d6aSRichard Fitzgerald 	   MADERA_OUT4L_MUTE_SHIFT, 1, 1),
2949cba2d6aSRichard Fitzgerald SOC_DOUBLE_R("SPKDAT1 Digital Switch", MADERA_DAC_DIGITAL_VOLUME_5L,
2959cba2d6aSRichard Fitzgerald 	     MADERA_DAC_DIGITAL_VOLUME_5R, MADERA_OUT5L_MUTE_SHIFT, 1, 1),
2969cba2d6aSRichard Fitzgerald 
2979cba2d6aSRichard Fitzgerald SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", MADERA_DAC_DIGITAL_VOLUME_1L,
2989cba2d6aSRichard Fitzgerald 		 MADERA_DAC_DIGITAL_VOLUME_1R, MADERA_OUT1L_VOL_SHIFT,
2999cba2d6aSRichard Fitzgerald 		 0xbf, 0, madera_digital_tlv),
3009cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("Speaker Digital Volume", MADERA_DAC_DIGITAL_VOLUME_4L,
3019cba2d6aSRichard Fitzgerald 	       MADERA_OUT4L_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),
3029cba2d6aSRichard Fitzgerald SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", MADERA_DAC_DIGITAL_VOLUME_5L,
3039cba2d6aSRichard Fitzgerald 		 MADERA_DAC_DIGITAL_VOLUME_5R, MADERA_OUT5L_VOL_SHIFT,
3049cba2d6aSRichard Fitzgerald 		 0xbf, 0, madera_digital_tlv),
3059cba2d6aSRichard Fitzgerald 
3069cba2d6aSRichard Fitzgerald SOC_DOUBLE("SPKDAT1 Switch", MADERA_PDM_SPK1_CTRL_1, MADERA_SPK1L_MUTE_SHIFT,
3079cba2d6aSRichard Fitzgerald 	   MADERA_SPK1R_MUTE_SHIFT, 1, 1),
3089cba2d6aSRichard Fitzgerald 
3099cba2d6aSRichard Fitzgerald SOC_ENUM("Output Ramp Up", madera_out_vi_ramp),
3109cba2d6aSRichard Fitzgerald SOC_ENUM("Output Ramp Down", madera_out_vd_ramp),
3119cba2d6aSRichard Fitzgerald 
3129cba2d6aSRichard Fitzgerald SOC_SINGLE("Noise Gate Switch", MADERA_NOISE_GATE_CONTROL,
3139cba2d6aSRichard Fitzgerald 	   MADERA_NGATE_ENA_SHIFT, 1, 0),
3149cba2d6aSRichard Fitzgerald SOC_SINGLE_TLV("Noise Gate Threshold Volume", MADERA_NOISE_GATE_CONTROL,
3159cba2d6aSRichard Fitzgerald 	       MADERA_NGATE_THR_SHIFT, 7, 1, madera_ng_tlv),
3169cba2d6aSRichard Fitzgerald SOC_ENUM("Noise Gate Hold", madera_ng_hold),
3179cba2d6aSRichard Fitzgerald 
3189cba2d6aSRichard Fitzgerald SOC_SINGLE_BOOL_EXT("IN1 LP Mode Switch", 0,
3199cba2d6aSRichard Fitzgerald 		    cs47l15_in1_adc_get, cs47l15_in1_adc_put),
3209cba2d6aSRichard Fitzgerald 
3219cba2d6aSRichard Fitzgerald CS47L15_NG_SRC("HPOUT1L", MADERA_NOISE_GATE_SELECT_1L),
3229cba2d6aSRichard Fitzgerald CS47L15_NG_SRC("HPOUT1R", MADERA_NOISE_GATE_SELECT_1R),
3239cba2d6aSRichard Fitzgerald CS47L15_NG_SRC("SPKOUTL", MADERA_NOISE_GATE_SELECT_4L),
3249cba2d6aSRichard Fitzgerald CS47L15_NG_SRC("SPKDAT1L", MADERA_NOISE_GATE_SELECT_5L),
3259cba2d6aSRichard Fitzgerald CS47L15_NG_SRC("SPKDAT1R", MADERA_NOISE_GATE_SELECT_5R),
3269cba2d6aSRichard Fitzgerald 
3279cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX1", MADERA_AIF1TX1MIX_INPUT_1_SOURCE),
3289cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX2", MADERA_AIF1TX2MIX_INPUT_1_SOURCE),
3299cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX3", MADERA_AIF1TX3MIX_INPUT_1_SOURCE),
3309cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX4", MADERA_AIF1TX4MIX_INPUT_1_SOURCE),
3319cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX5", MADERA_AIF1TX5MIX_INPUT_1_SOURCE),
3329cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF1TX6", MADERA_AIF1TX6MIX_INPUT_1_SOURCE),
3339cba2d6aSRichard Fitzgerald 
3349cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF2TX1", MADERA_AIF2TX1MIX_INPUT_1_SOURCE),
3359cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF2TX2", MADERA_AIF2TX2MIX_INPUT_1_SOURCE),
3369cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF2TX3", MADERA_AIF2TX3MIX_INPUT_1_SOURCE),
3379cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF2TX4", MADERA_AIF2TX4MIX_INPUT_1_SOURCE),
3389cba2d6aSRichard Fitzgerald 
3399cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF3TX1", MADERA_AIF3TX1MIX_INPUT_1_SOURCE),
3409cba2d6aSRichard Fitzgerald MADERA_MIXER_CONTROLS("AIF3TX2", MADERA_AIF3TX2MIX_INPUT_1_SOURCE),
3419cba2d6aSRichard Fitzgerald 
3429cba2d6aSRichard Fitzgerald MADERA_GAINMUX_CONTROLS("SPDIF1TX1", MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE),
3439cba2d6aSRichard Fitzgerald MADERA_GAINMUX_CONTROLS("SPDIF1TX2", MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE),
3449cba2d6aSRichard Fitzgerald 
3459cba2d6aSRichard Fitzgerald WM_ADSP_FW_CONTROL("DSP1", 0),
3469cba2d6aSRichard Fitzgerald };
3479cba2d6aSRichard Fitzgerald 
3489cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(EQ1, MADERA_EQ1MIX_INPUT_1_SOURCE);
3499cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(EQ2, MADERA_EQ2MIX_INPUT_1_SOURCE);
3509cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(EQ3, MADERA_EQ3MIX_INPUT_1_SOURCE);
3519cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(EQ4, MADERA_EQ4MIX_INPUT_1_SOURCE);
3529cba2d6aSRichard Fitzgerald 
3539cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DRC1L, MADERA_DRC1LMIX_INPUT_1_SOURCE);
3549cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DRC1R, MADERA_DRC1RMIX_INPUT_1_SOURCE);
3559cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DRC2L, MADERA_DRC2LMIX_INPUT_1_SOURCE);
3569cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DRC2R, MADERA_DRC2RMIX_INPUT_1_SOURCE);
3579cba2d6aSRichard Fitzgerald 
3589cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(LHPF1, MADERA_HPLP1MIX_INPUT_1_SOURCE);
3599cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(LHPF2, MADERA_HPLP2MIX_INPUT_1_SOURCE);
3609cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(LHPF3, MADERA_HPLP3MIX_INPUT_1_SOURCE);
3619cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(LHPF4, MADERA_HPLP4MIX_INPUT_1_SOURCE);
3629cba2d6aSRichard Fitzgerald 
3639cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DSP1L, MADERA_DSP1LMIX_INPUT_1_SOURCE);
3649cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(DSP1R, MADERA_DSP1RMIX_INPUT_1_SOURCE);
3659cba2d6aSRichard Fitzgerald MADERA_DSP_AUX_ENUMS(DSP1, MADERA_DSP1AUX1MIX_INPUT_1_SOURCE);
3669cba2d6aSRichard Fitzgerald 
3679cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(PWM1, MADERA_PWM1MIX_INPUT_1_SOURCE);
3689cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(PWM2, MADERA_PWM2MIX_INPUT_1_SOURCE);
3699cba2d6aSRichard Fitzgerald 
3709cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(OUT1L, MADERA_OUT1LMIX_INPUT_1_SOURCE);
3719cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(OUT1R, MADERA_OUT1RMIX_INPUT_1_SOURCE);
3729cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(SPKOUTL, MADERA_OUT4LMIX_INPUT_1_SOURCE);
3739cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(SPKDAT1L, MADERA_OUT5LMIX_INPUT_1_SOURCE);
3749cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(SPKDAT1R, MADERA_OUT5RMIX_INPUT_1_SOURCE);
3759cba2d6aSRichard Fitzgerald 
3769cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX1, MADERA_AIF1TX1MIX_INPUT_1_SOURCE);
3779cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX2, MADERA_AIF1TX2MIX_INPUT_1_SOURCE);
3789cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX3, MADERA_AIF1TX3MIX_INPUT_1_SOURCE);
3799cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX4, MADERA_AIF1TX4MIX_INPUT_1_SOURCE);
3809cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX5, MADERA_AIF1TX5MIX_INPUT_1_SOURCE);
3819cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF1TX6, MADERA_AIF1TX6MIX_INPUT_1_SOURCE);
3829cba2d6aSRichard Fitzgerald 
3839cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF2TX1, MADERA_AIF2TX1MIX_INPUT_1_SOURCE);
3849cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF2TX2, MADERA_AIF2TX2MIX_INPUT_1_SOURCE);
3859cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF2TX3, MADERA_AIF2TX3MIX_INPUT_1_SOURCE);
3869cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF2TX4, MADERA_AIF2TX4MIX_INPUT_1_SOURCE);
3879cba2d6aSRichard Fitzgerald 
3889cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF3TX1, MADERA_AIF3TX1MIX_INPUT_1_SOURCE);
3899cba2d6aSRichard Fitzgerald MADERA_MIXER_ENUMS(AIF3TX2, MADERA_AIF3TX2MIX_INPUT_1_SOURCE);
3909cba2d6aSRichard Fitzgerald 
3919cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(SPD1TX1, MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE);
3929cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(SPD1TX2, MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE);
3939cba2d6aSRichard Fitzgerald 
3949cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1INT1, MADERA_ISRC1INT1MIX_INPUT_1_SOURCE);
3959cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1INT2, MADERA_ISRC1INT2MIX_INPUT_1_SOURCE);
3969cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1INT3, MADERA_ISRC1INT3MIX_INPUT_1_SOURCE);
3979cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1INT4, MADERA_ISRC1INT4MIX_INPUT_1_SOURCE);
3989cba2d6aSRichard Fitzgerald 
3999cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1DEC1, MADERA_ISRC1DEC1MIX_INPUT_1_SOURCE);
4009cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1DEC2, MADERA_ISRC1DEC2MIX_INPUT_1_SOURCE);
4019cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1DEC3, MADERA_ISRC1DEC3MIX_INPUT_1_SOURCE);
4029cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC1DEC4, MADERA_ISRC1DEC4MIX_INPUT_1_SOURCE);
4039cba2d6aSRichard Fitzgerald 
4049cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2INT1, MADERA_ISRC2INT1MIX_INPUT_1_SOURCE);
4059cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2INT2, MADERA_ISRC2INT2MIX_INPUT_1_SOURCE);
4069cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2INT3, MADERA_ISRC2INT3MIX_INPUT_1_SOURCE);
4079cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2INT4, MADERA_ISRC2INT4MIX_INPUT_1_SOURCE);
4089cba2d6aSRichard Fitzgerald 
4099cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2DEC1, MADERA_ISRC2DEC1MIX_INPUT_1_SOURCE);
4109cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2DEC2, MADERA_ISRC2DEC2MIX_INPUT_1_SOURCE);
4119cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2DEC3, MADERA_ISRC2DEC3MIX_INPUT_1_SOURCE);
4129cba2d6aSRichard Fitzgerald MADERA_MUX_ENUMS(ISRC2DEC4, MADERA_ISRC2DEC4MIX_INPUT_1_SOURCE);
4139cba2d6aSRichard Fitzgerald 
4149cba2d6aSRichard Fitzgerald static const char * const cs47l15_aec_loopback_texts[] = {
4159cba2d6aSRichard Fitzgerald 	"HPOUT1L", "HPOUT1R", "SPKOUTL", "SPKDAT1L", "SPKDAT1R",
4169cba2d6aSRichard Fitzgerald };
4179cba2d6aSRichard Fitzgerald 
4189cba2d6aSRichard Fitzgerald static const unsigned int cs47l15_aec_loopback_values[] = {
4199cba2d6aSRichard Fitzgerald 	0, 1, 6, 8, 9,
4209cba2d6aSRichard Fitzgerald };
4219cba2d6aSRichard Fitzgerald 
4229cba2d6aSRichard Fitzgerald static const struct soc_enum cs47l15_aec1_loopback =
4239cba2d6aSRichard Fitzgerald 	SOC_VALUE_ENUM_SINGLE(MADERA_DAC_AEC_CONTROL_1,
4249cba2d6aSRichard Fitzgerald 			      MADERA_AEC1_LOOPBACK_SRC_SHIFT, 0xf,
4259cba2d6aSRichard Fitzgerald 			      ARRAY_SIZE(cs47l15_aec_loopback_texts),
4269cba2d6aSRichard Fitzgerald 			      cs47l15_aec_loopback_texts,
4279cba2d6aSRichard Fitzgerald 			      cs47l15_aec_loopback_values);
4289cba2d6aSRichard Fitzgerald 
4299cba2d6aSRichard Fitzgerald static const struct soc_enum cs47l15_aec2_loopback =
4309cba2d6aSRichard Fitzgerald 	SOC_VALUE_ENUM_SINGLE(MADERA_DAC_AEC_CONTROL_2,
4319cba2d6aSRichard Fitzgerald 			      MADERA_AEC2_LOOPBACK_SRC_SHIFT, 0xf,
4329cba2d6aSRichard Fitzgerald 			      ARRAY_SIZE(cs47l15_aec_loopback_texts),
4339cba2d6aSRichard Fitzgerald 			      cs47l15_aec_loopback_texts,
4349cba2d6aSRichard Fitzgerald 			      cs47l15_aec_loopback_values);
4359cba2d6aSRichard Fitzgerald 
4369cba2d6aSRichard Fitzgerald static const struct snd_kcontrol_new cs47l15_aec_loopback_mux[] = {
4379cba2d6aSRichard Fitzgerald 	SOC_DAPM_ENUM("AEC1 Loopback", cs47l15_aec1_loopback),
4389cba2d6aSRichard Fitzgerald 	SOC_DAPM_ENUM("AEC2 Loopback", cs47l15_aec2_loopback),
4399cba2d6aSRichard Fitzgerald };
4409cba2d6aSRichard Fitzgerald 
4419cba2d6aSRichard Fitzgerald static const struct snd_soc_dapm_widget cs47l15_dapm_widgets[] = {
4429cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
4439cba2d6aSRichard Fitzgerald 		    0, madera_sysclk_ev,
4441094af11SCharles Keepax 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4451094af11SCharles Keepax 		    SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4469cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
4479cba2d6aSRichard Fitzgerald 		    MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
4481094af11SCharles Keepax SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
4491094af11SCharles Keepax 		    0, madera_clk_ev,
4501094af11SCharles Keepax 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4519cba2d6aSRichard Fitzgerald 
4529cba2d6aSRichard Fitzgerald SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD1", 20, 0),
4539cba2d6aSRichard Fitzgerald SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
4549cba2d6aSRichard Fitzgerald SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDD", 0, 0),
4559cba2d6aSRichard Fitzgerald 
4569cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("MICBIAS1", MADERA_MIC_BIAS_CTRL_1,
4579cba2d6aSRichard Fitzgerald 		    MADERA_MICB1_ENA_SHIFT, 0, NULL, 0),
4589cba2d6aSRichard Fitzgerald 
4599cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("MICBIAS1A", MADERA_MIC_BIAS_CTRL_5,
4609cba2d6aSRichard Fitzgerald 		    MADERA_MICB1A_ENA_SHIFT, 0, NULL, 0),
4619cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("MICBIAS1B", MADERA_MIC_BIAS_CTRL_5,
4629cba2d6aSRichard Fitzgerald 		    MADERA_MICB1B_ENA_SHIFT, 0, NULL, 0),
4639cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("MICBIAS1C", MADERA_MIC_BIAS_CTRL_5,
4649cba2d6aSRichard Fitzgerald 		    MADERA_MICB1C_ENA_SHIFT, 0, NULL, 0),
4659cba2d6aSRichard Fitzgerald 
4669cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("FXCLK", SND_SOC_NOPM,
4679cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_FX, 0,
4689cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4699cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4709cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("ISRC1CLK", SND_SOC_NOPM,
4719cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_ISRC1, 0,
4729cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4739cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4749cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("ISRC2CLK", SND_SOC_NOPM,
4759cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_ISRC2, 0,
4769cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4779cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4789cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("OUTCLK", SND_SOC_NOPM,
4799cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_OUT, 0,
4809cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4819cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4829cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("SPDCLK", SND_SOC_NOPM,
4839cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_SPD, 0,
4849cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4859cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4869cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("DSP1CLK", SND_SOC_NOPM,
4879cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_DSP1, 0,
4889cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4899cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4909cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("AIF1TXCLK", SND_SOC_NOPM,
4919cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_AIF1, 0,
4929cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4939cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4949cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("AIF2TXCLK", SND_SOC_NOPM,
4959cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_AIF2, 0,
4969cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
4979cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4989cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("AIF3TXCLK", SND_SOC_NOPM,
4999cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_AIF3, 0,
5009cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
5019cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
5029cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SUPPLY("PWMCLK", SND_SOC_NOPM,
5039cba2d6aSRichard Fitzgerald 		    MADERA_DOM_GRP_PWM, 0,
5049cba2d6aSRichard Fitzgerald 		    madera_domain_clk_ev,
5059cba2d6aSRichard Fitzgerald 		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
5069cba2d6aSRichard Fitzgerald 
5079cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SIGGEN("TONE"),
5089cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SIGGEN("NOISE"),
5099cba2d6aSRichard Fitzgerald 
5109cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1ALN"),
5119cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1ALP"),
5129cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1BLN"),
5139cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1BLP"),
5149cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1ARN"),
5159cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1ARP"),
5169cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1BRN"),
5179cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN1BRP"),
5189cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN2N"),
5199cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("IN2P"),
5209cba2d6aSRichard Fitzgerald SND_SOC_DAPM_INPUT("SPKRXDAT"),
5219cba2d6aSRichard Fitzgerald 
5229cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN1L Analog Mux", SND_SOC_NOPM, 0, 0, &madera_inmux[0]),
5239cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN1R Analog Mux", SND_SOC_NOPM, 0, 0, &madera_inmux[1]),
5249cba2d6aSRichard Fitzgerald 
5259cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN1L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[0]),
5269cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN1R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[0]),
5279cba2d6aSRichard Fitzgerald 
5289cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN2L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),
5299cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("IN2R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),
5309cba2d6aSRichard Fitzgerald 
5319cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
5329cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
5339cba2d6aSRichard Fitzgerald 
5349cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("DSP Trigger Out"),
5359cba2d6aSRichard Fitzgerald 
5369cba2d6aSRichard Fitzgerald SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l15_outdemux),
5378ab6ddc5SCharles Keepax SND_SOC_DAPM_MUX("HPOUT1 Mono Mux", SND_SOC_NOPM, 0, 0, &cs47l15_outdemux),
5389cba2d6aSRichard Fitzgerald 
5399cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT,
5409cba2d6aSRichard Fitzgerald 		 0, NULL, 0),
5419cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("PWM2 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM2_ENA_SHIFT,
5429cba2d6aSRichard Fitzgerald 		 0, NULL, 0),
5439cba2d6aSRichard Fitzgerald 
5449cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
5459cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX1_ENA_SHIFT, 0),
5463570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 1,
5479cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX2_ENA_SHIFT, 0),
5483570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 2,
5499cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX3_ENA_SHIFT, 0),
5503570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 3,
5519cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX4_ENA_SHIFT, 0),
5523570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 4,
5539cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX5_ENA_SHIFT, 0),
5543570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 5,
5559cba2d6aSRichard Fitzgerald 		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX6_ENA_SHIFT, 0),
5569cba2d6aSRichard Fitzgerald 
5579cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
5589cba2d6aSRichard Fitzgerald 		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX1_ENA_SHIFT, 0),
5593570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 1,
5609cba2d6aSRichard Fitzgerald 		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX2_ENA_SHIFT, 0),
5613570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 2,
5629cba2d6aSRichard Fitzgerald 		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX3_ENA_SHIFT, 0),
5633570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 3,
5649cba2d6aSRichard Fitzgerald 		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX4_ENA_SHIFT, 0),
5659cba2d6aSRichard Fitzgerald 
5669cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
5679cba2d6aSRichard Fitzgerald 		     MADERA_AIF3_TX_ENABLES, MADERA_AIF3TX1_ENA_SHIFT, 0),
5683570922cSCharles Keepax SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 1,
5699cba2d6aSRichard Fitzgerald 		     MADERA_AIF3_TX_ENABLES, MADERA_AIF3TX2_ENA_SHIFT, 0),
5709cba2d6aSRichard Fitzgerald 
5719cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
5729cba2d6aSRichard Fitzgerald 		   MADERA_OUT1L_ENA_SHIFT, 0, NULL, 0, madera_hp_ev,
5739cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
5749cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
5759cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
5769cba2d6aSRichard Fitzgerald 		   MADERA_OUT1R_ENA_SHIFT, 0, NULL, 0, madera_hp_ev,
5779cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
5789cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
5799cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM,
5809cba2d6aSRichard Fitzgerald 		   MADERA_OUT4L_ENA_SHIFT, 0, NULL, 0, madera_spk_ev,
5819cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
5829cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("OUT5L", MADERA_OUTPUT_ENABLES_1,
5839cba2d6aSRichard Fitzgerald 		   MADERA_OUT5L_ENA_SHIFT, 0, NULL, 0, madera_out_ev,
5849cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
5859cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("OUT5R", MADERA_OUTPUT_ENABLES_1,
5869cba2d6aSRichard Fitzgerald 		   MADERA_OUT5R_ENA_SHIFT, 0, NULL, 0, madera_out_ev,
5879cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
5889cba2d6aSRichard Fitzgerald 
5899cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("SPD1TX1", MADERA_SPD1_TX_CONTROL,
5909cba2d6aSRichard Fitzgerald 		 MADERA_SPD1_VAL1_SHIFT, 0, NULL, 0),
5919cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("SPD1TX2", MADERA_SPD1_TX_CONTROL,
5929cba2d6aSRichard Fitzgerald 		 MADERA_SPD1_VAL2_SHIFT, 0, NULL, 0),
5939cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUT_DRV("SPD1", MADERA_SPD1_TX_CONTROL,
5949cba2d6aSRichard Fitzgerald 		     MADERA_SPD1_ENA_SHIFT, 0, NULL, 0),
5959cba2d6aSRichard Fitzgerald 
5969cba2d6aSRichard Fitzgerald /*
5979cba2d6aSRichard Fitzgerald  * mux_in widgets : arranged in the order of sources
5989cba2d6aSRichard Fitzgerald  * specified in MADERA_MIXER_INPUT_ROUTES
5999cba2d6aSRichard Fitzgerald  */
6009cba2d6aSRichard Fitzgerald 
6019cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("Noise Generator", MADERA_COMFORT_NOISE_GENERATOR,
6029cba2d6aSRichard Fitzgerald 		 MADERA_NOISE_GEN_ENA_SHIFT, 0, NULL, 0),
6039cba2d6aSRichard Fitzgerald 
6049cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("Tone Generator 1", MADERA_TONE_GENERATOR_1,
6059cba2d6aSRichard Fitzgerald 		 MADERA_TONE1_ENA_SHIFT, 0, NULL, 0),
6069cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("Tone Generator 2", MADERA_TONE_GENERATOR_1,
6079cba2d6aSRichard Fitzgerald 		 MADERA_TONE2_ENA_SHIFT, 0, NULL, 0),
6089cba2d6aSRichard Fitzgerald 
6099cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SIGGEN("HAPTICS"),
6109cba2d6aSRichard Fitzgerald 
6119cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("AEC1 Loopback", MADERA_DAC_AEC_CONTROL_1,
6129cba2d6aSRichard Fitzgerald 		 MADERA_AEC1_LOOPBACK_ENA_SHIFT, 0,
6139cba2d6aSRichard Fitzgerald 		 &cs47l15_aec_loopback_mux[0]),
6149cba2d6aSRichard Fitzgerald SND_SOC_DAPM_MUX("AEC2 Loopback", MADERA_DAC_AEC_CONTROL_2,
6159cba2d6aSRichard Fitzgerald 		 MADERA_AEC2_LOOPBACK_ENA_SHIFT, 0,
6169cba2d6aSRichard Fitzgerald 		 &cs47l15_aec_loopback_mux[1]),
6179cba2d6aSRichard Fitzgerald 
6189cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("IN1L", MADERA_INPUT_ENABLES, MADERA_IN1L_ENA_SHIFT,
6199cba2d6aSRichard Fitzgerald 		   0, NULL, 0, madera_in_ev,
6209cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
6219cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
6229cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("IN1R", MADERA_INPUT_ENABLES, MADERA_IN1R_ENA_SHIFT,
6239cba2d6aSRichard Fitzgerald 		   0, NULL, 0, madera_in_ev,
6249cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
6259cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
6269cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("IN2L", MADERA_INPUT_ENABLES, MADERA_IN2L_ENA_SHIFT,
6279cba2d6aSRichard Fitzgerald 		   0, NULL, 0, madera_in_ev,
6289cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
6299cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
6309cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA_E("IN2R", MADERA_INPUT_ENABLES, MADERA_IN2R_ENA_SHIFT,
6319cba2d6aSRichard Fitzgerald 		   0, NULL, 0, madera_in_ev,
6329cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
6339cba2d6aSRichard Fitzgerald 		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
6349cba2d6aSRichard Fitzgerald 
6359cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
6369cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX1_ENA_SHIFT, 0),
6373570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 1,
6389cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX2_ENA_SHIFT, 0),
6393570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 2,
6409cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX3_ENA_SHIFT, 0),
6413570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 3,
6429cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX4_ENA_SHIFT, 0),
6433570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 4,
6449cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX5_ENA_SHIFT, 0),
6453570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 5,
6469cba2d6aSRichard Fitzgerald 		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX6_ENA_SHIFT, 0),
6479cba2d6aSRichard Fitzgerald 
6489cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
6499cba2d6aSRichard Fitzgerald 		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX1_ENA_SHIFT, 0),
6503570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 1,
6519cba2d6aSRichard Fitzgerald 		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX2_ENA_SHIFT, 0),
6523570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 2,
6539cba2d6aSRichard Fitzgerald 		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX3_ENA_SHIFT, 0),
6543570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 3,
6559cba2d6aSRichard Fitzgerald 		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX4_ENA_SHIFT, 0),
6569cba2d6aSRichard Fitzgerald 
6579cba2d6aSRichard Fitzgerald SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
6589cba2d6aSRichard Fitzgerald 		    MADERA_AIF3_RX_ENABLES, MADERA_AIF3RX1_ENA_SHIFT, 0),
6593570922cSCharles Keepax SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 1,
6609cba2d6aSRichard Fitzgerald 		    MADERA_AIF3_RX_ENABLES, MADERA_AIF3RX2_ENA_SHIFT, 0),
6619cba2d6aSRichard Fitzgerald 
6629cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("EQ1", MADERA_EQ1_1, MADERA_EQ1_ENA_SHIFT, 0, NULL, 0),
6639cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("EQ2", MADERA_EQ2_1, MADERA_EQ2_ENA_SHIFT, 0, NULL, 0),
6649cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("EQ3", MADERA_EQ3_1, MADERA_EQ3_ENA_SHIFT, 0, NULL, 0),
6659cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("EQ4", MADERA_EQ4_1, MADERA_EQ4_ENA_SHIFT, 0, NULL, 0),
6669cba2d6aSRichard Fitzgerald 
6679cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("DRC1L", MADERA_DRC1_CTRL1, MADERA_DRC1L_ENA_SHIFT, 0,
6689cba2d6aSRichard Fitzgerald 		 NULL, 0),
6699cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("DRC1R", MADERA_DRC1_CTRL1, MADERA_DRC1R_ENA_SHIFT, 0,
6709cba2d6aSRichard Fitzgerald 		 NULL, 0),
6719cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("DRC2L", MADERA_DRC2_CTRL1, MADERA_DRC2L_ENA_SHIFT, 0,
6729cba2d6aSRichard Fitzgerald 		 NULL, 0),
6739cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("DRC2R", MADERA_DRC2_CTRL1, MADERA_DRC2R_ENA_SHIFT, 0,
6749cba2d6aSRichard Fitzgerald 		 NULL, 0),
6759cba2d6aSRichard Fitzgerald 
6769cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("LHPF1", MADERA_HPLPF1_1, MADERA_LHPF1_ENA_SHIFT, 0, NULL, 0),
6779cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("LHPF2", MADERA_HPLPF2_1, MADERA_LHPF2_ENA_SHIFT, 0, NULL, 0),
6789cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("LHPF3", MADERA_HPLPF3_1, MADERA_LHPF3_ENA_SHIFT, 0, NULL, 0),
6799cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("LHPF4", MADERA_HPLPF4_1, MADERA_LHPF4_ENA_SHIFT, 0, NULL, 0),
6809cba2d6aSRichard Fitzgerald 
6819cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1DEC1", MADERA_ISRC_1_CTRL_3,
6829cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),
6839cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1DEC2", MADERA_ISRC_1_CTRL_3,
6849cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),
6859cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1DEC3", MADERA_ISRC_1_CTRL_3,
6869cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),
6879cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1DEC4", MADERA_ISRC_1_CTRL_3,
6889cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_DEC4_ENA_SHIFT, 0, NULL, 0),
6899cba2d6aSRichard Fitzgerald 
6909cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1INT1", MADERA_ISRC_1_CTRL_3,
6919cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),
6929cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1INT2", MADERA_ISRC_1_CTRL_3,
6939cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),
6949cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1INT3", MADERA_ISRC_1_CTRL_3,
6959cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),
6969cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC1INT4", MADERA_ISRC_1_CTRL_3,
6979cba2d6aSRichard Fitzgerald 		 MADERA_ISRC1_INT4_ENA_SHIFT, 0, NULL, 0),
6989cba2d6aSRichard Fitzgerald 
6999cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2DEC1", MADERA_ISRC_2_CTRL_3,
7009cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),
7019cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2DEC2", MADERA_ISRC_2_CTRL_3,
7029cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0),
7039cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2DEC3", MADERA_ISRC_2_CTRL_3,
7049cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0),
7059cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2DEC4", MADERA_ISRC_2_CTRL_3,
7069cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_DEC4_ENA_SHIFT, 0, NULL, 0),
7079cba2d6aSRichard Fitzgerald 
7089cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2INT1", MADERA_ISRC_2_CTRL_3,
7099cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),
7109cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2INT2", MADERA_ISRC_2_CTRL_3,
7119cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0),
7129cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2INT3", MADERA_ISRC_2_CTRL_3,
7139cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_INT3_ENA_SHIFT, 0, NULL, 0),
7149cba2d6aSRichard Fitzgerald SND_SOC_DAPM_PGA("ISRC2INT4", MADERA_ISRC_2_CTRL_3,
7159cba2d6aSRichard Fitzgerald 		 MADERA_ISRC2_INT4_ENA_SHIFT, 0, NULL, 0),
7169cba2d6aSRichard Fitzgerald 
7179cba2d6aSRichard Fitzgerald WM_ADSP2("DSP1", 0, cs47l15_adsp_power_ev),
7189cba2d6aSRichard Fitzgerald 
7199cba2d6aSRichard Fitzgerald /* end of ordered widget list */
7209cba2d6aSRichard Fitzgerald 
7219cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(EQ1, "EQ1"),
7229cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(EQ2, "EQ2"),
7239cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(EQ3, "EQ3"),
7249cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(EQ4, "EQ4"),
7259cba2d6aSRichard Fitzgerald 
7269cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(DRC1L, "DRC1L"),
7279cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(DRC1R, "DRC1R"),
7289cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(DRC2L, "DRC2L"),
7299cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(DRC2R, "DRC2R"),
7309cba2d6aSRichard Fitzgerald 
7319cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SWITCH("DRC1 Activity Output", SND_SOC_NOPM, 0, 0,
7329cba2d6aSRichard Fitzgerald 		    &madera_drc_activity_output_mux[0]),
7339cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SWITCH("DRC2 Activity Output", SND_SOC_NOPM, 0, 0,
7349cba2d6aSRichard Fitzgerald 		    &madera_drc_activity_output_mux[1]),
7359cba2d6aSRichard Fitzgerald 
7369cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(LHPF1, "LHPF1"),
7379cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(LHPF2, "LHPF2"),
7389cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(LHPF3, "LHPF3"),
7399cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(LHPF4, "LHPF4"),
7409cba2d6aSRichard Fitzgerald 
7419cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(PWM1, "PWM1"),
7429cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(PWM2, "PWM2"),
7439cba2d6aSRichard Fitzgerald 
7449cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(OUT1L, "HPOUT1L"),
7459cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),
7469cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
7479cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(SPKDAT1L, "SPKDAT1L"),
7489cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(SPKDAT1R, "SPKDAT1R"),
7499cba2d6aSRichard Fitzgerald 
7509cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
7519cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
7529cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
7539cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
7549cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
7559cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
7569cba2d6aSRichard Fitzgerald 
7579cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
7589cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
7599cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
7609cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
7619cba2d6aSRichard Fitzgerald 
7629cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
7639cba2d6aSRichard Fitzgerald MADERA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
7649cba2d6aSRichard Fitzgerald 
7659cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(SPD1TX1, "SPDIF1TX1"),
7669cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(SPD1TX2, "SPDIF1TX2"),
7679cba2d6aSRichard Fitzgerald 
7689cba2d6aSRichard Fitzgerald MADERA_DSP_WIDGETS(DSP1, "DSP1"),
7699cba2d6aSRichard Fitzgerald 
7709cba2d6aSRichard Fitzgerald SND_SOC_DAPM_SWITCH("DSP1 Trigger Output", SND_SOC_NOPM, 0, 0,
7719cba2d6aSRichard Fitzgerald 		    &madera_dsp_trigger_output_mux[0]),
7729cba2d6aSRichard Fitzgerald 
7739cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),
7749cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),
7759cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),
7769cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),
7779cba2d6aSRichard Fitzgerald 
7789cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),
7799cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),
7809cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),
7819cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),
7829cba2d6aSRichard Fitzgerald 
7839cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),
7849cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),
7859cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2DEC3, "ISRC2DEC3"),
7869cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"),
7879cba2d6aSRichard Fitzgerald 
7889cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
7899cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
7909cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"),
7919cba2d6aSRichard Fitzgerald MADERA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"),
7929cba2d6aSRichard Fitzgerald 
7939cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("HPOUTL"),
7949cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("HPOUTR"),
7959cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("EPOUTP"),
7969cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("EPOUTN"),
7979cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("SPKOUTN"),
7989cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("SPKOUTP"),
7999cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("SPKDAT1L"),
8009cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("SPKDAT1R"),
8019cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("SPDIF1"),
8029cba2d6aSRichard Fitzgerald 
8039cba2d6aSRichard Fitzgerald SND_SOC_DAPM_OUTPUT("MICSUPP"),
8049cba2d6aSRichard Fitzgerald };
8059cba2d6aSRichard Fitzgerald 
8069cba2d6aSRichard Fitzgerald #define MADERA_MIXER_INPUT_ROUTES(name)	\
8079cba2d6aSRichard Fitzgerald 	{ name, "Noise Generator", "Noise Generator" }, \
8089cba2d6aSRichard Fitzgerald 	{ name, "Tone Generator 1", "Tone Generator 1" }, \
8099cba2d6aSRichard Fitzgerald 	{ name, "Tone Generator 2", "Tone Generator 2" }, \
8109cba2d6aSRichard Fitzgerald 	{ name, "Haptics", "HAPTICS" }, \
8119cba2d6aSRichard Fitzgerald 	{ name, "AEC1", "AEC1 Loopback" }, \
8129cba2d6aSRichard Fitzgerald 	{ name, "AEC2", "AEC2 Loopback" }, \
8139cba2d6aSRichard Fitzgerald 	{ name, "IN1L", "IN1L" }, \
8149cba2d6aSRichard Fitzgerald 	{ name, "IN1R", "IN1R" }, \
8159cba2d6aSRichard Fitzgerald 	{ name, "IN2L", "IN2L" }, \
8169cba2d6aSRichard Fitzgerald 	{ name, "IN2R", "IN2R" }, \
8179cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX1", "AIF1RX1" }, \
8189cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX2", "AIF1RX2" }, \
8199cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX3", "AIF1RX3" }, \
8209cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX4", "AIF1RX4" }, \
8219cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX5", "AIF1RX5" }, \
8229cba2d6aSRichard Fitzgerald 	{ name, "AIF1RX6", "AIF1RX6" }, \
8239cba2d6aSRichard Fitzgerald 	{ name, "AIF2RX1", "AIF2RX1" }, \
8249cba2d6aSRichard Fitzgerald 	{ name, "AIF2RX2", "AIF2RX2" }, \
8259cba2d6aSRichard Fitzgerald 	{ name, "AIF2RX3", "AIF2RX3" }, \
8269cba2d6aSRichard Fitzgerald 	{ name, "AIF2RX4", "AIF2RX4" }, \
8279cba2d6aSRichard Fitzgerald 	{ name, "AIF3RX1", "AIF3RX1" }, \
8289cba2d6aSRichard Fitzgerald 	{ name, "AIF3RX2", "AIF3RX2" }, \
8299cba2d6aSRichard Fitzgerald 	{ name, "EQ1", "EQ1" }, \
8309cba2d6aSRichard Fitzgerald 	{ name, "EQ2", "EQ2" }, \
8319cba2d6aSRichard Fitzgerald 	{ name, "EQ3", "EQ3" }, \
8329cba2d6aSRichard Fitzgerald 	{ name, "EQ4", "EQ4" }, \
8339cba2d6aSRichard Fitzgerald 	{ name, "DRC1L", "DRC1L" }, \
8349cba2d6aSRichard Fitzgerald 	{ name, "DRC1R", "DRC1R" }, \
8359cba2d6aSRichard Fitzgerald 	{ name, "DRC2L", "DRC2L" }, \
8369cba2d6aSRichard Fitzgerald 	{ name, "DRC2R", "DRC2R" }, \
8379cba2d6aSRichard Fitzgerald 	{ name, "LHPF1", "LHPF1" }, \
8389cba2d6aSRichard Fitzgerald 	{ name, "LHPF2", "LHPF2" }, \
8399cba2d6aSRichard Fitzgerald 	{ name, "LHPF3", "LHPF3" }, \
8409cba2d6aSRichard Fitzgerald 	{ name, "LHPF4", "LHPF4" }, \
8419cba2d6aSRichard Fitzgerald 	{ name, "ISRC1DEC1", "ISRC1DEC1" }, \
8429cba2d6aSRichard Fitzgerald 	{ name, "ISRC1DEC2", "ISRC1DEC2" }, \
8439cba2d6aSRichard Fitzgerald 	{ name, "ISRC1DEC3", "ISRC1DEC3" }, \
8449cba2d6aSRichard Fitzgerald 	{ name, "ISRC1DEC4", "ISRC1DEC4" }, \
8459cba2d6aSRichard Fitzgerald 	{ name, "ISRC1INT1", "ISRC1INT1" }, \
8469cba2d6aSRichard Fitzgerald 	{ name, "ISRC1INT2", "ISRC1INT2" }, \
8479cba2d6aSRichard Fitzgerald 	{ name, "ISRC1INT3", "ISRC1INT3" }, \
8489cba2d6aSRichard Fitzgerald 	{ name, "ISRC1INT4", "ISRC1INT4" }, \
8499cba2d6aSRichard Fitzgerald 	{ name, "ISRC2DEC1", "ISRC2DEC1" }, \
8509cba2d6aSRichard Fitzgerald 	{ name, "ISRC2DEC2", "ISRC2DEC2" }, \
8519cba2d6aSRichard Fitzgerald 	{ name, "ISRC2DEC3", "ISRC2DEC3" }, \
8529cba2d6aSRichard Fitzgerald 	{ name, "ISRC2DEC4", "ISRC2DEC4" }, \
8539cba2d6aSRichard Fitzgerald 	{ name, "ISRC2INT1", "ISRC2INT1" }, \
8549cba2d6aSRichard Fitzgerald 	{ name, "ISRC2INT2", "ISRC2INT2" }, \
8559cba2d6aSRichard Fitzgerald 	{ name, "ISRC2INT3", "ISRC2INT3" }, \
8569cba2d6aSRichard Fitzgerald 	{ name, "ISRC2INT4", "ISRC2INT4" }, \
8579cba2d6aSRichard Fitzgerald 	{ name, "DSP1.1", "DSP1" }, \
8589cba2d6aSRichard Fitzgerald 	{ name, "DSP1.2", "DSP1" }, \
8599cba2d6aSRichard Fitzgerald 	{ name, "DSP1.3", "DSP1" }, \
8609cba2d6aSRichard Fitzgerald 	{ name, "DSP1.4", "DSP1" }, \
8619cba2d6aSRichard Fitzgerald 	{ name, "DSP1.5", "DSP1" }, \
8629cba2d6aSRichard Fitzgerald 	{ name, "DSP1.6", "DSP1" }
8639cba2d6aSRichard Fitzgerald 
8649cba2d6aSRichard Fitzgerald static const struct snd_soc_dapm_route cs47l15_dapm_routes[] = {
8659cba2d6aSRichard Fitzgerald 	/* Internal clock domains */
8669cba2d6aSRichard Fitzgerald 	{ "EQ1", NULL, "FXCLK" },
8679cba2d6aSRichard Fitzgerald 	{ "EQ2", NULL, "FXCLK" },
8689cba2d6aSRichard Fitzgerald 	{ "EQ3", NULL, "FXCLK" },
8699cba2d6aSRichard Fitzgerald 	{ "EQ4", NULL, "FXCLK" },
8709cba2d6aSRichard Fitzgerald 	{ "DRC1L", NULL, "FXCLK" },
8719cba2d6aSRichard Fitzgerald 	{ "DRC1R", NULL, "FXCLK" },
8729cba2d6aSRichard Fitzgerald 	{ "DRC2L", NULL, "FXCLK" },
8739cba2d6aSRichard Fitzgerald 	{ "DRC2R", NULL, "FXCLK" },
8749cba2d6aSRichard Fitzgerald 	{ "LHPF1", NULL, "FXCLK" },
8759cba2d6aSRichard Fitzgerald 	{ "LHPF2", NULL, "FXCLK" },
8769cba2d6aSRichard Fitzgerald 	{ "LHPF3", NULL, "FXCLK" },
8779cba2d6aSRichard Fitzgerald 	{ "LHPF4", NULL, "FXCLK" },
8789cba2d6aSRichard Fitzgerald 	{ "PWM1 Mixer", NULL, "PWMCLK" },
8799cba2d6aSRichard Fitzgerald 	{ "PWM2 Mixer", NULL, "PWMCLK" },
8809cba2d6aSRichard Fitzgerald 	{ "OUT1L", NULL, "OUTCLK" },
8819cba2d6aSRichard Fitzgerald 	{ "OUT1R", NULL, "OUTCLK" },
8829cba2d6aSRichard Fitzgerald 	{ "OUT4L", NULL, "OUTCLK" },
8839cba2d6aSRichard Fitzgerald 	{ "OUT5L", NULL, "OUTCLK" },
8849cba2d6aSRichard Fitzgerald 	{ "OUT5R", NULL, "OUTCLK" },
8859cba2d6aSRichard Fitzgerald 	{ "AIF1TX1", NULL, "AIF1TXCLK" },
8869cba2d6aSRichard Fitzgerald 	{ "AIF1TX2", NULL, "AIF1TXCLK" },
8879cba2d6aSRichard Fitzgerald 	{ "AIF1TX3", NULL, "AIF1TXCLK" },
8889cba2d6aSRichard Fitzgerald 	{ "AIF1TX4", NULL, "AIF1TXCLK" },
8899cba2d6aSRichard Fitzgerald 	{ "AIF1TX5", NULL, "AIF1TXCLK" },
8909cba2d6aSRichard Fitzgerald 	{ "AIF1TX6", NULL, "AIF1TXCLK" },
8919cba2d6aSRichard Fitzgerald 	{ "AIF2TX1", NULL, "AIF2TXCLK" },
8929cba2d6aSRichard Fitzgerald 	{ "AIF2TX2", NULL, "AIF2TXCLK" },
8939cba2d6aSRichard Fitzgerald 	{ "AIF2TX3", NULL, "AIF2TXCLK" },
8949cba2d6aSRichard Fitzgerald 	{ "AIF2TX4", NULL, "AIF2TXCLK" },
8959cba2d6aSRichard Fitzgerald 	{ "AIF3TX1", NULL, "AIF3TXCLK" },
8969cba2d6aSRichard Fitzgerald 	{ "AIF3TX2", NULL, "AIF3TXCLK" },
8979cba2d6aSRichard Fitzgerald 	{ "SPD1TX1", NULL, "SPDCLK" },
8989cba2d6aSRichard Fitzgerald 	{ "SPD1TX2", NULL, "SPDCLK" },
8999cba2d6aSRichard Fitzgerald 	{ "DSP1", NULL, "DSP1CLK" },
9009cba2d6aSRichard Fitzgerald 	{ "ISRC1DEC1", NULL, "ISRC1CLK" },
9019cba2d6aSRichard Fitzgerald 	{ "ISRC1DEC2", NULL, "ISRC1CLK" },
9029cba2d6aSRichard Fitzgerald 	{ "ISRC1DEC3", NULL, "ISRC1CLK" },
9039cba2d6aSRichard Fitzgerald 	{ "ISRC1DEC4", NULL, "ISRC1CLK" },
9049cba2d6aSRichard Fitzgerald 	{ "ISRC1INT1", NULL, "ISRC1CLK" },
9059cba2d6aSRichard Fitzgerald 	{ "ISRC1INT2", NULL, "ISRC1CLK" },
9069cba2d6aSRichard Fitzgerald 	{ "ISRC1INT3", NULL, "ISRC1CLK" },
9079cba2d6aSRichard Fitzgerald 	{ "ISRC1INT4", NULL, "ISRC1CLK" },
9089cba2d6aSRichard Fitzgerald 	{ "ISRC2DEC1", NULL, "ISRC2CLK" },
9099cba2d6aSRichard Fitzgerald 	{ "ISRC2DEC2", NULL, "ISRC2CLK" },
9109cba2d6aSRichard Fitzgerald 	{ "ISRC2DEC3", NULL, "ISRC2CLK" },
9119cba2d6aSRichard Fitzgerald 	{ "ISRC2DEC4", NULL, "ISRC2CLK" },
9129cba2d6aSRichard Fitzgerald 	{ "ISRC2INT1", NULL, "ISRC2CLK" },
9139cba2d6aSRichard Fitzgerald 	{ "ISRC2INT2", NULL, "ISRC2CLK" },
9149cba2d6aSRichard Fitzgerald 	{ "ISRC2INT3", NULL, "ISRC2CLK" },
9159cba2d6aSRichard Fitzgerald 	{ "ISRC2INT4", NULL, "ISRC2CLK" },
9169cba2d6aSRichard Fitzgerald 
9179cba2d6aSRichard Fitzgerald 	{ "OUT1L", NULL, "CPVDD1" },
9189cba2d6aSRichard Fitzgerald 	{ "OUT1R", NULL, "CPVDD1" },
9199cba2d6aSRichard Fitzgerald 	{ "OUT4L", NULL, "SPKVDD" },
9209cba2d6aSRichard Fitzgerald 
9219cba2d6aSRichard Fitzgerald 	{ "OUT1L", NULL, "SYSCLK" },
9229cba2d6aSRichard Fitzgerald 	{ "OUT1R", NULL, "SYSCLK" },
9239cba2d6aSRichard Fitzgerald 	{ "OUT4L", NULL, "SYSCLK" },
9249cba2d6aSRichard Fitzgerald 	{ "OUT5L", NULL, "SYSCLK" },
9259cba2d6aSRichard Fitzgerald 	{ "OUT5R", NULL, "SYSCLK" },
9269cba2d6aSRichard Fitzgerald 
9279cba2d6aSRichard Fitzgerald 	{ "SPD1", NULL, "SYSCLK" },
9289cba2d6aSRichard Fitzgerald 	{ "SPD1", NULL, "SPD1TX1" },
9299cba2d6aSRichard Fitzgerald 	{ "SPD1", NULL, "SPD1TX2" },
9309cba2d6aSRichard Fitzgerald 
9319cba2d6aSRichard Fitzgerald 	{ "IN1L", NULL, "SYSCLK" },
9329cba2d6aSRichard Fitzgerald 	{ "IN1R", NULL, "SYSCLK" },
9339cba2d6aSRichard Fitzgerald 	{ "IN2L", NULL, "SYSCLK" },
9349cba2d6aSRichard Fitzgerald 	{ "IN2R", NULL, "SYSCLK" },
9359cba2d6aSRichard Fitzgerald 
9369cba2d6aSRichard Fitzgerald 	{ "MICBIAS1", NULL, "MICVDD" },
9379cba2d6aSRichard Fitzgerald 
9389cba2d6aSRichard Fitzgerald 	{ "MICBIAS1A", NULL, "MICBIAS1" },
9399cba2d6aSRichard Fitzgerald 	{ "MICBIAS1B", NULL, "MICBIAS1" },
9409cba2d6aSRichard Fitzgerald 	{ "MICBIAS1C", NULL, "MICBIAS1" },
9419cba2d6aSRichard Fitzgerald 
9429cba2d6aSRichard Fitzgerald 	{ "Noise Generator", NULL, "SYSCLK" },
9439cba2d6aSRichard Fitzgerald 	{ "Tone Generator 1", NULL, "SYSCLK" },
9449cba2d6aSRichard Fitzgerald 	{ "Tone Generator 2", NULL, "SYSCLK" },
9459cba2d6aSRichard Fitzgerald 
9469cba2d6aSRichard Fitzgerald 	{ "Noise Generator", NULL, "NOISE" },
9479cba2d6aSRichard Fitzgerald 	{ "Tone Generator 1", NULL, "TONE" },
9489cba2d6aSRichard Fitzgerald 	{ "Tone Generator 2", NULL, "TONE" },
9499cba2d6aSRichard Fitzgerald 
9509cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX1" },
9519cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX2" },
9529cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX3" },
9539cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX4" },
9549cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX5" },
9559cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "AIF1TX6" },
9569cba2d6aSRichard Fitzgerald 
9579cba2d6aSRichard Fitzgerald 	{ "AIF1RX1", NULL, "AIF1 Playback" },
9589cba2d6aSRichard Fitzgerald 	{ "AIF1RX2", NULL, "AIF1 Playback" },
9599cba2d6aSRichard Fitzgerald 	{ "AIF1RX3", NULL, "AIF1 Playback" },
9609cba2d6aSRichard Fitzgerald 	{ "AIF1RX4", NULL, "AIF1 Playback" },
9619cba2d6aSRichard Fitzgerald 	{ "AIF1RX5", NULL, "AIF1 Playback" },
9629cba2d6aSRichard Fitzgerald 	{ "AIF1RX6", NULL, "AIF1 Playback" },
9639cba2d6aSRichard Fitzgerald 
9649cba2d6aSRichard Fitzgerald 	{ "AIF2 Capture", NULL, "AIF2TX1" },
9659cba2d6aSRichard Fitzgerald 	{ "AIF2 Capture", NULL, "AIF2TX2" },
9669cba2d6aSRichard Fitzgerald 	{ "AIF2 Capture", NULL, "AIF2TX3" },
9679cba2d6aSRichard Fitzgerald 	{ "AIF2 Capture", NULL, "AIF2TX4" },
9689cba2d6aSRichard Fitzgerald 
9699cba2d6aSRichard Fitzgerald 	{ "AIF2RX1", NULL, "AIF2 Playback" },
9709cba2d6aSRichard Fitzgerald 	{ "AIF2RX2", NULL, "AIF2 Playback" },
9719cba2d6aSRichard Fitzgerald 	{ "AIF2RX3", NULL, "AIF2 Playback" },
9729cba2d6aSRichard Fitzgerald 	{ "AIF2RX4", NULL, "AIF2 Playback" },
9739cba2d6aSRichard Fitzgerald 
9749cba2d6aSRichard Fitzgerald 	{ "AIF3 Capture", NULL, "AIF3TX1" },
9759cba2d6aSRichard Fitzgerald 	{ "AIF3 Capture", NULL, "AIF3TX2" },
9769cba2d6aSRichard Fitzgerald 
9779cba2d6aSRichard Fitzgerald 	{ "AIF3RX1", NULL, "AIF3 Playback" },
9789cba2d6aSRichard Fitzgerald 	{ "AIF3RX2", NULL, "AIF3 Playback" },
9799cba2d6aSRichard Fitzgerald 
9809cba2d6aSRichard Fitzgerald 	{ "AIF1 Playback", NULL, "SYSCLK" },
9819cba2d6aSRichard Fitzgerald 	{ "AIF2 Playback", NULL, "SYSCLK" },
9829cba2d6aSRichard Fitzgerald 	{ "AIF3 Playback", NULL, "SYSCLK" },
9839cba2d6aSRichard Fitzgerald 
9849cba2d6aSRichard Fitzgerald 	{ "AIF1 Capture", NULL, "SYSCLK" },
9859cba2d6aSRichard Fitzgerald 	{ "AIF2 Capture", NULL, "SYSCLK" },
9869cba2d6aSRichard Fitzgerald 	{ "AIF3 Capture", NULL, "SYSCLK" },
9879cba2d6aSRichard Fitzgerald 
9889cba2d6aSRichard Fitzgerald 	{ "Audio Trace DSP", NULL, "DSP1" },
9899cba2d6aSRichard Fitzgerald 
9909cba2d6aSRichard Fitzgerald 	{ "IN1L Analog Mux", "A", "IN1ALN" },
9919cba2d6aSRichard Fitzgerald 	{ "IN1L Analog Mux", "A", "IN1ALP" },
9929cba2d6aSRichard Fitzgerald 	{ "IN1L Analog Mux", "B", "IN1BLN" },
9939cba2d6aSRichard Fitzgerald 	{ "IN1L Analog Mux", "B", "IN1BLP" },
9949cba2d6aSRichard Fitzgerald 	{ "IN1R Analog Mux", "A", "IN1ARN" },
9959cba2d6aSRichard Fitzgerald 	{ "IN1R Analog Mux", "A", "IN1ARP" },
9969cba2d6aSRichard Fitzgerald 	{ "IN1R Analog Mux", "B", "IN1BRN" },
9979cba2d6aSRichard Fitzgerald 	{ "IN1R Analog Mux", "B", "IN1BRP" },
9989cba2d6aSRichard Fitzgerald 
9999cba2d6aSRichard Fitzgerald 	{ "IN1L Mode", "Analog", "IN1L Analog Mux" },
10009cba2d6aSRichard Fitzgerald 	{ "IN1R Mode", "Analog", "IN1R Analog Mux" },
10019cba2d6aSRichard Fitzgerald 
10029cba2d6aSRichard Fitzgerald 	{ "IN1L Mode", "Digital", "IN1ALN" },
10039cba2d6aSRichard Fitzgerald 	{ "IN1L Mode", "Digital", "IN1ALP" },
10049cba2d6aSRichard Fitzgerald 	{ "IN1R Mode", "Digital", "IN1ALN" },
10059cba2d6aSRichard Fitzgerald 	{ "IN1R Mode", "Digital", "IN1ALP" },
10069cba2d6aSRichard Fitzgerald 
10079cba2d6aSRichard Fitzgerald 	{ "IN1L", NULL, "IN1L Mode" },
10089cba2d6aSRichard Fitzgerald 	{ "IN1R", NULL, "IN1R Mode" },
10099cba2d6aSRichard Fitzgerald 
10109cba2d6aSRichard Fitzgerald 	{ "IN2L Mode", "Analog", "IN2N" },
10119cba2d6aSRichard Fitzgerald 	{ "IN2L Mode", "Analog", "IN2P" },
10129cba2d6aSRichard Fitzgerald 
10139cba2d6aSRichard Fitzgerald 	{ "IN2L Mode", "Digital", "SPKRXDAT" },
10149cba2d6aSRichard Fitzgerald 	{ "IN2R Mode", "Digital", "SPKRXDAT" },
10159cba2d6aSRichard Fitzgerald 
10169cba2d6aSRichard Fitzgerald 	{ "IN2L", NULL, "IN2L Mode" },
10179cba2d6aSRichard Fitzgerald 	{ "IN2R", NULL, "IN2R Mode" },
10189cba2d6aSRichard Fitzgerald 
10199cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
10209cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
10219cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("OUT4L", "SPKOUTL"),
10229cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("OUT5L", "SPKDAT1L"),
10239cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("OUT5R", "SPKDAT1R"),
10249cba2d6aSRichard Fitzgerald 
10259cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("PWM1 Driver", "PWM1"),
10269cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("PWM2 Driver", "PWM2"),
10279cba2d6aSRichard Fitzgerald 
10289cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
10299cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
10309cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
10319cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
10329cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
10339cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
10349cba2d6aSRichard Fitzgerald 
10359cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
10369cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
10379cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
10389cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
10399cba2d6aSRichard Fitzgerald 
10409cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
10419cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
10429cba2d6aSRichard Fitzgerald 
10439cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("SPD1TX1", "SPDIF1TX1"),
10449cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("SPD1TX2", "SPDIF1TX2"),
10459cba2d6aSRichard Fitzgerald 
10469cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("EQ1", "EQ1"),
10479cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("EQ2", "EQ2"),
10489cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("EQ3", "EQ3"),
10499cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("EQ4", "EQ4"),
10509cba2d6aSRichard Fitzgerald 
10519cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("DRC1L", "DRC1L"),
10529cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("DRC1R", "DRC1R"),
10539cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("DRC2L", "DRC2L"),
10549cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("DRC2R", "DRC2R"),
10559cba2d6aSRichard Fitzgerald 
10569cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("LHPF1", "LHPF1"),
10579cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("LHPF2", "LHPF2"),
10589cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("LHPF3", "LHPF3"),
10599cba2d6aSRichard Fitzgerald 	MADERA_MIXER_ROUTES("LHPF4", "LHPF4"),
10609cba2d6aSRichard Fitzgerald 
10619cba2d6aSRichard Fitzgerald 	MADERA_DSP_ROUTES("DSP1"),
10629cba2d6aSRichard Fitzgerald 
10639cba2d6aSRichard Fitzgerald 	{ "DSP Trigger Out", NULL, "DSP1 Trigger Output" },
10649cba2d6aSRichard Fitzgerald 
10659cba2d6aSRichard Fitzgerald 	{ "DSP1 Trigger Output", "Switch", "DSP1" },
10669cba2d6aSRichard Fitzgerald 
10679cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
10689cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
10699cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),
10709cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),
10719cba2d6aSRichard Fitzgerald 
10729cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
10739cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
10749cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
10759cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
10769cba2d6aSRichard Fitzgerald 
10779cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
10789cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
10799cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2INT3", "ISRC2INT3"),
10809cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"),
10819cba2d6aSRichard Fitzgerald 
10829cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
10839cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
10849cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),
10859cba2d6aSRichard Fitzgerald 	MADERA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),
10869cba2d6aSRichard Fitzgerald 
10879cba2d6aSRichard Fitzgerald 	{ "AEC1 Loopback", "HPOUT1L", "OUT1L" },
10889cba2d6aSRichard Fitzgerald 	{ "AEC1 Loopback", "HPOUT1R", "OUT1R" },
10899cba2d6aSRichard Fitzgerald 	{ "AEC2 Loopback", "HPOUT1L", "OUT1L" },
10909cba2d6aSRichard Fitzgerald 	{ "AEC2 Loopback", "HPOUT1R", "OUT1R" },
10919cba2d6aSRichard Fitzgerald 	{ "HPOUT1 Demux", NULL, "OUT1L" },
10929cba2d6aSRichard Fitzgerald 	{ "HPOUT1 Demux", NULL, "OUT1R" },
10938ab6ddc5SCharles Keepax 
10948ab6ddc5SCharles Keepax 	{ "OUT1R", NULL, "HPOUT1 Mono Mux" },
109564952377SRichard Fitzgerald 	{ "HPOUT1 Mono Mux", "EPOUT", "OUT1L" },
10968ab6ddc5SCharles Keepax 
10979cba2d6aSRichard Fitzgerald 	{ "HPOUTL", "HPOUT", "HPOUT1 Demux" },
10989cba2d6aSRichard Fitzgerald 	{ "HPOUTR", "HPOUT", "HPOUT1 Demux" },
10999cba2d6aSRichard Fitzgerald 	{ "EPOUTP", "EPOUT", "HPOUT1 Demux" },
11009cba2d6aSRichard Fitzgerald 	{ "EPOUTN", "EPOUT", "HPOUT1 Demux" },
11019cba2d6aSRichard Fitzgerald 
11029cba2d6aSRichard Fitzgerald 	{ "AEC1 Loopback", "SPKOUTL", "OUT4L" },
11039cba2d6aSRichard Fitzgerald 	{ "AEC2 Loopback", "SPKOUTL", "OUT4L" },
11049cba2d6aSRichard Fitzgerald 	{ "SPKOUTN", NULL, "OUT4L" },
11059cba2d6aSRichard Fitzgerald 	{ "SPKOUTP", NULL, "OUT4L" },
11069cba2d6aSRichard Fitzgerald 
11079cba2d6aSRichard Fitzgerald 	{ "AEC1 Loopback", "SPKDAT1L", "OUT5L" },
11089cba2d6aSRichard Fitzgerald 	{ "AEC1 Loopback", "SPKDAT1R", "OUT5R" },
11099cba2d6aSRichard Fitzgerald 	{ "AEC2 Loopback", "SPKDAT1L", "OUT5L" },
11109cba2d6aSRichard Fitzgerald 	{ "AEC2 Loopback", "SPKDAT1R", "OUT5R" },
11119cba2d6aSRichard Fitzgerald 	{ "SPKDAT1L", NULL, "OUT5L" },
11129cba2d6aSRichard Fitzgerald 	{ "SPKDAT1R", NULL, "OUT5R" },
11139cba2d6aSRichard Fitzgerald 
11149cba2d6aSRichard Fitzgerald 	{ "SPDIF1", NULL, "SPD1" },
11159cba2d6aSRichard Fitzgerald 
11169cba2d6aSRichard Fitzgerald 	{ "MICSUPP", NULL, "SYSCLK" },
11179cba2d6aSRichard Fitzgerald 
11189cba2d6aSRichard Fitzgerald 	{ "DRC1 Signal Activity", NULL, "DRC1 Activity Output" },
11199cba2d6aSRichard Fitzgerald 	{ "DRC2 Signal Activity", NULL, "DRC2 Activity Output" },
11209cba2d6aSRichard Fitzgerald 	{ "DRC1 Activity Output", "Switch", "DRC1L" },
11219cba2d6aSRichard Fitzgerald 	{ "DRC1 Activity Output", "Switch", "DRC1R" },
11229cba2d6aSRichard Fitzgerald 	{ "DRC2 Activity Output", "Switch", "DRC2L" },
11239cba2d6aSRichard Fitzgerald 	{ "DRC2 Activity Output", "Switch", "DRC2R" },
11249cba2d6aSRichard Fitzgerald };
11259cba2d6aSRichard Fitzgerald 
cs47l15_set_fll(struct snd_soc_component * component,int fll_id,int source,unsigned int fref,unsigned int fout)11269cba2d6aSRichard Fitzgerald static int cs47l15_set_fll(struct snd_soc_component *component, int fll_id,
11279cba2d6aSRichard Fitzgerald 			   int source, unsigned int fref, unsigned int fout)
11289cba2d6aSRichard Fitzgerald {
11299cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
11309cba2d6aSRichard Fitzgerald 
11319cba2d6aSRichard Fitzgerald 	switch (fll_id) {
11329cba2d6aSRichard Fitzgerald 	case MADERA_FLL1_REFCLK:
11339cba2d6aSRichard Fitzgerald 		return madera_set_fll_refclk(&cs47l15->fll[0], source, fref,
11349cba2d6aSRichard Fitzgerald 					     fout);
11359cba2d6aSRichard Fitzgerald 	case MADERA_FLLAO_REFCLK:
11369cba2d6aSRichard Fitzgerald 		return madera_set_fll_ao_refclk(&cs47l15->fll[1], source, fref,
11379cba2d6aSRichard Fitzgerald 						fout);
11389cba2d6aSRichard Fitzgerald 	case MADERA_FLL1_SYNCCLK:
11399cba2d6aSRichard Fitzgerald 		return madera_set_fll_syncclk(&cs47l15->fll[0], source, fref,
11409cba2d6aSRichard Fitzgerald 					      fout);
11419cba2d6aSRichard Fitzgerald 	default:
11429cba2d6aSRichard Fitzgerald 		return -EINVAL;
11439cba2d6aSRichard Fitzgerald 	}
11449cba2d6aSRichard Fitzgerald }
11459cba2d6aSRichard Fitzgerald 
1146*e22a907dSKuninori Morimoto static const struct snd_soc_dai_ops cs47l15_dai_ops = {
1147*e22a907dSKuninori Morimoto 	.compress_new = snd_soc_new_compress,
1148*e22a907dSKuninori Morimoto };
1149*e22a907dSKuninori Morimoto 
11509cba2d6aSRichard Fitzgerald static struct snd_soc_dai_driver cs47l15_dai[] = {
11519cba2d6aSRichard Fitzgerald 	{
11529cba2d6aSRichard Fitzgerald 		.name = "cs47l15-aif1",
11539cba2d6aSRichard Fitzgerald 		.id = 1,
11549cba2d6aSRichard Fitzgerald 		.base = MADERA_AIF1_BCLK_CTRL,
11559cba2d6aSRichard Fitzgerald 		.playback = {
11569cba2d6aSRichard Fitzgerald 			.stream_name = "AIF1 Playback",
11579cba2d6aSRichard Fitzgerald 			.channels_min = 1,
11589cba2d6aSRichard Fitzgerald 			.channels_max = 6,
11599cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
11609cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
11619cba2d6aSRichard Fitzgerald 		},
11629cba2d6aSRichard Fitzgerald 		.capture = {
11639cba2d6aSRichard Fitzgerald 			.stream_name = "AIF1 Capture",
11649cba2d6aSRichard Fitzgerald 			.channels_min = 1,
11659cba2d6aSRichard Fitzgerald 			.channels_max = 6,
11669cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
11679cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
11689cba2d6aSRichard Fitzgerald 		 },
11699cba2d6aSRichard Fitzgerald 		.ops = &madera_dai_ops,
1170260b668cSKuninori Morimoto 		.symmetric_rate = 1,
1171260b668cSKuninori Morimoto 		.symmetric_sample_bits = 1,
11729cba2d6aSRichard Fitzgerald 	},
11739cba2d6aSRichard Fitzgerald 	{
11749cba2d6aSRichard Fitzgerald 		.name = "cs47l15-aif2",
11759cba2d6aSRichard Fitzgerald 		.id = 2,
11769cba2d6aSRichard Fitzgerald 		.base = MADERA_AIF2_BCLK_CTRL,
11779cba2d6aSRichard Fitzgerald 		.playback = {
11789cba2d6aSRichard Fitzgerald 			.stream_name = "AIF2 Playback",
11799cba2d6aSRichard Fitzgerald 			.channels_min = 1,
11809cba2d6aSRichard Fitzgerald 			.channels_max = 4,
11819cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
11829cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
11839cba2d6aSRichard Fitzgerald 		},
11849cba2d6aSRichard Fitzgerald 		.capture = {
11859cba2d6aSRichard Fitzgerald 			.stream_name = "AIF2 Capture",
11869cba2d6aSRichard Fitzgerald 			.channels_min = 1,
11879cba2d6aSRichard Fitzgerald 			.channels_max = 4,
11889cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
11899cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
11909cba2d6aSRichard Fitzgerald 		 },
11919cba2d6aSRichard Fitzgerald 		.ops = &madera_dai_ops,
1192260b668cSKuninori Morimoto 		.symmetric_rate = 1,
1193260b668cSKuninori Morimoto 		.symmetric_sample_bits = 1,
11949cba2d6aSRichard Fitzgerald 	},
11959cba2d6aSRichard Fitzgerald 	{
11969cba2d6aSRichard Fitzgerald 		.name = "cs47l15-aif3",
11979cba2d6aSRichard Fitzgerald 		.id = 3,
11989cba2d6aSRichard Fitzgerald 		.base = MADERA_AIF3_BCLK_CTRL,
11999cba2d6aSRichard Fitzgerald 		.playback = {
12009cba2d6aSRichard Fitzgerald 			.stream_name = "AIF3 Playback",
12019cba2d6aSRichard Fitzgerald 			.channels_min = 1,
12029cba2d6aSRichard Fitzgerald 			.channels_max = 2,
12039cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
12049cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
12059cba2d6aSRichard Fitzgerald 		},
12069cba2d6aSRichard Fitzgerald 		.capture = {
12079cba2d6aSRichard Fitzgerald 			.stream_name = "AIF3 Capture",
12089cba2d6aSRichard Fitzgerald 			.channels_min = 1,
12099cba2d6aSRichard Fitzgerald 			.channels_max = 2,
12109cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
12119cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
12129cba2d6aSRichard Fitzgerald 		 },
12139cba2d6aSRichard Fitzgerald 		.ops = &madera_dai_ops,
1214260b668cSKuninori Morimoto 		.symmetric_rate = 1,
1215260b668cSKuninori Morimoto 		.symmetric_sample_bits = 1,
12169cba2d6aSRichard Fitzgerald 	},
12179cba2d6aSRichard Fitzgerald 	{
12189cba2d6aSRichard Fitzgerald 		.name = "cs47l15-cpu-trace",
12199cba2d6aSRichard Fitzgerald 		.capture = {
12209cba2d6aSRichard Fitzgerald 			.stream_name = "Audio Trace CPU",
12219cba2d6aSRichard Fitzgerald 			.channels_min = 1,
12229cba2d6aSRichard Fitzgerald 			.channels_max = 6,
12239cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
12249cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
12259cba2d6aSRichard Fitzgerald 		},
1226*e22a907dSKuninori Morimoto 		.ops = &cs47l15_dai_ops,
12279cba2d6aSRichard Fitzgerald 	},
12289cba2d6aSRichard Fitzgerald 	{
12299cba2d6aSRichard Fitzgerald 		.name = "cs47l15-dsp-trace",
12309cba2d6aSRichard Fitzgerald 		.capture = {
12319cba2d6aSRichard Fitzgerald 			.stream_name = "Audio Trace DSP",
12329cba2d6aSRichard Fitzgerald 			.channels_min = 1,
12339cba2d6aSRichard Fitzgerald 			.channels_max = 6,
12349cba2d6aSRichard Fitzgerald 			.rates = MADERA_RATES,
12359cba2d6aSRichard Fitzgerald 			.formats = MADERA_FORMATS,
12369cba2d6aSRichard Fitzgerald 		},
12379cba2d6aSRichard Fitzgerald 	},
12389cba2d6aSRichard Fitzgerald };
12399cba2d6aSRichard Fitzgerald 
cs47l15_open(struct snd_soc_component * component,struct snd_compr_stream * stream)12403a5ccf25SKuninori Morimoto static int cs47l15_open(struct snd_soc_component *component,
12413a5ccf25SKuninori Morimoto 			struct snd_compr_stream *stream)
12429cba2d6aSRichard Fitzgerald {
12439cba2d6aSRichard Fitzgerald 	struct snd_soc_pcm_runtime *rtd = stream->private_data;
12449cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
12459cba2d6aSRichard Fitzgerald 	struct madera_priv *priv = &cs47l15->core;
12469cba2d6aSRichard Fitzgerald 	struct madera *madera = priv->madera;
12479cba2d6aSRichard Fitzgerald 	int n_adsp;
12489cba2d6aSRichard Fitzgerald 
1249b5cb8558SKuninori Morimoto 	if (strcmp(asoc_rtd_to_codec(rtd, 0)->name, "cs47l15-dsp-trace") == 0) {
12509cba2d6aSRichard Fitzgerald 		n_adsp = 0;
12519cba2d6aSRichard Fitzgerald 	} else {
12529cba2d6aSRichard Fitzgerald 		dev_err(madera->dev,
12539cba2d6aSRichard Fitzgerald 			"No suitable compressed stream for DAI '%s'\n",
1254b5cb8558SKuninori Morimoto 			asoc_rtd_to_codec(rtd, 0)->name);
12559cba2d6aSRichard Fitzgerald 		return -EINVAL;
12569cba2d6aSRichard Fitzgerald 	}
12579cba2d6aSRichard Fitzgerald 
12589cba2d6aSRichard Fitzgerald 	return wm_adsp_compr_open(&priv->adsp[n_adsp], stream);
12599cba2d6aSRichard Fitzgerald }
12609cba2d6aSRichard Fitzgerald 
cs47l15_adsp2_irq(int irq,void * data)12619cba2d6aSRichard Fitzgerald static irqreturn_t cs47l15_adsp2_irq(int irq, void *data)
12629cba2d6aSRichard Fitzgerald {
12639cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = data;
12649cba2d6aSRichard Fitzgerald 	struct madera_priv *priv = &cs47l15->core;
12659cba2d6aSRichard Fitzgerald 	struct madera *madera = priv->madera;
12669cba2d6aSRichard Fitzgerald 	int ret;
12679cba2d6aSRichard Fitzgerald 
12689cba2d6aSRichard Fitzgerald 	ret = wm_adsp_compr_handle_irq(&priv->adsp[0]);
12699cba2d6aSRichard Fitzgerald 	if (ret == -ENODEV) {
12709cba2d6aSRichard Fitzgerald 		dev_err(madera->dev, "Spurious compressed data IRQ\n");
12719cba2d6aSRichard Fitzgerald 		return IRQ_NONE;
12729cba2d6aSRichard Fitzgerald 	}
12739cba2d6aSRichard Fitzgerald 
12749cba2d6aSRichard Fitzgerald 	return IRQ_HANDLED;
12759cba2d6aSRichard Fitzgerald }
12769cba2d6aSRichard Fitzgerald 
12778ab6ddc5SCharles Keepax static const struct snd_soc_dapm_route cs47l15_mono_routes[] = {
12788ab6ddc5SCharles Keepax 	{ "HPOUT1 Mono Mux", "HPOUT", "OUT1L" },
12798ab6ddc5SCharles Keepax };
12808ab6ddc5SCharles Keepax 
cs47l15_component_probe(struct snd_soc_component * component)12819cba2d6aSRichard Fitzgerald static int cs47l15_component_probe(struct snd_soc_component *component)
12829cba2d6aSRichard Fitzgerald {
12839cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
12849cba2d6aSRichard Fitzgerald 	struct madera *madera = cs47l15->core.madera;
12859cba2d6aSRichard Fitzgerald 	int ret;
12869cba2d6aSRichard Fitzgerald 
12879cba2d6aSRichard Fitzgerald 	snd_soc_component_init_regmap(component, madera->regmap);
12889cba2d6aSRichard Fitzgerald 
12899cba2d6aSRichard Fitzgerald 	mutex_lock(&madera->dapm_ptr_lock);
12909cba2d6aSRichard Fitzgerald 	madera->dapm = snd_soc_component_get_dapm(component);
12919cba2d6aSRichard Fitzgerald 	mutex_unlock(&madera->dapm_ptr_lock);
12929cba2d6aSRichard Fitzgerald 
12939cba2d6aSRichard Fitzgerald 	ret = madera_init_inputs(component);
12949cba2d6aSRichard Fitzgerald 	if (ret)
12959cba2d6aSRichard Fitzgerald 		return ret;
12969cba2d6aSRichard Fitzgerald 
12978ab6ddc5SCharles Keepax 	ret = madera_init_outputs(component, cs47l15_mono_routes,
12988ab6ddc5SCharles Keepax 				  ARRAY_SIZE(cs47l15_mono_routes),
12998ab6ddc5SCharles Keepax 				  CS47L15_MONO_OUTPUTS);
13009cba2d6aSRichard Fitzgerald 	if (ret)
13019cba2d6aSRichard Fitzgerald 		return ret;
13029cba2d6aSRichard Fitzgerald 
13039cba2d6aSRichard Fitzgerald 	snd_soc_component_disable_pin(component, "HAPTICS");
13049cba2d6aSRichard Fitzgerald 
13059cba2d6aSRichard Fitzgerald 	ret = snd_soc_add_component_controls(component,
13069cba2d6aSRichard Fitzgerald 					     madera_adsp_rate_controls,
13079cba2d6aSRichard Fitzgerald 					     CS47L15_NUM_ADSP);
13089cba2d6aSRichard Fitzgerald 	if (ret)
13099cba2d6aSRichard Fitzgerald 		return ret;
13109cba2d6aSRichard Fitzgerald 
13119cba2d6aSRichard Fitzgerald 	wm_adsp2_component_probe(&cs47l15->core.adsp[0], component);
13129cba2d6aSRichard Fitzgerald 
13139cba2d6aSRichard Fitzgerald 	return 0;
13149cba2d6aSRichard Fitzgerald }
13159cba2d6aSRichard Fitzgerald 
cs47l15_component_remove(struct snd_soc_component * component)13169cba2d6aSRichard Fitzgerald static void cs47l15_component_remove(struct snd_soc_component *component)
13179cba2d6aSRichard Fitzgerald {
13189cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
13199cba2d6aSRichard Fitzgerald 	struct madera *madera = cs47l15->core.madera;
13209cba2d6aSRichard Fitzgerald 
13219cba2d6aSRichard Fitzgerald 	mutex_lock(&madera->dapm_ptr_lock);
13229cba2d6aSRichard Fitzgerald 	madera->dapm = NULL;
13239cba2d6aSRichard Fitzgerald 	mutex_unlock(&madera->dapm_ptr_lock);
13249cba2d6aSRichard Fitzgerald 
13259cba2d6aSRichard Fitzgerald 	wm_adsp2_component_remove(&cs47l15->core.adsp[0], component);
13269cba2d6aSRichard Fitzgerald }
13279cba2d6aSRichard Fitzgerald 
13289cba2d6aSRichard Fitzgerald #define CS47L15_DIG_VU 0x0200
13299cba2d6aSRichard Fitzgerald 
13309cba2d6aSRichard Fitzgerald static unsigned int cs47l15_digital_vu[] = {
13319cba2d6aSRichard Fitzgerald 	MADERA_DAC_DIGITAL_VOLUME_1L,
13329cba2d6aSRichard Fitzgerald 	MADERA_DAC_DIGITAL_VOLUME_1R,
13339cba2d6aSRichard Fitzgerald 	MADERA_DAC_DIGITAL_VOLUME_4L,
13349cba2d6aSRichard Fitzgerald 	MADERA_DAC_DIGITAL_VOLUME_5L,
13359cba2d6aSRichard Fitzgerald 	MADERA_DAC_DIGITAL_VOLUME_5R,
13369cba2d6aSRichard Fitzgerald };
13379cba2d6aSRichard Fitzgerald 
13383a5ccf25SKuninori Morimoto static const struct snd_compress_ops cs47l15_compress_ops = {
13399cba2d6aSRichard Fitzgerald 	.open = &cs47l15_open,
13409cba2d6aSRichard Fitzgerald 	.free = &wm_adsp_compr_free,
13419cba2d6aSRichard Fitzgerald 	.set_params = &wm_adsp_compr_set_params,
13429cba2d6aSRichard Fitzgerald 	.get_caps = &wm_adsp_compr_get_caps,
13439cba2d6aSRichard Fitzgerald 	.trigger = &wm_adsp_compr_trigger,
13449cba2d6aSRichard Fitzgerald 	.pointer = &wm_adsp_compr_pointer,
13459cba2d6aSRichard Fitzgerald 	.copy = &wm_adsp_compr_copy,
13469cba2d6aSRichard Fitzgerald };
13479cba2d6aSRichard Fitzgerald 
13489cba2d6aSRichard Fitzgerald static const struct snd_soc_component_driver soc_component_dev_cs47l15 = {
13499cba2d6aSRichard Fitzgerald 	.probe			= &cs47l15_component_probe,
13509cba2d6aSRichard Fitzgerald 	.remove			= &cs47l15_component_remove,
13519cba2d6aSRichard Fitzgerald 	.set_sysclk		= &madera_set_sysclk,
13529cba2d6aSRichard Fitzgerald 	.set_pll		= &cs47l15_set_fll,
13539cba2d6aSRichard Fitzgerald 	.name			= DRV_NAME,
13543a5ccf25SKuninori Morimoto 	.compress_ops		= &cs47l15_compress_ops,
13559cba2d6aSRichard Fitzgerald 	.controls		= cs47l15_snd_controls,
13569cba2d6aSRichard Fitzgerald 	.num_controls		= ARRAY_SIZE(cs47l15_snd_controls),
13579cba2d6aSRichard Fitzgerald 	.dapm_widgets		= cs47l15_dapm_widgets,
13589cba2d6aSRichard Fitzgerald 	.num_dapm_widgets	= ARRAY_SIZE(cs47l15_dapm_widgets),
13599cba2d6aSRichard Fitzgerald 	.dapm_routes		= cs47l15_dapm_routes,
13609cba2d6aSRichard Fitzgerald 	.num_dapm_routes	= ARRAY_SIZE(cs47l15_dapm_routes),
13619cba2d6aSRichard Fitzgerald 	.use_pmdown_time	= 1,
13629cba2d6aSRichard Fitzgerald 	.endianness		= 1,
13639cba2d6aSRichard Fitzgerald };
13649cba2d6aSRichard Fitzgerald 
cs47l15_probe(struct platform_device * pdev)13659cba2d6aSRichard Fitzgerald static int cs47l15_probe(struct platform_device *pdev)
13669cba2d6aSRichard Fitzgerald {
13679cba2d6aSRichard Fitzgerald 	struct madera *madera = dev_get_drvdata(pdev->dev.parent);
13689cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15;
13699cba2d6aSRichard Fitzgerald 	int i, ret;
13709cba2d6aSRichard Fitzgerald 
13719cba2d6aSRichard Fitzgerald 	BUILD_BUG_ON(ARRAY_SIZE(cs47l15_dai) > MADERA_MAX_DAI);
13729cba2d6aSRichard Fitzgerald 
13739cba2d6aSRichard Fitzgerald 	/* quick exit if Madera irqchip driver hasn't completed probe */
13749cba2d6aSRichard Fitzgerald 	if (!madera->irq_dev) {
13759cba2d6aSRichard Fitzgerald 		dev_dbg(&pdev->dev, "irqchip driver not ready\n");
13769cba2d6aSRichard Fitzgerald 		return -EPROBE_DEFER;
13779cba2d6aSRichard Fitzgerald 	}
13789cba2d6aSRichard Fitzgerald 
13799cba2d6aSRichard Fitzgerald 	cs47l15 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l15),
13809cba2d6aSRichard Fitzgerald 			       GFP_KERNEL);
13819cba2d6aSRichard Fitzgerald 	if (!cs47l15)
13829cba2d6aSRichard Fitzgerald 		return -ENOMEM;
13839cba2d6aSRichard Fitzgerald 
13849cba2d6aSRichard Fitzgerald 	platform_set_drvdata(pdev, cs47l15);
13859cba2d6aSRichard Fitzgerald 
13869cba2d6aSRichard Fitzgerald 	cs47l15->core.madera = madera;
13879cba2d6aSRichard Fitzgerald 	cs47l15->core.dev = &pdev->dev;
13889cba2d6aSRichard Fitzgerald 	cs47l15->core.num_inputs = 4;
13899cba2d6aSRichard Fitzgerald 
13909cba2d6aSRichard Fitzgerald 	ret = madera_core_init(&cs47l15->core);
13919cba2d6aSRichard Fitzgerald 	if (ret)
13929cba2d6aSRichard Fitzgerald 		return ret;
13939cba2d6aSRichard Fitzgerald 
13949cba2d6aSRichard Fitzgerald 	ret = madera_init_overheat(&cs47l15->core);
13959cba2d6aSRichard Fitzgerald 	if (ret)
13969cba2d6aSRichard Fitzgerald 		goto error_core;
13979cba2d6aSRichard Fitzgerald 
13989cba2d6aSRichard Fitzgerald 	ret = madera_request_irq(madera, MADERA_IRQ_DSP_IRQ1,
13999cba2d6aSRichard Fitzgerald 				 "ADSP2 Compressed IRQ", cs47l15_adsp2_irq,
14009cba2d6aSRichard Fitzgerald 				 cs47l15);
14019cba2d6aSRichard Fitzgerald 	if (ret != 0) {
14029cba2d6aSRichard Fitzgerald 		dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
14039cba2d6aSRichard Fitzgerald 		goto error_overheat;
14049cba2d6aSRichard Fitzgerald 	}
14059cba2d6aSRichard Fitzgerald 
14069cba2d6aSRichard Fitzgerald 	ret = madera_set_irq_wake(madera, MADERA_IRQ_DSP_IRQ1, 1);
14079cba2d6aSRichard Fitzgerald 	if (ret)
14089cba2d6aSRichard Fitzgerald 		dev_warn(&pdev->dev, "Failed to set DSP IRQ wake: %d\n", ret);
14099cba2d6aSRichard Fitzgerald 
14109cba2d6aSRichard Fitzgerald 	cs47l15->core.adsp[0].part = "cs47l15";
1411e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.num = 1;
1412e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.type = WMFW_ADSP2;
1413e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.rev = 2;
1414e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.dev = madera->dev;
1415e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.regmap = madera->regmap_32bit;
14169cba2d6aSRichard Fitzgerald 
1417e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.base = MADERA_DSP1_CONFIG_1;
1418e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.mem = cs47l15_dsp1_regions;
1419e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.num_mems = ARRAY_SIZE(cs47l15_dsp1_regions);
14209cba2d6aSRichard Fitzgerald 
1421e1468202SSimon Trimmer 	cs47l15->core.adsp[0].cs_dsp.lock_regions =
14225beb8eeaSSimon Trimmer 		CS_ADSP2_REGION_1 | CS_ADSP2_REGION_2 | CS_ADSP2_REGION_3;
14239cba2d6aSRichard Fitzgerald 
14249cba2d6aSRichard Fitzgerald 	ret = wm_adsp2_init(&cs47l15->core.adsp[0]);
14259cba2d6aSRichard Fitzgerald 	if (ret != 0)
14269cba2d6aSRichard Fitzgerald 		goto error_dsp_irq;
14279cba2d6aSRichard Fitzgerald 
14289cba2d6aSRichard Fitzgerald 	ret = madera_init_bus_error_irq(&cs47l15->core, 0, wm_adsp2_bus_error);
14299cba2d6aSRichard Fitzgerald 	if (ret)
14309cba2d6aSRichard Fitzgerald 		goto error_adsp;
14319cba2d6aSRichard Fitzgerald 
14329cba2d6aSRichard Fitzgerald 	madera_init_fll(madera, 1, MADERA_FLL1_CONTROL_1 - 1,
14339cba2d6aSRichard Fitzgerald 			&cs47l15->fll[0]);
14349cba2d6aSRichard Fitzgerald 	madera_init_fll(madera, 4, MADERA_FLLAO_CONTROL_1 - 1,
14359cba2d6aSRichard Fitzgerald 			&cs47l15->fll[1]);
14369cba2d6aSRichard Fitzgerald 
14379cba2d6aSRichard Fitzgerald 	for (i = 0; i < ARRAY_SIZE(cs47l15_dai); i++)
14389cba2d6aSRichard Fitzgerald 		madera_init_dai(&cs47l15->core, i);
14399cba2d6aSRichard Fitzgerald 
14409cba2d6aSRichard Fitzgerald 	/* Latch volume update bits */
14419cba2d6aSRichard Fitzgerald 	for (i = 0; i < ARRAY_SIZE(cs47l15_digital_vu); i++)
14429cba2d6aSRichard Fitzgerald 		regmap_update_bits(madera->regmap, cs47l15_digital_vu[i],
14439cba2d6aSRichard Fitzgerald 				   CS47L15_DIG_VU, CS47L15_DIG_VU);
14449cba2d6aSRichard Fitzgerald 
14459cba2d6aSRichard Fitzgerald 	pm_runtime_enable(&pdev->dev);
14469cba2d6aSRichard Fitzgerald 	pm_runtime_idle(&pdev->dev);
14479cba2d6aSRichard Fitzgerald 
14489cba2d6aSRichard Fitzgerald 	ret = devm_snd_soc_register_component(&pdev->dev,
14499cba2d6aSRichard Fitzgerald 					      &soc_component_dev_cs47l15,
14509cba2d6aSRichard Fitzgerald 					      cs47l15_dai,
14519cba2d6aSRichard Fitzgerald 					      ARRAY_SIZE(cs47l15_dai));
14529cba2d6aSRichard Fitzgerald 	if (ret < 0) {
14539cba2d6aSRichard Fitzgerald 		dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
14549cba2d6aSRichard Fitzgerald 		goto error_pm_runtime;
14559cba2d6aSRichard Fitzgerald 	}
14569cba2d6aSRichard Fitzgerald 
14579cba2d6aSRichard Fitzgerald 	return ret;
14589cba2d6aSRichard Fitzgerald 
14599cba2d6aSRichard Fitzgerald error_pm_runtime:
14609cba2d6aSRichard Fitzgerald 	pm_runtime_disable(&pdev->dev);
14619cba2d6aSRichard Fitzgerald 	madera_free_bus_error_irq(&cs47l15->core, 0);
14629cba2d6aSRichard Fitzgerald error_adsp:
14639cba2d6aSRichard Fitzgerald 	wm_adsp2_remove(&cs47l15->core.adsp[0]);
14649cba2d6aSRichard Fitzgerald error_dsp_irq:
14659cba2d6aSRichard Fitzgerald 	madera_set_irq_wake(madera, MADERA_IRQ_DSP_IRQ1, 0);
14669cba2d6aSRichard Fitzgerald 	madera_free_irq(madera, MADERA_IRQ_DSP_IRQ1, cs47l15);
14679cba2d6aSRichard Fitzgerald error_overheat:
14689cba2d6aSRichard Fitzgerald 	madera_free_overheat(&cs47l15->core);
14699cba2d6aSRichard Fitzgerald error_core:
14709cba2d6aSRichard Fitzgerald 	madera_core_free(&cs47l15->core);
14719cba2d6aSRichard Fitzgerald 
14729cba2d6aSRichard Fitzgerald 	return ret;
14739cba2d6aSRichard Fitzgerald }
14749cba2d6aSRichard Fitzgerald 
cs47l15_remove(struct platform_device * pdev)1475f57c2cf8SUwe Kleine-König static void cs47l15_remove(struct platform_device *pdev)
14769cba2d6aSRichard Fitzgerald {
14779cba2d6aSRichard Fitzgerald 	struct cs47l15 *cs47l15 = platform_get_drvdata(pdev);
14789cba2d6aSRichard Fitzgerald 
14799cba2d6aSRichard Fitzgerald 	pm_runtime_disable(&pdev->dev);
14809cba2d6aSRichard Fitzgerald 
14819cba2d6aSRichard Fitzgerald 	madera_free_bus_error_irq(&cs47l15->core, 0);
14829cba2d6aSRichard Fitzgerald 
14839cba2d6aSRichard Fitzgerald 	wm_adsp2_remove(&cs47l15->core.adsp[0]);
14849cba2d6aSRichard Fitzgerald 
14859cba2d6aSRichard Fitzgerald 	madera_set_irq_wake(cs47l15->core.madera, MADERA_IRQ_DSP_IRQ1, 0);
14869cba2d6aSRichard Fitzgerald 	madera_free_irq(cs47l15->core.madera, MADERA_IRQ_DSP_IRQ1, cs47l15);
14879cba2d6aSRichard Fitzgerald 	madera_free_overheat(&cs47l15->core);
14889cba2d6aSRichard Fitzgerald 	madera_core_free(&cs47l15->core);
14899cba2d6aSRichard Fitzgerald }
14909cba2d6aSRichard Fitzgerald 
14919cba2d6aSRichard Fitzgerald static struct platform_driver cs47l15_codec_driver = {
14929cba2d6aSRichard Fitzgerald 	.driver = {
14939cba2d6aSRichard Fitzgerald 		.name = "cs47l15-codec",
14949cba2d6aSRichard Fitzgerald 	},
14959cba2d6aSRichard Fitzgerald 	.probe = &cs47l15_probe,
1496f57c2cf8SUwe Kleine-König 	.remove_new = cs47l15_remove,
14979cba2d6aSRichard Fitzgerald };
14989cba2d6aSRichard Fitzgerald 
14999cba2d6aSRichard Fitzgerald module_platform_driver(cs47l15_codec_driver);
15009cba2d6aSRichard Fitzgerald 
15019cba2d6aSRichard Fitzgerald MODULE_SOFTDEP("pre: madera irq-madera arizona-micsupp");
15029cba2d6aSRichard Fitzgerald MODULE_DESCRIPTION("ASoC CS47L15 driver");
15039cba2d6aSRichard Fitzgerald MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
15049cba2d6aSRichard Fitzgerald MODULE_AUTHOR("Jaswinder Jassal <jjassal@opensource.cirrus.com>");
15059cba2d6aSRichard Fitzgerald MODULE_LICENSE("GPL v2");
15069cba2d6aSRichard Fitzgerald MODULE_ALIAS("platform:cs47l15-codec");
1507