ASoC: Updates for v3.10

As well as the usual driver specifics we've got a couple of core fixes
 here, one fixing capabilities for unidirectional streams and the other
 fixing suspend while audio streams are active.  The suspend fix is a
 little involved but mostly as a result of removing some special casing
 that was doing the wrong thing.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.12 (GNU/Linux)
 
 iQIcBAABAgAGBQJRtaaSAAoJELSic+t+oim9RZoP/3ILClypxa6EfVBoMq5A8nza
 ZiiMFCH3anma0n/kLQv57fYlBHxI7hj07qZLLWPB/WOauukFJJFaLYtB2gr7Gm7M
 I880qAbpmCMJQC8Nzff7t7LB4l4tgZxzWYpeQU6PvBk6Dr/MfwdPFwdvLBW9uXPK
 OneLWvaomwkldowvymNXzSWWC0dKkhR9ZKNWR3C2kSzOxsGhyUHjFTWartbGAzLj
 74vsOIlOy75P86EawmqZ6Y+dCCCuC8mwTRzf5TrTDsN9ru+QL2DQSzRpVMuF2WmQ
 GSMvwmrWFAQzMoaI2lid2wMs5zV6zJikMp6rE3Bz20RcdDsea9Eu5rYhkIx2XR+G
 yeY0rx1WuhwGkfhG5WE/VuBiXyUFuTvQr91EEH3GftSlrEfw2RMuoa1fvJWNPb1/
 3p80gPRJ09EwN3J3fBA+ezCm0Cvk76lGkc7E4dhQcUcBvzr8vLEASf+xP5JcjZbi
 DXdAi2Dxq8VbJYZGdrPh5FEzNKPJMsScchZIs2mc9dvwAlblG9ibdpm/0XHKnmRk
 xmf8IfrSPdxueujxGx9zrkw/deJuM0tU3ofrhMxxTYaPvdeZpqfCQE/59SC/1h9Y
 1wTdD76+X9ntXywsWdyOL1+ePtpvbVuZItwL08rOUreDlfAFbsjNvG6PXZWqAb07
 hVRcyxtE1We/J3g9uJzt
 =pK3d
 -----END PGP SIGNATURE-----

Merge tag 'asoc-v3.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound

Pull ASoC sound updates from Mark Brown:
 "Takashi is travelling at the minute and it'd be good to get the
  MAINTAINERS update in here merged so sending directly.

  As well as the usual driver specifics we've got a couple of core fixes
  here, one fixing capabilities for unidirectional streams and the other
  fixing suspend while audio streams are active.

  The suspend fix is a little involved but mostly as a result of
  removing some special casing that was doing the wrong thing."

* tag 'asoc-v3.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound:
  ASoC: tlv320aic3x: Remove deadlock from snd_soc_dapm_put_volsw_aic3x()
  ASoC: dapm: Treat DAI widgets like AIF widgets for power
  ASoC: arizona: Correct AEC loopback enable
  ASoC: pcm: Require both CODEC and CPU support when declaring stream caps
  MAINTAINERS: Remove myself from Wolfson maintainers
  ASoC: wm8994: Ensure microphone detection state is reset on removal
  ASoC: wm8994: Avoid leaking pm_runtime reference on removed jack race
  ASoC: cs42l52: fix hp_gain_enum shift value.
  ASoC: cs42l52: use correct PCM mixer TLV dB scale to match datasheet.
This commit is contained in:
Linus Torvalds 2013-06-13 10:18:33 -07:00
commit 509768f751
9 changed files with 54 additions and 39 deletions

View File

@ -9004,7 +9004,7 @@ S: Maintained
F: drivers/net/wireless/wl3501* F: drivers/net/wireless/wl3501*
WM97XX TOUCHSCREEN DRIVERS WM97XX TOUCHSCREEN DRIVERS
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@kernel.org>
M: Liam Girdwood <lrg@slimlogic.co.uk> M: Liam Girdwood <lrg@slimlogic.co.uk>
L: linux-input@vger.kernel.org L: linux-input@vger.kernel.org
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
@ -9014,7 +9014,6 @@ F: drivers/input/touchscreen/*wm97*
F: include/linux/wm97xx.h F: include/linux/wm97xx.h
WOLFSON MICROELECTRONICS DRIVERS WOLFSON MICROELECTRONICS DRIVERS
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
L: patches@opensource.wolfsonmicro.com L: patches@opensource.wolfsonmicro.com
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus

View File

@ -450,7 +450,8 @@ enum snd_soc_dapm_type {
snd_soc_dapm_aif_in, /* audio interface input */ snd_soc_dapm_aif_in, /* audio interface input */
snd_soc_dapm_aif_out, /* audio interface output */ snd_soc_dapm_aif_out, /* audio interface output */
snd_soc_dapm_siggen, /* signal generator */ snd_soc_dapm_siggen, /* signal generator */
snd_soc_dapm_dai, /* link to DAI structure */ snd_soc_dapm_dai_in, /* link to DAI structure */
snd_soc_dapm_dai_out,
snd_soc_dapm_dai_link, /* link between two DAI structures */ snd_soc_dapm_dai_link, /* link between two DAI structures */
}; };

View File

@ -193,6 +193,8 @@ static DECLARE_TLV_DB_SCALE(mic_tlv, 1600, 100, 0);
static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0); static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0);
static DECLARE_TLV_DB_SCALE(mix_tlv, -50, 50, 0);
static const unsigned int limiter_tlv[] = { static const unsigned int limiter_tlv[] = {
TLV_DB_RANGE_HEAD(2), TLV_DB_RANGE_HEAD(2),
0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0), 0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0),
@ -260,7 +262,7 @@ static const char * const hp_gain_num_text[] = {
}; };
static const struct soc_enum hp_gain_enum = static const struct soc_enum hp_gain_enum =
SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 4, SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 5,
ARRAY_SIZE(hp_gain_num_text), hp_gain_num_text); ARRAY_SIZE(hp_gain_num_text), hp_gain_num_text);
static const char * const beep_pitch_text[] = { static const char * const beep_pitch_text[] = {
@ -441,7 +443,7 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
0, 0x7f, 0x19, hl_tlv), 0, 0x7f, 0x19, mix_tlv),
SOC_DOUBLE_R("PCM Mixer Switch", SOC_DOUBLE_R("PCM Mixer Switch",
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),

View File

@ -187,14 +187,14 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol,
break; break;
} }
if (found)
snd_soc_dapm_sync(widget->dapm);
} }
ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
mutex_unlock(&widget->codec->mutex); mutex_unlock(&widget->codec->mutex);
if (found)
snd_soc_dapm_sync(widget->dapm);
ret = snd_soc_update_bits_locked(widget->codec, reg, val_mask, val);
return ret; return ret;
} }

View File

@ -1120,7 +1120,8 @@ SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0,
ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5102_aec_loopback_mux), ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
&wm5102_aec_loopback_mux),
SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,

View File

@ -503,7 +503,8 @@ SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
NULL, 0), NULL, 0),
SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5110_aec_loopback_mux), ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
&wm5110_aec_loopback_mux),
SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),

View File

@ -3836,12 +3836,13 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
ret); ret);
} else if (!(ret & WM1811_JACKDET_LVL)) { } else if (!(ret & WM1811_JACKDET_LVL)) {
dev_dbg(codec->dev, "Ignoring removed jack\n"); dev_dbg(codec->dev, "Ignoring removed jack\n");
return IRQ_HANDLED; goto out;
} }
} else if (!(reg & WM8958_MICD_STS)) { } else if (!(reg & WM8958_MICD_STS)) {
snd_soc_jack_report(wm8994->micdet[0].jack, 0, snd_soc_jack_report(wm8994->micdet[0].jack, 0,
SND_JACK_MECHANICAL | SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_HEADSET |
wm8994->btn_mask); wm8994->btn_mask);
wm8994->mic_detecting = true;
goto out; goto out;
} }

View File

@ -55,7 +55,8 @@ static int dapm_up_seq[] = {
[snd_soc_dapm_clock_supply] = 1, [snd_soc_dapm_clock_supply] = 1,
[snd_soc_dapm_micbias] = 2, [snd_soc_dapm_micbias] = 2,
[snd_soc_dapm_dai_link] = 2, [snd_soc_dapm_dai_link] = 2,
[snd_soc_dapm_dai] = 3, [snd_soc_dapm_dai_in] = 3,
[snd_soc_dapm_dai_out] = 3,
[snd_soc_dapm_aif_in] = 3, [snd_soc_dapm_aif_in] = 3,
[snd_soc_dapm_aif_out] = 3, [snd_soc_dapm_aif_out] = 3,
[snd_soc_dapm_mic] = 4, [snd_soc_dapm_mic] = 4,
@ -92,7 +93,8 @@ static int dapm_down_seq[] = {
[snd_soc_dapm_value_mux] = 9, [snd_soc_dapm_value_mux] = 9,
[snd_soc_dapm_aif_in] = 10, [snd_soc_dapm_aif_in] = 10,
[snd_soc_dapm_aif_out] = 10, [snd_soc_dapm_aif_out] = 10,
[snd_soc_dapm_dai] = 10, [snd_soc_dapm_dai_in] = 10,
[snd_soc_dapm_dai_out] = 10,
[snd_soc_dapm_dai_link] = 11, [snd_soc_dapm_dai_link] = 11,
[snd_soc_dapm_clock_supply] = 12, [snd_soc_dapm_clock_supply] = 12,
[snd_soc_dapm_regulator_supply] = 12, [snd_soc_dapm_regulator_supply] = 12,
@ -419,7 +421,8 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
case snd_soc_dapm_aif_in: case snd_soc_dapm_aif_in:
case snd_soc_dapm_aif_out: case snd_soc_dapm_aif_out:
case snd_soc_dapm_dai: case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out:
case snd_soc_dapm_hp: case snd_soc_dapm_hp:
case snd_soc_dapm_mic: case snd_soc_dapm_mic:
case snd_soc_dapm_spk: case snd_soc_dapm_spk:
@ -820,7 +823,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget,
switch (widget->id) { switch (widget->id) {
case snd_soc_dapm_adc: case snd_soc_dapm_adc:
case snd_soc_dapm_aif_out: case snd_soc_dapm_aif_out:
case snd_soc_dapm_dai: case snd_soc_dapm_dai_out:
if (widget->active) { if (widget->active) {
widget->outputs = snd_soc_dapm_suspend_check(widget); widget->outputs = snd_soc_dapm_suspend_check(widget);
return widget->outputs; return widget->outputs;
@ -916,7 +919,7 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget,
switch (widget->id) { switch (widget->id) {
case snd_soc_dapm_dac: case snd_soc_dapm_dac:
case snd_soc_dapm_aif_in: case snd_soc_dapm_aif_in:
case snd_soc_dapm_dai: case snd_soc_dapm_dai_in:
if (widget->active) { if (widget->active) {
widget->inputs = snd_soc_dapm_suspend_check(widget); widget->inputs = snd_soc_dapm_suspend_check(widget);
return widget->inputs; return widget->inputs;
@ -1135,16 +1138,6 @@ static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
return out != 0 && in != 0; return out != 0 && in != 0;
} }
static int dapm_dai_check_power(struct snd_soc_dapm_widget *w)
{
DAPM_UPDATE_STAT(w, power_checks);
if (w->active)
return w->active;
return dapm_generic_check_power(w);
}
/* Check to see if an ADC has power */ /* Check to see if an ADC has power */
static int dapm_adc_check_power(struct snd_soc_dapm_widget *w) static int dapm_adc_check_power(struct snd_soc_dapm_widget *w)
{ {
@ -2318,7 +2311,8 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
case snd_soc_dapm_aif_in: case snd_soc_dapm_aif_in:
case snd_soc_dapm_aif_out: case snd_soc_dapm_aif_out:
case snd_soc_dapm_dai: case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out:
case snd_soc_dapm_dai_link: case snd_soc_dapm_dai_link:
list_add(&path->list, &dapm->card->paths); list_add(&path->list, &dapm->card->paths);
list_add(&path->list_sink, &wsink->sources); list_add(&path->list_sink, &wsink->sources);
@ -3129,10 +3123,12 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
break; break;
case snd_soc_dapm_adc: case snd_soc_dapm_adc:
case snd_soc_dapm_aif_out: case snd_soc_dapm_aif_out:
case snd_soc_dapm_dai_out:
w->power_check = dapm_adc_check_power; w->power_check = dapm_adc_check_power;
break; break;
case snd_soc_dapm_dac: case snd_soc_dapm_dac:
case snd_soc_dapm_aif_in: case snd_soc_dapm_aif_in:
case snd_soc_dapm_dai_in:
w->power_check = dapm_dac_check_power; w->power_check = dapm_dac_check_power;
break; break;
case snd_soc_dapm_pga: case snd_soc_dapm_pga:
@ -3152,9 +3148,6 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
w->power_check = dapm_supply_check_power; w->power_check = dapm_supply_check_power;
break; break;
case snd_soc_dapm_dai:
w->power_check = dapm_dai_check_power;
break;
default: default:
w->power_check = dapm_always_on_check_power; w->power_check = dapm_always_on_check_power;
break; break;
@ -3375,7 +3368,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
template.reg = SND_SOC_NOPM; template.reg = SND_SOC_NOPM;
if (dai->driver->playback.stream_name) { if (dai->driver->playback.stream_name) {
template.id = snd_soc_dapm_dai; template.id = snd_soc_dapm_dai_in;
template.name = dai->driver->playback.stream_name; template.name = dai->driver->playback.stream_name;
template.sname = dai->driver->playback.stream_name; template.sname = dai->driver->playback.stream_name;
@ -3393,7 +3386,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
} }
if (dai->driver->capture.stream_name) { if (dai->driver->capture.stream_name) {
template.id = snd_soc_dapm_dai; template.id = snd_soc_dapm_dai_out;
template.name = dai->driver->capture.stream_name; template.name = dai->driver->capture.stream_name;
template.sname = dai->driver->capture.stream_name; template.sname = dai->driver->capture.stream_name;
@ -3423,8 +3416,13 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
/* For each DAI widget... */ /* For each DAI widget... */
list_for_each_entry(dai_w, &card->widgets, list) { list_for_each_entry(dai_w, &card->widgets, list) {
if (dai_w->id != snd_soc_dapm_dai) switch (dai_w->id) {
case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out:
break;
default:
continue; continue;
}
dai = dai_w->priv; dai = dai_w->priv;
@ -3433,8 +3431,13 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
if (w->dapm != dai_w->dapm) if (w->dapm != dai_w->dapm)
continue; continue;
if (w->id == snd_soc_dapm_dai) switch (w->id) {
case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out:
continue; continue;
default:
break;
}
if (!w->sname) if (!w->sname)
continue; continue;

View File

@ -928,8 +928,13 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
/* Create any new FE <--> BE connections */ /* Create any new FE <--> BE connections */
for (i = 0; i < list->num_widgets; i++) { for (i = 0; i < list->num_widgets; i++) {
if (list->widgets[i]->id != snd_soc_dapm_dai) switch (list->widgets[i]->id) {
case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out:
break;
default:
continue; continue;
}
/* is there a valid BE rtd for this widget */ /* is there a valid BE rtd for this widget */
be = dpcm_get_be(card, list->widgets[i], stream); be = dpcm_get_be(card, list->widgets[i], stream);
@ -2011,9 +2016,11 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
if (cpu_dai->driver->capture.channels_min) if (cpu_dai->driver->capture.channels_min)
capture = 1; capture = 1;
} else { } else {
if (codec_dai->driver->playback.channels_min) if (codec_dai->driver->playback.channels_min &&
cpu_dai->driver->playback.channels_min)
playback = 1; playback = 1;
if (codec_dai->driver->capture.channels_min) if (codec_dai->driver->capture.channels_min &&
cpu_dai->driver->capture.channels_min)
capture = 1; capture = 1;
} }