ChangeSet 1.1276.22.23, 2003/08/22 15:42:25-07:00, [EMAIL PROTECTED]
[PATCH] USB: convert stv680 driver to handle the driver core changes in the v4l layer
drivers/usb/media/stv680.c | 50 +++++++++++++++++++++++++++++++--------------
drivers/usb/media/stv680.h | 2 -
2 files changed, 36 insertions(+), 16 deletions(-)
diff -Nru a/drivers/usb/media/stv680.c b/drivers/usb/media/stv680.c
--- a/drivers/usb/media/stv680.c Tue Sep 2 12:46:47 2003
+++ b/drivers/usb/media/stv680.c Tue Sep 2 12:46:47 2003
@@ -1000,7 +1000,7 @@
static int stv_open (struct inode *inode, struct file *file)
{
struct video_device *dev = video_devdata(file);
- struct usb_stv *stv680 = (struct usb_stv *) dev;
+ struct usb_stv *stv680 = video_get_drvdata(dev);
int err = 0;
/* we are called with the BKL held */
@@ -1024,7 +1024,7 @@
static int stv_close (struct inode *inode, struct file *file)
{
struct video_device *dev = file->private_data;
- struct usb_stv *stv680 = (struct usb_stv *) dev;
+ struct usb_stv *stv680 = video_get_drvdata(dev);
int i;
for (i = 0; i < STV680_NUMFRAMES; i++)
@@ -1051,7 +1051,7 @@
unsigned int cmd, void *arg)
{
struct video_device *vdev = file->private_data;
- struct usb_stv *stv680 = (struct usb_stv *) vdev;
+ struct usb_stv *stv680 = video_get_drvdata(vdev);
if (!stv680->udev)
return -EIO;
@@ -1227,7 +1227,7 @@
static int stv680_mmap (struct file *file, struct vm_area_struct *vma)
{
struct video_device *dev = file->private_data;
- struct usb_stv *stv680 = (struct usb_stv *) dev;
+ struct usb_stv *stv680 = video_get_drvdata(dev);
unsigned long start = vma->vm_start;
unsigned long size = vma->vm_end-vma->vm_start;
unsigned long page, pos;
@@ -1268,7 +1268,7 @@
struct video_device *dev = file->private_data;
unsigned long int realcount = count;
int ret = 0;
- struct usb_stv *stv680 = (struct usb_stv *) dev;
+ struct usb_stv *stv680 = video_get_drvdata(dev);
unsigned long int i;
if (STV680_NUMFRAMES != 2) {
@@ -1325,14 +1325,17 @@
.type = VID_TYPE_CAPTURE,
.hardware = VID_HARDWARE_SE401,
.fops = &stv680_fops,
+ .release = video_device_release,
+ .minor = -1,
};
static int stv680_probe (struct usb_interface *intf, const struct usb_device_id *id)
{
struct usb_device *dev = interface_to_usbdev(intf);
struct usb_host_interface *interface;
- struct usb_stv *stv680;
+ struct usb_stv *stv680 = NULL;
char *camera_name = NULL;
+ int retval = 0;
/* We don't handle multi-config cameras */
if (dev->descriptor.bNumConfigurations != 1) {
@@ -1348,12 +1351,14 @@
} else {
PDEBUG (0, "STV(e): Vendor/Product ID do not match STV0680 values.");
PDEBUG (0, "STV(e): Check that the STV0680 camera is connected to the
computer.");
- return -ENODEV;
+ retval = -ENODEV;
+ goto error;
}
/* We found one */
if ((stv680 = kmalloc (sizeof (*stv680), GFP_KERNEL)) == NULL) {
PDEBUG (0, "STV(e): couldn't kmalloc stv680 struct.");
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto error;
}
memset (stv680, 0, sizeof (*stv680));
@@ -1361,21 +1366,33 @@
stv680->udev = dev;
stv680->camera_name = camera_name;
- memcpy (&stv680->vdev, &stv680_template, sizeof (stv680_template));
- memcpy (stv680->vdev.name, stv680->camera_name, strlen (stv680->camera_name));
+ stv680->vdev = video_device_alloc();
+ if (!stv680->vdev) {
+ retval = -ENOMEM;
+ goto error;
+ }
+ memcpy(stv680->vdev, &stv680_template, sizeof(stv680_template));
+ stv680->vdev->dev = &intf->dev;
+ video_set_drvdata(stv680->vdev, stv680);
+
+ memcpy (stv680->vdev->name, stv680->camera_name, strlen (stv680->camera_name));
init_waitqueue_head (&stv680->wq);
init_MUTEX (&stv680->lock);
wmb ();
- if (video_register_device (&stv680->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
- kfree (stv680);
+ if (video_register_device (stv680->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
PDEBUG (0, "STV(e): video_register_device failed");
- return -EIO;
+ retval = -EIO;
+ goto error;
}
- PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev.minor);
+ PDEBUG (0, "STV(i): registered new video device: video%d",
stv680->vdev->minor);
usb_set_intfdata (intf, stv680);
return 0;
+
+error:
+ kfree(stv680);
+ return retval;
}
static inline void usb_stv680_remove_disconnected (struct usb_stv *stv680)
@@ -1414,7 +1431,10 @@
if (stv680) {
/* We don't want people trying to open up the device */
- video_unregister_device (&stv680->vdev);
+ if (stv680->vdev) {
+ video_unregister_device(stv680->vdev);
+ stv680->vdev = NULL;
+ }
if (!stv680->user) {
usb_stv680_remove_disconnected (stv680);
} else {
diff -Nru a/drivers/usb/media/stv680.h b/drivers/usb/media/stv680.h
--- a/drivers/usb/media/stv680.h Tue Sep 2 12:46:47 2003
+++ b/drivers/usb/media/stv680.h Tue Sep 2 12:46:47 2003
@@ -89,7 +89,7 @@
/* this is almost the video structure uvd_t, with extra parameters for stv */
struct usb_stv {
- struct video_device vdev;
+ struct video_device *vdev;
struct usb_device *udev;
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel