diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-23 14:28:05 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-23 14:28:05 -0500 |
| commit | 0200971d2f6a5443869fae7ef8a5f4c8606e5446 (patch) | |
| tree | 1c435ff313d6021e559f172afd4c17400f5b6682 | |
| parent | 45196cee28a5bcfb6ddbe2bffa4270cbed66ae4b (diff) | |
| parent | cb74eb15ac88d6aacf7e58db1d8f8dadee710fd9 (diff) | |
Merge tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
sound fixes for 3.3-rc5
Just a collection of boring small fixes for ASoC, HD-audio Realtek
and USB-audio drivers.
* tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: snd-usb-caiaq: Fix the return of XRUN
ASoC: ak4642: fixup HeadPhone L/R dapm settings
ALSA: hda/realtek - Fix surround output regression on Acer Aspire 5935
ALSA: hda/realtek - Fix overflow of vol/sw check bitmap
ALSA: usb-audio: avoid integer overflow in create_fixed_stream_quirk()
ASoC: wm8962: Fix sidetone enumeration texts
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 19 | ||||
| -rw-r--r-- | sound/soc/codecs/ak4642.c | 31 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8962.c | 2 | ||||
| -rw-r--r-- | sound/usb/caiaq/audio.c | 5 | ||||
| -rw-r--r-- | sound/usb/card.h | 1 | ||||
| -rw-r--r-- | sound/usb/format.c | 4 | ||||
| -rw-r--r-- | sound/usb/quirks.c | 6 |
7 files changed, 44 insertions, 24 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 1358987c49d8..3647baa9bfed 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -80,6 +80,8 @@ enum { | |||
| 80 | ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */ | 80 | ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */ |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | #define MAX_VOL_NIDS 0x40 | ||
| 84 | |||
| 83 | struct alc_spec { | 85 | struct alc_spec { |
| 84 | /* codec parameterization */ | 86 | /* codec parameterization */ |
| 85 | const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 87 | const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
| @@ -118,8 +120,8 @@ struct alc_spec { | |||
| 118 | const hda_nid_t *capsrc_nids; | 120 | const hda_nid_t *capsrc_nids; |
| 119 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ | 121 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ |
| 120 | hda_nid_t mixer_nid; /* analog-mixer NID */ | 122 | hda_nid_t mixer_nid; /* analog-mixer NID */ |
| 121 | DECLARE_BITMAP(vol_ctls, 0x20 << 1); | 123 | DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1); |
| 122 | DECLARE_BITMAP(sw_ctls, 0x20 << 1); | 124 | DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1); |
| 123 | 125 | ||
| 124 | /* capture setup for dynamic dual-adc switch */ | 126 | /* capture setup for dynamic dual-adc switch */ |
| 125 | hda_nid_t cur_adc; | 127 | hda_nid_t cur_adc; |
| @@ -3149,7 +3151,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) | |||
| 3149 | static inline unsigned int get_ctl_pos(unsigned int data) | 3151 | static inline unsigned int get_ctl_pos(unsigned int data) |
| 3150 | { | 3152 | { |
| 3151 | hda_nid_t nid = get_amp_nid_(data); | 3153 | hda_nid_t nid = get_amp_nid_(data); |
| 3152 | unsigned int dir = get_amp_direction_(data); | 3154 | unsigned int dir; |
| 3155 | if (snd_BUG_ON(nid >= MAX_VOL_NIDS)) | ||
| 3156 | return 0; | ||
| 3157 | dir = get_amp_direction_(data); | ||
| 3153 | return (nid << 1) | dir; | 3158 | return (nid << 1) | dir; |
| 3154 | } | 3159 | } |
| 3155 | 3160 | ||
| @@ -4436,12 +4441,20 @@ static void alc889_fixup_dac_route(struct hda_codec *codec, | |||
| 4436 | const struct alc_fixup *fix, int action) | 4441 | const struct alc_fixup *fix, int action) |
| 4437 | { | 4442 | { |
| 4438 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { | 4443 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { |
| 4444 | /* fake the connections during parsing the tree */ | ||
| 4439 | hda_nid_t conn1[2] = { 0x0c, 0x0d }; | 4445 | hda_nid_t conn1[2] = { 0x0c, 0x0d }; |
| 4440 | hda_nid_t conn2[2] = { 0x0e, 0x0f }; | 4446 | hda_nid_t conn2[2] = { 0x0e, 0x0f }; |
| 4441 | snd_hda_override_conn_list(codec, 0x14, 2, conn1); | 4447 | snd_hda_override_conn_list(codec, 0x14, 2, conn1); |
| 4442 | snd_hda_override_conn_list(codec, 0x15, 2, conn1); | 4448 | snd_hda_override_conn_list(codec, 0x15, 2, conn1); |
| 4443 | snd_hda_override_conn_list(codec, 0x18, 2, conn2); | 4449 | snd_hda_override_conn_list(codec, 0x18, 2, conn2); |
| 4444 | snd_hda_override_conn_list(codec, 0x1a, 2, conn2); | 4450 | snd_hda_override_conn_list(codec, 0x1a, 2, conn2); |
| 4451 | } else if (action == ALC_FIXUP_ACT_PROBE) { | ||
| 4452 | /* restore the connections */ | ||
| 4453 | hda_nid_t conn[5] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 }; | ||
| 4454 | snd_hda_override_conn_list(codec, 0x14, 5, conn); | ||
| 4455 | snd_hda_override_conn_list(codec, 0x15, 5, conn); | ||
| 4456 | snd_hda_override_conn_list(codec, 0x18, 5, conn); | ||
| 4457 | snd_hda_override_conn_list(codec, 0x1a, 5, conn); | ||
| 4445 | } | 4458 | } |
| 4446 | } | 4459 | } |
| 4447 | 4460 | ||
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 5ef70b5d27e4..278c0a0575f5 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c | |||
| @@ -146,13 +146,10 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { | |||
| 146 | 146 | ||
| 147 | SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, | 147 | SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, |
| 148 | 0, 0xFF, 1, out_tlv), | 148 | 0, 0xFF, 1, out_tlv), |
| 149 | |||
| 150 | SOC_SINGLE("Headphone Switch", PW_MGMT2, 6, 1, 0), | ||
| 151 | }; | 149 | }; |
| 152 | 150 | ||
| 153 | static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { | 151 | static const struct snd_kcontrol_new ak4642_headphone_control = |
| 154 | SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), | 152 | SOC_DAPM_SINGLE("Switch", PW_MGMT2, 6, 1, 0); |
| 155 | }; | ||
| 156 | 153 | ||
| 157 | static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { | 154 | static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { |
| 158 | SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), | 155 | SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), |
| @@ -165,13 +162,12 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { | |||
| 165 | SND_SOC_DAPM_OUTPUT("HPOUTR"), | 162 | SND_SOC_DAPM_OUTPUT("HPOUTR"), |
| 166 | SND_SOC_DAPM_OUTPUT("LINEOUT"), | 163 | SND_SOC_DAPM_OUTPUT("LINEOUT"), |
| 167 | 164 | ||
| 168 | SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, | 165 | SND_SOC_DAPM_PGA("HPL Out", PW_MGMT2, 5, 0, NULL, 0), |
| 169 | &ak4642_hpout_mixer_controls[0], | 166 | SND_SOC_DAPM_PGA("HPR Out", PW_MGMT2, 4, 0, NULL, 0), |
| 170 | ARRAY_SIZE(ak4642_hpout_mixer_controls)), | 167 | SND_SOC_DAPM_SWITCH("Headphone Enable", SND_SOC_NOPM, 0, 0, |
| 168 | &ak4642_headphone_control), | ||
| 171 | 169 | ||
| 172 | SND_SOC_DAPM_MIXER("HPOUTR Mixer", PW_MGMT2, 4, 0, | 170 | SND_SOC_DAPM_PGA("DACH", MD_CTL4, 0, 0, NULL, 0), |
| 173 | &ak4642_hpout_mixer_controls[0], | ||
| 174 | ARRAY_SIZE(ak4642_hpout_mixer_controls)), | ||
| 175 | 171 | ||
| 176 | SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, | 172 | SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, |
| 177 | &ak4642_lout_mixer_controls[0], | 173 | &ak4642_lout_mixer_controls[0], |
| @@ -184,12 +180,17 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { | |||
| 184 | static const struct snd_soc_dapm_route ak4642_intercon[] = { | 180 | static const struct snd_soc_dapm_route ak4642_intercon[] = { |
| 185 | 181 | ||
| 186 | /* Outputs */ | 182 | /* Outputs */ |
| 187 | {"HPOUTL", NULL, "HPOUTL Mixer"}, | 183 | {"HPOUTL", NULL, "HPL Out"}, |
| 188 | {"HPOUTR", NULL, "HPOUTR Mixer"}, | 184 | {"HPOUTR", NULL, "HPR Out"}, |
| 189 | {"LINEOUT", NULL, "LINEOUT Mixer"}, | 185 | {"LINEOUT", NULL, "LINEOUT Mixer"}, |
| 190 | 186 | ||
| 191 | {"HPOUTL Mixer", "DACH", "DAC"}, | 187 | {"HPL Out", NULL, "Headphone Enable"}, |
| 192 | {"HPOUTR Mixer", "DACH", "DAC"}, | 188 | {"HPR Out", NULL, "Headphone Enable"}, |
| 189 | |||
| 190 | {"Headphone Enable", "Switch", "DACH"}, | ||
| 191 | |||
| 192 | {"DACH", NULL, "DAC"}, | ||
| 193 | |||
| 193 | {"LINEOUT Mixer", "DACL", "DAC"}, | 194 | {"LINEOUT Mixer", "DACL", "DAC"}, |
| 194 | }; | 195 | }; |
| 195 | 196 | ||
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 29c4b02c4790..0ac228b7dc04 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -2564,7 +2564,7 @@ static int dsp2_event(struct snd_soc_dapm_widget *w, | |||
| 2564 | return 0; | 2564 | return 0; |
| 2565 | } | 2565 | } |
| 2566 | 2566 | ||
| 2567 | static const char *st_text[] = { "None", "Right", "Left" }; | 2567 | static const char *st_text[] = { "None", "Left", "Right" }; |
| 2568 | 2568 | ||
| 2569 | static const struct soc_enum str_enum = | 2569 | static const struct soc_enum str_enum = |
| 2570 | SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text); | 2570 | SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text); |
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 2cf87f5afed4..fde9a7a29cb6 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c | |||
| @@ -311,8 +311,10 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) | |||
| 311 | 311 | ||
| 312 | spin_lock(&dev->spinlock); | 312 | spin_lock(&dev->spinlock); |
| 313 | 313 | ||
| 314 | if (dev->input_panic || dev->output_panic) | 314 | if (dev->input_panic || dev->output_panic) { |
| 315 | ptr = SNDRV_PCM_POS_XRUN; | 315 | ptr = SNDRV_PCM_POS_XRUN; |
| 316 | goto unlock; | ||
| 317 | } | ||
| 316 | 318 | ||
| 317 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) | 319 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 318 | ptr = bytes_to_frames(sub->runtime, | 320 | ptr = bytes_to_frames(sub->runtime, |
| @@ -321,6 +323,7 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) | |||
| 321 | ptr = bytes_to_frames(sub->runtime, | 323 | ptr = bytes_to_frames(sub->runtime, |
| 322 | dev->audio_in_buf_pos[index]); | 324 | dev->audio_in_buf_pos[index]); |
| 323 | 325 | ||
| 326 | unlock: | ||
| 324 | spin_unlock(&dev->spinlock); | 327 | spin_unlock(&dev->spinlock); |
| 325 | return ptr; | 328 | return ptr; |
| 326 | } | 329 | } |
diff --git a/sound/usb/card.h b/sound/usb/card.h index a39edcc32a93..da5fa1ac4eda 100644 --- a/sound/usb/card.h +++ b/sound/usb/card.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef __USBAUDIO_CARD_H | 1 | #ifndef __USBAUDIO_CARD_H |
| 2 | #define __USBAUDIO_CARD_H | 2 | #define __USBAUDIO_CARD_H |
| 3 | 3 | ||
| 4 | #define MAX_NR_RATES 1024 | ||
| 4 | #define MAX_PACKS 20 | 5 | #define MAX_PACKS 20 |
| 5 | #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ | 6 | #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ |
| 6 | #define MAX_URBS 8 | 7 | #define MAX_URBS 8 |
diff --git a/sound/usb/format.c b/sound/usb/format.c index e09aba19375c..ddfef57c4c9f 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c | |||
| @@ -209,8 +209,6 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof | |||
| 209 | return 0; | 209 | return 0; |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | #define MAX_UAC2_NR_RATES 1024 | ||
| 213 | |||
| 214 | /* | 212 | /* |
| 215 | * Helper function to walk the array of sample rate triplets reported by | 213 | * Helper function to walk the array of sample rate triplets reported by |
| 216 | * the device. The problem is that we need to parse whole array first to | 214 | * the device. The problem is that we need to parse whole array first to |
| @@ -255,7 +253,7 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets, | |||
| 255 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); | 253 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); |
| 256 | 254 | ||
| 257 | nr_rates++; | 255 | nr_rates++; |
| 258 | if (nr_rates >= MAX_UAC2_NR_RATES) { | 256 | if (nr_rates >= MAX_NR_RATES) { |
| 259 | snd_printk(KERN_ERR "invalid uac2 rates\n"); | 257 | snd_printk(KERN_ERR "invalid uac2 rates\n"); |
| 260 | break; | 258 | break; |
| 261 | } | 259 | } |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index a3ddac0deffd..27817266867a 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
| @@ -132,10 +132,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | |||
| 132 | unsigned *rate_table = NULL; | 132 | unsigned *rate_table = NULL; |
| 133 | 133 | ||
| 134 | fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL); | 134 | fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL); |
| 135 | if (! fp) { | 135 | if (!fp) { |
| 136 | snd_printk(KERN_ERR "cannot memdup\n"); | 136 | snd_printk(KERN_ERR "cannot memdup\n"); |
| 137 | return -ENOMEM; | 137 | return -ENOMEM; |
| 138 | } | 138 | } |
| 139 | if (fp->nr_rates > MAX_NR_RATES) { | ||
| 140 | kfree(fp); | ||
| 141 | return -EINVAL; | ||
| 142 | } | ||
| 139 | if (fp->nr_rates > 0) { | 143 | if (fp->nr_rates > 0) { |
| 140 | rate_table = kmemdup(fp->rate_table, | 144 | rate_table = kmemdup(fp->rate_table, |
| 141 | sizeof(int) * fp->nr_rates, GFP_KERNEL); | 145 | sizeof(int) * fp->nr_rates, GFP_KERNEL); |
