V4L/DVB (9588): 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>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
95ea470574
commit
24a613e4b0
@@ -426,9 +426,10 @@ static int em28xx_audio_init(struct em28xx *dev)
|
|||||||
static int devnr;
|
static int devnr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (dev->has_audio_class) {
|
if (dev->has_alsa_audio != 1) {
|
||||||
/* This device does not support the extension (in this case
|
/* 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,9 +481,10 @@ static int em28xx_audio_fini(struct em28xx *dev)
|
|||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (dev->has_audio_class) {
|
if (dev->has_alsa_audio != 1) {
|
||||||
/* This device does not support the extension (in this case
|
/* 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1927,6 +1927,19 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
|
|||||||
return vfd;
|
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)
|
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)
|
if (dev->has_audio_class)
|
||||||
request_module("snd-usb-audio");
|
request_module("snd-usb-audio");
|
||||||
else
|
else if (dev->has_alsa_audio)
|
||||||
request_module("em28xx-alsa");
|
request_module("em28xx-alsa");
|
||||||
|
|
||||||
if (dev->has_dvb)
|
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 */
|
/* compute alternate max packet sizes */
|
||||||
uif = udev->actconfig->interface[0];
|
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);
|
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 */
|
/* save our data pointer in this interface device */
|
||||||
usb_set_intfdata(interface, dev);
|
usb_set_intfdata(interface, dev);
|
||||||
|
|
||||||
|
@@ -376,6 +376,7 @@ struct em28xx {
|
|||||||
unsigned int has_tda9887:1;
|
unsigned int has_tda9887:1;
|
||||||
unsigned int stream_on:1; /* Locks streams */
|
unsigned int stream_on:1; /* Locks streams */
|
||||||
unsigned int has_audio_class:1;
|
unsigned int has_audio_class:1;
|
||||||
|
unsigned int has_alsa_audio:1;
|
||||||
unsigned int has_12mhz_i2s:1;
|
unsigned int has_12mhz_i2s:1;
|
||||||
unsigned int max_range_640_480:1;
|
unsigned int max_range_640_480:1;
|
||||||
unsigned int has_dvb:1;
|
unsigned int has_dvb:1;
|
||||||
|
Reference in New Issue
Block a user