diff options
author | Luca Risolia <luca.risolia@studio.unibo.it> | 2006-02-07 19:05:27 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-20 17:49:59 -0500 |
commit | 9e47a52bf36fa4a24f56f878f4ca57eb885c78dd (patch) | |
tree | 366b55f9a85f80d3bd2877d498d0fae2034419b1 | |
parent | addf36fec058691f7ba4f95b5487d140f4a86f5a (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.txt | 19 | ||||
-rw-r--r-- | drivers/usb/media/zc0301.h | 2 | ||||
-rw-r--r-- | drivers/usb/media/zc0301_core.c | 43 | ||||
-rw-r--r-- | drivers/usb/media/zc0301_pas202bcb.c | 2 |
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 | |||
226 | of the new video frames, so you have to map the buffers again before any I/O | 225 | of the new video frames, so you have to map the buffers again before any I/O |
227 | attempts on them. | 226 | attempts on them. |
228 | 227 | ||
229 | This driver supports the standard JPEG video format. The current compression | ||
230 | quality may vary from 0 to 3 and can be selected or queried thanks to the | ||
231 | VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP V4L2 ioctl's. | ||
232 | |||
233 | 228 | ||
234 | 10. Contact information | 229 | 10. Contact information |
235 | ======================= | 230 | ======================= |
@@ -242,9 +237,9 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'. | |||
242 | 237 | ||
243 | 11. Credits | 238 | 11. 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 | ||
739 | static ssize_t | 738 | static ssize_t |
740 | zc0301_read(struct file* filp, char __user * buf, | 739 | zc0301_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 | ||
1030 | static int | 1029 | static int |
1031 | zc0301_vidioc_gs_input(struct zc0301_device* cam, void __user * arg) | 1030 | zc0301_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 | |||
1041 | static int | ||
1042 | zc0301_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 | ||