aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt5
-rw-r--r--sound/usb/usbaudio.c7
-rw-r--r--sound/usb/usbaudio.h3
-rw-r--r--sound/usb/usbmixer.c7
4 files changed, 15 insertions, 7 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index 68bbc25ff39e..b33e030509fb 100644
--- a/Documentation/sound/alsa/ALSA-Configuration.txt
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt
@@ -1983,6 +1983,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
1983 device_setup - Device specific magic number (optional) 1983 device_setup - Device specific magic number (optional)
1984 - Influence depends on the device 1984 - Influence depends on the device
1985 - Default: 0x0000 1985 - Default: 0x0000
1986 ignore_ctl_error - Ignore any USB-controller regarding mixer
1987 interface (default: no)
1986 1988
1987 This module supports multiple devices, autoprobe and hotplugging. 1989 This module supports multiple devices, autoprobe and hotplugging.
1988 1990
@@ -1991,6 +1993,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
1991 check. 1993 check.
1992 NB: async_unlink=0 would cause Oops. It remains just for 1994 NB: async_unlink=0 would cause Oops. It remains just for
1993 debugging purpose (if any). 1995 debugging purpose (if any).
1996 NB: ignore_ctl_error=1 may help when you get an error at accessing
1997 the mixer element such as URB error -22. This happens on some
1998 buggy USB device or the controller.
1994 1999
1995 Module snd-usb-caiaq 2000 Module snd-usb-caiaq
1996 -------------------- 2001 --------------------
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index c91f18cdc8b5..c5cf682c352f 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -71,6 +71,7 @@ static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
71static int nrpacks = 8; /* max. number of packets per urb */ 71static int nrpacks = 8; /* max. number of packets per urb */
72static int async_unlink = 1; 72static int async_unlink = 1;
73static int device_setup[SNDRV_CARDS]; /* device parameter for this card*/ 73static int device_setup[SNDRV_CARDS]; /* device parameter for this card*/
74static int ignore_ctl_error;
74 75
75module_param_array(index, int, NULL, 0444); 76module_param_array(index, int, NULL, 0444);
76MODULE_PARM_DESC(index, "Index value for the USB audio adapter."); 77MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
@@ -88,7 +89,9 @@ module_param(async_unlink, bool, 0444);
88MODULE_PARM_DESC(async_unlink, "Use async unlink mode."); 89MODULE_PARM_DESC(async_unlink, "Use async unlink mode.");
89module_param_array(device_setup, int, NULL, 0444); 90module_param_array(device_setup, int, NULL, 0444);
90MODULE_PARM_DESC(device_setup, "Specific device setup (if needed)."); 91MODULE_PARM_DESC(device_setup, "Specific device setup (if needed).");
91 92module_param(ignore_ctl_error, bool, 0444);
93MODULE_PARM_DESC(ignore_ctl_error,
94 "Ignore errors from USB controller for mixer interfaces.");
92 95
93/* 96/*
94 * debug the h/w constraints 97 * debug the h/w constraints
@@ -3633,7 +3636,7 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
3633 if (err > 0) { 3636 if (err > 0) {
3634 /* create normal USB audio interfaces */ 3637 /* create normal USB audio interfaces */
3635 if (snd_usb_create_streams(chip, ifnum) < 0 || 3638 if (snd_usb_create_streams(chip, ifnum) < 0 ||
3636 snd_usb_create_mixer(chip, ifnum) < 0) { 3639 snd_usb_create_mixer(chip, ifnum, ignore_ctl_error) < 0) {
3637 goto __error; 3640 goto __error;
3638 } 3641 }
3639 } 3642 }
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index 140ba363414c..f3ca77f08eac 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -223,7 +223,8 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe,
223 __u8 request, __u8 requesttype, __u16 value, __u16 index, 223 __u8 request, __u8 requesttype, __u16 value, __u16 index,
224 void *data, __u16 size, int timeout); 224 void *data, __u16 size, int timeout);
225 225
226int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif); 226int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
227 int ignore_error);
227void snd_usb_mixer_disconnect(struct list_head *p); 228void snd_usb_mixer_disconnect(struct list_head *p);
228 229
229int snd_usb_create_midi_interface(struct snd_usb_audio *chip, struct usb_interface *iface, 230int snd_usb_create_midi_interface(struct snd_usb_audio *chip, struct usb_interface *iface,
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
index 6621fad8c5f0..a49246113e75 100644
--- a/sound/usb/usbmixer.c
+++ b/sound/usb/usbmixer.c
@@ -2014,7 +2014,8 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
2014 } 2014 }
2015} 2015}
2016 2016
2017int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif) 2017int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
2018 int ignore_error)
2018{ 2019{
2019 static struct snd_device_ops dev_ops = { 2020 static struct snd_device_ops dev_ops = {
2020 .dev_free = snd_usb_mixer_dev_free 2021 .dev_free = snd_usb_mixer_dev_free
@@ -2029,9 +2030,7 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif)
2029 return -ENOMEM; 2030 return -ENOMEM;
2030 mixer->chip = chip; 2031 mixer->chip = chip;
2031 mixer->ctrlif = ctrlif; 2032 mixer->ctrlif = ctrlif;
2032#ifdef IGNORE_CTL_ERROR 2033 mixer->ignore_ctl_error = ignore_error;
2033 mixer->ignore_ctl_error = 1;
2034#endif
2035 mixer->id_elems = kcalloc(256, sizeof(*mixer->id_elems), GFP_KERNEL); 2034 mixer->id_elems = kcalloc(256, sizeof(*mixer->id_elems), GFP_KERNEL);
2036 if (!mixer->id_elems) { 2035 if (!mixer->id_elems) {
2037 kfree(mixer); 2036 kfree(mixer);