Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.

+54 -39
+1 -2
MAINTAINERS
··· 9004 9004 F: drivers/net/wireless/wl3501* 9005 9005 9006 9006 WM97XX TOUCHSCREEN DRIVERS 9007 - M: Mark Brown <broonie@opensource.wolfsonmicro.com> 9007 + M: Mark Brown <broonie@kernel.org> 9008 9008 M: Liam Girdwood <lrg@slimlogic.co.uk> 9009 9009 L: linux-input@vger.kernel.org 9010 9010 T: git git://opensource.wolfsonmicro.com/linux-2.6-touch ··· 9014 9014 F: include/linux/wm97xx.h 9015 9015 9016 9016 WOLFSON MICROELECTRONICS DRIVERS 9017 - M: Mark Brown <broonie@opensource.wolfsonmicro.com> 9018 9017 L: patches@opensource.wolfsonmicro.com 9019 9018 T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc 9020 9019 T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
+2 -1
include/sound/soc-dapm.h
··· 450 450 snd_soc_dapm_aif_in, /* audio interface input */ 451 451 snd_soc_dapm_aif_out, /* audio interface output */ 452 452 snd_soc_dapm_siggen, /* signal generator */ 453 - snd_soc_dapm_dai, /* link to DAI structure */ 453 + snd_soc_dapm_dai_in, /* link to DAI structure */ 454 + snd_soc_dapm_dai_out, 454 455 snd_soc_dapm_dai_link, /* link between two DAI structures */ 455 456 }; 456 457
+4 -2
sound/soc/codecs/cs42l52.c
··· 193 193 194 194 static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0); 195 195 196 + static DECLARE_TLV_DB_SCALE(mix_tlv, -50, 50, 0); 197 + 196 198 static const unsigned int limiter_tlv[] = { 197 199 TLV_DB_RANGE_HEAD(2), 198 200 0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0), ··· 262 260 }; 263 261 264 262 static const struct soc_enum hp_gain_enum = 265 - SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 4, 263 + SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 5, 266 264 ARRAY_SIZE(hp_gain_num_text), hp_gain_num_text); 267 265 268 266 static const char * const beep_pitch_text[] = { ··· 443 441 444 442 SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", 445 443 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 446 - 0, 0x7f, 0x19, hl_tlv), 444 + 0, 0x7f, 0x19, mix_tlv), 447 445 SOC_DOUBLE_R("PCM Mixer Switch", 448 446 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), 449 447
+5 -5
sound/soc/codecs/tlv320aic3x.c
··· 187 187 188 188 break; 189 189 } 190 - 191 - if (found) 192 - snd_soc_dapm_sync(widget->dapm); 193 190 } 194 191 195 - ret = snd_soc_update_bits(widget->codec, reg, val_mask, val); 196 - 197 192 mutex_unlock(&widget->codec->mutex); 193 + 194 + if (found) 195 + snd_soc_dapm_sync(widget->dapm); 196 + 197 + ret = snd_soc_update_bits_locked(widget->codec, reg, val_mask, val); 198 198 return ret; 199 199 } 200 200
+2 -1
sound/soc/codecs/wm5102.c
··· 1120 1120 ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), 1121 1121 1122 1122 SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, 1123 - ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5102_aec_loopback_mux), 1123 + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, 1124 + &wm5102_aec_loopback_mux), 1124 1125 1125 1126 SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, 1126 1127 ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
+2 -1
sound/soc/codecs/wm5110.c
··· 503 503 NULL, 0), 504 504 505 505 SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, 506 - ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5110_aec_loopback_mux), 506 + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, 507 + &wm5110_aec_loopback_mux), 507 508 508 509 SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, 509 510 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
+2 -1
sound/soc/codecs/wm8994.c
··· 3836 3836 ret); 3837 3837 } else if (!(ret & WM1811_JACKDET_LVL)) { 3838 3838 dev_dbg(codec->dev, "Ignoring removed jack\n"); 3839 - return IRQ_HANDLED; 3839 + goto out; 3840 3840 } 3841 3841 } else if (!(reg & WM8958_MICD_STS)) { 3842 3842 snd_soc_jack_report(wm8994->micdet[0].jack, 0, 3843 3843 SND_JACK_MECHANICAL | SND_JACK_HEADSET | 3844 3844 wm8994->btn_mask); 3845 + wm8994->mic_detecting = true; 3845 3846 goto out; 3846 3847 } 3847 3848
+26 -23
sound/soc/soc-dapm.c
··· 55 55 [snd_soc_dapm_clock_supply] = 1, 56 56 [snd_soc_dapm_micbias] = 2, 57 57 [snd_soc_dapm_dai_link] = 2, 58 - [snd_soc_dapm_dai] = 3, 58 + [snd_soc_dapm_dai_in] = 3, 59 + [snd_soc_dapm_dai_out] = 3, 59 60 [snd_soc_dapm_aif_in] = 3, 60 61 [snd_soc_dapm_aif_out] = 3, 61 62 [snd_soc_dapm_mic] = 4, ··· 93 92 [snd_soc_dapm_value_mux] = 9, 94 93 [snd_soc_dapm_aif_in] = 10, 95 94 [snd_soc_dapm_aif_out] = 10, 96 - [snd_soc_dapm_dai] = 10, 95 + [snd_soc_dapm_dai_in] = 10, 96 + [snd_soc_dapm_dai_out] = 10, 97 97 [snd_soc_dapm_dai_link] = 11, 98 98 [snd_soc_dapm_clock_supply] = 12, 99 99 [snd_soc_dapm_regulator_supply] = 12, ··· 421 419 case snd_soc_dapm_clock_supply: 422 420 case snd_soc_dapm_aif_in: 423 421 case snd_soc_dapm_aif_out: 424 - case snd_soc_dapm_dai: 422 + case snd_soc_dapm_dai_in: 423 + case snd_soc_dapm_dai_out: 425 424 case snd_soc_dapm_hp: 426 425 case snd_soc_dapm_mic: 427 426 case snd_soc_dapm_spk: ··· 823 820 switch (widget->id) { 824 821 case snd_soc_dapm_adc: 825 822 case snd_soc_dapm_aif_out: 826 - case snd_soc_dapm_dai: 823 + case snd_soc_dapm_dai_out: 827 824 if (widget->active) { 828 825 widget->outputs = snd_soc_dapm_suspend_check(widget); 829 826 return widget->outputs; ··· 919 916 switch (widget->id) { 920 917 case snd_soc_dapm_dac: 921 918 case snd_soc_dapm_aif_in: 922 - case snd_soc_dapm_dai: 919 + case snd_soc_dapm_dai_in: 923 920 if (widget->active) { 924 921 widget->inputs = snd_soc_dapm_suspend_check(widget); 925 922 return widget->inputs; ··· 1136 1133 out = is_connected_output_ep(w, NULL); 1137 1134 dapm_clear_walk_output(w->dapm, &w->sinks); 1138 1135 return out != 0 && in != 0; 1139 - } 1140 - 1141 - static int dapm_dai_check_power(struct snd_soc_dapm_widget *w) 1142 - { 1143 - DAPM_UPDATE_STAT(w, power_checks); 1144 - 1145 - if (w->active) 1146 - return w->active; 1147 - 1148 - return dapm_generic_check_power(w); 1149 1136 } 1150 1137 1151 1138 /* Check to see if an ADC has power */ ··· 2311 2318 case snd_soc_dapm_clock_supply: 2312 2319 case snd_soc_dapm_aif_in: 2313 2320 case snd_soc_dapm_aif_out: 2314 - case snd_soc_dapm_dai: 2321 + case snd_soc_dapm_dai_in: 2322 + case snd_soc_dapm_dai_out: 2315 2323 case snd_soc_dapm_dai_link: 2316 2324 list_add(&path->list, &dapm->card->paths); 2317 2325 list_add(&path->list_sink, &wsink->sources); ··· 3123 3129 break; 3124 3130 case snd_soc_dapm_adc: 3125 3131 case snd_soc_dapm_aif_out: 3132 + case snd_soc_dapm_dai_out: 3126 3133 w->power_check = dapm_adc_check_power; 3127 3134 break; 3128 3135 case snd_soc_dapm_dac: 3129 3136 case snd_soc_dapm_aif_in: 3137 + case snd_soc_dapm_dai_in: 3130 3138 w->power_check = dapm_dac_check_power; 3131 3139 break; 3132 3140 case snd_soc_dapm_pga: ··· 3147 3151 case snd_soc_dapm_regulator_supply: 3148 3152 case snd_soc_dapm_clock_supply: 3149 3153 w->power_check = dapm_supply_check_power; 3150 - break; 3151 - case snd_soc_dapm_dai: 3152 - w->power_check = dapm_dai_check_power; 3153 3154 break; 3154 3155 default: 3155 3156 w->power_check = dapm_always_on_check_power; ··· 3368 3375 template.reg = SND_SOC_NOPM; 3369 3376 3370 3377 if (dai->driver->playback.stream_name) { 3371 - template.id = snd_soc_dapm_dai; 3378 + template.id = snd_soc_dapm_dai_in; 3372 3379 template.name = dai->driver->playback.stream_name; 3373 3380 template.sname = dai->driver->playback.stream_name; 3374 3381 ··· 3386 3393 } 3387 3394 3388 3395 if (dai->driver->capture.stream_name) { 3389 - template.id = snd_soc_dapm_dai; 3396 + template.id = snd_soc_dapm_dai_out; 3390 3397 template.name = dai->driver->capture.stream_name; 3391 3398 template.sname = dai->driver->capture.stream_name; 3392 3399 ··· 3416 3423 3417 3424 /* For each DAI widget... */ 3418 3425 list_for_each_entry(dai_w, &card->widgets, list) { 3419 - if (dai_w->id != snd_soc_dapm_dai) 3426 + switch (dai_w->id) { 3427 + case snd_soc_dapm_dai_in: 3428 + case snd_soc_dapm_dai_out: 3429 + break; 3430 + default: 3420 3431 continue; 3432 + } 3421 3433 3422 3434 dai = dai_w->priv; 3423 3435 ··· 3431 3433 if (w->dapm != dai_w->dapm) 3432 3434 continue; 3433 3435 3434 - if (w->id == snd_soc_dapm_dai) 3436 + switch (w->id) { 3437 + case snd_soc_dapm_dai_in: 3438 + case snd_soc_dapm_dai_out: 3435 3439 continue; 3440 + default: 3441 + break; 3442 + } 3436 3443 3437 3444 if (!w->sname) 3438 3445 continue;
+10 -3
sound/soc/soc-pcm.c
··· 928 928 /* Create any new FE <--> BE connections */ 929 929 for (i = 0; i < list->num_widgets; i++) { 930 930 931 - if (list->widgets[i]->id != snd_soc_dapm_dai) 931 + switch (list->widgets[i]->id) { 932 + case snd_soc_dapm_dai_in: 933 + case snd_soc_dapm_dai_out: 934 + break; 935 + default: 932 936 continue; 937 + } 933 938 934 939 /* is there a valid BE rtd for this widget */ 935 940 be = dpcm_get_be(card, list->widgets[i], stream); ··· 2016 2011 if (cpu_dai->driver->capture.channels_min) 2017 2012 capture = 1; 2018 2013 } else { 2019 - if (codec_dai->driver->playback.channels_min) 2014 + if (codec_dai->driver->playback.channels_min && 2015 + cpu_dai->driver->playback.channels_min) 2020 2016 playback = 1; 2021 - if (codec_dai->driver->capture.channels_min) 2017 + if (codec_dai->driver->capture.channels_min && 2018 + cpu_dai->driver->capture.channels_min) 2022 2019 capture = 1; 2023 2020 } 2024 2021