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:
Коммит
509768f751
|
@ -9004,7 +9004,7 @@ S: Maintained
|
|||
F: drivers/net/wireless/wl3501*
|
||||
|
||||
WM97XX TOUCHSCREEN DRIVERS
|
||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||
M: Mark Brown <broonie@kernel.org>
|
||||
M: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||
L: linux-input@vger.kernel.org
|
||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
|
||||
|
@ -9014,7 +9014,6 @@ F: drivers/input/touchscreen/*wm97*
|
|||
F: include/linux/wm97xx.h
|
||||
|
||||
WOLFSON MICROELECTRONICS DRIVERS
|
||||
M: Mark Brown <broonie@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-audioplus
|
||||
|
|
|
@ -450,7 +450,8 @@ enum snd_soc_dapm_type {
|
|||
snd_soc_dapm_aif_in, /* audio interface input */
|
||||
snd_soc_dapm_aif_out, /* audio interface output */
|
||||
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 */
|
||||
};
|
||||
|
||||
|
|
|
@ -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(mix_tlv, -50, 50, 0);
|
||||
|
||||
static const unsigned int limiter_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
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 =
|
||||
SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 4,
|
||||
SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 5,
|
||||
ARRAY_SIZE(hp_gain_num_text), hp_gain_num_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",
|
||||
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
|
||||
0, 0x7f, 0x19, hl_tlv),
|
||||
0, 0x7f, 0x19, mix_tlv),
|
||||
SOC_DOUBLE_R("PCM Mixer Switch",
|
||||
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),
|
||||
|
||||
|
|
|
@ -187,14 +187,14 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol,
|
|||
|
||||
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);
|
||||
|
||||
if (found)
|
||||
snd_soc_dapm_sync(widget->dapm);
|
||||
|
||||
ret = snd_soc_update_bits_locked(widget->codec, reg, val_mask, val);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1120,7 +1120,8 @@ SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0,
|
|||
ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
|
||||
|
||||
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,
|
||||
ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
|
||||
|
|
|
@ -503,7 +503,8 @@ 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,
|
||||
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,
|
||||
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
|
||||
|
|
|
@ -3836,12 +3836,13 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
|
|||
ret);
|
||||
} else if (!(ret & WM1811_JACKDET_LVL)) {
|
||||
dev_dbg(codec->dev, "Ignoring removed jack\n");
|
||||
return IRQ_HANDLED;
|
||||
goto out;
|
||||
}
|
||||
} else if (!(reg & WM8958_MICD_STS)) {
|
||||
snd_soc_jack_report(wm8994->micdet[0].jack, 0,
|
||||
SND_JACK_MECHANICAL | SND_JACK_HEADSET |
|
||||
wm8994->btn_mask);
|
||||
wm8994->mic_detecting = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -55,7 +55,8 @@ static int dapm_up_seq[] = {
|
|||
[snd_soc_dapm_clock_supply] = 1,
|
||||
[snd_soc_dapm_micbias] = 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_out] = 3,
|
||||
[snd_soc_dapm_mic] = 4,
|
||||
|
@ -92,7 +93,8 @@ static int dapm_down_seq[] = {
|
|||
[snd_soc_dapm_value_mux] = 9,
|
||||
[snd_soc_dapm_aif_in] = 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_clock_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_aif_in:
|
||||
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_mic:
|
||||
case snd_soc_dapm_spk:
|
||||
|
@ -820,7 +823,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget,
|
|||
switch (widget->id) {
|
||||
case snd_soc_dapm_adc:
|
||||
case snd_soc_dapm_aif_out:
|
||||
case snd_soc_dapm_dai:
|
||||
case snd_soc_dapm_dai_out:
|
||||
if (widget->active) {
|
||||
widget->outputs = snd_soc_dapm_suspend_check(widget);
|
||||
return widget->outputs;
|
||||
|
@ -916,7 +919,7 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget,
|
|||
switch (widget->id) {
|
||||
case snd_soc_dapm_dac:
|
||||
case snd_soc_dapm_aif_in:
|
||||
case snd_soc_dapm_dai:
|
||||
case snd_soc_dapm_dai_in:
|
||||
if (widget->active) {
|
||||
widget->inputs = snd_soc_dapm_suspend_check(widget);
|
||||
return widget->inputs;
|
||||
|
@ -1135,16 +1138,6 @@ static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
|
|||
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 */
|
||||
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_aif_in:
|
||||
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:
|
||||
list_add(&path->list, &dapm->card->paths);
|
||||
list_add(&path->list_sink, &wsink->sources);
|
||||
|
@ -3129,10 +3123,12 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
|||
break;
|
||||
case snd_soc_dapm_adc:
|
||||
case snd_soc_dapm_aif_out:
|
||||
case snd_soc_dapm_dai_out:
|
||||
w->power_check = dapm_adc_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_dac:
|
||||
case snd_soc_dapm_aif_in:
|
||||
case snd_soc_dapm_dai_in:
|
||||
w->power_check = dapm_dac_check_power;
|
||||
break;
|
||||
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:
|
||||
w->power_check = dapm_supply_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_dai:
|
||||
w->power_check = dapm_dai_check_power;
|
||||
break;
|
||||
default:
|
||||
w->power_check = dapm_always_on_check_power;
|
||||
break;
|
||||
|
@ -3375,7 +3368,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
|
|||
template.reg = SND_SOC_NOPM;
|
||||
|
||||
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.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) {
|
||||
template.id = snd_soc_dapm_dai;
|
||||
template.id = snd_soc_dapm_dai_out;
|
||||
template.name = 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... */
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
continue;
|
||||
|
||||
if (w->id == snd_soc_dapm_dai)
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_dai_in:
|
||||
case snd_soc_dapm_dai_out:
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!w->sname)
|
||||
continue;
|
||||
|
|
|
@ -928,8 +928,13 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
|
|||
/* Create any new FE <--> BE connections */
|
||||
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;
|
||||
}
|
||||
|
||||
/* is there a valid BE rtd for this widget */
|
||||
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)
|
||||
capture = 1;
|
||||
} else {
|
||||
if (codec_dai->driver->playback.channels_min)
|
||||
if (codec_dai->driver->playback.channels_min &&
|
||||
cpu_dai->driver->playback.channels_min)
|
||||
playback = 1;
|
||||
if (codec_dai->driver->capture.channels_min)
|
||||
if (codec_dai->driver->capture.channels_min &&
|
||||
cpu_dai->driver->capture.channels_min)
|
||||
capture = 1;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче