V4L/DVB (9588): Don't load em28xx audio module for digital-only devices
authorDevin Heitmueller <devin.heitmueller@gmail.com>
Wed, 12 Nov 2008 05:05:19 +0000 (02:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:32 +0000 (17:53 -0200)
Rework the logic so that the em28xx-alsa module does not get loaded for devices
that don't support analog audio (such as the em2874)

Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-audio.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h

index 4a42b29..15c03f0 100644 (file)
@@ -426,9 +426,10 @@ static int em28xx_audio_init(struct em28xx *dev)
        static int          devnr;
        int                 err;
 
-       if (dev->has_audio_class) {
+       if (dev->has_alsa_audio != 1) {
                /* This device does not support the extension (in this case
-                  the device is expecting the snd-usb-audio module) */
+                  the device is expecting the snd-usb-audio module or
+                  doesn't have analog audio support at all) */
                return 0;
        }
 
@@ -480,9 +481,10 @@ static int em28xx_audio_fini(struct em28xx *dev)
        if (dev == NULL)
                return 0;
 
-       if (dev->has_audio_class) {
+       if (dev->has_alsa_audio != 1) {
                /* This device does not support the extension (in this case
-                  the device is expecting the snd-usb-audio module */
+                  the device is expecting the snd-usb-audio module or
+                  doesn't have analog audio support at all) */
                return 0;
        }
 
index e478ccb..129bd06 100644 (file)
@@ -1927,6 +1927,19 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
        return vfd;
 }
 
+int em28xx_supports_audio_extension(struct em28xx *dev)
+{
+       /* The chip dictates whether we support the Empia analog audio
+          extension */
+       switch (dev->chip_id) {
+       case CHIP_ID_EM2874:
+               /* Either a digital-only device or provides AC97 audio */
+               return 0;
+       case CHIP_ID_EM2883:
+       default:
+               return 1;
+       }
+}
 
 static int register_analog_devices(struct em28xx *dev)
 {
@@ -2121,7 +2134,7 @@ static void request_module_async(struct work_struct *work)
 
        if (dev->has_audio_class)
                request_module("snd-usb-audio");
-       else
+       else if (dev->has_alsa_audio)
                request_module("em28xx-alsa");
 
        if (dev->has_dvb)
@@ -2230,9 +2243,6 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                }
        }
 
-       printk(KERN_INFO DRIVER_NAME " %s usb audio class\n",
-                  dev->has_audio_class ? "Has" : "Doesn't have");
-
        /* compute alternate max packet sizes */
        uif = udev->actconfig->interface[0];
 
@@ -2271,6 +2281,17 @@ static int em28xx_usb_probe(struct usb_interface *interface,
 
        em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
 
+       if (dev->has_audio_class == 0) {
+               /* We don't have a USB audio class, let's see if we support
+                  ALSA Audio */
+               dev->has_alsa_audio = em28xx_supports_audio_extension(dev);
+               if (dev->has_alsa_audio)
+                       printk(KERN_INFO DRIVER_NAME " supports alsa audio\n");
+       } else {
+               printk(KERN_INFO DRIVER_NAME " has usb audio class\n");
+       }
+
+
        /* save our data pointer in this interface device */
        usb_set_intfdata(interface, dev);
 
index 326208a..7bf08ce 100644 (file)
@@ -376,6 +376,7 @@ struct em28xx {
        unsigned int has_tda9887:1;
        unsigned int stream_on:1;       /* Locks streams */
        unsigned int has_audio_class:1;
+       unsigned int has_alsa_audio:1;
        unsigned int has_12mhz_i2s:1;
        unsigned int max_range_640_480:1;
        unsigned int has_dvb:1;