Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28f06ff4 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab
Browse files

[media] s5p-fimc: Do not lock both buffer queues in s_fmt



It is not necessary to lock both capture and output buffer queue while
setting format for single queue.

Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 47654df8
Loading
Loading
Loading
Loading
+31 −38
Original line number Diff line number Diff line
@@ -742,8 +742,9 @@ static int fimc_m2m_try_fmt(struct file *file, void *priv,
static int fimc_m2m_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
{
	struct fimc_ctx *ctx = priv;
	struct v4l2_device *v4l2_dev = &ctx->fimc_dev->m2m.v4l2_dev;
	struct videobuf_queue *src_vq, *dst_vq;
	struct fimc_dev *fimc = ctx->fimc_dev;
	struct v4l2_device *v4l2_dev = &fimc->m2m.v4l2_dev;
	struct videobuf_queue *vq;
	struct fimc_frame *frame;
	struct v4l2_pix_format *pix;
	unsigned long flags;
@@ -755,51 +756,43 @@ static int fimc_m2m_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
	if (ret)
		return ret;

	mutex_lock(&ctx->fimc_dev->lock);

	src_vq = v4l2_m2m_get_src_vq(ctx->m2m_ctx);
	dst_vq = v4l2_m2m_get_dst_vq(ctx->m2m_ctx);
	if (mutex_lock_interruptible(&fimc->lock))
		return -ERESTARTSYS;

	mutex_lock(&src_vq->vb_lock);
	mutex_lock(&dst_vq->vb_lock);
	vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
	mutex_lock(&vq->vb_lock);

	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
		if (videobuf_queue_is_busy(src_vq)) {
			v4l2_err(v4l2_dev, "%s queue busy\n", __func__);
	if (videobuf_queue_is_busy(vq)) {
		v4l2_err(v4l2_dev, "%s: queue (%d) busy\n", __func__, f->type);
		ret = -EBUSY;
			goto s_fmt_out;
		goto sf_out;
	}
		frame = &ctx->s_frame;

	spin_lock_irqsave(&ctx->slock, flags);
	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
		frame = &ctx->s_frame;
		ctx->state |= FIMC_SRC_FMT;
		spin_unlock_irqrestore(&ctx->slock, flags);

	} else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		if (videobuf_queue_is_busy(dst_vq)) {
			v4l2_err(v4l2_dev, "%s queue busy\n", __func__);
			ret = -EBUSY;
			goto s_fmt_out;
		}
		frame = &ctx->d_frame;
		spin_lock_irqsave(&ctx->slock, flags);
		ctx->state |= FIMC_DST_FMT;
		spin_unlock_irqrestore(&ctx->slock, flags);
	} else {
		spin_unlock_irqrestore(&ctx->slock, flags);
		v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev,
			 "Wrong buffer/video queue type (%d)\n", f->type);
		ret = -EINVAL;
		goto s_fmt_out;
		goto sf_out;
	}
	spin_unlock_irqrestore(&ctx->slock, flags);

	pix = &f->fmt.pix;
	frame->fmt = find_format(f);
	if (!frame->fmt) {
		ret = -EINVAL;
		goto s_fmt_out;
		goto sf_out;
	}

	frame->f_width	= pix->bytesperline * 8 / frame->fmt->depth;
	frame->f_height = pix->sizeimage/pix->bytesperline;
	frame->f_height	= pix->height;
	frame->width	= pix->width;
	frame->height	= pix->height;
	frame->o_width	= pix->width;
@@ -807,17 +800,17 @@ static int fimc_m2m_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
	frame->offs_h	= 0;
	frame->offs_v	= 0;
	frame->size	= (pix->width * pix->height * frame->fmt->depth) >> 3;
	src_vq->field = dst_vq->field = pix->field;
	vq->field	= pix->field;

	spin_lock_irqsave(&ctx->slock, flags);
	ctx->state |= FIMC_PARAMS;
	spin_unlock_irqrestore(&ctx->slock, flags);

	dbg("f_width= %d, f_height= %d", frame->f_width, frame->f_height);
	dbg("f_w: %d, f_h: %d", frame->f_width, frame->f_height);

s_fmt_out:
	mutex_unlock(&dst_vq->vb_lock);
	mutex_unlock(&src_vq->vb_lock);
	mutex_unlock(&ctx->fimc_dev->lock);
sf_out:
	mutex_unlock(&vq->vb_lock);
	mutex_unlock(&fimc->lock);
	return ret;
}