diff options
Diffstat (limited to 'sound/soc/codecs')
| -rw-r--r-- | sound/soc/codecs/arizona.c | 9 | ||||
| -rw-r--r-- | sound/soc/codecs/arizona.h | 18 | ||||
| -rw-r--r-- | sound/soc/codecs/cs4271.c | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/cs42l52.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/lm49453.c | 106 | ||||
| -rw-r--r-- | sound/soc/codecs/sgtl5000.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/sta529.c | 9 | ||||
| -rw-r--r-- | sound/soc/codecs/wm2000.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm2200.c | 8 | ||||
| -rw-r--r-- | sound/soc/codecs/wm5100.c | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/wm5102.c | 48 | ||||
| -rw-r--r-- | sound/soc/codecs/wm_adsp.c | 23 | 
12 files changed, 133 insertions, 112 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index adf397b9d0e..1d8bb591759 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c @@ -446,15 +446,9 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)  	case SND_SOC_DAIFMT_DSP_A:  		mode = 0;  		break; -	case SND_SOC_DAIFMT_DSP_B: -		mode = 1; -		break;  	case SND_SOC_DAIFMT_I2S:  		mode = 2;  		break; -	case SND_SOC_DAIFMT_LEFT_J: -		mode = 3; -		break;  	default:  		arizona_aif_err(dai, "Unsupported DAI format %d\n",  				fmt & SND_SOC_DAIFMT_FORMAT_MASK); @@ -714,7 +708,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,  		snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1,  				    ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val);  		snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, -				    ARIZONA_AIF1_RATE_MASK, 8); +				    ARIZONA_AIF1_RATE_MASK, +				    8 << ARIZONA_AIF1_RATE_SHIFT);  		break;  	default:  		arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h index 41dae1ed3b7..4deebeb0717 100644 --- a/sound/soc/codecs/arizona.h +++ b/sound/soc/codecs/arizona.h @@ -34,15 +34,15 @@  #define ARIZONA_FLL_SRC_MCLK1      0  #define ARIZONA_FLL_SRC_MCLK2      1 -#define ARIZONA_FLL_SRC_SLIMCLK    2 -#define ARIZONA_FLL_SRC_FLL1       3 -#define ARIZONA_FLL_SRC_FLL2       4 -#define ARIZONA_FLL_SRC_AIF1BCLK   5 -#define ARIZONA_FLL_SRC_AIF2BCLK   6 -#define ARIZONA_FLL_SRC_AIF3BCLK   7 -#define ARIZONA_FLL_SRC_AIF1LRCLK  8 -#define ARIZONA_FLL_SRC_AIF2LRCLK  9 -#define ARIZONA_FLL_SRC_AIF3LRCLK 10 +#define ARIZONA_FLL_SRC_SLIMCLK    3 +#define ARIZONA_FLL_SRC_FLL1       4 +#define ARIZONA_FLL_SRC_FLL2       5 +#define ARIZONA_FLL_SRC_AIF1BCLK   8 +#define ARIZONA_FLL_SRC_AIF2BCLK   9 +#define ARIZONA_FLL_SRC_AIF3BCLK  10 +#define ARIZONA_FLL_SRC_AIF1LRCLK 12 +#define ARIZONA_FLL_SRC_AIF2LRCLK 13 +#define ARIZONA_FLL_SRC_AIF3LRCLK 14  #define ARIZONA_MIXER_VOL_MASK             0x00FE  #define ARIZONA_MIXER_VOL_SHIFT                 1 diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index 4f1127935fd..ac8742a1f25 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c @@ -474,16 +474,16 @@ static int cs4271_probe(struct snd_soc_codec *codec)  	struct cs4271_platform_data *cs4271plat = codec->dev->platform_data;  	int ret;  	int gpio_nreset = -EINVAL; -	int amutec_eq_bmutec = 0; +	bool amutec_eq_bmutec = false;  #ifdef CONFIG_OF  	if (of_match_device(cs4271_dt_ids, codec->dev)) {  		gpio_nreset = of_get_named_gpio(codec->dev->of_node,  						"reset-gpio", 0); -		if (!of_get_property(codec->dev->of_node, +		if (of_get_property(codec->dev->of_node,  				     "cirrus,amutec-eq-bmutec", NULL)) -			amutec_eq_bmutec = 1; +			amutec_eq_bmutec = true;  	}  #endif diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 99bb1c69499..9811a5478c8 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -737,7 +737,7 @@ static const struct cs42l52_clk_para clk_map_table[] = {  static int cs42l52_get_clk(int mclk, int rate)  { -	int i, ret = 0; +	int i, ret = -EINVAL;  	u_int mclk1, mclk2 = 0;  	for (i = 0; i < ARRAY_SIZE(clk_map_table); i++) { @@ -749,8 +749,6 @@ static int cs42l52_get_clk(int mclk, int rate)  			}  		}  	} -	if (ret > ARRAY_SIZE(clk_map_table)) -		return -EINVAL;  	return ret;  } diff --git a/sound/soc/codecs/lm49453.c b/sound/soc/codecs/lm49453.c index d75257d40a4..e19490cfb3a 100644 --- a/sound/soc/codecs/lm49453.c +++ b/sound/soc/codecs/lm49453.c @@ -111,9 +111,9 @@ static struct reg_default lm49453_reg_defs[] = {  	{ 101, 0x00 },  	{ 102, 0x00 },  	{ 103, 0x01 }, -	{ 105, 0x01 }, -	{ 106, 0x00 }, -	{ 107, 0x01 }, +	{ 104, 0x01 }, +	{ 105, 0x00 }, +	{ 106, 0x01 },  	{ 107, 0x00 },  	{ 108, 0x00 },  	{ 109, 0x00 }, @@ -163,56 +163,25 @@ static struct reg_default lm49453_reg_defs[] = {  	{ 184, 0x00 },  	{ 185, 0x00 },  	{ 186, 0x00 }, -	{ 189, 0x00 }, +	{ 187, 0x00 },  	{ 188, 0x00 }, -	{ 194, 0x00 }, -	{ 195, 0x00 }, -	{ 196, 0x00 }, -	{ 197, 0x00 }, -	{ 200, 0x00 }, -	{ 201, 0x00 }, -	{ 202, 0x00 }, -	{ 203, 0x00 }, -	{ 204, 0x00 }, -	{ 205, 0x00 }, -	{ 208, 0x00 }, +	{ 189, 0x00 }, +	{ 208, 0x06 },  	{ 209, 0x00 }, -	{ 210, 0x00 }, -	{ 211, 0x00 }, -	{ 213, 0x00 }, -	{ 214, 0x00 }, -	{ 215, 0x00 }, -	{ 216, 0x00 }, -	{ 217, 0x00 }, -	{ 218, 0x00 }, -	{ 219, 0x00 }, +	{ 210, 0x08 }, +	{ 211, 0x54 }, +	{ 212, 0x14 }, +	{ 213, 0x0d }, +	{ 214, 0x0d }, +	{ 215, 0x14 }, +	{ 216, 0x60 },  	{ 221, 0x00 },  	{ 222, 0x00 }, +	{ 223, 0x00 },  	{ 224, 0x00 }, -	{ 225, 0x00 }, -	{ 226, 0x00 }, -	{ 227, 0x00 }, -	{ 228, 0x00 }, -	{ 229, 0x00 }, -	{ 230, 0x13 }, -	{ 231, 0x00 }, -	{ 232, 0x80 }, -	{ 233, 0x0C }, -	{ 234, 0xDD }, -	{ 235, 0x00 }, -	{ 236, 0x04 }, -	{ 237, 0x00 }, -	{ 238, 0x00 }, -	{ 239, 0x00 }, -	{ 240, 0x00 }, -	{ 241, 0x00 }, -	{ 242, 0x00 }, -	{ 243, 0x00 }, -	{ 244, 0x00 }, -	{ 245, 0x00 },  	{ 248, 0x00 },  	{ 249, 0x00 }, -	{ 254, 0x00 }, +	{ 250, 0x00 },  	{ 255, 0x00 },  }; @@ -525,36 +494,41 @@ SOC_DAPM_SINGLE("Port2_2 Switch", LM49453_P0_PORT2_TX2_REG, 7, 1, 0),  };  /* TLV Declarations */ -static const DECLARE_TLV_DB_SCALE(digital_tlv, -7650, 150, 1); -static const DECLARE_TLV_DB_SCALE(port_tlv, 0, 600, 0); +static const DECLARE_TLV_DB_SCALE(adc_dac_tlv, -7650, 150, 1); +static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 200, 1); +static const DECLARE_TLV_DB_SCALE(port_tlv, -1800, 600, 0); +static const DECLARE_TLV_DB_SCALE(stn_tlv, -7200, 150, 0);  static const struct snd_kcontrol_new lm49453_sidetone_mixer_controls[] = {  /* Sidetone supports mono only */  SOC_DAPM_SINGLE_TLV("Sidetone ADCL Volume", LM49453_P0_STN_VOL_ADCL_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  SOC_DAPM_SINGLE_TLV("Sidetone ADCR Volume", LM49453_P0_STN_VOL_ADCR_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  SOC_DAPM_SINGLE_TLV("Sidetone DMIC1L Volume", LM49453_P0_STN_VOL_DMIC1L_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  SOC_DAPM_SINGLE_TLV("Sidetone DMIC1R Volume", LM49453_P0_STN_VOL_DMIC1R_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  SOC_DAPM_SINGLE_TLV("Sidetone DMIC2L Volume", LM49453_P0_STN_VOL_DMIC2L_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  SOC_DAPM_SINGLE_TLV("Sidetone DMIC2R Volume", LM49453_P0_STN_VOL_DMIC2R_REG, -		     0, 0x3F, 0, digital_tlv), +		     0, 0x3F, 0, stn_tlv),  };  static const struct snd_kcontrol_new lm49453_snd_controls[] = {  	/* mic1 and mic2 supports mono only */ -	SOC_SINGLE_TLV("Mic1 Volume", LM49453_P0_ADC_LEVELL_REG, 0, 6, -			0, digital_tlv), -	SOC_SINGLE_TLV("Mic2 Volume", LM49453_P0_ADC_LEVELR_REG, 0, 6, -			0, digital_tlv), +	SOC_SINGLE_TLV("Mic1 Volume", LM49453_P0_MICL_REG, 0, 15, 0, mic_tlv), +	SOC_SINGLE_TLV("Mic2 Volume", LM49453_P0_MICR_REG, 0, 15, 0, mic_tlv), + +	SOC_SINGLE_TLV("ADCL Volume", LM49453_P0_ADC_LEVELL_REG, 0, 63, +			0, adc_dac_tlv), +	SOC_SINGLE_TLV("ADCR Volume", LM49453_P0_ADC_LEVELR_REG, 0, 63, +			0, adc_dac_tlv),  	SOC_DOUBLE_R_TLV("DMIC1 Volume", LM49453_P0_DMIC1_LEVELL_REG, -			  LM49453_P0_DMIC1_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DMIC1_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_DOUBLE_R_TLV("DMIC2 Volume", LM49453_P0_DMIC2_LEVELL_REG, -			  LM49453_P0_DMIC2_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DMIC2_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_DAPM_ENUM("Mic2Mode", lm49453_mic2mode_enum),  	SOC_DAPM_ENUM("DMIC12 SRC", lm49453_dmic12_cfg_enum), @@ -569,16 +543,16 @@ static const struct snd_kcontrol_new lm49453_snd_controls[] = {  					  2, 1, 0),  	SOC_DOUBLE_R_TLV("DAC HP Volume", LM49453_P0_DAC_HP_LEVELL_REG, -			  LM49453_P0_DAC_HP_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DAC_HP_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_DOUBLE_R_TLV("DAC LO Volume", LM49453_P0_DAC_LO_LEVELL_REG, -			  LM49453_P0_DAC_LO_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DAC_LO_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_DOUBLE_R_TLV("DAC LS Volume", LM49453_P0_DAC_LS_LEVELL_REG, -			  LM49453_P0_DAC_LS_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DAC_LS_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_DOUBLE_R_TLV("DAC HA Volume", LM49453_P0_DAC_HA_LEVELL_REG, -			  LM49453_P0_DAC_HA_LEVELR_REG, 0, 6, 0, digital_tlv), +			  LM49453_P0_DAC_HA_LEVELR_REG, 0, 63, 0, adc_dac_tlv),  	SOC_SINGLE_TLV("EP Volume", LM49453_P0_DAC_LS_LEVELL_REG, -			0, 6, 0, digital_tlv), +			0, 63, 0, adc_dac_tlv),  	SOC_SINGLE_TLV("PORT1_1_RX_LVL Volume", LM49453_P0_PORT1_RX_LVL1_REG,  			0, 3, 0, port_tlv), @@ -1218,7 +1192,7 @@ static int lm49453_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)  	}  	snd_soc_update_bits(codec, LM49453_P0_AUDIO_PORT1_BASIC_REG, -			    LM49453_AUDIO_PORT1_BASIC_FMT_MASK|BIT(1)|BIT(5), +			    LM49453_AUDIO_PORT1_BASIC_FMT_MASK|BIT(0)|BIT(5),  			    (aif_val | mode | clk_phase));  	snd_soc_write(codec, LM49453_P0_AUDIO_PORT1_RX_MSB_REG, clk_shift); diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index cb1675cd8e1..92bbfec9b10 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -401,7 +401,7 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = {  			5, 1, 0),  	SOC_SINGLE_TLV("Mic Volume", SGTL5000_CHIP_MIC_CTRL, -			0, 4, 0, mic_gain_tlv), +			0, 3, 0, mic_gain_tlv),  };  /* mute the codec used by alsa core */ @@ -1344,7 +1344,7 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)  			SGTL5000_HP_ZCD_EN |  			SGTL5000_ADC_ZCD_EN); -	snd_soc_write(codec, SGTL5000_CHIP_MIC_CTRL, 0); +	snd_soc_write(codec, SGTL5000_CHIP_MIC_CTRL, 2);  	/*  	 * disable DAP diff --git a/sound/soc/codecs/sta529.c b/sound/soc/codecs/sta529.c index ab355c4f0b2..40c07be9b58 100644 --- a/sound/soc/codecs/sta529.c +++ b/sound/soc/codecs/sta529.c @@ -74,9 +74,10 @@  				SNDRV_PCM_FMTBIT_S32_LE)  #define	S2PC_VALUE		0x98  #define CLOCK_OUT		0x60 -#define LEFT_J_DATA_FORMAT	0x10 -#define I2S_DATA_FORMAT		0x12 -#define RIGHT_J_DATA_FORMAT	0x14 +#define DATA_FORMAT_MSK		0x0E +#define LEFT_J_DATA_FORMAT	0x00 +#define I2S_DATA_FORMAT		0x02 +#define RIGHT_J_DATA_FORMAT	0x04  #define CODEC_MUTE_VAL		0x80  #define POWER_CNTLMSAK		0x40 @@ -289,7 +290,7 @@ static int sta529_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt)  		return -EINVAL;  	} -	snd_soc_update_bits(codec, STA529_S2PCFG0, 0x0D, mode); +	snd_soc_update_bits(codec, STA529_S2PCFG0, DATA_FORMAT_MSK, mode);  	return 0;  } diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index 1cbe88f01d6..12bcae63a7f 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c @@ -209,9 +209,9 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)  	ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY);  	if (wm2000->speech_clarity) -		ret &= ~WM2000_SPEECH_CLARITY; -	else  		ret |= WM2000_SPEECH_CLARITY; +	else +		ret &= ~WM2000_SPEECH_CLARITY;  	wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret);  	wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33); diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c index afcf31df77e..e6cefe1ac67 100644 --- a/sound/soc/codecs/wm2200.c +++ b/sound/soc/codecs/wm2200.c @@ -1566,15 +1566,9 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)  	case SND_SOC_DAIFMT_DSP_A:  		fmt_val = 0;  		break; -	case SND_SOC_DAIFMT_DSP_B: -		fmt_val = 1; -		break;  	case SND_SOC_DAIFMT_I2S:  		fmt_val = 2;  		break; -	case SND_SOC_DAIFMT_LEFT_J: -		fmt_val = 3; -		break;  	default:  		dev_err(codec->dev, "Unsupported DAI format %d\n",  			fmt & SND_SOC_DAIFMT_FORMAT_MASK); @@ -1626,7 +1620,7 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)  			    WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV,  			    lrclk);  	snd_soc_update_bits(codec, WM2200_AUDIO_IF_1_5, -			    WM2200_AIF1_FMT_MASK << 1, fmt_val << 1); +			    WM2200_AIF1_FMT_MASK, fmt_val);  	return 0;  } diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c index 5a5f3693623..54397a50807 100644 --- a/sound/soc/codecs/wm5100.c +++ b/sound/soc/codecs/wm5100.c @@ -1279,15 +1279,9 @@ static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)  	case SND_SOC_DAIFMT_DSP_A:  		mask = 0;  		break; -	case SND_SOC_DAIFMT_DSP_B: -		mask = 1; -		break;  	case SND_SOC_DAIFMT_I2S:  		mask = 2;  		break; -	case SND_SOC_DAIFMT_LEFT_J: -		mask = 3; -		break;  	default:  		dev_err(codec->dev, "Unsupported DAI format %d\n",  			fmt & SND_SOC_DAIFMT_FORMAT_MASK); diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index 688ade08058..7a9048dad1c 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c @@ -36,6 +36,9 @@  struct wm5102_priv {  	struct arizona_priv core;  	struct arizona_fll fll[2]; + +	unsigned int spk_ena:2; +	unsigned int spk_ena_pending:1;  };  static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); @@ -787,6 +790,47 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),  }; +static int wm5102_spk_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 wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec); + +	if (arizona->rev < 1) +		return 0; + +	switch (event) { +	case SND_SOC_DAPM_PRE_PMU: +		if (!wm5102->spk_ena) { +			snd_soc_write(codec, 0x4f5, 0x25a); +			wm5102->spk_ena_pending = true; +		} +		break; +	case SND_SOC_DAPM_POST_PMU: +		if (wm5102->spk_ena_pending) { +			msleep(75); +			snd_soc_write(codec, 0x4f5, 0xda); +			wm5102->spk_ena_pending = false; +			wm5102->spk_ena++; +		} +		break; +	case SND_SOC_DAPM_PRE_PMD: +		wm5102->spk_ena--; +		if (!wm5102->spk_ena) +			snd_soc_write(codec, 0x4f5, 0x25a); +		break; +	case SND_SOC_DAPM_POST_PMD: +		if (!wm5102->spk_ena) +			snd_soc_write(codec, 0x4f5, 0x0da); +		break; +	} + +	return 0; +} + +  ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);  ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); @@ -1034,10 +1078,10 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,  		   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,  		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),  SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1, -		   ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, +		   ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,  		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),  SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1, -		   ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, +		   ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,  		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),  SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,  		   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c index ffc89fab96f..7b198c38f3e 100644 --- a/sound/soc/codecs/wm_adsp.c +++ b/sound/soc/codecs/wm_adsp.c @@ -169,6 +169,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)  	const struct wm_adsp_region *mem;  	const char *region_name;  	char *file, *text; +	void *buf;  	unsigned int reg;  	int regions = 0;  	int ret, offset, type, sizes; @@ -322,8 +323,18 @@ static int wm_adsp_load(struct wm_adsp *dsp)  		}  		if (reg) { -			ret = regmap_raw_write(regmap, reg, region->data, +			buf = kmemdup(region->data, le32_to_cpu(region->len), +				      GFP_KERNEL); +			if (!buf) { +				adsp_err(dsp, "Out of memory\n"); +				return -ENOMEM; +			} + +			ret = regmap_raw_write(regmap, reg, buf,  					       le32_to_cpu(region->len)); + +			kfree(buf); +  			if (ret != 0) {  				adsp_err(dsp,  					"%s.%d: Failed to write %d bytes at %d in %s: %d\n", @@ -359,6 +370,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)  	const char *region_name;  	int ret, pos, blocks, type, offset, reg;  	char *file; +	void *buf;  	file = kzalloc(PAGE_SIZE, GFP_KERNEL);  	if (file == NULL) @@ -426,6 +438,13 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)  		}  		if (reg) { +			buf = kmemdup(blk->data, le32_to_cpu(blk->len), +				      GFP_KERNEL); +			if (!buf) { +				adsp_err(dsp, "Out of memory\n"); +				return -ENOMEM; +			} +  			ret = regmap_raw_write(regmap, reg, blk->data,  					       le32_to_cpu(blk->len));  			if (ret != 0) { @@ -433,6 +452,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)  					"%s.%d: Failed to write to %x in %s\n",  					file, blocks, reg, region_name);  			} + +			kfree(buf);  		}  		pos += le32_to_cpu(blk->len) + sizeof(*blk);  |