You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (37 commits) V4L/DVB (6382): saa7134: fix NULL dereference at suspend time for cards without IR receiver V4L/DVB (6380): ivtvfb: Removal of the 'osd_compat' module option V4L/DVB (6379): patch which improves GotView Saa7135 remote control V4L/DVB (6378b): Updates info about the removal of V4L1 at feature-removal-schedule.txt V4L/DVB (6378a): Removal of VIDIOC_[G|S]_MPEGCOMP from feature-removal-schedule.txt V4L/DVB (6378): DiB0700-device: Using 1.10 firmware V4L/DVB (6357): pvrusb2: Improve encoder chip health tracking V4L/DVB (6356): "while (!ca->wakeup)" breaks the CAM initialisation V4L/DVB (6352): ir-kbd-i2c: Missing break statement V4L/DVB (6350): V4L: possible leak in em28xx_init_isoc V4L/DVB (6348): ivtv: undo video mute when closing the radio V4L/DVB (6347): ivtv: fix video mute when radio is used V4L/DVB (6346): ivtvfb: YUV output size fix when ivtvfb is not loaded V4L/DVB (6345): ivtvfb: YUV handling of an image which is not visible in the display area V4L/DVB (6343): ivtvfb: check return value of unregister_framebuffer V4L/DVB (6342): ivtv: fix circular locking (bug 9037) V4L/DVB (6341): ivtv: fix resizing MPEG1 streams V4L/DVB (6340): ivtvfb: screen mode change sometimes goes wrong V4L/DVB (6339): ivtv: set the video color to black instead of green when capturing from the radio V4L/DVB (6338): ivtv: fix incorrect EBUSY return ...
This commit is contained in:
@@ -14,18 +14,6 @@ Who: Jiri Slaby <jirislaby@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: V4L2 VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP
|
||||
When: October 2007
|
||||
Why: Broken attempt to set MPEG compression parameters. These ioctls are
|
||||
not able to implement the wide variety of parameters that can be set
|
||||
by hardware MPEG encoders. A new MPEG control mechanism was created
|
||||
in kernel 2.6.18 that replaces these ioctls. See the V4L2 specification
|
||||
(section 1.9: Extended controls) for more information on this topic.
|
||||
Who: Hans Verkuil <hverkuil@xs4all.nl> and
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: dev->power.power_state
|
||||
When: July 2007
|
||||
Why: Broken design for runtime control over driver power states, confusing
|
||||
@@ -49,10 +37,10 @@ Who: David Miller <davem@davemloft.net>
|
||||
---------------------------
|
||||
|
||||
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
|
||||
When: December 2006
|
||||
Files: include/linux/video_decoder.h
|
||||
Check: include/linux/video_decoder.h
|
||||
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
When: December 2008
|
||||
Files: include/linux/video_decoder.h include/linux/videodev.h
|
||||
Check: include/linux/video_decoder.h include/linux/videodev.h
|
||||
Why: V4L1 AP1 was replaced by V4L2 API during migration from 2.4 to 2.6
|
||||
series. The old API have lots of drawbacks and don't provide enough
|
||||
means to work with all video and audio standards. The newer API is
|
||||
already available on the main drivers and should be used instead.
|
||||
@@ -61,7 +49,9 @@ Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
Decoder iocts are using internally to allow video drivers to
|
||||
communicate with video decoders. This should also be improved to allow
|
||||
V4L2 calls being translated into compatible internal ioctls.
|
||||
Who: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
|
||||
Compatibility ioctls will be provided, for a while, via
|
||||
v4l1-compat module.
|
||||
Who: Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
|
||||
@@ -1074,41 +1074,41 @@ EXPORT_SYMBOL_GPL(ir_codes_manli);
|
||||
/* Mike Baikov <mike@baikov.com> */
|
||||
IR_KEYTAB_TYPE ir_codes_gotview7135[IR_KEYTAB_SIZE] = {
|
||||
|
||||
[ 0x21 ] = KEY_POWER,
|
||||
[ 0x69 ] = KEY_TV,
|
||||
[ 0x33 ] = KEY_0,
|
||||
[ 0x51 ] = KEY_1,
|
||||
[ 0x31 ] = KEY_2,
|
||||
[ 0x71 ] = KEY_3,
|
||||
[ 0x3b ] = KEY_4,
|
||||
[ 0x58 ] = KEY_5,
|
||||
[ 0x41 ] = KEY_6,
|
||||
[ 0x48 ] = KEY_7,
|
||||
[ 0x30 ] = KEY_8,
|
||||
[ 0x53 ] = KEY_9,
|
||||
[ 0x73 ] = KEY_AGAIN, /* LOOP */
|
||||
[ 0x0a ] = KEY_AUDIO,
|
||||
[ 0x61 ] = KEY_PRINT, /* PREVIEW */
|
||||
[ 0x7a ] = KEY_VIDEO,
|
||||
[ 0x20 ] = KEY_CHANNELUP,
|
||||
[ 0x40 ] = KEY_CHANNELDOWN,
|
||||
[ 0x18 ] = KEY_VOLUMEDOWN,
|
||||
[ 0x50 ] = KEY_VOLUMEUP,
|
||||
[ 0x10 ] = KEY_MUTE,
|
||||
[ 0x4a ] = KEY_SEARCH,
|
||||
[ 0x7b ] = KEY_SHUFFLE, /* SNAPSHOT */
|
||||
[ 0x22 ] = KEY_RECORD,
|
||||
[ 0x62 ] = KEY_STOP,
|
||||
[ 0x78 ] = KEY_PLAY,
|
||||
[ 0x39 ] = KEY_REWIND,
|
||||
[ 0x59 ] = KEY_PAUSE,
|
||||
[ 0x19 ] = KEY_FORWARD,
|
||||
[ 0x09 ] = KEY_ZOOM,
|
||||
[ 0x11 ] = KEY_POWER,
|
||||
[ 0x35 ] = KEY_TV,
|
||||
[ 0x1b ] = KEY_0,
|
||||
[ 0x29 ] = KEY_1,
|
||||
[ 0x19 ] = KEY_2,
|
||||
[ 0x39 ] = KEY_3,
|
||||
[ 0x1f ] = KEY_4,
|
||||
[ 0x2c ] = KEY_5,
|
||||
[ 0x21 ] = KEY_6,
|
||||
[ 0x24 ] = KEY_7,
|
||||
[ 0x18 ] = KEY_8,
|
||||
[ 0x2b ] = KEY_9,
|
||||
[ 0x3b ] = KEY_AGAIN, /* LOOP */
|
||||
[ 0x06 ] = KEY_AUDIO,
|
||||
[ 0x31 ] = KEY_PRINT, /* PREVIEW */
|
||||
[ 0x3e ] = KEY_VIDEO,
|
||||
[ 0x10 ] = KEY_CHANNELUP,
|
||||
[ 0x20 ] = KEY_CHANNELDOWN,
|
||||
[ 0x0c ] = KEY_VOLUMEDOWN,
|
||||
[ 0x28 ] = KEY_VOLUMEUP,
|
||||
[ 0x08 ] = KEY_MUTE,
|
||||
[ 0x26 ] = KEY_SEARCH, /*SCAN*/
|
||||
[ 0x3f ] = KEY_SHUFFLE, /* SNAPSHOT */
|
||||
[ 0x12 ] = KEY_RECORD,
|
||||
[ 0x32 ] = KEY_STOP,
|
||||
[ 0x3c ] = KEY_PLAY,
|
||||
[ 0x1d ] = KEY_REWIND,
|
||||
[ 0x2d ] = KEY_PAUSE,
|
||||
[ 0x0d ] = KEY_FORWARD,
|
||||
[ 0x05 ] = KEY_ZOOM, /*FULL*/
|
||||
|
||||
[ 0x52 ] = KEY_F21, /* LIVE TIMESHIFT */
|
||||
[ 0x1a ] = KEY_F22, /* MIN TIMESHIFT */
|
||||
[ 0x3a ] = KEY_F23, /* TIMESHIFT */
|
||||
[ 0x70 ] = KEY_F24, /* NORMAL TIMESHIFT */
|
||||
[ 0x2a ] = KEY_F21, /* LIVE TIMESHIFT */
|
||||
[ 0x0e ] = KEY_F22, /* MIN TIMESHIFT */
|
||||
[ 0x1e ] = KEY_F23, /* TIMESHIFT */
|
||||
[ 0x38 ] = KEY_F24, /* NORMAL TIMESHIFT */
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_gotview7135);
|
||||
|
||||
@@ -345,7 +345,9 @@ static int cinergyt2_start_feed(struct dvb_demux_feed *dvbdmxfeed)
|
||||
struct dvb_demux *demux = dvbdmxfeed->demux;
|
||||
struct cinergyt2 *cinergyt2 = demux->priv;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
return -EAGAIN;
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (cinergyt2->streaming == 0)
|
||||
@@ -361,7 +363,9 @@ static int cinergyt2_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
|
||||
struct dvb_demux *demux = dvbdmxfeed->demux;
|
||||
struct cinergyt2 *cinergyt2 = demux->priv;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
return -EAGAIN;
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (--cinergyt2->streaming == 0)
|
||||
@@ -481,12 +485,16 @@ static int cinergyt2_open (struct inode *inode, struct file *file)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct cinergyt2 *cinergyt2 = dvbdev->priv;
|
||||
int err = -ERESTARTSYS;
|
||||
int err = -EAGAIN;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
goto out;
|
||||
err = mutex_lock_interruptible(&cinergyt2->wq_sem);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
err = mutex_lock_interruptible(&cinergyt2->sem);
|
||||
if (err)
|
||||
goto out_unlock1;
|
||||
|
||||
if ((err = dvb_generic_open(inode, file)))
|
||||
@@ -550,7 +558,9 @@ static unsigned int cinergyt2_poll (struct file *file, struct poll_table_struct
|
||||
struct cinergyt2 *cinergyt2 = dvbdev->priv;
|
||||
unsigned int mask = 0;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
return -EAGAIN;
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
poll_wait(file, &cinergyt2->poll_wq, wait);
|
||||
@@ -625,7 +635,9 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file,
|
||||
if (copy_from_user(&p, (void __user*) arg, sizeof(p)))
|
||||
return -EFAULT;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
return -EAGAIN;
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
param->cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS;
|
||||
@@ -996,7 +1008,9 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state)
|
||||
{
|
||||
struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
return -EAGAIN;
|
||||
if (mutex_lock_interruptible(&cinergyt2->wq_sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
cinergyt2_suspend_rc(cinergyt2);
|
||||
@@ -1017,16 +1031,18 @@ static int cinergyt2_resume (struct usb_interface *intf)
|
||||
{
|
||||
struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
|
||||
struct dvbt_set_parameters_msg *param = &cinergyt2->param;
|
||||
int err = -ERESTARTSYS;
|
||||
int err = -EAGAIN;
|
||||
|
||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
|
||||
if (cinergyt2->disconnect_pending)
|
||||
goto out;
|
||||
err = mutex_lock_interruptible(&cinergyt2->wq_sem);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||
err = mutex_lock_interruptible(&cinergyt2->sem);
|
||||
if (err)
|
||||
goto out_unlock1;
|
||||
|
||||
err = 0;
|
||||
|
||||
if (!cinergyt2->sleeping) {
|
||||
cinergyt2_sleep(cinergyt2, 0);
|
||||
cinergyt2_command(cinergyt2, (char *) param, sizeof(*param), NULL, 0);
|
||||
|
||||
@@ -972,7 +972,7 @@ static int dvb_ca_en50221_thread(void *data)
|
||||
/* main loop */
|
||||
while (!kthread_should_stop()) {
|
||||
/* sleep for a bit */
|
||||
while (!ca->wakeup) {
|
||||
if (!ca->wakeup) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(ca->delay);
|
||||
if (kthread_should_stop())
|
||||
|
||||
@@ -828,7 +828,7 @@ MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
||||
#define DIB0700_DEFAULT_DEVICE_PROPERTIES \
|
||||
.caps = DVB_USB_IS_AN_I2C_ADAPTER, \
|
||||
.usb_ctrl = DEVICE_SPECIFIC, \
|
||||
.firmware = "dvb-usb-dib0700-03-pre1.fw", \
|
||||
.firmware = "dvb-usb-dib0700-1.10.fw", \
|
||||
.download_firmware = dib0700_download_firmware, \
|
||||
.no_reconnect = 1, \
|
||||
.size_of_priv = sizeof(struct dib0700_state), \
|
||||
|
||||
@@ -229,7 +229,6 @@ static struct video_device pcm20_radio = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Miro PCM 20 radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = VID_HARDWARE_RTRACK,
|
||||
.fops = &pcm20_fops,
|
||||
.priv = &pcm20_unit
|
||||
};
|
||||
|
||||
@@ -554,7 +554,6 @@ static struct video_device gemtek_radio = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "GemTek Radio card",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = VID_HARDWARE_GEMTEK,
|
||||
.fops = &gemtek_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
||||
@@ -755,7 +755,6 @@ static struct video_device ar_template = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Colour AR VGA",
|
||||
.type = VID_TYPE_CAPTURE,
|
||||
.hardware = VID_HARDWARE_ARV,
|
||||
.fops = &ar_fops,
|
||||
.release = ar_release,
|
||||
.minor = -1,
|
||||
|
||||
@@ -3877,7 +3877,6 @@ static struct video_device bttv_video_template =
|
||||
.name = "UNSET",
|
||||
.type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|
|
||||
VID_TYPE_CLIPPING|VID_TYPE_SCALES,
|
||||
.hardware = VID_HARDWARE_BT848,
|
||||
.fops = &bttv_fops,
|
||||
.minor = -1,
|
||||
};
|
||||
@@ -3886,7 +3885,6 @@ static struct video_device bttv_vbi_template =
|
||||
{
|
||||
.name = "bt848/878 vbi",
|
||||
.type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
|
||||
.hardware = VID_HARDWARE_BT848,
|
||||
.fops = &bttv_fops,
|
||||
.minor = -1,
|
||||
};
|
||||
@@ -4034,7 +4032,6 @@ static struct video_device radio_template =
|
||||
{
|
||||
.name = "bt848/878 radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = VID_HARDWARE_BT848,
|
||||
.fops = &radio_fops,
|
||||
.minor = -1,
|
||||
};
|
||||
|
||||
@@ -899,7 +899,6 @@ static struct video_device qcam_template=
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Connectix Quickcam",
|
||||
.type = VID_TYPE_CAPTURE,
|
||||
.hardware = VID_HARDWARE_QCAM_BW,
|
||||
.fops = &qcam_fops,
|
||||
};
|
||||
|
||||
|
||||
@@ -699,7 +699,6 @@ static struct video_device qcam_template=
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Colour QuickCam",
|
||||
.type = VID_TYPE_CAPTURE,
|
||||
.hardware = VID_HARDWARE_QCAM_C,
|
||||
.fops = &qcam_fops,
|
||||
};
|
||||
|
||||
|
||||
@@ -65,10 +65,6 @@ MODULE_PARM_DESC(colorspace_conv,
|
||||
|
||||
#define ABOUT "V4L-Driver for Vision CPiA based cameras"
|
||||
|
||||
#ifndef VID_HARDWARE_CPIA
|
||||
#define VID_HARDWARE_CPIA 24 /* FIXME -> from linux/videodev.h */
|
||||
#endif
|
||||
|
||||
#define CPIA_MODULE_CPIA (0<<5)
|
||||
#define CPIA_MODULE_SYSTEM (1<<5)
|
||||
#define CPIA_MODULE_VP_CTRL (5<<5)
|
||||
@@ -3804,7 +3800,6 @@ static struct video_device cpia_template = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "CPiA Camera",
|
||||
.type = VID_TYPE_CAPTURE,
|
||||
.hardware = VID_HARDWARE_CPIA,
|
||||
.fops = &cpia_fops,
|
||||
};
|
||||
|
||||
|
||||
@@ -86,10 +86,6 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
#define ABOUT "V4L-Driver for Vision CPiA2 based cameras"
|
||||
|
||||
#ifndef VID_HARDWARE_CPIA2
|
||||
#error "VID_HARDWARE_CPIA2 should have been defined in linux/videodev.h"
|
||||
#endif
|
||||
|
||||
struct control_menu_info {
|
||||
int value;
|
||||
char name[32];
|
||||
@@ -1942,7 +1938,6 @@ static struct video_device cpia2_template = {
|
||||
.type= VID_TYPE_CAPTURE,
|
||||
.type2 = V4L2_CAP_VIDEO_CAPTURE |
|
||||
V4L2_CAP_STREAMING,
|
||||
.hardware= VID_HARDWARE_CPIA2,
|
||||
.minor= -1,
|
||||
.fops= &fops_template,
|
||||
.release= video_device_release,
|
||||
|
||||
@@ -793,7 +793,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
|
||||
dev->pci->subsystem_device);
|
||||
|
||||
cx23885_devcount--;
|
||||
goto fail_free;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* PCIe stuff */
|
||||
@@ -835,10 +835,6 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail_free:
|
||||
kfree(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
void cx23885_dev_unregister(struct cx23885_dev *dev)
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/initval.h>
|
||||
#include <sound/tlv.h>
|
||||
|
||||
#include "cx88.h"
|
||||
#include "cx88-reg.h"
|
||||
@@ -82,6 +83,7 @@ typedef struct cx88_audio_dev snd_cx88_card_t;
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Module global static vars
|
||||
****************************************************************************/
|
||||
@@ -545,8 +547,8 @@ static int __devinit snd_cx88_pcm(snd_cx88_card_t *chip, int device, char *name)
|
||||
/****************************************************************************
|
||||
CONTROL INTERFACE
|
||||
****************************************************************************/
|
||||
static int snd_cx88_capture_volume_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *info)
|
||||
static int snd_cx88_volume_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *info)
|
||||
{
|
||||
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
info->count = 2;
|
||||
@@ -556,9 +558,8 @@ static int snd_cx88_capture_volume_info(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* OK - TODO: test it */
|
||||
static int snd_cx88_capture_volume_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
static int snd_cx88_volume_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
{
|
||||
snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol);
|
||||
struct cx88_core *core=chip->core;
|
||||
@@ -573,8 +574,8 @@ static int snd_cx88_capture_volume_get(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
|
||||
/* OK - TODO: test it */
|
||||
static int snd_cx88_capture_volume_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
static int snd_cx88_volume_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
{
|
||||
snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol);
|
||||
struct cx88_core *core=chip->core;
|
||||
@@ -605,14 +606,67 @@ static int snd_cx88_capture_volume_put(struct snd_kcontrol *kcontrol,
|
||||
return changed;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new snd_cx88_capture_volume = {
|
||||
static const DECLARE_TLV_DB_SCALE(snd_cx88_db_scale, -6300, 100, 0);
|
||||
|
||||
static struct snd_kcontrol_new snd_cx88_volume = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Volume",
|
||||
.info = snd_cx88_capture_volume_info,
|
||||
.get = snd_cx88_capture_volume_get,
|
||||
.put = snd_cx88_capture_volume_put,
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
|
||||
.name = "Playback Volume",
|
||||
.info = snd_cx88_volume_info,
|
||||
.get = snd_cx88_volume_get,
|
||||
.put = snd_cx88_volume_put,
|
||||
.tlv.p = snd_cx88_db_scale,
|
||||
};
|
||||
|
||||
static int snd_cx88_switch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
{
|
||||
snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol);
|
||||
struct cx88_core *core = chip->core;
|
||||
u32 bit = kcontrol->private_value;
|
||||
|
||||
value->value.integer.value[0] = !(cx_read(AUD_VOL_CTL) & bit);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_cx88_switch_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *value)
|
||||
{
|
||||
snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol);
|
||||
struct cx88_core *core = chip->core;
|
||||
u32 bit = kcontrol->private_value;
|
||||
int ret = 0;
|
||||
u32 vol;
|
||||
|
||||
spin_lock_irq(&chip->reg_lock);
|
||||
vol = cx_read(AUD_VOL_CTL);
|
||||
if (value->value.integer.value[0] != !(vol & bit)) {
|
||||
vol ^= bit;
|
||||
cx_write(AUD_VOL_CTL, vol);
|
||||
ret = 1;
|
||||
}
|
||||
spin_unlock_irq(&chip->reg_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new snd_cx88_dac_switch = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Playback Switch",
|
||||
.info = snd_ctl_boolean_mono_info,
|
||||
.get = snd_cx88_switch_get,
|
||||
.put = snd_cx88_switch_put,
|
||||
.private_value = (1<<8),
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new snd_cx88_source_switch = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Switch",
|
||||
.info = snd_ctl_boolean_mono_info,
|
||||
.get = snd_cx88_switch_get,
|
||||
.put = snd_cx88_switch_put,
|
||||
.private_value = (1<<6),
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
Basic Flow for Sound Devices
|
||||
@@ -762,7 +816,13 @@ static int __devinit cx88_audio_initdev(struct pci_dev *pci,
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
err = snd_ctl_add(card, snd_ctl_new1(&snd_cx88_capture_volume, chip));
|
||||
err = snd_ctl_add(card, snd_ctl_new1(&snd_cx88_volume, chip));
|
||||
if (err < 0)
|
||||
goto error;
|
||||
err = snd_ctl_add(card, snd_ctl_new1(&snd_cx88_dac_switch, chip));
|
||||
if (err < 0)
|
||||
goto error;
|
||||
err = snd_ctl_add(card, snd_ctl_new1(&snd_cx88_source_switch, chip));
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
|
||||
@@ -527,44 +527,6 @@ static void blackbird_codec_settings(struct cx8802_dev *dev)
|
||||
cx2341x_update(dev, blackbird_mbox_func, NULL, &dev->params);
|
||||
}
|
||||
|
||||
static struct v4l2_mpeg_compression default_mpeg_params = {
|
||||
.st_type = V4L2_MPEG_PS_2,
|
||||
.st_bitrate = {
|
||||
.mode = V4L2_BITRATE_CBR,
|
||||
.min = 0,
|
||||
.target = 0,
|
||||
.max = 0
|
||||
},
|
||||
.ts_pid_pmt = 16,
|
||||
.ts_pid_audio = 260,
|
||||
.ts_pid_video = 256,
|
||||
.ts_pid_pcr = 259,
|
||||
.ps_size = 0,
|
||||
.au_type = V4L2_MPEG_AU_2_II,
|
||||
.au_bitrate = {
|
||||
.mode = V4L2_BITRATE_CBR,
|
||||
.min = 224,
|
||||
.target = 224,
|
||||
.max = 224
|
||||
},
|
||||
.au_sample_rate = 48000,
|
||||
.au_pesid = 0,
|
||||
.vi_type = V4L2_MPEG_VI_2,
|
||||
.vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3,
|
||||
.vi_bitrate = {
|
||||
.mode = V4L2_BITRATE_CBR,
|
||||
.min = 4000,
|
||||
.target = 4500,
|
||||
.max = 6000
|
||||
},
|
||||
.vi_frame_rate = 25,
|
||||
.vi_frames_per_gop = 12,
|
||||
.vi_bframes_count = 2,
|
||||
.vi_pesid = 0,
|
||||
.closed_gops = 1,
|
||||
.pulldown = 0
|
||||
};
|
||||
|
||||
static int blackbird_initialize_codec(struct cx8802_dev *dev)
|
||||
{
|
||||
struct cx88_core *core = dev->core;
|
||||
@@ -852,23 +814,6 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
|
||||
return videobuf_streamoff(&fh->mpegq);
|
||||
}
|
||||
|
||||
static int vidioc_g_mpegcomp (struct file *file, void *fh,
|
||||
struct v4l2_mpeg_compression *f)
|
||||
{
|
||||
printk(KERN_WARNING "VIDIOC_G_MPEGCOMP is obsolete. "
|
||||
"Replace with VIDIOC_G_EXT_CTRLS!");
|
||||
memcpy(f,&default_mpeg_params,sizeof(*f));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_s_mpegcomp (struct file *file, void *fh,
|
||||
struct v4l2_mpeg_compression *f)
|
||||
{
|
||||
printk(KERN_WARNING "VIDIOC_S_MPEGCOMP is obsolete. "
|
||||
"Replace with VIDIOC_S_EXT_CTRLS!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_ext_ctrls (struct file *file, void *priv,
|
||||
struct v4l2_ext_controls *f)
|
||||
{
|
||||
@@ -1216,8 +1161,6 @@ static struct video_device cx8802_mpeg_template =
|
||||
.vidioc_dqbuf = vidioc_dqbuf,
|
||||
.vidioc_streamon = vidioc_streamon,
|
||||
.vidioc_streamoff = vidioc_streamoff,
|
||||
.vidioc_g_mpegcomp = vidioc_g_mpegcomp,
|
||||
.vidioc_s_mpegcomp = vidioc_s_mpegcomp,
|
||||
.vidioc_g_ext_ctrls = vidioc_g_ext_ctrls,
|
||||
.vidioc_s_ext_ctrls = vidioc_s_ext_ctrls,
|
||||
.vidioc_try_ext_ctrls = vidioc_try_ext_ctrls,
|
||||
|
||||
@@ -475,8 +475,9 @@ static int dvb_register(struct cx8802_dev *dev)
|
||||
break;
|
||||
case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
|
||||
#if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
|
||||
/* MT352 is on a secondary I2C bus made from some GPIO lines */
|
||||
dev->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
|
||||
&((struct vp3054_i2c_state *)dev->card_priv)->adap);
|
||||
&dev->vp3054->adap);
|
||||
if (dev->dvb.frontend != NULL) {
|
||||
dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61,
|
||||
&dev->core->i2c_adap, DVB_PLL_FMD1216ME);
|
||||
|
||||
@@ -79,7 +79,8 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
|
||||
{
|
||||
struct cx88_core *core = dev->core;
|
||||
|
||||
dprintk(1, "cx8802_start_dma w: %d, h: %d, f: %d\n", dev->width, dev->height, buf->vb.field);
|
||||
dprintk(1, "cx8802_start_dma w: %d, h: %d, f: %d\n",
|
||||
buf->vb.width, buf->vb.height, buf->vb.field);
|
||||
|
||||
/* setup fifo + format */
|
||||
cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28],
|
||||
@@ -177,7 +178,6 @@ static int cx8802_restart_queue(struct cx8802_dev *dev,
|
||||
struct cx88_dmaqueue *q)
|
||||
{
|
||||
struct cx88_buffer *buf;
|
||||
struct list_head *item;
|
||||
|
||||
dprintk( 1, "cx8802_restart_queue\n" );
|
||||
if (list_empty(&q->active))
|
||||
@@ -223,10 +223,8 @@ static int cx8802_restart_queue(struct cx8802_dev *dev,
|
||||
dprintk(2,"restart_queue [%p/%d]: restart dma\n",
|
||||
buf, buf->vb.i);
|
||||
cx8802_start_dma(dev, q, buf);
|
||||
list_for_each(item,&q->active) {
|
||||
buf = list_entry(item, struct cx88_buffer, vb.queue);
|
||||
list_for_each_entry(buf, &q->active, vb.queue)
|
||||
buf->count = q->count++;
|
||||
}
|
||||
mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
|
||||
return 0;
|
||||
}
|
||||
@@ -572,42 +570,29 @@ int cx8802_resume_common(struct pci_dev *pci_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_VIDEO_CX88_BLACKBIRD) || \
|
||||
defined(CONFIG_VIDEO_CX88_BLACKBIRD_MODULE)
|
||||
struct cx8802_dev * cx8802_get_device(struct inode *inode)
|
||||
{
|
||||
int minor = iminor(inode);
|
||||
struct cx8802_dev *h = NULL;
|
||||
struct list_head *list;
|
||||
struct cx8802_dev *dev;
|
||||
|
||||
list_for_each(list,&cx8802_devlist) {
|
||||
h = list_entry(list, struct cx8802_dev, devlist);
|
||||
if (h->mpeg_dev && h->mpeg_dev->minor == minor)
|
||||
return h;
|
||||
}
|
||||
list_for_each_entry(dev, &cx8802_devlist, devlist)
|
||||
if (dev->mpeg_dev && dev->mpeg_dev->minor == minor)
|
||||
return dev;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(cx8802_get_device);
|
||||
#endif
|
||||
|
||||
struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board_type btype)
|
||||
{
|
||||
struct cx8802_dev *h = NULL;
|
||||
struct cx8802_driver *d = NULL;
|
||||
struct list_head *list;
|
||||
struct list_head *list2;
|
||||
struct cx8802_driver *d;
|
||||
|
||||
list_for_each(list,&cx8802_devlist) {
|
||||
h = list_entry(list, struct cx8802_dev, devlist);
|
||||
if (h != dev)
|
||||
continue;
|
||||
|
||||
list_for_each(list2, &h->drvlist.devlist) {
|
||||
d = list_entry(list2, struct cx8802_driver, devlist);
|
||||
|
||||
/* only unregister the correct driver type */
|
||||
if (d->type_id == btype) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
}
|
||||
list_for_each_entry(d, &dev->drvlist, drvlist)
|
||||
if (d->type_id == btype)
|
||||
return d;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -671,10 +656,9 @@ static int cx8802_check_driver(struct cx8802_driver *drv)
|
||||
|
||||
int cx8802_register_driver(struct cx8802_driver *drv)
|
||||
{
|
||||
struct cx8802_dev *h;
|
||||
struct cx8802_dev *dev;
|
||||
struct cx8802_driver *driver;
|
||||
struct list_head *list;
|
||||
int err = 0, i = 0;
|
||||
int err, i = 0;
|
||||
|
||||
printk(KERN_INFO
|
||||
"cx88/2: registering cx8802 driver, type: %s access: %s\n",
|
||||
@@ -686,14 +670,12 @@ int cx8802_register_driver(struct cx8802_driver *drv)
|
||||
return err;
|
||||
}
|
||||
|
||||
list_for_each(list,&cx8802_devlist) {
|
||||
h = list_entry(list, struct cx8802_dev, devlist);
|
||||
|
||||
list_for_each_entry(dev, &cx8802_devlist, devlist) {
|
||||
printk(KERN_INFO
|
||||
"%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
|
||||
h->core->name, h->pci->subsystem_vendor,
|
||||
h->pci->subsystem_device, h->core->board.name,
|
||||
h->core->boardnr);
|
||||
dev->core->name, dev->pci->subsystem_vendor,
|
||||
dev->pci->subsystem_device, dev->core->board.name,
|
||||
dev->core->boardnr);
|
||||
|
||||
/* Bring up a new struct for each driver instance */
|
||||
driver = kzalloc(sizeof(*drv),GFP_KERNEL);
|
||||
@@ -701,7 +683,7 @@ int cx8802_register_driver(struct cx8802_driver *drv)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Snapshot of the driver registration data */
|
||||
drv->core = h->core;
|
||||
drv->core = dev->core;
|
||||
drv->suspend = cx8802_suspend_common;
|
||||
drv->resume = cx8802_resume_common;
|
||||
drv->request_acquire = cx8802_request_acquire;
|
||||
@@ -712,49 +694,38 @@ int cx8802_register_driver(struct cx8802_driver *drv)
|
||||
if (err == 0) {
|
||||
i++;
|
||||
mutex_lock(&drv->core->lock);
|
||||
list_add_tail(&driver->devlist,&h->drvlist.devlist);
|
||||
list_add_tail(&driver->drvlist, &dev->drvlist);
|
||||
mutex_unlock(&drv->core->lock);
|
||||
} else {
|
||||
printk(KERN_ERR
|
||||
"%s/2: cx8802 probe failed, err = %d\n",
|
||||
h->core->name, err);
|
||||
dev->core->name, err);
|
||||
}
|
||||
|
||||
}
|
||||
if (i == 0)
|
||||
err = -ENODEV;
|
||||
else
|
||||
err = 0;
|
||||
|
||||
return err;
|
||||
return i ? 0 : -ENODEV;
|
||||
}
|
||||
|
||||
int cx8802_unregister_driver(struct cx8802_driver *drv)
|
||||
{
|
||||
struct cx8802_dev *h;
|
||||
struct cx8802_driver *d;
|
||||
struct list_head *list;
|
||||
struct list_head *list2, *q;
|
||||
int err = 0, i = 0;
|
||||
struct cx8802_dev *dev;
|
||||
struct cx8802_driver *d, *dtmp;
|
||||
int err = 0;
|
||||
|
||||
printk(KERN_INFO
|
||||
"cx88/2: unregistering cx8802 driver, type: %s access: %s\n",
|
||||
drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird",
|
||||
drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive");
|
||||
|
||||
list_for_each(list,&cx8802_devlist) {
|
||||
i++;
|
||||
h = list_entry(list, struct cx8802_dev, devlist);
|
||||
|
||||
list_for_each_entry(dev, &cx8802_devlist, devlist) {
|
||||
printk(KERN_INFO
|
||||
"%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
|
||||
h->core->name, h->pci->subsystem_vendor,
|
||||
h->pci->subsystem_device, h->core->board.name,
|
||||
h->core->boardnr);
|
||||
|
||||
list_for_each_safe(list2, q, &h->drvlist.devlist) {
|
||||
d = list_entry(list2, struct cx8802_driver, devlist);
|
||||
dev->core->name, dev->pci->subsystem_vendor,
|
||||
dev->pci->subsystem_device, dev->core->board.name,
|
||||
dev->core->boardnr);
|
||||
|
||||
list_for_each_entry_safe(d, dtmp, &dev->drvlist, drvlist) {
|
||||
/* only unregister the correct driver type */
|
||||
if (d->type_id != drv->type_id)
|
||||
continue;
|
||||
@@ -762,12 +733,12 @@ int cx8802_unregister_driver(struct cx8802_driver *drv)
|
||||
err = d->remove(d);
|
||||
if (err == 0) {
|
||||
mutex_lock(&drv->core->lock);
|
||||
list_del(list2);
|
||||
list_del(&d->drvlist);
|
||||
mutex_unlock(&drv->core->lock);
|
||||
kfree(d);
|
||||
} else
|
||||
printk(KERN_ERR "%s/2: cx8802 driver remove "
|
||||
"failed (%d)\n", h->core->name, err);
|
||||
|
||||
"failed (%d)\n", dev->core->name, err);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -805,7 +776,7 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
|
||||
if (err != 0)
|
||||
goto fail_free;
|
||||
|
||||
INIT_LIST_HEAD(&dev->drvlist.devlist);
|
||||
INIT_LIST_HEAD(&dev->drvlist);
|
||||
list_add_tail(&dev->devlist,&cx8802_devlist);
|
||||
|
||||
/* Maintain a reference so cx88-video can query the 8802 device. */
|
||||
@@ -825,23 +796,30 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
|
||||
static void __devexit cx8802_remove(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct cx8802_dev *dev;
|
||||
struct cx8802_driver *h;
|
||||
struct list_head *list;
|
||||
|
||||
dev = pci_get_drvdata(pci_dev);
|
||||
|
||||
dprintk( 1, "%s\n", __FUNCTION__);
|
||||
|
||||
list_for_each(list,&dev->drvlist.devlist) {
|
||||
h = list_entry(list, struct cx8802_driver, devlist);
|
||||
dprintk( 1, " ->driver\n");
|
||||
if (h->remove == NULL) {
|
||||
printk(KERN_ERR "%s .. skipping driver, no probe function\n", __FUNCTION__);
|
||||
continue;
|
||||
if (!list_empty(&dev->drvlist)) {
|
||||
struct cx8802_driver *drv, *tmp;
|
||||
int err;
|
||||
|
||||
printk(KERN_WARNING "%s/2: Trying to remove cx8802 driver "
|
||||
"while cx8802 sub-drivers still loaded?!\n",
|
||||
dev->core->name);
|
||||
|
||||
list_for_each_entry_safe(drv, tmp, &dev->drvlist, drvlist) {
|
||||
err = drv->remove(drv);
|
||||
if (err == 0) {
|
||||
mutex_lock(&drv->core->lock);
|
||||
list_del(&drv->drvlist);
|
||||
mutex_unlock(&drv->core->lock);
|
||||
} else
|
||||
printk(KERN_ERR "%s/2: cx8802 driver remove "
|
||||
"failed (%d)\n", dev->core->name, err);
|
||||
kfree(drv);
|
||||
}
|
||||
printk(KERN_INFO "%s .. Removing driver type %d\n", __FUNCTION__, h->type_id);
|
||||
cx8802_unregister_driver(h);
|
||||
list_del(&dev->drvlist.devlist);
|
||||
}
|
||||
|
||||
/* Destroy any 8802 reference. */
|
||||
@@ -901,7 +879,6 @@ EXPORT_SYMBOL(cx8802_fini_common);
|
||||
|
||||
EXPORT_SYMBOL(cx8802_register_driver);
|
||||
EXPORT_SYMBOL(cx8802_unregister_driver);
|
||||
EXPORT_SYMBOL(cx8802_get_device);
|
||||
EXPORT_SYMBOL(cx8802_get_driver);
|
||||
/* ----------------------------------------------------------- */
|
||||
/*
|
||||
|
||||
@@ -1675,7 +1675,6 @@ static struct video_device cx8800_radio_template =
|
||||
{
|
||||
.name = "cx8800-radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &radio_fops,
|
||||
.minor = -1,
|
||||
.vidioc_querycap = radio_querycap,
|
||||
|
||||
@@ -41,7 +41,7 @@ static void vp3054_bit_setscl(void *data, int state)
|
||||
{
|
||||
struct cx8802_dev *dev = data;
|
||||
struct cx88_core *core = dev->core;
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->card_priv;
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->vp3054;
|
||||
|
||||
if (state) {
|
||||
vp3054_i2c->state |= 0x0001; /* SCL high */
|
||||
@@ -58,7 +58,7 @@ static void vp3054_bit_setsda(void *data, int state)
|
||||
{
|
||||
struct cx8802_dev *dev = data;
|
||||
struct cx88_core *core = dev->core;
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->card_priv;
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->vp3054;
|
||||
|
||||
if (state) {
|
||||
vp3054_i2c->state |= 0x0002; /* SDA high */
|
||||
@@ -113,10 +113,10 @@ int vp3054_i2c_probe(struct cx8802_dev *dev)
|
||||
if (core->boardnr != CX88_BOARD_DNTV_LIVE_DVB_T_PRO)
|
||||
return 0;
|
||||
|
||||
dev->card_priv = kzalloc(sizeof(*vp3054_i2c), GFP_KERNEL);
|
||||
if (dev->card_priv == NULL)
|
||||
vp3054_i2c = kzalloc(sizeof(*vp3054_i2c), GFP_KERNEL);
|
||||
if (vp3054_i2c == NULL)
|
||||
return -ENOMEM;
|
||||
vp3054_i2c = dev->card_priv;
|
||||
dev->vp3054 = vp3054_i2c;
|
||||
|
||||
memcpy(&vp3054_i2c->algo, &vp3054_i2c_algo_template,
|
||||
sizeof(vp3054_i2c->algo));
|
||||
@@ -139,8 +139,8 @@ int vp3054_i2c_probe(struct cx8802_dev *dev)
|
||||
if (0 != rc) {
|
||||
printk("%s: vp3054_i2c register FAILED\n", core->name);
|
||||
|
||||
kfree(dev->card_priv);
|
||||
dev->card_priv = NULL;
|
||||
kfree(dev->vp3054);
|
||||
dev->vp3054 = NULL;
|
||||
}
|
||||
|
||||
return rc;
|
||||
@@ -148,7 +148,7 @@ int vp3054_i2c_probe(struct cx8802_dev *dev)
|
||||
|
||||
void vp3054_i2c_remove(struct cx8802_dev *dev)
|
||||
{
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->card_priv;
|
||||
struct vp3054_i2c_state *vp3054_i2c = dev->vp3054;
|
||||
|
||||
if (vp3054_i2c == NULL ||
|
||||
dev->core->boardnr != CX88_BOARD_DNTV_LIVE_DVB_T_PRO)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user