diff options
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-audio.c | 8 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-cards.c | 30 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-core.c | 8 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx.h | 9 |
4 files changed, 31 insertions, 24 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c index e881ef7b6445..90c7a83989d1 100644 --- a/drivers/media/usb/em28xx/em28xx-audio.c +++ b/drivers/media/usb/em28xx/em28xx-audio.c @@ -893,7 +893,7 @@ static int em28xx_audio_init(struct em28xx *dev) static int devnr; int err; - if (!dev->has_alsa_audio) { + if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) { /* This device does not support the extension (in this case the device is expecting the snd-usb-audio module or doesn't have analog audio support at all) */ @@ -975,7 +975,7 @@ static int em28xx_audio_fini(struct em28xx *dev) if (dev == NULL) return 0; - if (!dev->has_alsa_audio) { + if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) { /* This device does not support the extension (in this case the device is expecting the snd-usb-audio module or doesn't have analog audio support at all) */ @@ -1003,7 +1003,7 @@ static int em28xx_audio_suspend(struct em28xx *dev) if (dev == NULL) return 0; - if (!dev->has_alsa_audio) + if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) return 0; em28xx_info("Suspending audio extension"); @@ -1017,7 +1017,7 @@ static int em28xx_audio_resume(struct em28xx *dev) if (dev == NULL) return 0; - if (!dev->has_alsa_audio) + if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) return 0; em28xx_info("Resuming audio extension"); diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index 582c1e192472..f1425882a843 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -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", diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c index 3bbab0e468de..147d73d4f03a 100644 --- a/drivers/media/usb/em28xx/em28xx-core.c +++ b/drivers/media/usb/em28xx/em28xx-core.c @@ -513,8 +513,7 @@ int em28xx_audio_setup(struct em28xx *dev) dev->chip_id == CHIP_ID_EM28178) { /* Digital only device - don't load any alsa module */ dev->audio_mode.has_audio = false; - dev->has_audio_class = false; - dev->has_alsa_audio = false; + dev->usb_audio_type = EM28XX_USB_AUDIO_NONE; return 0; } @@ -528,8 +527,8 @@ int em28xx_audio_setup(struct em28xx *dev) cfg = EM28XX_CHIPCFG_AC97; /* Be conservative */ } else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == 0x00) { /* The device doesn't have vendor audio at all */ - dev->has_alsa_audio = false; dev->audio_mode.has_audio = false; + dev->usb_audio_type = EM28XX_USB_AUDIO_NONE; return 0; } else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) != EM28XX_CHIPCFG_AC97) { if (dev->chip_id < CHIP_ID_EM2860 && @@ -560,7 +559,8 @@ int em28xx_audio_setup(struct em28xx *dev) */ em28xx_warn("AC97 chip type couldn't be determined\n"); dev->audio_mode.ac97 = EM28XX_NO_AC97; - dev->has_alsa_audio = false; + if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR) + dev->usb_audio_type = EM28XX_USB_AUDIO_NONE; dev->audio_mode.has_audio = false; goto init_audio; } diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index 1f38163352b6..3fd176f99a23 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -312,6 +312,12 @@ struct em28xx_audio_mode { unsigned int has_audio:1; }; +enum em28xx_usb_audio_type { + EM28XX_USB_AUDIO_NONE = 0, + EM28XX_USB_AUDIO_CLASS, + EM28XX_USB_AUDIO_VENDOR, +}; + /* em28xx has two audio inputs: tuner and line in. However, on most devices, an auxiliary AC97 codec device is used. The AC97 device may have several different inputs and outputs, @@ -601,9 +607,8 @@ struct em28xx { unsigned int is_em25xx:1; /* em25xx/em276x/7x/8x family bridge */ unsigned char disconnected:1; /* device has been diconnected */ unsigned int has_video:1; - unsigned int has_audio_class:1; - unsigned int has_alsa_audio:1; unsigned int is_audio_only:1; + enum em28xx_usb_audio_type usb_audio_type; struct em28xx_board board; |