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; }
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); }