aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Risolia <luca.risolia@studio.unibo.it>2006-02-07 19:05:27 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-03-20 17:49:59 -0500
commit9e47a52bf36fa4a24f56f878f4ca57eb885c78dd (patch)
tree366b55f9a85f80d3bd2877d498d0fae2034419b1
parentaddf36fec058691f7ba4f95b5487d140f4a86f5a (diff)
[PATCH] USB: ZC0301 driver updates
"Cosmetic" driver updates for the ZC0301 driver: - Fix stream_interrupt() (and work around a possible kernel bug); - Fix vidioc_enum_input() and split vidioc_gs_input() in two parts; - Use wait_event_interruptible_timeout() instead of wait_event_interruptible() when waiting for video frames; - replace erroneous wake_up_interruptible(&wait_stream) with wake_up(&wait_stream); - Cosmetic cleanups in the documentation. Signed-off-by: Luca Risolia <luca.risolia@studio.unibo.it> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--Documentation/usb/zc0301.txt19
-rw-r--r--drivers/usb/media/zc0301.h2
-rw-r--r--drivers/usb/media/zc0301_core.c43
-rw-r--r--drivers/usb/media/zc0301_pas202bcb.c2
4 files changed, 37 insertions, 29 deletions
diff --git a/Documentation/usb/zc0301.txt b/Documentation/usb/zc0301.txt
index 10590bf625e4..0889ae6ac7d8 100644
--- a/Documentation/usb/zc0301.txt
+++ b/Documentation/usb/zc0301.txt
@@ -67,8 +67,7 @@ Some of the features of the driver are:
67- available mmap or read/poll methods for video streaming through isochronous 67- available mmap or read/poll methods for video streaming through isochronous
68 data transfers; 68 data transfers;
69- automatic detection of image sensor; 69- automatic detection of image sensor;
70- video formats is standard JPEG in various compression qualities 70- video format is standard JPEG;
71 (see also "Notes for V4L2 application developers" paragraph);
72- full support for the capabilities of every possible image sensors that can 71- full support for the capabilities of every possible image sensors that can
73 be connected to the ZC0301 bridges, including, for istance, red, green, 72 be connected to the ZC0301 bridges, including, for istance, red, green,
74 blue and global gain adjustments and exposure control (see "Supported 73 blue and global gain adjustments and exposure control (see "Supported
@@ -226,10 +225,6 @@ The same number of buffers as before will be allocated again to match the size
226of the new video frames, so you have to map the buffers again before any I/O 225of the new video frames, so you have to map the buffers again before any I/O
227attempts on them. 226attempts on them.
228 227
229This driver supports the standard JPEG video format. The current compression
230quality may vary from 0 to 3 and can be selected or queried thanks to the
231VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP V4L2 ioctl's.
232
233 228
23410. Contact information 22910. Contact information
235======================= 230=======================
@@ -242,9 +237,9 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
242 237
24311. Credits 23811. Credits
244=========== 239===========
245- Informations about the chip internals to enable the I2C protocol have been 240- Informations about the chip internals needed to enable the I2C protocol have
246 taken from the documentation of the ZC030x Video4Linux1 driver written by 241 been taken from the documentation of the ZC030x Video4Linux1 driver written
247 Andrew Birkett <andy@nobugs.org>; 242 by Andrew Birkett <andy@nobugs.org>;
248- Initialization values of the ZC0301 connected to the PAS202BCB image sensor 243- Initialization values of the ZC0301 controller connected to the PAS202BCB
249 have been taken from the SPCA5XX driver maintained by 244 image sensor have been taken from the SPCA5XX driver maintained by
250 Michel Xhaard <mxhaard@magic.fr> 245 Michel Xhaard <mxhaard@magic.fr>.
diff --git a/drivers/usb/media/zc0301.h b/drivers/usb/media/zc0301.h
index 6fa5075f1e3d..cb1a0823bc63 100644
--- a/drivers/usb/media/zc0301.h
+++ b/drivers/usb/media/zc0301.h
@@ -45,7 +45,7 @@
45#define ZC0301_MAX_DEVICES 64 45#define ZC0301_MAX_DEVICES 64
46#define ZC0301_FORCE_MUNMAP 0 46#define ZC0301_FORCE_MUNMAP 0
47#define ZC0301_MAX_FRAMES 32 47#define ZC0301_MAX_FRAMES 32
48#define ZC0301_COMPRESSION_QUALITY 2 48#define ZC0301_COMPRESSION_QUALITY 0
49#define ZC0301_URBS 2 49#define ZC0301_URBS 2
50#define ZC0301_ISO_PACKETS 7 50#define ZC0301_ISO_PACKETS 7
51#define ZC0301_ALTERNATE_SETTING 7 51#define ZC0301_ALTERNATE_SETTING 7
diff --git a/drivers/usb/media/zc0301_core.c b/drivers/usb/media/zc0301_core.c
index 238f60f7f472..7e8b1676d144 100644
--- a/drivers/usb/media/zc0301_core.c
+++ b/drivers/usb/media/zc0301_core.c
@@ -3,9 +3,9 @@
3 * * 3 * *
4 * Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> * 4 * Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
5 * * 5 * *
6 * Informations about the chip internals to enable the I2C protocol have * 6 * Informations about the chip internals needed to enable the I2C protocol *
7 * been taken from the documentation of the ZC030x Video4Linux1 driver * 7 * have been taken from the documentation of the ZC030x Video4Linux1 *
8 * written by Andrew Birkett <andy@nobugs.org> * 8 * driver written by Andrew Birkett <andy@nobugs.org> *
9 * * 9 * *
10 * This program is free software; you can redistribute it and/or modify * 10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by * 11 * it under the terms of the GNU General Public License as published by *
@@ -54,8 +54,8 @@
54#define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia" 54#define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia"
55#define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>" 55#define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
56#define ZC0301_MODULE_LICENSE "GPL" 56#define ZC0301_MODULE_LICENSE "GPL"
57#define ZC0301_MODULE_VERSION "1:1.00" 57#define ZC0301_MODULE_VERSION "1:1.01"
58#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 0) 58#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 1)
59 59
60/*****************************************************************************/ 60/*****************************************************************************/
61 61
@@ -314,7 +314,7 @@ static void zc0301_urb_complete(struct urb *urb, struct pt_regs* regs)
314 if ((*f)) 314 if ((*f))
315 (*f)->state = F_QUEUED; 315 (*f)->state = F_QUEUED;
316 DBG(3, "Stream interrupted"); 316 DBG(3, "Stream interrupted");
317 wake_up_interruptible(&cam->wait_stream); 317 wake_up(&cam->wait_stream);
318 } 318 }
319 319
320 if (cam->state & DEV_DISCONNECTED) 320 if (cam->state & DEV_DISCONNECTED)
@@ -526,7 +526,7 @@ static int zc0301_stream_interrupt(struct zc0301_device* cam)
526 ZC0301_URB_TIMEOUT); 526 ZC0301_URB_TIMEOUT);
527 if (cam->state & DEV_DISCONNECTED) 527 if (cam->state & DEV_DISCONNECTED)
528 return -ENODEV; 528 return -ENODEV;
529 else if (!timeout) { 529 else if (cam->stream != STREAM_OFF) {
530 cam->state |= DEV_MISCONFIGURED; 530 cam->state |= DEV_MISCONFIGURED;
531 DBG(1, "URB timeout reached. The camera is misconfigured. To " 531 DBG(1, "URB timeout reached. The camera is misconfigured. To "
532 "use it, close and open /dev/video%d again.", 532 "use it, close and open /dev/video%d again.",
@@ -547,8 +547,7 @@ zc0301_set_compression(struct zc0301_device* cam,
547 547
548 if ((r = zc0301_read_reg(cam, 0x0008)) < 0) 548 if ((r = zc0301_read_reg(cam, 0x0008)) < 0)
549 err += r; 549 err += r;
550 err += zc0301_write_reg(cam, 0x0008, 550 err += zc0301_write_reg(cam, 0x0008, r | 0x11 | compression->quality);
551 r | 0x11 | (compression->quality >> 1));
552 551
553 return err ? -EIO : 0; 552 return err ? -EIO : 0;
554} 553}
@@ -737,8 +736,7 @@ static int zc0301_release(struct inode* inode, struct file* filp)
737 736
738 737
739static ssize_t 738static ssize_t
740zc0301_read(struct file* filp, char __user * buf, 739zc0301_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
741 size_t count, loff_t* f_pos)
742{ 740{
743 struct zc0301_device* cam = video_get_drvdata(video_devdata(filp)); 741 struct zc0301_device* cam = video_get_drvdata(video_devdata(filp));
744 struct zc0301_frame_t* f, * i; 742 struct zc0301_frame_t* f, * i;
@@ -1019,6 +1017,7 @@ zc0301_vidioc_enuminput(struct zc0301_device* cam, void __user * arg)
1019 1017
1020 memset(&i, 0, sizeof(i)); 1018 memset(&i, 0, sizeof(i));
1021 strcpy(i.name, "Camera"); 1019 strcpy(i.name, "Camera");
1020 i.type = V4L2_INPUT_TYPE_CAMERA;
1022 1021
1023 if (copy_to_user(arg, &i, sizeof(i))) 1022 if (copy_to_user(arg, &i, sizeof(i)))
1024 return -EFAULT; 1023 return -EFAULT;
@@ -1028,7 +1027,19 @@ zc0301_vidioc_enuminput(struct zc0301_device* cam, void __user * arg)
1028 1027
1029 1028
1030static int 1029static int
1031zc0301_vidioc_gs_input(struct zc0301_device* cam, void __user * arg) 1030zc0301_vidioc_g_input(struct zc0301_device* cam, void __user * arg)
1031{
1032 int index = 0;
1033
1034 if (copy_to_user(arg, &index, sizeof(index)))
1035 return -EFAULT;
1036
1037 return 0;
1038}
1039
1040
1041static int
1042zc0301_vidioc_s_input(struct zc0301_device* cam, void __user * arg)
1032{ 1043{
1033 int index; 1044 int index;
1034 1045
@@ -1446,7 +1457,7 @@ zc0301_vidioc_s_jpegcomp(struct zc0301_device* cam, void __user * arg)
1446 if (copy_from_user(&jc, arg, sizeof(jc))) 1457 if (copy_from_user(&jc, arg, sizeof(jc)))
1447 return -EFAULT; 1458 return -EFAULT;
1448 1459
1449 if (jc.quality < 0 || jc.quality > 3) 1460 if (jc.quality != 0)
1450 return -EINVAL; 1461 return -EINVAL;
1451 1462
1452 if (cam->stream == STREAM_ON) 1463 if (cam->stream == STREAM_ON)
@@ -1738,8 +1749,10 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
1738 return zc0301_vidioc_enuminput(cam, arg); 1749 return zc0301_vidioc_enuminput(cam, arg);
1739 1750
1740 case VIDIOC_G_INPUT: 1751 case VIDIOC_G_INPUT:
1752 return zc0301_vidioc_g_input(cam, arg);
1753
1741 case VIDIOC_S_INPUT: 1754 case VIDIOC_S_INPUT:
1742 return zc0301_vidioc_gs_input(cam, arg); 1755 return zc0301_vidioc_s_input(cam, arg);
1743 1756
1744 case VIDIOC_QUERYCTRL: 1757 case VIDIOC_QUERYCTRL:
1745 return zc0301_vidioc_query_ctrl(cam, arg); 1758 return zc0301_vidioc_query_ctrl(cam, arg);
@@ -1980,7 +1993,7 @@ static void zc0301_usb_disconnect(struct usb_interface* intf)
1980 zc0301_stop_transfer(cam); 1993 zc0301_stop_transfer(cam);
1981 cam->state |= DEV_DISCONNECTED; 1994 cam->state |= DEV_DISCONNECTED;
1982 wake_up_interruptible(&cam->wait_frame); 1995 wake_up_interruptible(&cam->wait_frame);
1983 wake_up_interruptible(&cam->wait_stream); 1996 wake_up(&cam->wait_stream);
1984 } else { 1997 } else {
1985 cam->state |= DEV_DISCONNECTED; 1998 cam->state |= DEV_DISCONNECTED;
1986 zc0301_release_resources(cam); 1999 zc0301_release_resources(cam);
diff --git a/drivers/usb/media/zc0301_pas202bcb.c b/drivers/usb/media/zc0301_pas202bcb.c
index 83b45f1c0f4e..32b9b9329cbf 100644
--- a/drivers/usb/media/zc0301_pas202bcb.c
+++ b/drivers/usb/media/zc0301_pas202bcb.c
@@ -318,7 +318,7 @@ static struct zc0301_sensor pas202bcb = {
318 .width = 640, 318 .width = 640,
319 .height = 480, 319 .height = 480,
320 .pixelformat = V4L2_PIX_FMT_JPEG, 320 .pixelformat = V4L2_PIX_FMT_JPEG,
321 .priv = 16, 321 .priv = 8,
322 }, 322 },
323}; 323};
324 324