|
|
@@ -2931,9 +2931,9 @@ static void request_module_async(struct work_struct *work)
|
|
|
#if defined(CONFIG_MODULES) && defined(MODULE)
|
|
|
if (dev->has_video)
|
|
|
request_module("em28xx-v4l");
|
|
|
- if (dev->has_audio_class)
|
|
|
+ if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
|
|
|
request_module("snd-usb-audio");
|
|
|
- else if (dev->has_alsa_audio)
|
|
|
+ else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
|
|
|
request_module("em28xx-alsa");
|
|
|
if (dev->board.has_dvb)
|
|
|
request_module("em28xx-dvb");
|
|
|
@@ -3180,7 +3180,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
|
|
struct usb_device *udev;
|
|
|
struct em28xx *dev = NULL;
|
|
|
int retval;
|
|
|
- bool has_audio = false, has_video = false, has_dvb = false;
|
|
|
+ bool has_vendor_audio = false, has_video = false, has_dvb = false;
|
|
|
int i, nr, try_bulk;
|
|
|
const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
|
|
|
char *speed;
|
|
|
@@ -3262,7 +3262,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
|
|
break;
|
|
|
case 0x83:
|
|
|
if (usb_endpoint_xfer_isoc(e)) {
|
|
|
- has_audio = true;
|
|
|
+ has_vendor_audio = true;
|
|
|
} else {
|
|
|
printk(KERN_INFO DRIVER_NAME
|
|
|
": error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
|
|
|
@@ -3318,7 +3318,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!(has_audio || has_video || has_dvb)) {
|
|
|
+ if (!(has_vendor_audio || has_video || has_dvb)) {
|
|
|
retval = -ENODEV;
|
|
|
goto err_free;
|
|
|
}
|
|
|
@@ -3365,25 +3365,27 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
|
|
dev->devno = nr;
|
|
|
dev->model = id->driver_info;
|
|
|
dev->alt = -1;
|
|
|
- dev->is_audio_only = has_audio && !(has_video || has_dvb);
|
|
|
- dev->has_alsa_audio = has_audio;
|
|
|
+ dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
|
|
|
dev->has_video = has_video;
|
|
|
dev->ifnum = ifnum;
|
|
|
|
|
|
- /* Checks if audio is provided by some interface */
|
|
|
+ if (has_vendor_audio) {
|
|
|
+ printk(KERN_INFO DRIVER_NAME ": Audio interface %i found %s\n",
|
|
|
+ ifnum, "(Vendor Class)");
|
|
|
+ dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
|
|
|
+ }
|
|
|
+ /* Checks if audio is provided by a USB Audio Class interface */
|
|
|
for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
|
|
|
struct usb_interface *uif = udev->config->interface[i];
|
|
|
if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
|
|
|
- dev->has_audio_class = 1;
|
|
|
+ if (has_vendor_audio)
|
|
|
+ em28xx_err("em28xx: device seems to have vendor AND usb audio class interfaces !\n"
|
|
|
+ "\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
|
|
|
+ dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (has_audio)
|
|
|
- printk(KERN_INFO DRIVER_NAME
|
|
|
- ": Audio interface %i found %s\n",
|
|
|
- ifnum,
|
|
|
- dev->has_audio_class ? "(USB Audio Class)" : "(Vendor Class)");
|
|
|
if (has_video)
|
|
|
printk(KERN_INFO DRIVER_NAME
|
|
|
": Video interface %i found:%s%s\n",
|