summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
Diffstat (limited to 'linux')
-rw-r--r--linux/drivers/media/dvb/vp7041/vp7041.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/linux/drivers/media/dvb/vp7041/vp7041.c b/linux/drivers/media/dvb/vp7041/vp7041.c
index a570adef2..ee8175c36 100644
--- a/linux/drivers/media/dvb/vp7041/vp7041.c
+++ b/linux/drivers/media/dvb/vp7041/vp7041.c
@@ -137,9 +137,10 @@ struct usb_vp7041 {
struct dvb_demux demux;
struct dvb_net dvb_net;
struct dmx_frontend frontend;
- struct dvb_i2c_bus i2c_bus;
-};
+/* i2c */
+ struct i2c_adapter *i2c;
+};
static struct dvb_frontend_info vp7041_frontend_info = {
.name = "VisionPlus VisionDTV USB-Ter (VP7041) Frontend",
@@ -745,10 +746,10 @@ static int vp7041_dvb_exit(struct usb_vp7041 *vp)
return 0;
}
-static int vp7041_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
- void *arg)
+static int vp7041_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
{
struct usb_vp7041 *vp = fe->data;
+
switch (cmd) {
case FE_GET_INFO:
dprintk("FE_GET_INFO\n");
@@ -812,16 +813,19 @@ static int vp7041_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
return 0;
}
-static void vp7041_frontend_init(struct usb_vp7041 *vp)
+static int vp7041_frontend_init(struct usb_vp7041 *vp)
{
- vp->i2c_bus.adapter = vp->adapter;
- dvb_register_frontend(vp7041_frontend_ioctl, &vp->i2c_bus, (void *)vp,
- &vp7041_frontend_info);
+ int ret;
+
+ ret = dvb_register_frontend_new(vp7041_ioctl, vp->adapter, vp, &vp7041_frontend_info, THIS_MODULE);
+ if (ret)
+ return ret;
+ return 0;
}
static void vp7041_frontend_exit(struct usb_vp7041 *vp)
{
- dvb_unregister_frontend(vp7041_frontend_ioctl, &vp->i2c_bus);
+ dvb_unregister_frontend_new(vp7041_ioctl, vp->adapter);
}
static int vp7041_exit (struct usb_vp7041 *vp)
@@ -852,7 +856,7 @@ static int vp7041_init(struct usb_vp7041 *vp)
vp->buffer = pci_alloc_consistent(NULL,8192, &vp->dma_handle);
memset(vp->buffer,0,8192);
if (!(vp->buf_urb = usb_alloc_urb(0,GFP_KERNEL))) {
- vp7041_exit(vp);
+ pci_free_consistent(NULL,8192,vp->buffer,vp->dma_handle);
return -ENOMEM;
}
spin_lock_irqsave(&vp->channel_lock,flags);
@@ -863,12 +867,25 @@ static int vp7041_init(struct usb_vp7041 *vp)
}
spin_unlock_irqrestore(&vp->channel_lock,flags);
- if ((ret = vp7041_device_init(vp)))
+ ret = vp7041_device_init(vp);
+ if (ret) {
+ vp7041_exit(vp);
return ret;
-
- if ((ret = vp7041_dvb_init(vp)))
+ }
+
+ ret = vp7041_dvb_init(vp);
+ if (ret) {
+ vp7041_exit(vp);
+ return ret;
+ }
+
+ ret = vp7041_frontend_init(vp);
+ if (ret) {
+ vp7041_dvb_exit(vp);
+ vp7041_exit(vp);
return ret;
- vp7041_frontend_init(vp);
+ }
+
return 0;
}