diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-06-17 14:15:12 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-07-27 16:53:04 -0400 |
commit | 4f83e7b3ef938eb9a01eadf81a0f3b2c67d3afb6 (patch) | |
tree | f49cd93355efa11d2ad2ce97bb25bbeb0d4ad155 /drivers/media/video/em28xx/em28xx-audio.c | |
parent | dff0f8c279e34089128e9687d77bfc72dbb471bd (diff) |
[media] em28xx: Add support for devices with a separate audio interface
Some devices use a separate interface for the vendor audio class.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-audio.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-audio.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 47f21a382546..cff0768afbf5 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
@@ -3,9 +3,9 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2006 Markus Rechberger <mrechberger@gmail.com> | 4 | * Copyright (C) 2006 Markus Rechberger <mrechberger@gmail.com> |
5 | * | 5 | * |
6 | * Copyright (C) 2007 Mauro Carvalho Chehab <mchehab@infradead.org> | 6 | * Copyright (C) 2007-2011 Mauro Carvalho Chehab <mchehab@redhat.com> |
7 | * - Port to work with the in-kernel driver | 7 | * - Port to work with the in-kernel driver |
8 | * - Several cleanups | 8 | * - Cleanups, fixes, alsa-controls, etc. |
9 | * | 9 | * |
10 | * This driver is based on my previous au600 usb pstn audio driver | 10 | * This driver is based on my previous au600 usb pstn audio driver |
11 | * and inherits all the copyrights | 11 | * and inherits all the copyrights |
@@ -281,23 +281,27 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) | |||
281 | return -ENODEV; | 281 | return -ENODEV; |
282 | } | 282 | } |
283 | 283 | ||
284 | /* Sets volume, mute, etc */ | 284 | runtime->hw = snd_em28xx_hw_capture; |
285 | if ((dev->alt == 0 || dev->audio_ifnum) && dev->adev.users == 0) { | ||
286 | if (dev->audio_ifnum) | ||
287 | dev->alt = 1; | ||
288 | else | ||
289 | dev->alt = 7; | ||
285 | 290 | ||
286 | dev->mute = 0; | 291 | dprintk("changing alternate number on interface %d to %d\n", |
287 | mutex_lock(&dev->lock); | 292 | dev->audio_ifnum, dev->alt); |
288 | ret = em28xx_audio_analog_set(dev); | 293 | usb_set_interface(dev->udev, dev->audio_ifnum, dev->alt); |
289 | if (ret < 0) | ||
290 | goto err; | ||
291 | 294 | ||
292 | runtime->hw = snd_em28xx_hw_capture; | 295 | /* Sets volume, mute, etc */ |
293 | if (dev->alt == 0 && dev->adev.users == 0) { | 296 | dev->mute = 0; |
294 | dev->alt = 7; | 297 | mutex_lock(&dev->lock); |
295 | dprintk("changing alternate number to 7\n"); | 298 | ret = em28xx_audio_analog_set(dev); |
296 | usb_set_interface(dev->udev, 0, 7); | 299 | if (ret < 0) |
297 | } | 300 | goto err; |
298 | 301 | ||
299 | dev->adev.users++; | 302 | dev->adev.users++; |
300 | mutex_unlock(&dev->lock); | 303 | mutex_unlock(&dev->lock); |
304 | } | ||
301 | 305 | ||
302 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | 306 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
303 | dev->adev.capture_pcm_substream = substream; | 307 | dev->adev.capture_pcm_substream = substream; |
@@ -635,17 +639,17 @@ static int em28xx_audio_init(struct em28xx *dev) | |||
635 | static int devnr; | 639 | static int devnr; |
636 | int err; | 640 | int err; |
637 | 641 | ||
638 | if (dev->has_alsa_audio != 1) { | 642 | if (!dev->has_alsa_audio || dev->audio_ifnum < 0) { |
639 | /* This device does not support the extension (in this case | 643 | /* This device does not support the extension (in this case |
640 | the device is expecting the snd-usb-audio module or | 644 | the device is expecting the snd-usb-audio module or |
641 | doesn't have analog audio support at all) */ | 645 | doesn't have analog audio support at all) */ |
642 | return 0; | 646 | return 0; |
643 | } | 647 | } |
644 | 648 | ||
645 | printk(KERN_INFO "em28xx-audio.c: probing for em28x1 " | 649 | printk(KERN_INFO "em28xx-audio.c: probing for em28xx Audio Vendor Class\n"); |
646 | "non standard usbaudio\n"); | ||
647 | printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus " | 650 | printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus " |
648 | "Rechberger\n"); | 651 | "Rechberger\n"); |
652 | printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2007-2011 Mauro Carvalho Chehab\n"); | ||
649 | 653 | ||
650 | err = snd_card_create(index[devnr], "Em28xx Audio", THIS_MODULE, 0, | 654 | err = snd_card_create(index[devnr], "Em28xx Audio", THIS_MODULE, 0, |
651 | &card); | 655 | &card); |
@@ -737,7 +741,7 @@ static void __exit em28xx_alsa_unregister(void) | |||
737 | 741 | ||
738 | MODULE_LICENSE("GPL"); | 742 | MODULE_LICENSE("GPL"); |
739 | MODULE_AUTHOR("Markus Rechberger <mrechberger@gmail.com>"); | 743 | MODULE_AUTHOR("Markus Rechberger <mrechberger@gmail.com>"); |
740 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); | 744 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); |
741 | MODULE_DESCRIPTION("Em28xx Audio driver"); | 745 | MODULE_DESCRIPTION("Em28xx Audio driver"); |
742 | 746 | ||
743 | module_init(em28xx_alsa_register); | 747 | module_init(em28xx_alsa_register); |