Skip to content

Commit

Permalink
[PATCH] USB: ZC0301 driver updates
Browse files Browse the repository at this point in the history
"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 <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Luca Risolia authored and gregkh committed Mar 20, 2006
1 parent addf36f commit 9e47a52
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 29 deletions.
19 changes: 7 additions & 12 deletions Documentation/usb/zc0301.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ Some of the features of the driver are:
- available mmap or read/poll methods for video streaming through isochronous
data transfers;
- automatic detection of image sensor;
- video formats is standard JPEG in various compression qualities
(see also "Notes for V4L2 application developers" paragraph);
- video format is standard JPEG;
- full support for the capabilities of every possible image sensors that can
be connected to the ZC0301 bridges, including, for istance, red, green,
blue and global gain adjustments and exposure control (see "Supported
Expand Down Expand Up @@ -226,10 +225,6 @@ The same number of buffers as before will be allocated again to match the size
of the new video frames, so you have to map the buffers again before any I/O
attempts on them.

This driver supports the standard JPEG video format. The current compression
quality may vary from 0 to 3 and can be selected or queried thanks to the
VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP V4L2 ioctl's.


10. Contact information
=======================
Expand All @@ -242,9 +237,9 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.

11. Credits
===========
- Informations about the chip internals to enable the I2C protocol have been
taken from the documentation of the ZC030x Video4Linux1 driver written by
Andrew Birkett <[email protected]>;
- Initialization values of the ZC0301 connected to the PAS202BCB image sensor
have been taken from the SPCA5XX driver maintained by
Michel Xhaard <[email protected]>
- Informations about the chip internals needed to enable the I2C protocol have
been taken from the documentation of the ZC030x Video4Linux1 driver written
by Andrew Birkett <[email protected]>;
- Initialization values of the ZC0301 controller connected to the PAS202BCB
image sensor have been taken from the SPCA5XX driver maintained by
Michel Xhaard <[email protected]>.
2 changes: 1 addition & 1 deletion drivers/usb/media/zc0301.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
#define ZC0301_MAX_DEVICES 64
#define ZC0301_FORCE_MUNMAP 0
#define ZC0301_MAX_FRAMES 32
#define ZC0301_COMPRESSION_QUALITY 2
#define ZC0301_COMPRESSION_QUALITY 0
#define ZC0301_URBS 2
#define ZC0301_ISO_PACKETS 7
#define ZC0301_ALTERNATE_SETTING 7
Expand Down
43 changes: 28 additions & 15 deletions drivers/usb/media/zc0301_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
* *
* Copyright (C) 2006 by Luca Risolia <[email protected]> *
* *
* Informations about the chip internals to enable the I2C protocol have *
* been taken from the documentation of the ZC030x Video4Linux1 driver *
* written by Andrew Birkett <[email protected]> *
* Informations about the chip internals needed to enable the I2C protocol *
* have been taken from the documentation of the ZC030x Video4Linux1 *
* driver written by Andrew Birkett <[email protected]> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
Expand Down Expand Up @@ -54,8 +54,8 @@
#define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia"
#define ZC0301_AUTHOR_EMAIL "<[email protected]>"
#define ZC0301_MODULE_LICENSE "GPL"
#define ZC0301_MODULE_VERSION "1:1.00"
#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 0)
#define ZC0301_MODULE_VERSION "1:1.01"
#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 1)

/*****************************************************************************/

Expand Down Expand Up @@ -314,7 +314,7 @@ static void zc0301_urb_complete(struct urb *urb, struct pt_regs* regs)
if ((*f))
(*f)->state = F_QUEUED;
DBG(3, "Stream interrupted");
wake_up_interruptible(&cam->wait_stream);
wake_up(&cam->wait_stream);
}

if (cam->state & DEV_DISCONNECTED)
Expand Down Expand Up @@ -526,7 +526,7 @@ static int zc0301_stream_interrupt(struct zc0301_device* cam)
ZC0301_URB_TIMEOUT);
if (cam->state & DEV_DISCONNECTED)
return -ENODEV;
else if (!timeout) {
else if (cam->stream != STREAM_OFF) {
cam->state |= DEV_MISCONFIGURED;
DBG(1, "URB timeout reached. The camera is misconfigured. To "
"use it, close and open /dev/video%d again.",
Expand All @@ -547,8 +547,7 @@ zc0301_set_compression(struct zc0301_device* cam,

if ((r = zc0301_read_reg(cam, 0x0008)) < 0)
err += r;
err += zc0301_write_reg(cam, 0x0008,
r | 0x11 | (compression->quality >> 1));
err += zc0301_write_reg(cam, 0x0008, r | 0x11 | compression->quality);

return err ? -EIO : 0;
}
Expand Down Expand Up @@ -737,8 +736,7 @@ static int zc0301_release(struct inode* inode, struct file* filp)


static ssize_t
zc0301_read(struct file* filp, char __user * buf,
size_t count, loff_t* f_pos)
zc0301_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
{
struct zc0301_device* cam = video_get_drvdata(video_devdata(filp));
struct zc0301_frame_t* f, * i;
Expand Down Expand Up @@ -1019,6 +1017,7 @@ zc0301_vidioc_enuminput(struct zc0301_device* cam, void __user * arg)

memset(&i, 0, sizeof(i));
strcpy(i.name, "Camera");
i.type = V4L2_INPUT_TYPE_CAMERA;

if (copy_to_user(arg, &i, sizeof(i)))
return -EFAULT;
Expand All @@ -1028,7 +1027,19 @@ zc0301_vidioc_enuminput(struct zc0301_device* cam, void __user * arg)


static int
zc0301_vidioc_gs_input(struct zc0301_device* cam, void __user * arg)
zc0301_vidioc_g_input(struct zc0301_device* cam, void __user * arg)
{
int index = 0;

if (copy_to_user(arg, &index, sizeof(index)))
return -EFAULT;

return 0;
}


static int
zc0301_vidioc_s_input(struct zc0301_device* cam, void __user * arg)
{
int index;

Expand Down Expand Up @@ -1446,7 +1457,7 @@ zc0301_vidioc_s_jpegcomp(struct zc0301_device* cam, void __user * arg)
if (copy_from_user(&jc, arg, sizeof(jc)))
return -EFAULT;

if (jc.quality < 0 || jc.quality > 3)
if (jc.quality != 0)
return -EINVAL;

if (cam->stream == STREAM_ON)
Expand Down Expand Up @@ -1738,8 +1749,10 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
return zc0301_vidioc_enuminput(cam, arg);

case VIDIOC_G_INPUT:
return zc0301_vidioc_g_input(cam, arg);

case VIDIOC_S_INPUT:
return zc0301_vidioc_gs_input(cam, arg);
return zc0301_vidioc_s_input(cam, arg);

case VIDIOC_QUERYCTRL:
return zc0301_vidioc_query_ctrl(cam, arg);
Expand Down Expand Up @@ -1980,7 +1993,7 @@ static void zc0301_usb_disconnect(struct usb_interface* intf)
zc0301_stop_transfer(cam);
cam->state |= DEV_DISCONNECTED;
wake_up_interruptible(&cam->wait_frame);
wake_up_interruptible(&cam->wait_stream);
wake_up(&cam->wait_stream);
} else {
cam->state |= DEV_DISCONNECTED;
zc0301_release_resources(cam);
Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/media/zc0301_pas202bcb.c
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ static struct zc0301_sensor pas202bcb = {
.width = 640,
.height = 480,
.pixelformat = V4L2_PIX_FMT_JPEG,
.priv = 16,
.priv = 8,
},
};

Expand Down

0 comments on commit 9e47a52

Please sign in to comment.