Esempio n. 1
0
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
					struct v4l2_format *f)
{
	int ret;
	struct marucam_device *dev = priv;
	struct videobuf_queue *q2 = &dev->vb_vidq;

	mutex_lock(&dev->mlock);
	if (dev->opstate != S_IDLE) {
		marucam_err("The device state is not S_IDLE\n");
		mutex_unlock(&dev->mlock);
		return -EBUSY;
	}
	mutex_lock(&q2->vb_lock);
	if (videobuf_queue_is_busy(&dev->vb_vidq)) {
		marucam_err("The videobuf queue is busy\n");
		mutex_unlock(&q2->vb_lock);
		mutex_unlock(&dev->mlock);
		return -EBUSY;
	}
	mutex_unlock(&q2->vb_lock);

	iowrite32(0, dev->mmregs + MARUCAM_DTC);
	iowrite32(f->fmt.pix.width, dev->mmregs + MARUCAM_S_DATA);
	iowrite32(f->fmt.pix.height, dev->mmregs + MARUCAM_S_DATA);
	iowrite32(f->fmt.pix.pixelformat, dev->mmregs + MARUCAM_S_DATA);
	iowrite32(f->fmt.pix.field, dev->mmregs + MARUCAM_S_DATA);

	iowrite32(0, dev->mmregs + MARUCAM_S_FMT);
	ret = (int)ioread32(dev->mmregs + MARUCAM_S_FMT);
	if (ret) {
		marucam_err("Failed to set the format: %d\n", -ret);
		mutex_unlock(&dev->mlock);
		return -ret;
	}

	f->fmt.pix.width	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.height	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.field	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.pixelformat	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.bytesperline	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.sizeimage	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.colorspace	= ioread32(dev->mmregs + MARUCAM_G_DATA);
	f->fmt.pix.priv		= ioread32(dev->mmregs + MARUCAM_G_DATA);

	dev->pixelformat	= f->fmt.pix.pixelformat;
	dev->width		= f->fmt.pix.width;
	dev->height		= f->fmt.pix.height;
	dev->vb_vidq.field	= f->fmt.pix.field;
	dev->type		= f->type;

	mutex_unlock(&dev->mlock);
	return 0;
}
Esempio n. 2
0
static int solo_set_fmt_cap(struct file *file, void *priv,
			    struct v4l2_format *f)
{
	struct solo_filehandle *fh = priv;

	if (videobuf_queue_is_busy(&fh->vidq))
		return -EBUSY;

	/* For right now, if it doesn't match our running config,
	 * then fail */
	return solo_try_fmt_cap(file, priv, f);
}