struct v4l2_rect* r = &(cam->sensor->cropcap.bounds);
const size_t imagesize = cam->module_param.force_munmap ||
io == IO_READ ?
- (p->width * p->height * p->priv)/8 :
- (r->width * r->height * p->priv)/8;
+ (p->width * p->height * p->priv) / 8 :
+ (r->width * r->height * p->priv) / 8;
void* buff = NULL;
u32 i;
}
-int
+static int
sn9c102_i2c_try_write(struct sn9c102_device* cam,
struct sn9c102_sensor* sensor, u8 address, u8 value)
{
{
struct sn9c102_device* cam = urb->context;
struct sn9c102_frame_t** f;
+ size_t imagesize;
unsigned long lock_flags;
u8 i;
int err = 0;
wake_up_interruptible(&cam->wait_stream);
}
- if ((cam->state & DEV_DISCONNECTED)||(cam->state & DEV_MISCONFIGURED))
+ if (cam->state & DEV_DISCONNECTED)
return;
+ if (cam->state & DEV_MISCONFIGURED) {
+ wake_up_interruptible(&cam->wait_frame);
+ return;
+ }
+
if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
goto resubmit_urb;
(*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
frame);
+ imagesize = (cam->sensor->pix_format.width *
+ cam->sensor->pix_format.height *
+ cam->sensor->pix_format.priv) / 8;
+
for (i = 0; i < urb->number_of_packets; i++) {
unsigned int img, len, status;
void *pos, *sof, *eof;
if (eof)
img = (eof > pos) ? eof - pos - 1 : 0;
- if ((*f)->buf.bytesused+img>(*f)->buf.length) {
+ if ((*f)->buf.bytesused+img > imagesize) {
u32 b = (*f)->buf.bytesused + img -
- (*f)->buf.length;
- img = (*f)->buf.length -
- (*f)->buf.bytesused;
+ imagesize;
+ img = imagesize - (*f)->buf.bytesused;
DBG(3, "Expected EOF not found: "
"video frame cut")
if (eof)
(*f)->buf.bytesused += img;
- if ((*f)->buf.bytesused == (*f)->buf.length ||
+ if ((*f)->buf.bytesused == imagesize ||
(cam->sensor->pix_format.pixelformat ==
V4L2_PIX_FMT_SN9C10X && eof)) {
u32 b = (*f)->buf.bytesused;
}
-int sn9c102_stream_interrupt(struct sn9c102_device* cam)
+static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
{
int err = 0;
err = wait_event_interruptible
( cam->wait_frame,
(!list_empty(&cam->outqueue)) ||
- (cam->state & DEV_DISCONNECTED) );
+ (cam->state & DEV_DISCONNECTED) ||
+ (cam->state & DEV_MISCONFIGURED) );
if (err) {
up(&cam->fileop_sem);
return err;
up(&cam->fileop_sem);
return -ENODEV;
}
+ if (cam->state & DEV_MISCONFIGURED) {
+ up(&cam->fileop_sem);
+ return -EIO;
+ }
}
f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
}
if (cam->io == IO_NONE) {
- if (!sn9c102_request_buffers(cam, 2, IO_READ)) {
+ if (!sn9c102_request_buffers(cam, cam->nreadbuffers,
+ IO_READ)) {
DBG(1, "poll() failed, not enough memory")
goto error;
}
}
-static int sn9c102_v4l2_ioctl(struct inode* inode, struct file* filp,
+static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
unsigned int cmd, void __user * arg)
{
struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
return -EFAULT;
}
- if (cam->module_param.force_munmap)
+ if (cam->module_param.force_munmap || cam->io == IO_READ)
sn9c102_release_buffers(cam);
err = sn9c102_set_crop(cam, rect);
s->pix_format.height = rect->height/scale;
memcpy(&(s->_rect), rect, sizeof(*rect));
- if (cam->module_param.force_munmap &&
+ if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
nbuffers != sn9c102_request_buffers(cam, nbuffers,
cam->io)) {
cam->state |= DEV_MISCONFIGURED;
return -EFAULT;
}
- if (cam->module_param.force_munmap)
+ if (cam->module_param.force_munmap || cam->io == IO_READ)
sn9c102_release_buffers(cam);
err += sn9c102_set_pix_format(cam, pix);
memcpy(pfmt, pix, sizeof(*pix));
memcpy(&(s->_rect), &rect, sizeof(rect));
- if (cam->module_param.force_munmap &&
+ if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
nbuffers != sn9c102_request_buffers(cam, nbuffers,
cam->io)) {
cam->state |= DEV_MISCONFIGURED;
err = wait_event_interruptible
( cam->wait_frame,
(!list_empty(&cam->outqueue)) ||
- (cam->state & DEV_DISCONNECTED) );
+ (cam->state & DEV_DISCONNECTED) ||
+ (cam->state & DEV_MISCONFIGURED) );
if (err)
return err;
if (cam->state & DEV_DISCONNECTED)
return -ENODEV;
+ if (cam->state & DEV_MISCONFIGURED)
+ return -EIO;
}
spin_lock_irqsave(&cam->queue_lock, lock_flags);
return -EIO;
}
- err = sn9c102_v4l2_ioctl(inode, filp, cmd, (void __user *)arg);
+ err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
up(&cam->fileop_sem);