Commit 8e3b3bb5 authored by Linus Torvalds's avatar Linus Torvalds

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: riptide -  proper handling of pci_register_driver for joystick
  sound: usb-audio: add workaround for Blue Microphones devices
  ALSA: hda_intel: more strict alc880_parse_auto_config dig_nid checking
  ASoC: Fix NULL pointer dereference in __pxa2xx_pcm_hw_free
parents 301d95c4 15c2ac05
...@@ -75,7 +75,7 @@ int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream) ...@@ -75,7 +75,7 @@ int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
{ {
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data; struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
if (rtd && rtd->params) if (rtd && rtd->params && rtd->params->drcmr)
*rtd->params->drcmr = 0; *rtd->params->drcmr = 0;
snd_pcm_set_runtime_buffer(substream, NULL); snd_pcm_set_runtime_buffer(substream, NULL);
......
...@@ -4505,6 +4505,12 @@ static int alc880_parse_auto_config(struct hda_codec *codec) ...@@ -4505,6 +4505,12 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
&dig_nid, 1); &dig_nid, 1);
if (err < 0) if (err < 0)
continue; continue;
if (dig_nid > 0x7f) {
printk(KERN_ERR "alc880_auto: invalid dig_nid "
"connection 0x%x for NID 0x%x\n", dig_nid,
spec->autocfg.dig_out_pins[i]);
continue;
}
if (!i) if (!i)
spec->multiout.dig_out_nid = dig_nid; spec->multiout.dig_out_nid = dig_nid;
else { else {
......
...@@ -2197,9 +2197,12 @@ static int __init alsa_card_riptide_init(void) ...@@ -2197,9 +2197,12 @@ static int __init alsa_card_riptide_init(void)
if (err < 0) if (err < 0)
return err; return err;
#if defined(SUPPORT_JOYSTICK) #if defined(SUPPORT_JOYSTICK)
pci_register_driver(&joystick_driver); err = pci_register_driver(&joystick_driver);
/* On failure unregister formerly registered audio driver */
if (err < 0)
pci_unregister_driver(&driver);
#endif #endif
return 0; return err;
} }
static void __exit alsa_card_riptide_exit(void) static void __exit alsa_card_riptide_exit(void)
......
...@@ -2661,7 +2661,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) ...@@ -2661,7 +2661,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
struct usb_interface_descriptor *altsd; struct usb_interface_descriptor *altsd;
int i, altno, err, stream; int i, altno, err, stream;
int format; int format;
struct audioformat *fp; struct audioformat *fp = NULL;
unsigned char *fmt, *csep; unsigned char *fmt, *csep;
int num; int num;
...@@ -2734,6 +2734,18 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) ...@@ -2734,6 +2734,18 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
continue; continue;
} }
/*
* Blue Microphones workaround: The last altsetting is identical
* with the previous one, except for a larger packet size, but
* is actually a mislabeled two-channel setting; ignore it.
*/
if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 &&
fp && fp->altsetting == 1 && fp->channels == 1 &&
fp->format == SNDRV_PCM_FORMAT_S16_LE &&
le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
fp->maxpacksize * 2)
continue;
csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT); csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
/* Creamware Noah has this descriptor after the 2nd endpoint */ /* Creamware Noah has this descriptor after the 2nd endpoint */
if (!csep && altsd->bNumEndpoints >= 2) if (!csep && altsd->bNumEndpoints >= 2)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment