diff options
author | Hans de Goede <hdegoede@redhat.com> | 2008-11-19 15:10:47 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-12-29 14:53:39 -0500 |
commit | d01823069f40b8ff084449bf469ba558b1bc951d (patch) | |
tree | 0565f2491dfceafc9614469d496c28c0b6d16b93 /drivers/media/video | |
parent | 579ef879999f9b9e9215ad5c5bb78e168cc64dde (diff) |
V4L/DVB (9706): gspca: Use the ref counting of v4l2 for disconnection.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/gspca/gspca.c | 17 | ||||
-rw-r--r-- | drivers/media/video/gspca/gspca.h | 1 |
2 files changed, 4 insertions, 14 deletions
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 1da7a5c6a9a3..0d233c724875 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/string.h> | 30 | #include <linux/string.h> |
31 | #include <linux/pagemap.h> | 31 | #include <linux/pagemap.h> |
32 | #include <linux/io.h> | 32 | #include <linux/io.h> |
33 | #include <linux/kref.h> | ||
34 | #include <asm/page.h> | 33 | #include <asm/page.h> |
35 | #include <linux/uaccess.h> | 34 | #include <linux/uaccess.h> |
36 | #include <linux/jiffies.h> | 35 | #include <linux/jiffies.h> |
@@ -871,11 +870,11 @@ out: | |||
871 | return ret; | 870 | return ret; |
872 | } | 871 | } |
873 | 872 | ||
874 | static void gspca_delete(struct kref *kref) | 873 | static void gspca_release(struct video_device *vfd) |
875 | { | 874 | { |
876 | struct gspca_dev *gspca_dev = container_of(kref, struct gspca_dev, kref); | 875 | struct gspca_dev *gspca_dev = container_of(vfd, struct gspca_dev, vdev); |
877 | 876 | ||
878 | PDEBUG(D_STREAM, "device deleted"); | 877 | PDEBUG(D_STREAM, "device released"); |
879 | 878 | ||
880 | kfree(gspca_dev->usb_buf); | 879 | kfree(gspca_dev->usb_buf); |
881 | kfree(gspca_dev); | 880 | kfree(gspca_dev); |
@@ -908,9 +907,6 @@ static int dev_open(struct inode *inode, struct file *file) | |||
908 | 907 | ||
909 | gspca_dev->users++; | 908 | gspca_dev->users++; |
910 | 909 | ||
911 | /* one more user */ | ||
912 | kref_get(&gspca_dev->kref); | ||
913 | |||
914 | file->private_data = gspca_dev; | 910 | file->private_data = gspca_dev; |
915 | #ifdef GSPCA_DEBUG | 911 | #ifdef GSPCA_DEBUG |
916 | /* activate the v4l2 debug */ | 912 | /* activate the v4l2 debug */ |
@@ -957,8 +953,6 @@ static int dev_close(struct inode *inode, struct file *file) | |||
957 | 953 | ||
958 | PDEBUG(D_STREAM, "close done"); | 954 | PDEBUG(D_STREAM, "close done"); |
959 | 955 | ||
960 | kref_put(&gspca_dev->kref, gspca_delete); | ||
961 | |||
962 | return 0; | 956 | return 0; |
963 | } | 957 | } |
964 | 958 | ||
@@ -1827,7 +1821,7 @@ static struct video_device gspca_template = { | |||
1827 | .name = "gspca main driver", | 1821 | .name = "gspca main driver", |
1828 | .fops = &dev_fops, | 1822 | .fops = &dev_fops, |
1829 | .ioctl_ops = &dev_ioctl_ops, | 1823 | .ioctl_ops = &dev_ioctl_ops, |
1830 | .release = video_device_release, | 1824 | .release = gspca_release, |
1831 | .minor = -1, | 1825 | .minor = -1, |
1832 | }; | 1826 | }; |
1833 | 1827 | ||
@@ -1865,7 +1859,6 @@ int gspca_dev_probe(struct usb_interface *intf, | |||
1865 | err("couldn't kzalloc gspca struct"); | 1859 | err("couldn't kzalloc gspca struct"); |
1866 | return -ENOMEM; | 1860 | return -ENOMEM; |
1867 | } | 1861 | } |
1868 | kref_init(&gspca_dev->kref); | ||
1869 | gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); | 1862 | gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); |
1870 | if (!gspca_dev->usb_buf) { | 1863 | if (!gspca_dev->usb_buf) { |
1871 | err("out of memory"); | 1864 | err("out of memory"); |
@@ -1936,8 +1929,6 @@ void gspca_disconnect(struct usb_interface *intf) | |||
1936 | /* (this will call gspca_release() immediatly or on last close) */ | 1929 | /* (this will call gspca_release() immediatly or on last close) */ |
1937 | video_unregister_device(&gspca_dev->vdev); | 1930 | video_unregister_device(&gspca_dev->vdev); |
1938 | 1931 | ||
1939 | kref_put(&gspca_dev->kref, gspca_delete); | ||
1940 | |||
1941 | PDEBUG(D_PROBE, "disconnect complete"); | 1932 | PDEBUG(D_PROBE, "disconnect complete"); |
1942 | } | 1933 | } |
1943 | EXPORT_SYMBOL(gspca_disconnect); | 1934 | EXPORT_SYMBOL(gspca_disconnect); |
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h index 4ff9b8105f05..dcfc6fd2a402 100644 --- a/drivers/media/video/gspca/gspca.h +++ b/drivers/media/video/gspca/gspca.h | |||
@@ -127,7 +127,6 @@ struct gspca_dev { | |||
127 | struct video_device vdev; /* !! must be the first item */ | 127 | struct video_device vdev; /* !! must be the first item */ |
128 | struct module *module; /* subdriver handling the device */ | 128 | struct module *module; /* subdriver handling the device */ |
129 | struct usb_device *dev; | 129 | struct usb_device *dev; |
130 | struct kref kref; | ||
131 | struct file *capt_file; /* file doing video capture */ | 130 | struct file *capt_file; /* file doing video capture */ |
132 | 131 | ||
133 | struct cam cam; /* device information */ | 132 | struct cam cam; /* device information */ |