diff options
Diffstat (limited to 'linux')
-rw-r--r-- | linux/drivers/media/dvb/vp7041/vp7041.c | 45 |
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; } |