|
@@ -2184,17 +2184,15 @@ static int add_audio_endpoint(snd_usb_audio_t *chip, int stream, struct audiofor
|
|
/*
|
|
/*
|
|
* check if the device uses big-endian samples
|
|
* check if the device uses big-endian samples
|
|
*/
|
|
*/
|
|
-static int is_big_endian_format(struct usb_device *dev, struct audioformat *fp)
|
|
|
|
|
|
+static int is_big_endian_format(snd_usb_audio_t *chip, struct audioformat *fp)
|
|
{
|
|
{
|
|
- /* M-Audio */
|
|
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x0763) {
|
|
|
|
- /* Quattro: captured data only */
|
|
|
|
- if (le16_to_cpu(dev->descriptor.idProduct) == 0x2001 &&
|
|
|
|
- fp->endpoint & USB_DIR_IN)
|
|
|
|
- return 1;
|
|
|
|
- /* Audiophile USB */
|
|
|
|
- if (le16_to_cpu(dev->descriptor.idProduct) == 0x2003)
|
|
|
|
|
|
+ switch (chip->usb_id) {
|
|
|
|
+ case USB_ID(0x0763, 0x2001): /* M-Audio Quattro: captured data only */
|
|
|
|
+ if (fp->endpoint & USB_DIR_IN)
|
|
return 1;
|
|
return 1;
|
|
|
|
+ break;
|
|
|
|
+ case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2208,7 +2206,7 @@ static int is_big_endian_format(struct usb_device *dev, struct audioformat *fp)
|
|
* @format: the format tag (wFormatTag)
|
|
* @format: the format tag (wFormatTag)
|
|
* @fmt: the format type descriptor
|
|
* @fmt: the format type descriptor
|
|
*/
|
|
*/
|
|
-static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat *fp,
|
|
|
|
|
|
+static int parse_audio_format_i_type(snd_usb_audio_t *chip, struct audioformat *fp,
|
|
int format, unsigned char *fmt)
|
|
int format, unsigned char *fmt)
|
|
{
|
|
{
|
|
int pcm_format;
|
|
int pcm_format;
|
|
@@ -2221,12 +2219,12 @@ static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat
|
|
switch (format) {
|
|
switch (format) {
|
|
case 0: /* some devices don't define this correctly... */
|
|
case 0: /* some devices don't define this correctly... */
|
|
snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",
|
|
snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",
|
|
- dev->devnum, fp->iface, fp->altsetting);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting);
|
|
/* fall-through */
|
|
/* fall-through */
|
|
case USB_AUDIO_FORMAT_PCM:
|
|
case USB_AUDIO_FORMAT_PCM:
|
|
if (sample_width > sample_bytes * 8) {
|
|
if (sample_width > sample_bytes * 8) {
|
|
snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n",
|
|
snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n",
|
|
- dev->devnum, fp->iface, fp->altsetting,
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting,
|
|
sample_width, sample_bytes);
|
|
sample_width, sample_bytes);
|
|
}
|
|
}
|
|
/* check the format byte size */
|
|
/* check the format byte size */
|
|
@@ -2235,13 +2233,13 @@ static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat
|
|
pcm_format = SNDRV_PCM_FORMAT_S8;
|
|
pcm_format = SNDRV_PCM_FORMAT_S8;
|
|
break;
|
|
break;
|
|
case 2:
|
|
case 2:
|
|
- if (is_big_endian_format(dev, fp))
|
|
|
|
|
|
+ if (is_big_endian_format(chip, fp))
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_BE; /* grrr, big endian!! */
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_BE; /* grrr, big endian!! */
|
|
else
|
|
else
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_LE;
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_LE;
|
|
break;
|
|
break;
|
|
case 3:
|
|
case 3:
|
|
- if (is_big_endian_format(dev, fp))
|
|
|
|
|
|
+ if (is_big_endian_format(chip, fp))
|
|
pcm_format = SNDRV_PCM_FORMAT_S24_3BE; /* grrr, big endian!! */
|
|
pcm_format = SNDRV_PCM_FORMAT_S24_3BE; /* grrr, big endian!! */
|
|
else
|
|
else
|
|
pcm_format = SNDRV_PCM_FORMAT_S24_3LE;
|
|
pcm_format = SNDRV_PCM_FORMAT_S24_3LE;
|
|
@@ -2251,14 +2249,14 @@ static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes\n",
|
|
snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes\n",
|
|
- dev->devnum, fp->iface, fp->altsetting, sample_width, sample_bytes);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface,
|
|
|
|
+ fp->altsetting, sample_width, sample_bytes);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case USB_AUDIO_FORMAT_PCM8:
|
|
case USB_AUDIO_FORMAT_PCM8:
|
|
/* Dallas DS4201 workaround */
|
|
/* Dallas DS4201 workaround */
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x04fa &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x4201)
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x04fa, 0x4201))
|
|
pcm_format = SNDRV_PCM_FORMAT_S8;
|
|
pcm_format = SNDRV_PCM_FORMAT_S8;
|
|
else
|
|
else
|
|
pcm_format = SNDRV_PCM_FORMAT_U8;
|
|
pcm_format = SNDRV_PCM_FORMAT_U8;
|
|
@@ -2274,7 +2272,7 @@ static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
snd_printk(KERN_INFO "%d:%u:%d : unsupported format type %d\n",
|
|
snd_printk(KERN_INFO "%d:%u:%d : unsupported format type %d\n",
|
|
- dev->devnum, fp->iface, fp->altsetting, format);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting, format);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
return pcm_format;
|
|
return pcm_format;
|
|
@@ -2291,13 +2289,13 @@ static int parse_audio_format_i_type(struct usb_device *dev, struct audioformat
|
|
* @offset: the start offset of descriptor pointing the rate type
|
|
* @offset: the start offset of descriptor pointing the rate type
|
|
* (7 for type I and II, 8 for type II)
|
|
* (7 for type I and II, 8 for type II)
|
|
*/
|
|
*/
|
|
-static int parse_audio_format_rates(struct usb_device *dev, struct audioformat *fp,
|
|
|
|
|
|
+static int parse_audio_format_rates(snd_usb_audio_t *chip, struct audioformat *fp,
|
|
unsigned char *fmt, int offset)
|
|
unsigned char *fmt, int offset)
|
|
{
|
|
{
|
|
int nr_rates = fmt[offset];
|
|
int nr_rates = fmt[offset];
|
|
if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
|
|
if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
|
|
snd_printk(KERN_ERR "%d:%u:%d : invalid FORMAT_TYPE desc\n",
|
|
snd_printk(KERN_ERR "%d:%u:%d : invalid FORMAT_TYPE desc\n",
|
|
- dev->devnum, fp->iface, fp->altsetting);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2344,7 +2342,7 @@ static int parse_audio_format_rates(struct usb_device *dev, struct audioformat *
|
|
/*
|
|
/*
|
|
* parse the format type I and III descriptors
|
|
* parse the format type I and III descriptors
|
|
*/
|
|
*/
|
|
-static int parse_audio_format_i(struct usb_device *dev, struct audioformat *fp,
|
|
|
|
|
|
+static int parse_audio_format_i(snd_usb_audio_t *chip, struct audioformat *fp,
|
|
int format, unsigned char *fmt)
|
|
int format, unsigned char *fmt)
|
|
{
|
|
{
|
|
int pcm_format;
|
|
int pcm_format;
|
|
@@ -2356,7 +2354,7 @@ static int parse_audio_format_i(struct usb_device *dev, struct audioformat *fp,
|
|
*/
|
|
*/
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_LE;
|
|
pcm_format = SNDRV_PCM_FORMAT_S16_LE;
|
|
} else {
|
|
} else {
|
|
- pcm_format = parse_audio_format_i_type(dev, fp, format, fmt);
|
|
|
|
|
|
+ pcm_format = parse_audio_format_i_type(chip, fp, format, fmt);
|
|
if (pcm_format < 0)
|
|
if (pcm_format < 0)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -2364,16 +2362,16 @@ static int parse_audio_format_i(struct usb_device *dev, struct audioformat *fp,
|
|
fp->channels = fmt[4];
|
|
fp->channels = fmt[4];
|
|
if (fp->channels < 1) {
|
|
if (fp->channels < 1) {
|
|
snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n",
|
|
snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n",
|
|
- dev->devnum, fp->iface, fp->altsetting, fp->channels);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting, fp->channels);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- return parse_audio_format_rates(dev, fp, fmt, 7);
|
|
|
|
|
|
+ return parse_audio_format_rates(chip, fp, fmt, 7);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
* prase the format type II descriptor
|
|
* prase the format type II descriptor
|
|
*/
|
|
*/
|
|
-static int parse_audio_format_ii(struct usb_device *dev, struct audioformat *fp,
|
|
|
|
|
|
+static int parse_audio_format_ii(snd_usb_audio_t *chip, struct audioformat *fp,
|
|
int format, unsigned char *fmt)
|
|
int format, unsigned char *fmt)
|
|
{
|
|
{
|
|
int brate, framesize;
|
|
int brate, framesize;
|
|
@@ -2388,7 +2386,7 @@ static int parse_audio_format_ii(struct usb_device *dev, struct audioformat *fp,
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
snd_printd(KERN_INFO "%d:%u:%d : unknown format tag 0x%x is detected. processed as MPEG.\n",
|
|
snd_printd(KERN_INFO "%d:%u:%d : unknown format tag 0x%x is detected. processed as MPEG.\n",
|
|
- dev->devnum, fp->iface, fp->altsetting, format);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting, format);
|
|
fp->format = SNDRV_PCM_FORMAT_MPEG;
|
|
fp->format = SNDRV_PCM_FORMAT_MPEG;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -2397,10 +2395,10 @@ static int parse_audio_format_ii(struct usb_device *dev, struct audioformat *fp,
|
|
framesize = combine_word(&fmt[6]); /* fmt[6,7]: wSamplesPerFrame */
|
|
framesize = combine_word(&fmt[6]); /* fmt[6,7]: wSamplesPerFrame */
|
|
snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
|
|
snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
|
|
fp->frame_size = framesize;
|
|
fp->frame_size = framesize;
|
|
- return parse_audio_format_rates(dev, fp, fmt, 8); /* fmt[8..] sample rates */
|
|
|
|
|
|
+ return parse_audio_format_rates(chip, fp, fmt, 8); /* fmt[8..] sample rates */
|
|
}
|
|
}
|
|
|
|
|
|
-static int parse_audio_format(struct usb_device *dev, struct audioformat *fp,
|
|
|
|
|
|
+static int parse_audio_format(snd_usb_audio_t *chip, struct audioformat *fp,
|
|
int format, unsigned char *fmt, int stream)
|
|
int format, unsigned char *fmt, int stream)
|
|
{
|
|
{
|
|
int err;
|
|
int err;
|
|
@@ -2408,14 +2406,14 @@ static int parse_audio_format(struct usb_device *dev, struct audioformat *fp,
|
|
switch (fmt[3]) {
|
|
switch (fmt[3]) {
|
|
case USB_FORMAT_TYPE_I:
|
|
case USB_FORMAT_TYPE_I:
|
|
case USB_FORMAT_TYPE_III:
|
|
case USB_FORMAT_TYPE_III:
|
|
- err = parse_audio_format_i(dev, fp, format, fmt);
|
|
|
|
|
|
+ err = parse_audio_format_i(chip, fp, format, fmt);
|
|
break;
|
|
break;
|
|
case USB_FORMAT_TYPE_II:
|
|
case USB_FORMAT_TYPE_II:
|
|
- err = parse_audio_format_ii(dev, fp, format, fmt);
|
|
|
|
|
|
+ err = parse_audio_format_ii(chip, fp, format, fmt);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n",
|
|
snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n",
|
|
- dev->devnum, fp->iface, fp->altsetting, fmt[3]);
|
|
|
|
|
|
+ chip->dev->devnum, fp->iface, fp->altsetting, fmt[3]);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
fp->fmt_type = fmt[3];
|
|
fp->fmt_type = fmt[3];
|
|
@@ -2426,9 +2424,8 @@ static int parse_audio_format(struct usb_device *dev, struct audioformat *fp,
|
|
/* extigy apparently supports sample rates other than 48k
|
|
/* extigy apparently supports sample rates other than 48k
|
|
* but not in ordinary way. so we enable only 48k atm.
|
|
* but not in ordinary way. so we enable only 48k atm.
|
|
*/
|
|
*/
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x041e &&
|
|
|
|
- (le16_to_cpu(dev->descriptor.idProduct) == 0x3000 ||
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x3020)) {
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
|
|
|
|
+ chip->usb_id == USB_ID(0x041e, 0x3020)) {
|
|
if (fmt[3] == USB_FORMAT_TYPE_I &&
|
|
if (fmt[3] == USB_FORMAT_TYPE_I &&
|
|
stream == SNDRV_PCM_STREAM_PLAYBACK &&
|
|
stream == SNDRV_PCM_STREAM_PLAYBACK &&
|
|
fp->rates != SNDRV_PCM_RATE_48000 &&
|
|
fp->rates != SNDRV_PCM_RATE_48000 &&
|
|
@@ -2532,8 +2529,7 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
|
|
/* some quirks for attributes here */
|
|
/* some quirks for attributes here */
|
|
|
|
|
|
/* workaround for AudioTrak Optoplay */
|
|
/* workaround for AudioTrak Optoplay */
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x0a92 &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x0053) {
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x0a92, 0x0053)) {
|
|
/* Optoplay sets the sample rate attribute although
|
|
/* Optoplay sets the sample rate attribute although
|
|
* it seems not supporting it in fact.
|
|
* it seems not supporting it in fact.
|
|
*/
|
|
*/
|
|
@@ -2541,8 +2537,7 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
|
|
}
|
|
}
|
|
|
|
|
|
/* workaround for M-Audio Audiophile USB */
|
|
/* workaround for M-Audio Audiophile USB */
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x0763 &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x2003) {
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x0763, 0x2003)) {
|
|
/* doesn't set the sample rate attribute, but supports it */
|
|
/* doesn't set the sample rate attribute, but supports it */
|
|
fp->attributes |= EP_CS_ATTR_SAMPLE_RATE;
|
|
fp->attributes |= EP_CS_ATTR_SAMPLE_RATE;
|
|
}
|
|
}
|
|
@@ -2551,11 +2546,9 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
|
|
* plantronics headset and Griffin iMic have set adaptive-in
|
|
* plantronics headset and Griffin iMic have set adaptive-in
|
|
* although it's really not...
|
|
* although it's really not...
|
|
*/
|
|
*/
|
|
- if ((le16_to_cpu(dev->descriptor.idVendor) == 0x047f &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x0ca1) ||
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x047f, 0x0ca1) ||
|
|
/* Griffin iMic (note that there is an older model 77d:223) */
|
|
/* Griffin iMic (note that there is an older model 77d:223) */
|
|
- (le16_to_cpu(dev->descriptor.idVendor) == 0x077d &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x07af)) {
|
|
|
|
|
|
+ chip->usb_id == USB_ID(0x077d, 0x07af)) {
|
|
fp->ep_attr &= ~EP_ATTR_MASK;
|
|
fp->ep_attr &= ~EP_ATTR_MASK;
|
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
fp->ep_attr |= EP_ATTR_ADAPTIVE;
|
|
fp->ep_attr |= EP_ATTR_ADAPTIVE;
|
|
@@ -2564,7 +2557,7 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
|
|
}
|
|
}
|
|
|
|
|
|
/* ok, let's parse further... */
|
|
/* ok, let's parse further... */
|
|
- if (parse_audio_format(dev, fp, format, fmt, stream) < 0) {
|
|
|
|
|
|
+ if (parse_audio_format(chip, fp, format, fmt, stream) < 0) {
|
|
kfree(fp->rate_table);
|
|
kfree(fp->rate_table);
|
|
kfree(fp);
|
|
kfree(fp);
|
|
continue;
|
|
continue;
|
|
@@ -2799,7 +2792,7 @@ static int create_ua700_ua25_quirk(snd_usb_audio_t *chip,
|
|
.type = QUIRK_MIDI_FIXED_ENDPOINT,
|
|
.type = QUIRK_MIDI_FIXED_ENDPOINT,
|
|
.data = &ua25_ep
|
|
.data = &ua25_ep
|
|
};
|
|
};
|
|
- if (le16_to_cpu(chip->dev->descriptor.idProduct) == 0x002b)
|
|
|
|
|
|
+ if (chip->usb_id == USB_ID(0x0582, 0x002b))
|
|
return snd_usb_create_midi_interface(chip, iface,
|
|
return snd_usb_create_midi_interface(chip, iface,
|
|
&ua700_quirk);
|
|
&ua700_quirk);
|
|
else
|
|
else
|
|
@@ -3018,8 +3011,8 @@ static void proc_audio_usbid_read(snd_info_entry_t *entry, snd_info_buffer_t *bu
|
|
snd_usb_audio_t *chip = entry->private_data;
|
|
snd_usb_audio_t *chip = entry->private_data;
|
|
if (! chip->shutdown)
|
|
if (! chip->shutdown)
|
|
snd_iprintf(buffer, "%04x:%04x\n",
|
|
snd_iprintf(buffer, "%04x:%04x\n",
|
|
- le16_to_cpu(chip->dev->descriptor.idVendor),
|
|
|
|
- le16_to_cpu(chip->dev->descriptor.idProduct));
|
|
|
|
|
|
+ USB_ID_VENDOR(chip->usb_id),
|
|
|
|
+ USB_ID_PRODUCT(chip->usb_id));
|
|
}
|
|
}
|
|
|
|
|
|
static void snd_usb_audio_create_proc(snd_usb_audio_t *chip)
|
|
static void snd_usb_audio_create_proc(snd_usb_audio_t *chip)
|
|
@@ -3089,6 +3082,8 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
|
chip->index = idx;
|
|
chip->index = idx;
|
|
chip->dev = dev;
|
|
chip->dev = dev;
|
|
chip->card = card;
|
|
chip->card = card;
|
|
|
|
+ chip->usb_id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
|
|
|
|
+ le16_to_cpu(dev->descriptor.idProduct));
|
|
INIT_LIST_HEAD(&chip->pcm_list);
|
|
INIT_LIST_HEAD(&chip->pcm_list);
|
|
INIT_LIST_HEAD(&chip->midi_list);
|
|
INIT_LIST_HEAD(&chip->midi_list);
|
|
INIT_LIST_HEAD(&chip->mixer_list);
|
|
INIT_LIST_HEAD(&chip->mixer_list);
|
|
@@ -3101,8 +3096,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
|
|
|
|
|
strcpy(card->driver, "USB-Audio");
|
|
strcpy(card->driver, "USB-Audio");
|
|
sprintf(component, "USB%04x:%04x",
|
|
sprintf(component, "USB%04x:%04x",
|
|
- le16_to_cpu(dev->descriptor.idVendor),
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct));
|
|
|
|
|
|
+ USB_ID_VENDOR(chip->usb_id), USB_ID_PRODUCT(chip->usb_id));
|
|
snd_component_add(card, component);
|
|
snd_component_add(card, component);
|
|
|
|
|
|
/* retrieve the device string as shortname */
|
|
/* retrieve the device string as shortname */
|
|
@@ -3114,8 +3108,8 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
|
card->shortname, sizeof(card->shortname)) <= 0) {
|
|
card->shortname, sizeof(card->shortname)) <= 0) {
|
|
/* no name available from anywhere, so use ID */
|
|
/* no name available from anywhere, so use ID */
|
|
sprintf(card->shortname, "USB Device %#04x:%#04x",
|
|
sprintf(card->shortname, "USB Device %#04x:%#04x",
|
|
- le16_to_cpu(dev->descriptor.idVendor),
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct));
|
|
|
|
|
|
+ USB_ID_VENDOR(chip->usb_id),
|
|
|
|
+ USB_ID_PRODUCT(chip->usb_id));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3173,17 +3167,19 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
|
|
snd_usb_audio_t *chip;
|
|
snd_usb_audio_t *chip;
|
|
struct usb_host_interface *alts;
|
|
struct usb_host_interface *alts;
|
|
int ifnum;
|
|
int ifnum;
|
|
|
|
+ u32 id;
|
|
|
|
|
|
alts = &intf->altsetting[0];
|
|
alts = &intf->altsetting[0];
|
|
ifnum = get_iface_desc(alts)->bInterfaceNumber;
|
|
ifnum = get_iface_desc(alts)->bInterfaceNumber;
|
|
|
|
+ id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
|
|
|
|
+ le16_to_cpu(dev->descriptor.idProduct));
|
|
|
|
|
|
if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
|
|
if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
|
|
goto __err_val;
|
|
goto __err_val;
|
|
|
|
|
|
/* SB Extigy needs special boot-up sequence */
|
|
/* SB Extigy needs special boot-up sequence */
|
|
/* if more models come, this will go to the quirk list. */
|
|
/* if more models come, this will go to the quirk list. */
|
|
- if (le16_to_cpu(dev->descriptor.idVendor) == 0x041e &&
|
|
|
|
- le16_to_cpu(dev->descriptor.idProduct) == 0x3000) {
|
|
|
|
|
|
+ if (id == USB_ID(0x041e, 0x3000)) {
|
|
if (snd_usb_extigy_boot_quirk(dev, intf) < 0)
|
|
if (snd_usb_extigy_boot_quirk(dev, intf) < 0)
|
|
goto __err_val;
|
|
goto __err_val;
|
|
config = dev->actconfig;
|
|
config = dev->actconfig;
|
|
@@ -3217,8 +3213,8 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
|
|
}
|
|
}
|
|
for (i = 0; i < SNDRV_CARDS; i++)
|
|
for (i = 0; i < SNDRV_CARDS; i++)
|
|
if (enable[i] && ! usb_chip[i] &&
|
|
if (enable[i] && ! usb_chip[i] &&
|
|
- (vid[i] == -1 || vid[i] == le16_to_cpu(dev->descriptor.idVendor)) &&
|
|
|
|
- (pid[i] == -1 || pid[i] == le16_to_cpu(dev->descriptor.idProduct))) {
|
|
|
|
|
|
+ (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) &&
|
|
|
|
+ (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) {
|
|
if (snd_usb_audio_create(dev, i, quirk, &chip) < 0) {
|
|
if (snd_usb_audio_create(dev, i, quirk, &chip) < 0) {
|
|
goto __error;
|
|
goto __error;
|
|
}
|
|
}
|