diff options
Diffstat (limited to 'sound/soc/codecs/wm5110.c')
| -rw-r--r-- | sound/soc/codecs/wm5110.c | 541 | 
1 files changed, 499 insertions, 42 deletions
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index bbd64384ca1..2e5fcb559e9 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c @@ -30,13 +30,140 @@  #include <linux/mfd/arizona/registers.h>  #include "arizona.h" +#include "wm_adsp.h"  #include "wm5110.h" +#define WM5110_NUM_ADSP 4 +  struct wm5110_priv {  	struct arizona_priv core;  	struct arizona_fll fll[2];  }; +static const struct wm_adsp_region wm5110_dsp1_regions[] = { +	{ .type = WMFW_ADSP2_PM, .base = 0x100000 }, +	{ .type = WMFW_ADSP2_ZM, .base = 0x180000 }, +	{ .type = WMFW_ADSP2_XM, .base = 0x190000 }, +	{ .type = WMFW_ADSP2_YM, .base = 0x1a8000 }, +}; + +static const struct wm_adsp_region wm5110_dsp2_regions[] = { +	{ .type = WMFW_ADSP2_PM, .base = 0x200000 }, +	{ .type = WMFW_ADSP2_ZM, .base = 0x280000 }, +	{ .type = WMFW_ADSP2_XM, .base = 0x290000 }, +	{ .type = WMFW_ADSP2_YM, .base = 0x2a8000 }, +}; + +static const struct wm_adsp_region wm5110_dsp3_regions[] = { +	{ .type = WMFW_ADSP2_PM, .base = 0x300000 }, +	{ .type = WMFW_ADSP2_ZM, .base = 0x380000 }, +	{ .type = WMFW_ADSP2_XM, .base = 0x390000 }, +	{ .type = WMFW_ADSP2_YM, .base = 0x3a8000 }, +}; + +static const struct wm_adsp_region wm5110_dsp4_regions[] = { +	{ .type = WMFW_ADSP2_PM, .base = 0x400000 }, +	{ .type = WMFW_ADSP2_ZM, .base = 0x480000 }, +	{ .type = WMFW_ADSP2_XM, .base = 0x490000 }, +	{ .type = WMFW_ADSP2_YM, .base = 0x4a8000 }, +}; + +static const struct wm_adsp_region *wm5110_dsp_regions[] = { +	wm5110_dsp1_regions, +	wm5110_dsp2_regions, +	wm5110_dsp3_regions, +	wm5110_dsp4_regions, +}; + +static const struct reg_default wm5110_sysclk_revd_patch[] = { +	{ 0x3093, 0x1001 }, +	{ 0x30E3, 0x1301 }, +	{ 0x3133, 0x1201 }, +	{ 0x3183, 0x1501 }, +	{ 0x31D3, 0x1401 }, +	{ 0x0049, 0x01ea }, +	{ 0x004a, 0x01f2 }, +	{ 0x0057, 0x01e7 }, +	{ 0x0058, 0x01fb }, +	{ 0x33ce, 0xc4f5 }, +	{ 0x33cf, 0x1361 }, +	{ 0x33d0, 0x0402 }, +	{ 0x33d1, 0x4700 }, +	{ 0x33d2, 0x026d }, +	{ 0x33d3, 0xff00 }, +	{ 0x33d4, 0x026d }, +	{ 0x33d5, 0x0101 }, +	{ 0x33d6, 0xc4f5 }, +	{ 0x33d7, 0x0361 }, +	{ 0x33d8, 0x0402 }, +	{ 0x33d9, 0x6701 }, +	{ 0x33da, 0xc4f5 }, +	{ 0x33db, 0x136f }, +	{ 0x33dc, 0xc4f5 }, +	{ 0x33dd, 0x134f }, +	{ 0x33de, 0xc4f5 }, +	{ 0x33df, 0x131f }, +	{ 0x33e0, 0x026d }, +	{ 0x33e1, 0x4f01 }, +	{ 0x33e2, 0x026d }, +	{ 0x33e3, 0xf100 }, +	{ 0x33e4, 0x026d }, +	{ 0x33e5, 0x0001 }, +	{ 0x33e6, 0xc4f5 }, +	{ 0x33e7, 0x0361 }, +	{ 0x33e8, 0x0402 }, +	{ 0x33e9, 0x6601 }, +	{ 0x33ea, 0xc4f5 }, +	{ 0x33eb, 0x136f }, +	{ 0x33ec, 0xc4f5 }, +	{ 0x33ed, 0x134f }, +	{ 0x33ee, 0xc4f5 }, +	{ 0x33ef, 0x131f }, +	{ 0x33f0, 0x026d }, +	{ 0x33f1, 0x4e01 }, +	{ 0x33f2, 0x026d }, +	{ 0x33f3, 0xf000 }, +	{ 0x33f6, 0xc4f5 }, +	{ 0x33f7, 0x1361 }, +	{ 0x33f8, 0x0402 }, +	{ 0x33f9, 0x4600 }, +	{ 0x33fa, 0x026d }, +	{ 0x33fb, 0xfe00 }, +}; + +static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, +			    struct snd_kcontrol *kcontrol, int event) +{ +	struct snd_soc_codec *codec = w->codec; +	struct arizona *arizona = dev_get_drvdata(codec->dev->parent); +	struct regmap *regmap = arizona->regmap; +	const struct reg_default *patch = NULL; +	int i, patch_size; + +	switch (arizona->rev) { +	case 3: +		patch = wm5110_sysclk_revd_patch; +		patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch); +		break; +	default: +		return 0; +	} + +	switch (event) { +	case SND_SOC_DAPM_POST_PMU: +		if (patch) +			for (i = 0; i < patch_size; i++) +				regmap_write_async(regmap, patch[i].reg, +						   patch[i].def); +		break; + +	default: +		break; +	} + +	return 0; +} +  static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);  static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);  static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); @@ -76,6 +203,25 @@ SOC_SINGLE_RANGE_TLV("IN3L Volume", ARIZONA_IN3L_CONTROL,  SOC_SINGLE_RANGE_TLV("IN3R Volume", ARIZONA_IN3R_CONTROL,  		     ARIZONA_IN3R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), +SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum), + +SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL, +	   ARIZONA_IN1L_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL, +	   ARIZONA_IN1R_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN2L HPF Switch", ARIZONA_IN2L_CONTROL, +	   ARIZONA_IN2L_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN2R HPF Switch", ARIZONA_IN2R_CONTROL, +	   ARIZONA_IN2R_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN3L HPF Switch", ARIZONA_IN3L_CONTROL, +	   ARIZONA_IN3L_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN3R HPF Switch", ARIZONA_IN3R_CONTROL, +	   ARIZONA_IN3R_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN4L HPF Switch", ARIZONA_IN4L_CONTROL, +	   ARIZONA_IN4L_HPF_SHIFT, 1, 0), +SOC_SINGLE("IN4R HPF Switch", ARIZONA_IN4R_CONTROL, +	   ARIZONA_IN4R_HPF_SHIFT, 1, 0), +  SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,  	       ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),  SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R, @@ -101,15 +247,8 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE), -SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21, -		   ARIZONA_EQ1_ENA_MASK), -SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21, -		   ARIZONA_EQ2_ENA_MASK), -SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21, -		   ARIZONA_EQ3_ENA_MASK), -SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21, -		   ARIZONA_EQ4_ENA_MASK), - +SND_SOC_BYTES("EQ1 Coefficients", ARIZONA_EQ1_3, 19), +SOC_SINGLE("EQ1 Mode Switch", ARIZONA_EQ1_2, ARIZONA_EQ1_B1_MODE, 1, 0),  SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,  	       24, 0, eq_tlv),  SOC_SINGLE_TLV("EQ1 B2 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B2_GAIN_SHIFT, @@ -121,6 +260,8 @@ SOC_SINGLE_TLV("EQ1 B4 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B4_GAIN_SHIFT,  SOC_SINGLE_TLV("EQ1 B5 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B5_GAIN_SHIFT,  	       24, 0, eq_tlv), +SND_SOC_BYTES("EQ2 Coefficients", ARIZONA_EQ2_3, 19), +SOC_SINGLE("EQ2 Mode Switch", ARIZONA_EQ2_2, ARIZONA_EQ2_B1_MODE, 1, 0),  SOC_SINGLE_TLV("EQ2 B1 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B1_GAIN_SHIFT,  	       24, 0, eq_tlv),  SOC_SINGLE_TLV("EQ2 B2 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B2_GAIN_SHIFT, @@ -132,6 +273,8 @@ SOC_SINGLE_TLV("EQ2 B4 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B4_GAIN_SHIFT,  SOC_SINGLE_TLV("EQ2 B5 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B5_GAIN_SHIFT,  	       24, 0, eq_tlv), +SND_SOC_BYTES("EQ3 Coefficients", ARIZONA_EQ3_3, 19), +SOC_SINGLE("EQ3 Mode Switch", ARIZONA_EQ3_2, ARIZONA_EQ3_B1_MODE, 1, 0),  SOC_SINGLE_TLV("EQ3 B1 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B1_GAIN_SHIFT,  	       24, 0, eq_tlv),  SOC_SINGLE_TLV("EQ3 B2 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B2_GAIN_SHIFT, @@ -143,6 +286,8 @@ SOC_SINGLE_TLV("EQ3 B4 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B4_GAIN_SHIFT,  SOC_SINGLE_TLV("EQ3 B5 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B5_GAIN_SHIFT,  	       24, 0, eq_tlv), +SND_SOC_BYTES("EQ4 Coefficients", ARIZONA_EQ4_3, 19), +SOC_SINGLE("EQ4 Mode Switch", ARIZONA_EQ4_2, ARIZONA_EQ4_B1_MODE, 1, 0),  SOC_SINGLE_TLV("EQ4 B1 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B1_GAIN_SHIFT,  	       24, 0, eq_tlv),  SOC_SINGLE_TLV("EQ4 B2 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B2_GAIN_SHIFT, @@ -179,6 +324,14 @@ SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),  SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),  SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode), +SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]), +SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]), +SOC_ENUM("ISRC3 FSL", arizona_isrc_fsl[2]), +SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]), +SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]), +SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]), +SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1), +  ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE), @@ -207,14 +360,13 @@ ARIZONA_MIXER_CONTROLS("SPKDAT1R", ARIZONA_OUT5RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("SPKDAT2L", ARIZONA_OUT6LMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE), -SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L, -	   ARIZONA_OUT1_OSR_SHIFT, 1, 0), -SOC_SINGLE("HPOUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L, -	   ARIZONA_OUT2_OSR_SHIFT, 1, 0), -SOC_SINGLE("HPOUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L, -	   ARIZONA_OUT3_OSR_SHIFT, 1, 0), -SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, -	   ARIZONA_OUT4_OSR_SHIFT, 1, 0), +SOC_SINGLE("HPOUT1 SC Protect Switch", ARIZONA_HP1_SHORT_CIRCUIT_CTRL, +	   ARIZONA_HP1_SC_ENA_SHIFT, 1, 0), +SOC_SINGLE("HPOUT2 SC Protect Switch", ARIZONA_HP2_SHORT_CIRCUIT_CTRL, +	   ARIZONA_HP2_SC_ENA_SHIFT, 1, 0), +SOC_SINGLE("HPOUT3 SC Protect Switch", ARIZONA_HP3_SHORT_CIRCUIT_CTRL, +	   ARIZONA_HP3_SC_ENA_SHIFT, 1, 0), +  SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L,  	   ARIZONA_OUT5_OSR_SHIFT, 1, 0),  SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L, @@ -252,23 +404,18 @@ SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_6L,  		 ARIZONA_DAC_DIGITAL_VOLUME_6R, ARIZONA_OUT6L_VOL_SHIFT,  		 0xbf, 0, digital_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L, -		       ARIZONA_OUTPUT_PATH_CONFIG_1R, -		       ARIZONA_OUT1L_PGA_VOL_SHIFT, -		       0x34, 0x40, 0, ana_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L, -		       ARIZONA_OUTPUT_PATH_CONFIG_2R, -		       ARIZONA_OUT2L_PGA_VOL_SHIFT, -		       0x34, 0x40, 0, ana_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L, -		       ARIZONA_OUTPUT_PATH_CONFIG_3R, -		       ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv), -  SOC_DOUBLE("SPKDAT1 Switch", ARIZONA_PDM_SPK1_CTRL_1, ARIZONA_SPK1L_MUTE_SHIFT,  	   ARIZONA_SPK1R_MUTE_SHIFT, 1, 1),  SOC_DOUBLE("SPKDAT2 Switch", ARIZONA_PDM_SPK2_CTRL_1, ARIZONA_SPK2L_MUTE_SHIFT,  	   ARIZONA_SPK2R_MUTE_SHIFT, 1, 1), +SOC_DOUBLE("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE, +	   ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0), +SOC_DOUBLE("HPOUT2 DRE Switch", ARIZONA_DRE_ENABLE, +	   ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0), +SOC_DOUBLE("HPOUT3 DRE Switch", ARIZONA_DRE_ENABLE, +	   ARIZONA_DRE3L_ENA_SHIFT, ARIZONA_DRE3R_ENA_SHIFT, 1, 0), +  SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),  SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp), @@ -302,6 +449,10 @@ ARIZONA_MIXER_CONTROLS("AIF1TX8", ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE), +ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE), +ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE), +ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE), +ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), @@ -331,6 +482,22 @@ ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(DSP1L, ARIZONA_DSP1LMIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(DSP1R, ARIZONA_DSP1RMIX_INPUT_1_SOURCE); +ARIZONA_DSP_AUX_ENUMS(DSP1, ARIZONA_DSP1AUX1MIX_INPUT_1_SOURCE); + +ARIZONA_MIXER_ENUMS(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE); +ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE); + +ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE); +ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_INPUT_1_SOURCE); + +ARIZONA_MIXER_ENUMS(DSP4L, ARIZONA_DSP4LMIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(DSP4R, ARIZONA_DSP4RMIX_INPUT_1_SOURCE); +ARIZONA_DSP_AUX_ENUMS(DSP4, ARIZONA_DSP4AUX1MIX_INPUT_1_SOURCE); +  ARIZONA_MIXER_ENUMS(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(Noise, ARIZONA_NOISEMIX_INPUT_1_SOURCE); @@ -361,6 +528,10 @@ ARIZONA_MIXER_ENUMS(AIF1TX8, ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE); +ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE); @@ -379,6 +550,36 @@ ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);  ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);  ARIZONA_MUX_ENUMS(ASRC2R, ARIZONA_ASRC2RMIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1INT1, ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1INT2, ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1INT3, ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1INT4, ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE); + +ARIZONA_MUX_ENUMS(ISRC1DEC1, ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1DEC2, ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1DEC3, ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC1DEC4, ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE); + +ARIZONA_MUX_ENUMS(ISRC2INT1, ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2INT2, ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2INT3, ARIZONA_ISRC2INT3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2INT4, ARIZONA_ISRC2INT4MIX_INPUT_1_SOURCE); + +ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2DEC3, ARIZONA_ISRC2DEC3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC2DEC4, ARIZONA_ISRC2DEC4MIX_INPUT_1_SOURCE); + +ARIZONA_MUX_ENUMS(ISRC3INT1, ARIZONA_ISRC3INT1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3INT2, ARIZONA_ISRC3INT2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3INT3, ARIZONA_ISRC3INT3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3INT4, ARIZONA_ISRC3INT4MIX_INPUT_1_SOURCE); + +ARIZONA_MUX_ENUMS(ISRC3DEC1, ARIZONA_ISRC3DEC1MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3DEC2, ARIZONA_ISRC3DEC2MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3DEC3, ARIZONA_ISRC3DEC3MIX_INPUT_1_SOURCE); +ARIZONA_MUX_ENUMS(ISRC3DEC4, ARIZONA_ISRC3DEC4MIX_INPUT_1_SOURCE); +  static const char *wm5110_aec_loopback_texts[] = {  	"HPOUT1L", "HPOUT1R", "HPOUT2L", "HPOUT2R", "HPOUT3L", "HPOUT3R",  	"SPKOUTL", "SPKOUTR", "SPKDAT1L", "SPKDAT1R", "SPKDAT2L", "SPKDAT2R", @@ -396,11 +597,11 @@ static const struct soc_enum wm5110_aec_loopback =  			      wm5110_aec_loopback_values);  static const struct snd_kcontrol_new wm5110_aec_loopback_mux = -	SOC_DAPM_VALUE_ENUM("AEC Loopback", wm5110_aec_loopback); +	SOC_DAPM_ENUM("AEC Loopback", wm5110_aec_loopback);  static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, -		    0, NULL, 0), +		    0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU),  SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,  		    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),  SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, @@ -519,7 +720,66 @@ SND_SOC_DAPM_PGA("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,  SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,  		 NULL, 0), -SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, +WM_ADSP2("DSP1", 0), +WM_ADSP2("DSP2", 1), +WM_ADSP2("DSP3", 2), +WM_ADSP2("DSP4", 3), + +SND_SOC_DAPM_PGA("ISRC1INT1", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_INT0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1INT2", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1INT3", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1INT4", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_PGA("ISRC1DEC1", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_DEC0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1DEC2", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1DEC3", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC1DEC4", ARIZONA_ISRC_1_CTRL_3, +		 ARIZONA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_PGA("ISRC2INT1", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_INT0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2INT2", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2INT3", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2INT4", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_INT3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_PGA("ISRC2DEC1", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_DEC0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2DEC3", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC2DEC4", ARIZONA_ISRC_2_CTRL_3, +		 ARIZONA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_PGA("ISRC3INT1", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_INT0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3INT2", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_INT1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3INT3", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_INT2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3INT4", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_INT3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_PGA("ISRC3DEC1", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_DEC0_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3DEC2", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_DEC1_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3DEC3", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_DEC2_ENA_SHIFT, 0, NULL, 0), +SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3, +		 ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0), + +SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,  		       ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,  		       &wm5110_aec_loopback_mux), @@ -561,11 +821,27 @@ SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,  		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),  SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 0,  		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 0, +		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 0, +		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 0, +		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 0, +		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),  SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,  		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),  SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0,  		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 0, +		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 0, +		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 0, +		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0), +SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 0, +		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),  SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,  		    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE, @@ -703,6 +979,10 @@ ARIZONA_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),  ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),  ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"), +ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"), +ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"), +ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"), +ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),  ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),  ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"), @@ -721,6 +1001,41 @@ ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),  ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),  ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"), +ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), +ARIZONA_DSP_WIDGETS(DSP2, "DSP2"), +ARIZONA_DSP_WIDGETS(DSP3, "DSP3"), +ARIZONA_DSP_WIDGETS(DSP4, "DSP4"), + +ARIZONA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"), +ARIZONA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"), +ARIZONA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"), +ARIZONA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"), + +ARIZONA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"), +ARIZONA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"), +ARIZONA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"), +ARIZONA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"), + +ARIZONA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"), +ARIZONA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"), +ARIZONA_MUX_WIDGETS(ISRC2DEC3, "ISRC2DEC3"), +ARIZONA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"), + +ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"), +ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"), +ARIZONA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"), +ARIZONA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"), + +ARIZONA_MUX_WIDGETS(ISRC3DEC1, "ISRC3DEC1"), +ARIZONA_MUX_WIDGETS(ISRC3DEC2, "ISRC3DEC2"), +ARIZONA_MUX_WIDGETS(ISRC3DEC3, "ISRC3DEC3"), +ARIZONA_MUX_WIDGETS(ISRC3DEC4, "ISRC3DEC4"), + +ARIZONA_MUX_WIDGETS(ISRC3INT1, "ISRC3INT1"), +ARIZONA_MUX_WIDGETS(ISRC3INT2, "ISRC3INT2"), +ARIZONA_MUX_WIDGETS(ISRC3INT3, "ISRC3INT3"), +ARIZONA_MUX_WIDGETS(ISRC3INT4, "ISRC3INT4"), +  SND_SOC_DAPM_OUTPUT("HPOUT1L"),  SND_SOC_DAPM_OUTPUT("HPOUT1R"),  SND_SOC_DAPM_OUTPUT("HPOUT2L"), @@ -764,6 +1079,10 @@ SND_SOC_DAPM_OUTPUT("MICSUPP"),  	{ name, "AIF1RX8", "AIF1RX8" }, \  	{ name, "AIF2RX1", "AIF2RX1" }, \  	{ name, "AIF2RX2", "AIF2RX2" }, \ +	{ name, "AIF2RX3", "AIF2RX3" }, \ +	{ name, "AIF2RX4", "AIF2RX4" }, \ +	{ name, "AIF2RX5", "AIF2RX5" }, \ +	{ name, "AIF2RX6", "AIF2RX6" }, \  	{ name, "AIF3RX1", "AIF3RX1" }, \  	{ name, "AIF3RX2", "AIF3RX2" }, \  	{ name, "SLIMRX1", "SLIMRX1" }, \ @@ -789,7 +1108,55 @@ SND_SOC_DAPM_OUTPUT("MICSUPP"),  	{ name, "ASRC1L", "ASRC1L" }, \  	{ name, "ASRC1R", "ASRC1R" }, \  	{ name, "ASRC2L", "ASRC2L" }, \ -	{ name, "ASRC2R", "ASRC2R" } +	{ name, "ASRC2R", "ASRC2R" }, \ +	{ name, "ISRC1DEC1", "ISRC1DEC1" }, \ +	{ name, "ISRC1DEC2", "ISRC1DEC2" }, \ +	{ name, "ISRC1DEC3", "ISRC1DEC3" }, \ +	{ name, "ISRC1DEC4", "ISRC1DEC4" }, \ +	{ name, "ISRC1INT1", "ISRC1INT1" }, \ +	{ name, "ISRC1INT2", "ISRC1INT2" }, \ +	{ name, "ISRC1INT3", "ISRC1INT3" }, \ +	{ name, "ISRC1INT4", "ISRC1INT4" }, \ +	{ name, "ISRC2DEC1", "ISRC2DEC1" }, \ +	{ name, "ISRC2DEC2", "ISRC2DEC2" }, \ +	{ name, "ISRC2DEC3", "ISRC2DEC3" }, \ +	{ name, "ISRC2DEC4", "ISRC2DEC4" }, \ +	{ name, "ISRC2INT1", "ISRC2INT1" }, \ +	{ name, "ISRC2INT2", "ISRC2INT2" }, \ +	{ name, "ISRC2INT3", "ISRC2INT3" }, \ +	{ name, "ISRC2INT4", "ISRC2INT4" }, \ +	{ name, "ISRC3DEC1", "ISRC3DEC1" }, \ +	{ name, "ISRC3DEC2", "ISRC3DEC2" }, \ +	{ name, "ISRC3DEC3", "ISRC3DEC3" }, \ +	{ name, "ISRC3DEC4", "ISRC3DEC4" }, \ +	{ name, "ISRC3INT1", "ISRC3INT1" }, \ +	{ name, "ISRC3INT2", "ISRC3INT2" }, \ +	{ name, "ISRC3INT3", "ISRC3INT3" }, \ +	{ name, "ISRC3INT4", "ISRC3INT4" }, \ +	{ name, "DSP1.1", "DSP1" }, \ +	{ name, "DSP1.2", "DSP1" }, \ +	{ name, "DSP1.3", "DSP1" }, \ +	{ name, "DSP1.4", "DSP1" }, \ +	{ name, "DSP1.5", "DSP1" }, \ +	{ name, "DSP1.6", "DSP1" }, \ +	{ name, "DSP2.1", "DSP2" }, \ +	{ name, "DSP2.2", "DSP2" }, \ +	{ name, "DSP2.3", "DSP2" }, \ +	{ name, "DSP2.4", "DSP2" }, \ +	{ name, "DSP2.5", "DSP2" }, \ +	{ name, "DSP2.6", "DSP2" }, \ +	{ name, "DSP3.1", "DSP3" }, \ +	{ name, "DSP3.2", "DSP3" }, \ +	{ name, "DSP3.3", "DSP3" }, \ +	{ name, "DSP3.4", "DSP3" }, \ +	{ name, "DSP3.5", "DSP3" }, \ +	{ name, "DSP3.6", "DSP3" }, \ +	{ name, "DSP4.1", "DSP4" }, \ +	{ name, "DSP4.2", "DSP4" }, \ +	{ name, "DSP4.3", "DSP4" }, \ +	{ name, "DSP4.4", "DSP4" }, \ +	{ name, "DSP4.5", "DSP4" }, \ +	{ name, "DSP4.6", "DSP4" }  static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {  	{ "AIF2 Capture", NULL, "DBVDD2" }, @@ -861,9 +1228,17 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {  	{ "AIF2 Capture", NULL, "AIF2TX1" },  	{ "AIF2 Capture", NULL, "AIF2TX2" }, +	{ "AIF2 Capture", NULL, "AIF2TX3" }, +	{ "AIF2 Capture", NULL, "AIF2TX4" }, +	{ "AIF2 Capture", NULL, "AIF2TX5" }, +	{ "AIF2 Capture", NULL, "AIF2TX6" },  	{ "AIF2RX1", NULL, "AIF2 Playback" },  	{ "AIF2RX2", NULL, "AIF2 Playback" }, +	{ "AIF2RX3", NULL, "AIF2 Playback" }, +	{ "AIF2RX4", NULL, "AIF2 Playback" }, +	{ "AIF2RX5", NULL, "AIF2 Playback" }, +	{ "AIF2RX6", NULL, "AIF2 Playback" },  	{ "AIF3 Capture", NULL, "AIF3TX1" },  	{ "AIF3 Capture", NULL, "AIF3TX2" }, @@ -947,6 +1322,10 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {  	ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),  	ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"), +	ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"), +	ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"), +	ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"), +	ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),  	ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),  	ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"), @@ -983,24 +1362,71 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {  	ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),  	ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"), +	ARIZONA_DSP_ROUTES("DSP1"), +	ARIZONA_DSP_ROUTES("DSP2"), +	ARIZONA_DSP_ROUTES("DSP3"), +	ARIZONA_DSP_ROUTES("DSP4"), + +	ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"), +	ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"), +	ARIZONA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"), +	ARIZONA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"), + +	ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"), +	ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"), +	ARIZONA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"), +	ARIZONA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"), + +	ARIZONA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"), +	ARIZONA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"), +	ARIZONA_MUX_ROUTES("ISRC2INT3", "ISRC2INT3"), +	ARIZONA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"), + +	ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"), +	ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"), +	ARIZONA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"), +	ARIZONA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"), + +	ARIZONA_MUX_ROUTES("ISRC3INT1", "ISRC3INT1"), +	ARIZONA_MUX_ROUTES("ISRC3INT2", "ISRC3INT2"), +	ARIZONA_MUX_ROUTES("ISRC3INT3", "ISRC3INT3"), +	ARIZONA_MUX_ROUTES("ISRC3INT4", "ISRC3INT4"), + +	ARIZONA_MUX_ROUTES("ISRC3DEC1", "ISRC3DEC1"), +	ARIZONA_MUX_ROUTES("ISRC3DEC2", "ISRC3DEC2"), +	ARIZONA_MUX_ROUTES("ISRC3DEC3", "ISRC3DEC3"), +	ARIZONA_MUX_ROUTES("ISRC3DEC4", "ISRC3DEC4"), + +	{ "AEC Loopback", "HPOUT1L", "OUT1L" }, +	{ "AEC Loopback", "HPOUT1R", "OUT1R" },  	{ "HPOUT1L", NULL, "OUT1L" },  	{ "HPOUT1R", NULL, "OUT1R" }, +	{ "AEC Loopback", "HPOUT2L", "OUT2L" }, +	{ "AEC Loopback", "HPOUT2R", "OUT2R" },  	{ "HPOUT2L", NULL, "OUT2L" },  	{ "HPOUT2R", NULL, "OUT2R" }, +	{ "AEC Loopback", "HPOUT3L", "OUT3L" }, +	{ "AEC Loopback", "HPOUT3R", "OUT3R" },  	{ "HPOUT3L", NULL, "OUT3L" }, -	{ "HPOUT3R", NULL, "OUT3L" }, +	{ "HPOUT3R", NULL, "OUT3R" }, +	{ "AEC Loopback", "SPKOUTL", "OUT4L" },  	{ "SPKOUTLN", NULL, "OUT4L" },  	{ "SPKOUTLP", NULL, "OUT4L" }, +	{ "AEC Loopback", "SPKOUTR", "OUT4R" },  	{ "SPKOUTRN", NULL, "OUT4R" },  	{ "SPKOUTRP", NULL, "OUT4R" }, +	{ "AEC Loopback", "SPKDAT1L", "OUT5L" }, +	{ "AEC Loopback", "SPKDAT1R", "OUT5R" },  	{ "SPKDAT1L", NULL, "OUT5L" },  	{ "SPKDAT1R", NULL, "OUT5R" }, +	{ "AEC Loopback", "SPKDAT2L", "OUT6L" }, +	{ "AEC Loopback", "SPKDAT2R", "OUT6R" },  	{ "SPKDAT2L", NULL, "OUT6L" },  	{ "SPKDAT2R", NULL, "OUT6R" }, @@ -1067,14 +1493,14 @@ static struct snd_soc_dai_driver wm5110_dai[] = {  		.playback = {  			.stream_name = "AIF2 Playback",  			.channels_min = 1, -			.channels_max = 2, +			.channels_max = 6,  			.rates = WM5110_RATES,  			.formats = WM5110_FORMATS,  		},  		.capture = {  			 .stream_name = "AIF2 Capture",  			 .channels_min = 1, -			 .channels_max = 2, +			 .channels_max = 6,  			 .rates = WM5110_RATES,  			 .formats = WM5110_FORMATS,  		 }, @@ -1166,16 +1592,15 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)  	struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);  	int ret; -	codec->control_data = priv->core.arizona->regmap;  	priv->core.arizona->dapm = &codec->dapm; -	ret = snd_soc_codec_set_cache_io(codec, 32, 16, SND_SOC_REGMAP); -	if (ret != 0) -		return ret; -  	arizona_init_spk(codec);  	arizona_init_gpio(codec); +	ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 8); +	if (ret != 0) +		return ret; +  	snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");  	priv->core.arizona->dapm = &codec->dapm; @@ -1209,9 +1634,17 @@ static unsigned int wm5110_digital_vu[] = {  	ARIZONA_DAC_DIGITAL_VOLUME_6R,  }; +static struct regmap *wm5110_get_regmap(struct device *dev) +{ +	struct wm5110_priv *priv = dev_get_drvdata(dev); + +	return priv->core.arizona->regmap; +} +  static struct snd_soc_codec_driver soc_codec_dev_wm5110 = {  	.probe = wm5110_codec_probe,  	.remove = wm5110_codec_remove, +	.get_regmap = wm5110_get_regmap,  	.idle_bias_off = true, @@ -1230,7 +1663,7 @@ static int wm5110_probe(struct platform_device *pdev)  {  	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);  	struct wm5110_priv *wm5110; -	int i; +	int i, ret;  	wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv),  			      GFP_KERNEL); @@ -1241,6 +1674,24 @@ static int wm5110_probe(struct platform_device *pdev)  	wm5110->core.arizona = arizona;  	wm5110->core.num_inputs = 8; +	for (i = 0; i < WM5110_NUM_ADSP; i++) { +		wm5110->core.adsp[i].part = "wm5110"; +		wm5110->core.adsp[i].num = i + 1; +		wm5110->core.adsp[i].type = WMFW_ADSP2; +		wm5110->core.adsp[i].dev = arizona->dev; +		wm5110->core.adsp[i].regmap = arizona->regmap; + +		wm5110->core.adsp[i].base = ARIZONA_DSP1_CONTROL_1 +			+ (0x100 * i); +		wm5110->core.adsp[i].mem = wm5110_dsp_regions[i]; +		wm5110->core.adsp[i].num_mems +			= ARRAY_SIZE(wm5110_dsp1_regions); + +		ret = wm_adsp2_init(&wm5110->core.adsp[i], false); +		if (ret != 0) +			return ret; +	} +  	for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++)  		wm5110->fll[i].vco_mult = 3; @@ -1251,6 +1702,12 @@ static int wm5110_probe(struct platform_device *pdev)  			 ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,  			 &wm5110->fll[1]); +	/* SR2 fixed at 8kHz, SR3 fixed at 16kHz */ +	regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2, +			   ARIZONA_SAMPLE_RATE_2_MASK, 0x11); +	regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3, +			   ARIZONA_SAMPLE_RATE_3_MASK, 0x12); +  	for (i = 0; i < ARRAY_SIZE(wm5110_dai); i++)  		arizona_init_dai(&wm5110->core, i);  | 
