diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-30 16:55:20 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-30 16:55:20 -0500 |
| commit | 6c49e2700fd5e78403d9119cbe12b7c7bb5b3d0e (patch) | |
| tree | 29d072381c7712dd1b4176af28771e5e38883cfa | |
| parent | 23e041dbaa80eb1032f9d612433c6b9062da5afd (diff) | |
| parent | 8ee763b9c82c6ca0a59a7271ce4fa29d7baf5c09 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
ALSA: AACI: fix recording bug
ALSA: AACI: fix AC97 multiple-open bug
ASoC: AIC23: Fixing infinite loop in resume path
ASoC: Fix suspend with active audio streams
| -rw-r--r-- | sound/arm/aaci.c | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/tlv320aic23.c | 3 | ||||
| -rw-r--r-- | sound/soc/soc-dapm.c | 20 |
3 files changed, 23 insertions, 6 deletions
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 1f0f8213e2d5..6c160a038b23 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c | |||
| @@ -504,6 +504,10 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 504 | int err; | 504 | int err; |
| 505 | 505 | ||
| 506 | aaci_pcm_hw_free(substream); | 506 | aaci_pcm_hw_free(substream); |
| 507 | if (aacirun->pcm_open) { | ||
| 508 | snd_ac97_pcm_close(aacirun->pcm); | ||
| 509 | aacirun->pcm_open = 0; | ||
| 510 | } | ||
| 507 | 511 | ||
| 508 | err = devdma_hw_alloc(NULL, substream, | 512 | err = devdma_hw_alloc(NULL, substream, |
| 509 | params_buffer_bytes(params)); | 513 | params_buffer_bytes(params)); |
| @@ -517,7 +521,7 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 517 | else | 521 | else |
| 518 | err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params), | 522 | err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params), |
| 519 | params_channels(params), | 523 | params_channels(params), |
| 520 | aacirun->pcm->r[1].slots); | 524 | aacirun->pcm->r[0].slots); |
| 521 | 525 | ||
| 522 | if (err) | 526 | if (err) |
| 523 | goto out; | 527 | goto out; |
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 6b24d8bb02bb..90a0264f7538 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c | |||
| @@ -625,11 +625,10 @@ static int tlv320aic23_resume(struct platform_device *pdev) | |||
| 625 | { | 625 | { |
| 626 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 626 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); |
| 627 | struct snd_soc_codec *codec = socdev->card->codec; | 627 | struct snd_soc_codec *codec = socdev->card->codec; |
| 628 | int i; | ||
| 629 | u16 reg; | 628 | u16 reg; |
| 630 | 629 | ||
| 631 | /* Sync reg_cache with the hardware */ | 630 | /* Sync reg_cache with the hardware */ |
| 632 | for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); i++) { | 631 | for (reg = 0; reg < TLV320AIC23_RESET; reg++) { |
| 633 | u16 val = tlv320aic23_read_reg_cache(codec, reg); | 632 | u16 val = tlv320aic23_read_reg_cache(codec, reg); |
| 634 | tlv320aic23_write(codec, reg, val); | 633 | tlv320aic23_write(codec, reg, val); |
| 635 | } | 634 | } |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index d89f6dc00908..66d4c165f99b 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -973,9 +973,19 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) | |||
| 973 | if (!w->power_check) | 973 | if (!w->power_check) |
| 974 | continue; | 974 | continue; |
| 975 | 975 | ||
| 976 | power = w->power_check(w); | 976 | /* If we're suspending then pull down all the |
| 977 | if (power) | 977 | * power. */ |
| 978 | sys_power = 1; | 978 | switch (event) { |
| 979 | case SND_SOC_DAPM_STREAM_SUSPEND: | ||
| 980 | power = 0; | ||
| 981 | break; | ||
| 982 | |||
| 983 | default: | ||
| 984 | power = w->power_check(w); | ||
| 985 | if (power) | ||
| 986 | sys_power = 1; | ||
| 987 | break; | ||
| 988 | } | ||
| 979 | 989 | ||
| 980 | if (w->power == power) | 990 | if (w->power == power) |
| 981 | continue; | 991 | continue; |
| @@ -999,8 +1009,12 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) | |||
| 999 | case SND_SOC_DAPM_STREAM_RESUME: | 1009 | case SND_SOC_DAPM_STREAM_RESUME: |
| 1000 | sys_power = 1; | 1010 | sys_power = 1; |
| 1001 | break; | 1011 | break; |
| 1012 | case SND_SOC_DAPM_STREAM_SUSPEND: | ||
| 1013 | sys_power = 0; | ||
| 1014 | break; | ||
| 1002 | case SND_SOC_DAPM_STREAM_NOP: | 1015 | case SND_SOC_DAPM_STREAM_NOP: |
| 1003 | sys_power = codec->bias_level != SND_SOC_BIAS_STANDBY; | 1016 | sys_power = codec->bias_level != SND_SOC_BIAS_STANDBY; |
| 1017 | break; | ||
| 1004 | default: | 1018 | default: |
| 1005 | break; | 1019 | break; |
| 1006 | } | 1020 | } |
