summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2008-11-12 05:05:19 +0000
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-11-12 05:05:19 +0000
commitb4d980248bc67a682e8762f9471a3966503d0a42 (patch)
treea1fc88c63e2647fd6afc869eea891f6457036c6c /linux
parente3afb5932ce80a7a6bb8b796801e21b684b31611 (diff)
downloadmediapointer-dvb-s2-b4d980248bc67a682e8762f9471a3966503d0a42.tar.gz
mediapointer-dvb-s2-b4d980248bc67a682e8762f9471a3966503d0a42.tar.bz2
Don't load em28xx audio module for digital-only devices
From: Devin Heitmueller <devin.heitmueller@gmail.com> Don't load em28xx audio module for digital-only devices 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>
Diffstat (limited to 'linux')
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-audio.c10
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c29
-rw-r--r--linux/drivers/media/video/em28xx/em28xx.h1
3 files changed, 32 insertions, 8 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-audio.c b/linux/drivers/media/video/em28xx/em28xx-audio.c
index cabce87b7..b86b0870d 100644
--- a/linux/drivers/media/video/em28xx/em28xx-audio.c
+++ b/linux/drivers/media/video/em28xx/em28xx-audio.c
@@ -498,9 +498,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;
}
@@ -552,9 +553,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;
}
diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c
index 6332eb07e..19684ad45 100644
--- a/linux/drivers/media/video/em28xx/em28xx-video.c
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c
@@ -1984,6 +1984,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;
+ }
+}
/*
* em28xx_init_dev()
@@ -2173,7 +2186,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)
@@ -2287,9 +2300,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];
@@ -2324,6 +2334,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);
diff --git a/linux/drivers/media/video/em28xx/em28xx.h b/linux/drivers/media/video/em28xx/em28xx.h
index d752d9cac..12507422f 100644
--- a/linux/drivers/media/video/em28xx/em28xx.h
+++ b/linux/drivers/media/video/em28xx/em28xx.h
@@ -382,6 +382,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;