diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-03-18 11:17:03 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-03-18 11:17:03 -0700 | 
| commit | 7b09ac704bac2de5bf0362793edc22a0094e381c (patch) | |
| tree | 9e63dd69a46bfa69ea499f15eb189c61134b491a | |
| parent | ec3fbff0302e219997d48117fcb1fd04b8ad97c6 (diff) | |
| parent | 3fc6c5a1cfb979c768de003ee3c5783e671b156d (diff) | |
Merge tag 'sound-4.0-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
 "This is a collection of many small fixes.  Most of fixes are for ASoC
  drivers, including the fixes of wrong field usages for boolean kctls.
  In addition, there is a fix in ASoC core for adding proper locks for
  component lists, and a fix for a HD-audio regression by the previous
  mono channel fix"
* tag 'sound-4.0-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (24 commits)
  ALSA: hda - Treat stereo-to-mono mix properly
  ASoC: wm9713: Fix wrong value references for boolean kctl
  ASoC: wm9712: Fix wrong value references for boolean kctl
  ASoC: wm8960: Fix wrong value references for boolean kctl
  ASoC: wm8955: Fix wrong value references for boolean kctl
  ASoC: wm8904: Fix wrong value references for boolean kctl
  ASoC: wm8903: Fix wrong value references for boolean kctl
  ASoC: wm8731: Fix wrong value references for boolean kctl
  ASoC: wm2000: Fix wrong value references for boolean kctl
  ASoC: tas5086: Fix wrong value references for boolean kctl
  ASoC: pcm1681: Fix wrong value references for boolean kctl
  ASoC: es8238: Fix wrong value references for boolean kctl
  ASoC: cs4271: Fix wrong value references for boolean kctl
  ASoC: ak4641: Fix wrong value references for boolean kctl
  ASoC: adav80x: Fix wrong value references for boolean kctl
  ASoC: Fix component lists locking
  ASoC: Intel: remove conflicts when load/unload multiple firmware images
  ASoC: rt286: Change the DMI mapping for Dino
  ASoC: sgtl5000: remove useless register write clearing CHRGPUMP_POWERUP
  ASoC: fsl_ssi: Don't try to round-up for PM divisor calculation
  ...
| -rw-r--r-- | sound/pci/hda/hda_generic.c | 21 | ||||
| -rw-r--r-- | sound/pci/hda/hda_proc.c | 38 | ||||
| -rw-r--r-- | sound/soc/codecs/adav80x.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/ak4641.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/ak4671.c | 44 | ||||
| -rw-r--r-- | sound/soc/codecs/cs4271.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/da732x.c | 8 | ||||
| -rw-r--r-- | sound/soc/codecs/es8328.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/pcm1681.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/rt286.c | 2 | ||||
| -rw-r--r-- | sound/soc/codecs/sgtl5000.c | 8 | ||||
| -rw-r--r-- | sound/soc/codecs/sn95031.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/tas5086.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm2000.c | 8 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8731.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8903.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8904.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8955.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8960.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/wm9712.c | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/wm9713.c | 6 | ||||
| -rw-r--r-- | sound/soc/fsl/fsl_ssi.c | 4 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-dsp.c | 3 | ||||
| -rw-r--r-- | sound/soc/intel/sst-haswell-ipc.c | 32 | ||||
| -rw-r--r-- | sound/soc/soc-core.c | 41 | 
25 files changed, 167 insertions, 102 deletions
| diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index fe18071bf93a..8ec5289f8e05 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -687,13 +687,30 @@ static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,  	return val;  } +/* is this a stereo widget or a stereo-to-mono mix? */ +static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, int dir) +{ +	unsigned int wcaps = get_wcaps(codec, nid); +	hda_nid_t conn; + +	if (wcaps & AC_WCAP_STEREO) +		return true; +	if (dir != HDA_INPUT || get_wcaps_type(wcaps) != AC_WID_AUD_MIX) +		return false; +	if (snd_hda_get_num_conns(codec, nid) != 1) +		return false; +	if (snd_hda_get_connections(codec, nid, &conn, 1) < 0) +		return false; +	return !!(get_wcaps(codec, conn) & AC_WCAP_STEREO); +} +  /* initialize the amp value (only at the first time) */  static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)  {  	unsigned int caps = query_amp_caps(codec, nid, dir);  	int val = get_amp_val_to_activate(codec, nid, dir, caps, false); -	if (get_wcaps(codec, nid) & AC_WCAP_STEREO) +	if (is_stereo_amps(codec, nid, dir))  		snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);  	else  		snd_hda_codec_amp_init(codec, nid, 0, dir, idx, 0xff, val); @@ -703,7 +720,7 @@ static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)  static int update_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx,  		      unsigned int mask, unsigned int val)  { -	if (get_wcaps(codec, nid) & AC_WCAP_STEREO) +	if (is_stereo_amps(codec, nid, dir))  		return snd_hda_codec_amp_stereo(codec, nid, dir, idx,  						mask, val);  	else diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index ce5a6da83419..05e19f78b4cb 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -134,13 +134,38 @@ static void print_amp_caps(struct snd_info_buffer *buffer,  		    (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT);  } +/* is this a stereo widget or a stereo-to-mono mix? */ +static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, +			   int dir, unsigned int wcaps, int indices) +{ +	hda_nid_t conn; + +	if (wcaps & AC_WCAP_STEREO) +		return true; +	/* check for a stereo-to-mono mix; it must be: +	 * only a single connection, only for input, and only a mixer widget +	 */ +	if (indices != 1 || dir != HDA_INPUT || +	    get_wcaps_type(wcaps) != AC_WID_AUD_MIX) +		return false; + +	if (snd_hda_get_raw_connections(codec, nid, &conn, 1) < 0) +		return false; +	/* the connection source is a stereo? */ +	wcaps = snd_hda_param_read(codec, conn, AC_PAR_AUDIO_WIDGET_CAP); +	return !!(wcaps & AC_WCAP_STEREO); +} +  static void print_amp_vals(struct snd_info_buffer *buffer,  			   struct hda_codec *codec, hda_nid_t nid, -			   int dir, int stereo, int indices) +			   int dir, unsigned int wcaps, int indices)  {  	unsigned int val; +	bool stereo;  	int i; +	stereo = is_stereo_amps(codec, nid, dir, wcaps, indices); +  	dir = dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT;  	for (i = 0; i < indices; i++) {  		snd_iprintf(buffer, " ["); @@ -757,12 +782,10 @@ static void print_codec_info(struct snd_info_entry *entry,  			    (codec->single_adc_amp &&  			     wid_type == AC_WID_AUD_IN))  				print_amp_vals(buffer, codec, nid, HDA_INPUT, -					       wid_caps & AC_WCAP_STEREO, -					       1); +					       wid_caps, 1);  			else  				print_amp_vals(buffer, codec, nid, HDA_INPUT, -					       wid_caps & AC_WCAP_STEREO, -					       conn_len); +					       wid_caps, conn_len);  		}  		if (wid_caps & AC_WCAP_OUT_AMP) {  			snd_iprintf(buffer, "  Amp-Out caps: "); @@ -771,11 +794,10 @@ static void print_codec_info(struct snd_info_entry *entry,  			if (wid_type == AC_WID_PIN &&  			    codec->pin_amp_workaround)  				print_amp_vals(buffer, codec, nid, HDA_OUTPUT, -					       wid_caps & AC_WCAP_STEREO, -					       conn_len); +					       wid_caps, conn_len);  			else  				print_amp_vals(buffer, codec, nid, HDA_OUTPUT, -					       wid_caps & AC_WCAP_STEREO, 1); +					       wid_caps, 1);  		}  		switch (wid_type) { diff --git a/sound/soc/codecs/adav80x.c b/sound/soc/codecs/adav80x.c index b67480f1b1aa..4373ada95648 100644 --- a/sound/soc/codecs/adav80x.c +++ b/sound/soc/codecs/adav80x.c @@ -317,7 +317,7 @@ static int adav80x_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); -	unsigned int deemph = ucontrol->value.enumerated.item[0]; +	unsigned int deemph = ucontrol->value.integer.value[0];  	if (deemph > 1)  		return -EINVAL; @@ -333,7 +333,7 @@ static int adav80x_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = adav80x->deemph; +	ucontrol->value.integer.value[0] = adav80x->deemph;  	return 0;  }; diff --git a/sound/soc/codecs/ak4641.c b/sound/soc/codecs/ak4641.c index 70861c7b1631..81b54a270bd8 100644 --- a/sound/soc/codecs/ak4641.c +++ b/sound/soc/codecs/ak4641.c @@ -76,7 +76,7 @@ static int ak4641_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	if (deemph > 1)  		return -EINVAL; @@ -92,7 +92,7 @@ static int ak4641_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = ak4641->deemph; +	ucontrol->value.integer.value[0] = ak4641->deemph;  	return 0;  }; diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c index 632e89f793a7..2a58b1dccd2f 100644 --- a/sound/soc/codecs/ak4671.c +++ b/sound/soc/codecs/ak4671.c @@ -343,25 +343,25 @@ static const struct snd_soc_dapm_widget ak4671_dapm_widgets[] = {  };  static const struct snd_soc_dapm_route ak4671_intercon[] = { -	{"DAC Left", "NULL", "PMPLL"}, -	{"DAC Right", "NULL", "PMPLL"}, -	{"ADC Left", "NULL", "PMPLL"}, -	{"ADC Right", "NULL", "PMPLL"}, +	{"DAC Left", NULL, "PMPLL"}, +	{"DAC Right", NULL, "PMPLL"}, +	{"ADC Left", NULL, "PMPLL"}, +	{"ADC Right", NULL, "PMPLL"},  	/* Outputs */ -	{"LOUT1", "NULL", "LOUT1 Mixer"}, -	{"ROUT1", "NULL", "ROUT1 Mixer"}, -	{"LOUT2", "NULL", "LOUT2 Mix Amp"}, -	{"ROUT2", "NULL", "ROUT2 Mix Amp"}, -	{"LOUT3", "NULL", "LOUT3 Mixer"}, -	{"ROUT3", "NULL", "ROUT3 Mixer"}, +	{"LOUT1", NULL, "LOUT1 Mixer"}, +	{"ROUT1", NULL, "ROUT1 Mixer"}, +	{"LOUT2", NULL, "LOUT2 Mix Amp"}, +	{"ROUT2", NULL, "ROUT2 Mix Amp"}, +	{"LOUT3", NULL, "LOUT3 Mixer"}, +	{"ROUT3", NULL, "ROUT3 Mixer"},  	{"LOUT1 Mixer", "DACL", "DAC Left"},  	{"ROUT1 Mixer", "DACR", "DAC Right"},  	{"LOUT2 Mixer", "DACHL", "DAC Left"},  	{"ROUT2 Mixer", "DACHR", "DAC Right"}, -	{"LOUT2 Mix Amp", "NULL", "LOUT2 Mixer"}, -	{"ROUT2 Mix Amp", "NULL", "ROUT2 Mixer"}, +	{"LOUT2 Mix Amp", NULL, "LOUT2 Mixer"}, +	{"ROUT2 Mix Amp", NULL, "ROUT2 Mixer"},  	{"LOUT3 Mixer", "DACSL", "DAC Left"},  	{"ROUT3 Mixer", "DACSR", "DAC Right"}, @@ -381,18 +381,18 @@ static const struct snd_soc_dapm_route ak4671_intercon[] = {  	{"LIN2", NULL, "Mic Bias"},  	{"RIN2", NULL, "Mic Bias"}, -	{"ADC Left", "NULL", "LIN MUX"}, -	{"ADC Right", "NULL", "RIN MUX"}, +	{"ADC Left", NULL, "LIN MUX"}, +	{"ADC Right", NULL, "RIN MUX"},  	/* Analog Loops */ -	{"LIN1 Mixing Circuit", "NULL", "LIN1"}, -	{"RIN1 Mixing Circuit", "NULL", "RIN1"}, -	{"LIN2 Mixing Circuit", "NULL", "LIN2"}, -	{"RIN2 Mixing Circuit", "NULL", "RIN2"}, -	{"LIN3 Mixing Circuit", "NULL", "LIN3"}, -	{"RIN3 Mixing Circuit", "NULL", "RIN3"}, -	{"LIN4 Mixing Circuit", "NULL", "LIN4"}, -	{"RIN4 Mixing Circuit", "NULL", "RIN4"}, +	{"LIN1 Mixing Circuit", NULL, "LIN1"}, +	{"RIN1 Mixing Circuit", NULL, "RIN1"}, +	{"LIN2 Mixing Circuit", NULL, "LIN2"}, +	{"RIN2 Mixing Circuit", NULL, "RIN2"}, +	{"LIN3 Mixing Circuit", NULL, "LIN3"}, +	{"RIN3 Mixing Circuit", NULL, "RIN3"}, +	{"LIN4 Mixing Circuit", NULL, "LIN4"}, +	{"RIN4 Mixing Circuit", NULL, "RIN4"},  	{"LOUT1 Mixer", "LINL1", "LIN1 Mixing Circuit"},  	{"ROUT1 Mixer", "RINR1", "RIN1 Mixing Circuit"}, diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index 79a4efcb894c..7d3a6accaf9a 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c @@ -286,7 +286,7 @@ static int cs4271_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = cs4271->deemph; +	ucontrol->value.integer.value[0] = cs4271->deemph;  	return 0;  } @@ -296,7 +296,7 @@ static int cs4271_put_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); -	cs4271->deemph = ucontrol->value.enumerated.item[0]; +	cs4271->deemph = ucontrol->value.integer.value[0];  	return cs4271_set_deemph(codec);  } diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c index ffe96175a8a5..911c26c705fc 100644 --- a/sound/soc/codecs/da732x.c +++ b/sound/soc/codecs/da732x.c @@ -876,11 +876,11 @@ static const struct snd_soc_dapm_widget da732x_dapm_widgets[] = {  static const struct snd_soc_dapm_route da732x_dapm_routes[] = {  	/* Inputs */ -	{"AUX1L PGA", "NULL", "AUX1L"}, -	{"AUX1R PGA", "NULL", "AUX1R"}, +	{"AUX1L PGA", NULL, "AUX1L"}, +	{"AUX1R PGA", NULL, "AUX1R"},  	{"MIC1 PGA", NULL, "MIC1"}, -	{"MIC2 PGA", "NULL", "MIC2"}, -	{"MIC3 PGA", "NULL", "MIC3"}, +	{"MIC2 PGA", NULL, "MIC2"}, +	{"MIC3 PGA", NULL, "MIC3"},  	/* Capture Path */  	{"ADC1 Left MUX", "MIC1", "MIC1 PGA"}, diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c index f27325155ace..c5f35a07e8e4 100644 --- a/sound/soc/codecs/es8328.c +++ b/sound/soc/codecs/es8328.c @@ -120,7 +120,7 @@ static int es8328_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = es8328->deemph; +	ucontrol->value.integer.value[0] = es8328->deemph;  	return 0;  } @@ -129,7 +129,7 @@ static int es8328_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	int ret;  	if (deemph > 1) diff --git a/sound/soc/codecs/pcm1681.c b/sound/soc/codecs/pcm1681.c index a722a023c262..477e13d30971 100644 --- a/sound/soc/codecs/pcm1681.c +++ b/sound/soc/codecs/pcm1681.c @@ -118,7 +118,7 @@ static int pcm1681_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = priv->deemph; +	ucontrol->value.integer.value[0] = priv->deemph;  	return 0;  } @@ -129,7 +129,7 @@ static int pcm1681_put_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); -	priv->deemph = ucontrol->value.enumerated.item[0]; +	priv->deemph = ucontrol->value.integer.value[0];  	return pcm1681_set_deemph(codec);  } diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index f374840a5a7c..9b541e52da8c 100644 --- a/sound/soc/codecs/rt286.c +++ b/sound/soc/codecs/rt286.c @@ -1198,7 +1198,7 @@ static struct dmi_system_id dmi_dell_dino[] = {  		.ident = "Dell Dino",  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -			DMI_MATCH(DMI_BOARD_NAME, "0144P8") +			DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343")  		}  	},  	{ } diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index e182e6569bbd..3593a1496056 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -1151,13 +1151,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)  		/* Enable VDDC charge pump */  		ana_pwr |= SGTL5000_VDDC_CHRGPMP_POWERUP;  	} else if (vddio >= 3100 && vdda >= 3100) { -		/* -		 * if vddio and vddd > 3.1v, -		 * charge pump should be clean before set ana_pwr -		 */ -		snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, -				SGTL5000_VDDC_CHRGPMP_POWERUP, 0); - +		ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP;  		/* VDDC use VDDIO rail */  		lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD;  		lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO << diff --git a/sound/soc/codecs/sn95031.c b/sound/soc/codecs/sn95031.c index 47b257e41809..82095d6cd070 100644 --- a/sound/soc/codecs/sn95031.c +++ b/sound/soc/codecs/sn95031.c @@ -538,8 +538,8 @@ static const struct snd_soc_dapm_route sn95031_audio_map[] = {  	/* speaker map */  	{ "IHFOUTL", NULL, "Speaker Rail"},  	{ "IHFOUTR", NULL, "Speaker Rail"}, -	{ "IHFOUTL", "NULL", "Speaker Left Playback"}, -	{ "IHFOUTR", "NULL", "Speaker Right Playback"}, +	{ "IHFOUTL", NULL, "Speaker Left Playback"}, +	{ "IHFOUTR", NULL, "Speaker Right Playback"},  	{ "Speaker Left Playback", NULL, "Speaker Left Filter"},  	{ "Speaker Right Playback", NULL, "Speaker Right Filter"},  	{ "Speaker Left Filter", NULL, "IHFDAC Left"}, diff --git a/sound/soc/codecs/tas5086.c b/sound/soc/codecs/tas5086.c index 249ef5c4c762..32942bed34b1 100644 --- a/sound/soc/codecs/tas5086.c +++ b/sound/soc/codecs/tas5086.c @@ -281,7 +281,7 @@ static int tas5086_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = priv->deemph; +	ucontrol->value.integer.value[0] = priv->deemph;  	return 0;  } @@ -292,7 +292,7 @@ static int tas5086_put_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); -	priv->deemph = ucontrol->value.enumerated.item[0]; +	priv->deemph = ucontrol->value.integer.value[0];  	return tas5086_set_deemph(codec);  } diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index 8d9de49a5052..21d5402e343f 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c @@ -610,7 +610,7 @@ static int wm2000_anc_mode_get(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); -	ucontrol->value.enumerated.item[0] = wm2000->anc_active; +	ucontrol->value.integer.value[0] = wm2000->anc_active;  	return 0;  } @@ -620,7 +620,7 @@ static int wm2000_anc_mode_put(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); -	int anc_active = ucontrol->value.enumerated.item[0]; +	int anc_active = ucontrol->value.integer.value[0];  	int ret;  	if (anc_active > 1) @@ -643,7 +643,7 @@ static int wm2000_speaker_get(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); -	ucontrol->value.enumerated.item[0] = wm2000->spk_ena; +	ucontrol->value.integer.value[0] = wm2000->spk_ena;  	return 0;  } @@ -653,7 +653,7 @@ static int wm2000_speaker_put(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); -	int val = ucontrol->value.enumerated.item[0]; +	int val = ucontrol->value.integer.value[0];  	int ret;  	if (val > 1) diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 098c143f44d6..c6d10533e2bd 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -125,7 +125,7 @@ static int wm8731_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = wm8731->deemph; +	ucontrol->value.integer.value[0] = wm8731->deemph;  	return 0;  } @@ -135,7 +135,7 @@ static int wm8731_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	int ret = 0;  	if (deemph > 1) diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c index dde462c082be..04b04f8e147c 100644 --- a/sound/soc/codecs/wm8903.c +++ b/sound/soc/codecs/wm8903.c @@ -442,7 +442,7 @@ static int wm8903_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = wm8903->deemph; +	ucontrol->value.integer.value[0] = wm8903->deemph;  	return 0;  } @@ -452,7 +452,7 @@ static int wm8903_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	int ret = 0;  	if (deemph > 1) diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index d3b3f57668cc..215e93c1ddf0 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -525,7 +525,7 @@ static int wm8904_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = wm8904->deemph; +	ucontrol->value.integer.value[0] = wm8904->deemph;  	return 0;  } @@ -534,7 +534,7 @@ static int wm8904_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	if (deemph > 1)  		return -EINVAL; diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index 1ab2d462afad..00bec915d652 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c @@ -393,7 +393,7 @@ static int wm8955_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = wm8955->deemph; +	ucontrol->value.integer.value[0] = wm8955->deemph;  	return 0;  } @@ -402,7 +402,7 @@ static int wm8955_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	if (deemph > 1)  		return -EINVAL; diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index cf8fecf97f2c..3035d9856415 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -184,7 +184,7 @@ static int wm8960_get_deemph(struct snd_kcontrol *kcontrol,  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); -	ucontrol->value.enumerated.item[0] = wm8960->deemph; +	ucontrol->value.integer.value[0] = wm8960->deemph;  	return 0;  } @@ -193,7 +193,7 @@ static int wm8960_put_deemph(struct snd_kcontrol *kcontrol,  {  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); -	int deemph = ucontrol->value.enumerated.item[0]; +	int deemph = ucontrol->value.integer.value[0];  	if (deemph > 1)  		return -EINVAL; diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 9517571e820d..98c9525bd751 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -180,7 +180,7 @@ static int wm9712_hp_mixer_put(struct snd_kcontrol *kcontrol,  	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);  	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);  	struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); -	unsigned int val = ucontrol->value.enumerated.item[0]; +	unsigned int val = ucontrol->value.integer.value[0];  	struct soc_mixer_control *mc =  		(struct soc_mixer_control *)kcontrol->private_value;  	unsigned int mixer, mask, shift, old; @@ -193,7 +193,7 @@ static int wm9712_hp_mixer_put(struct snd_kcontrol *kcontrol,  	mutex_lock(&wm9712->lock);  	old = wm9712->hp_mixer[mixer]; -	if (ucontrol->value.enumerated.item[0]) +	if (ucontrol->value.integer.value[0])  		wm9712->hp_mixer[mixer] |= mask;  	else  		wm9712->hp_mixer[mixer] &= ~mask; @@ -231,7 +231,7 @@ static int wm9712_hp_mixer_get(struct snd_kcontrol *kcontrol,  	mixer = mc->shift >> 8;  	shift = mc->shift & 0xff; -	ucontrol->value.enumerated.item[0] = +	ucontrol->value.integer.value[0] =  		(wm9712->hp_mixer[mixer] >> shift) & 1;  	return 0; diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index 68222917b396..79552953e1bd 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c @@ -255,7 +255,7 @@ static int wm9713_hp_mixer_put(struct snd_kcontrol *kcontrol,  	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);  	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);  	struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); -	unsigned int val = ucontrol->value.enumerated.item[0]; +	unsigned int val = ucontrol->value.integer.value[0];  	struct soc_mixer_control *mc =  		(struct soc_mixer_control *)kcontrol->private_value;  	unsigned int mixer, mask, shift, old; @@ -268,7 +268,7 @@ static int wm9713_hp_mixer_put(struct snd_kcontrol *kcontrol,  	mutex_lock(&wm9713->lock);  	old = wm9713->hp_mixer[mixer]; -	if (ucontrol->value.enumerated.item[0]) +	if (ucontrol->value.integer.value[0])  		wm9713->hp_mixer[mixer] |= mask;  	else  		wm9713->hp_mixer[mixer] &= ~mask; @@ -306,7 +306,7 @@ static int wm9713_hp_mixer_get(struct snd_kcontrol *kcontrol,  	mixer = mc->shift >> 8;  	shift = mc->shift & 0xff; -	ucontrol->value.enumerated.item[0] = +	ucontrol->value.integer.value[0] =  		(wm9713->hp_mixer[mixer] >> shift) & 1;  	return 0; diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index b9fabbf69db6..6b0c8f717ec2 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -603,7 +603,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,  	factor = (div2 + 1) * (7 * psr + 1) * 2;  	for (i = 0; i < 255; i++) { -		tmprate = freq * factor * (i + 2); +		tmprate = freq * factor * (i + 1);  		if (baudclk_is_used)  			clkrate = clk_get_rate(ssi_private->baudclk); @@ -1227,7 +1227,7 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,  	ssi_private->dma_params_tx.addr = ssi_private->ssi_phys + CCSR_SSI_STX0;  	ssi_private->dma_params_rx.addr = ssi_private->ssi_phys + CCSR_SSI_SRX0; -	ret = !of_property_read_u32_array(np, "dmas", dmas, 4); +	ret = of_property_read_u32_array(np, "dmas", dmas, 4);  	if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {  		ssi_private->use_dual_fifo = true;  		/* When using dual fifo mode, we need to keep watermark diff --git a/sound/soc/intel/sst-haswell-dsp.c b/sound/soc/intel/sst-haswell-dsp.c index c42ffae5fe9f..402b728c0a06 100644 --- a/sound/soc/intel/sst-haswell-dsp.c +++ b/sound/soc/intel/sst-haswell-dsp.c @@ -207,9 +207,6 @@ static int hsw_parse_fw_image(struct sst_fw *sst_fw)  		module = (void *)module + sizeof(*module) + module->mod_size;  	} -	/* allocate scratch mem regions */ -	sst_block_alloc_scratch(dsp); -  	return 0;  } diff --git a/sound/soc/intel/sst-haswell-ipc.c b/sound/soc/intel/sst-haswell-ipc.c index 394af5684c05..863a9ca34b8e 100644 --- a/sound/soc/intel/sst-haswell-ipc.c +++ b/sound/soc/intel/sst-haswell-ipc.c @@ -1732,6 +1732,7 @@ static void sst_hsw_drop_all(struct sst_hsw *hsw)  int sst_hsw_dsp_load(struct sst_hsw *hsw)  {  	struct sst_dsp *dsp = hsw->dsp; +	struct sst_fw *sst_fw, *t;  	int ret;  	dev_dbg(hsw->dev, "loading audio DSP...."); @@ -1748,12 +1749,17 @@ int sst_hsw_dsp_load(struct sst_hsw *hsw)  		return ret;  	} -	ret = sst_fw_reload(hsw->sst_fw); -	if (ret < 0) { -		dev_err(hsw->dev, "error: SST FW reload failed\n"); -		sst_dsp_dma_put_channel(dsp); -		return -ENOMEM; +	list_for_each_entry_safe_reverse(sst_fw, t, &dsp->fw_list, list) { +		ret = sst_fw_reload(sst_fw); +		if (ret < 0) { +			dev_err(hsw->dev, "error: SST FW reload failed\n"); +			sst_dsp_dma_put_channel(dsp); +			return -ENOMEM; +		}  	} +	ret = sst_block_alloc_scratch(hsw->dsp); +	if (ret < 0) +		return -EINVAL;  	sst_dsp_dma_put_channel(dsp);  	return 0; @@ -1809,12 +1815,17 @@ int sst_hsw_dsp_runtime_suspend(struct sst_hsw *hsw)  int sst_hsw_dsp_runtime_sleep(struct sst_hsw *hsw)  { -	sst_fw_unload(hsw->sst_fw); -	sst_block_free_scratch(hsw->dsp); +	struct sst_fw *sst_fw, *t; +	struct sst_dsp *dsp = hsw->dsp; + +	list_for_each_entry_safe(sst_fw, t, &dsp->fw_list, list) { +		sst_fw_unload(sst_fw); +	} +	sst_block_free_scratch(dsp);  	hsw->boot_complete = false; -	sst_dsp_sleep(hsw->dsp); +	sst_dsp_sleep(dsp);  	return 0;  } @@ -1943,6 +1954,11 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata)  		goto fw_err;  	} +	/* allocate scratch mem regions */ +	ret = sst_block_alloc_scratch(hsw->dsp); +	if (ret < 0) +		goto boot_err; +  	/* wait for DSP boot completion */  	sst_dsp_boot(hsw->dsp);  	ret = wait_event_timeout(hsw->boot_wait, hsw->boot_complete, diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 30579ca5bacb..e5c990889dcc 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -347,6 +347,8 @@ static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,  	if (!buf)  		return -ENOMEM; +	mutex_lock(&client_mutex); +  	list_for_each_entry(codec, &codec_list, list) {  		len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",  			       codec->component.name); @@ -358,6 +360,8 @@ static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,  		}  	} +	mutex_unlock(&client_mutex); +  	if (ret >= 0)  		ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); @@ -382,6 +386,8 @@ static ssize_t dai_list_read_file(struct file *file, char __user *user_buf,  	if (!buf)  		return -ENOMEM; +	mutex_lock(&client_mutex); +  	list_for_each_entry(component, &component_list, list) {  		list_for_each_entry(dai, &component->dai_list, list) {  			len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n", @@ -395,6 +401,8 @@ static ssize_t dai_list_read_file(struct file *file, char __user *user_buf,  		}  	} +	mutex_unlock(&client_mutex); +  	ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);  	kfree(buf); @@ -418,6 +426,8 @@ static ssize_t platform_list_read_file(struct file *file,  	if (!buf)  		return -ENOMEM; +	mutex_lock(&client_mutex); +  	list_for_each_entry(platform, &platform_list, list) {  		len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",  			       platform->component.name); @@ -429,6 +439,8 @@ static ssize_t platform_list_read_file(struct file *file,  		}  	} +	mutex_unlock(&client_mutex); +  	ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);  	kfree(buf); @@ -836,6 +848,8 @@ static struct snd_soc_component *soc_find_component(  {  	struct snd_soc_component *component; +	lockdep_assert_held(&client_mutex); +  	list_for_each_entry(component, &component_list, list) {  		if (of_node) {  			if (component->dev->of_node == of_node) @@ -854,6 +868,8 @@ static struct snd_soc_dai *snd_soc_find_dai(  	struct snd_soc_component *component;  	struct snd_soc_dai *dai; +	lockdep_assert_held(&client_mutex); +  	/* Find CPU DAI from registered DAIs*/  	list_for_each_entry(component, &component_list, list) {  		if (dlc->of_node && component->dev->of_node != dlc->of_node) @@ -1508,6 +1524,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)  	struct snd_soc_codec *codec;  	int ret, i, order; +	mutex_lock(&client_mutex);  	mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);  	/* bind DAIs */ @@ -1662,6 +1679,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)  	card->instantiated = 1;  	snd_soc_dapm_sync(&card->dapm);  	mutex_unlock(&card->mutex); +	mutex_unlock(&client_mutex);  	return 0; @@ -1680,6 +1698,7 @@ card_probe_error:  base_error:  	mutex_unlock(&card->mutex); +	mutex_unlock(&client_mutex);  	return ret;  } @@ -2713,13 +2732,6 @@ static void snd_soc_component_del_unlocked(struct snd_soc_component *component)  	list_del(&component->list);  } -static void snd_soc_component_del(struct snd_soc_component *component) -{ -	mutex_lock(&client_mutex); -	snd_soc_component_del_unlocked(component); -	mutex_unlock(&client_mutex); -} -  int snd_soc_register_component(struct device *dev,  			       const struct snd_soc_component_driver *cmpnt_drv,  			       struct snd_soc_dai_driver *dai_drv, @@ -2767,14 +2779,17 @@ void snd_soc_unregister_component(struct device *dev)  {  	struct snd_soc_component *cmpnt; +	mutex_lock(&client_mutex);  	list_for_each_entry(cmpnt, &component_list, list) {  		if (dev == cmpnt->dev && cmpnt->registered_as_component)  			goto found;  	} +	mutex_unlock(&client_mutex);  	return;  found: -	snd_soc_component_del(cmpnt); +	snd_soc_component_del_unlocked(cmpnt); +	mutex_unlock(&client_mutex);  	snd_soc_component_cleanup(cmpnt);  	kfree(cmpnt);  } @@ -2882,10 +2897,14 @@ struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev)  {  	struct snd_soc_platform *platform; +	mutex_lock(&client_mutex);  	list_for_each_entry(platform, &platform_list, list) { -		if (dev == platform->dev) +		if (dev == platform->dev) { +			mutex_unlock(&client_mutex);  			return platform; +		}  	} +	mutex_unlock(&client_mutex);  	return NULL;  } @@ -3090,15 +3109,15 @@ void snd_soc_unregister_codec(struct device *dev)  {  	struct snd_soc_codec *codec; +	mutex_lock(&client_mutex);  	list_for_each_entry(codec, &codec_list, list) {  		if (dev == codec->dev)  			goto found;  	} +	mutex_unlock(&client_mutex);  	return;  found: - -	mutex_lock(&client_mutex);  	list_del(&codec->list);  	snd_soc_component_del_unlocked(&codec->component);  	mutex_unlock(&client_mutex); | 
