Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 366865
b: refs/heads/master
c: 823beb7
h: refs/heads/master
i:
  366863: 85d22cc
v: v3
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed Mar 25, 2013
1 parent d2da34d commit ecc5ef4
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 26 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dc6d2a2f66a156ea90924abde553560481b6b57b
refs/heads/master: 823beb7e22d04ed545e7adfcd5ec8db934218872
48 changes: 31 additions & 17 deletions trunk/drivers/media/usb/au0828/au0828-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,36 +125,48 @@ static int recv_control_msg(struct au0828_dev *dev, u16 request, u32 value,
return status;
}

static void au0828_usb_disconnect(struct usb_interface *interface)
static void au0828_usb_release(struct au0828_dev *dev)
{
struct au0828_dev *dev = usb_get_intfdata(interface);

dprintk(1, "%s()\n", __func__);

/* Digital TV */
au0828_dvb_unregister(dev);

#ifdef CONFIG_VIDEO_AU0828_V4L2
if (AUVI_INPUT(0).type != AU0828_VMUX_UNDEFINED)
au0828_analog_unregister(dev);
#endif

/* I2C */
au0828_i2c_unregister(dev);

kfree(dev);
}

#ifdef CONFIG_VIDEO_AU0828_V4L2
static void au0828_usb_v4l2_release(struct v4l2_device *v4l2_dev)
{
struct au0828_dev *dev =
container_of(v4l2_dev, struct au0828_dev, v4l2_dev);

v4l2_ctrl_handler_free(&dev->v4l2_ctrl_hdl);
v4l2_device_unregister(&dev->v4l2_dev);
au0828_usb_release(dev);
}
#endif

usb_set_intfdata(interface, NULL);
static void au0828_usb_disconnect(struct usb_interface *interface)
{
struct au0828_dev *dev = usb_get_intfdata(interface);

dprintk(1, "%s()\n", __func__);

/* Digital TV */
au0828_dvb_unregister(dev);

usb_set_intfdata(interface, NULL);
mutex_lock(&dev->mutex);
dev->usbdev = NULL;
mutex_unlock(&dev->mutex);

kfree(dev);

#ifdef CONFIG_VIDEO_AU0828_V4L2
if (AUVI_INPUT(0).type != AU0828_VMUX_UNDEFINED) {
au0828_analog_unregister(dev);
v4l2_device_disconnect(&dev->v4l2_dev);
v4l2_device_put(&dev->v4l2_dev);
return;
}
#endif
au0828_usb_release(dev);
}

static int au0828_usb_probe(struct usb_interface *interface,
Expand Down Expand Up @@ -203,6 +215,8 @@ static int au0828_usb_probe(struct usb_interface *interface,
dev->boardnr = id->driver_info;

#ifdef CONFIG_VIDEO_AU0828_V4L2
dev->v4l2_dev.release = au0828_usb_v4l2_release;

/* Create the v4l2_device */
retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
if (retval) {
Expand Down
9 changes: 1 addition & 8 deletions trunk/drivers/media/usb/au0828/au0828-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1063,14 +1063,7 @@ static int au0828_v4l2_close(struct file *filp)
res_free(fh, AU0828_RESOURCE_VBI);
}

if (dev->users == 1) {
if (dev->dev_state & DEV_DISCONNECTED) {
au0828_analog_unregister(dev);
kfree(fh);
kfree(dev);
return 0;
}

if (dev->users == 1 && video_is_registered(video_devdata(filp))) {
au0828_analog_stream_disable(dev);

au0828_uninit_isoc(dev);
Expand Down

0 comments on commit ecc5ef4

Please sign in to comment.