Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp100283yba; Thu, 25 Apr 2019 18:53:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqxSZcRu/AJblf+LB+OaUOM75QfqWV2JThjsx2icxV+sgcMNAn/QcyXiwR3WBEq0jvB5GvKK X-Received: by 2002:a65:5304:: with SMTP id m4mr16385486pgq.281.1556243600187; Thu, 25 Apr 2019 18:53:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556243600; cv=none; d=google.com; s=arc-20160816; b=0lI4plTWTSlVTnbJ6dC/W5F48s4OJBTejGsu9UwjqOfoTAsMPchZOgz/pcxHKzL2Nf +Mp9n+Dhn1KeCcPkkraNKnRmhatWIv0jqnUuA3/qtUDULXj5ghb5z1QOhG/tzNz+XmGx xga/QNqbI0ZQsWEr5nV66FNivQtWcXB719fhPcDv8HaH2SgSLcNT19O+ySd0bJ2sO5ds x5bK3fihpULDwQ0ZdAKGJXgL/sYCGaz2oe85dr4ornkS8tCoJE0cMxzwRtjnszGITXza l65p5u8VZS9VIGwhQJgl8f3SC4ZGM3Vgul3/tw+ZsmK1AYqnmCtamPCDwI5KehGb5KGx tk6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=n6/O/VbZitIzQ6radjmwu/2LTYKS18f235Ies7Oh8ng=; b=YnRJJ9xL7gRPUCtrJItDN70dhB9NJMobkldYKx7UX+gOfPEjqCP/OGWygvtOaXbilO il1FtyqtvxojZYsHFFITDivSYIJ3OntLbd/Fs6tYpFv80eftG58sqwNUO116hB9yU2Xm dFR6j1+eYOXxBhyxG9slNCrorORRbQELk5WE3piu2ze9uqOwt3SSTVzEhEBpPFnKeH1/ tXne1cDiY5VIGqg+pbgsHQj5uXXQfpoqOyBB1QdQlWNRBU5sPLyB3NVhEgUsHJa9oYta v0ODGrbJvi/J7iNJyirAWqz2ZrS2yHpVWGcNRqNQzXQZDxlDCZY0BDhs22O2vxoKzANe i4gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="G80YUz/f"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b8si25009342pla.153.2019.04.25.18.53.05; Thu, 25 Apr 2019 18:53:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="G80YUz/f"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730713AbfDZB1I (ORCPT + 99 others); Thu, 25 Apr 2019 21:27:08 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:34847 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730559AbfDZB1E (ORCPT ); Thu, 25 Apr 2019 21:27:04 -0400 Received: by mail-pl1-f193.google.com with SMTP id w24so697251plp.2; Thu, 25 Apr 2019 18:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=n6/O/VbZitIzQ6radjmwu/2LTYKS18f235Ies7Oh8ng=; b=G80YUz/f0VQj5L6YyIHj3QP3xA8xpeE3Sx5XtpGWsx3zSmkQN+Ynxs390V1yZeKPNZ V3f2CUfHJ/8wOlBQOP0nFJSTFRsNxGziWFqUvtTpC/QA2xRCHizHLvSGvcAEl1oLJ98y 2TPmvjVV/U3Es7FzYNRIgTr0taHvJa+BqmKLuAU0+G8ejECus91q7AyouMeZjB/7xjjA FUA1sNSQokeBNoNfCZCoqcW8frNja6tIhvz96GmTrEHXYhN4Ao7/3w+heEYMGuruzY5L 52AhdadTEBR08YUaE49546gGmMHY6UOZKiWkF4IQVGTNXSzhQXiHIcpE61Zw0p8DF50s y5BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=n6/O/VbZitIzQ6radjmwu/2LTYKS18f235Ies7Oh8ng=; b=j0hqxYdZFXgebiJyOLCswyYXu6ZejPrv+OLtkjLLAE/BidoIKyQ7K9llqjlyEvYdPu DDC9L81+k8hNE0dcLzWDvE4iM+c7wBrAuvQ9GRweKgba2jJAquPEa4ncgXOWj2gbRmAM eD5KM6FTXqAa/VC5vEAW0l9cqhUktK/Xttjqb2+OCqOeYEO1Q6Ez9EMxdTTF22tHx6eU 50T/vwhlRkQHYzX5LNbbX59l8+TD/Fk59X3SLS/xbTvN+DB3qJiwIGiK+n8krl36sd6H SVfT5NMrmXWQbyz1xk6h2Tsw/tWvpPOlw7XBoK28Mb30F13DwsJe5rmS/3RPozOnzhul +K+g== X-Gm-Message-State: APjAAAUksaMLqOkNcp41EA+qs+0ZBZOuHgw9aHeYtA8wyRcZ4Kgblbkb op8rp4omZ4cOCAeLFfiyUjgbutk3 X-Received: by 2002:a17:902:2bc9:: with SMTP id l67mr43225429plb.237.1556242023515; Thu, 25 Apr 2019 18:27:03 -0700 (PDT) Received: from majic.sklembedded.com (c-73-202-231-77.hsd1.ca.comcast.net. [73.202.231.77]) by smtp.googlemail.com with ESMTPSA id l184sm46494230pfc.98.2019.04.25.18.27.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 Apr 2019 18:27:02 -0700 (PDT) From: Steve Longerbeam To: linux-media@vger.kernel.org Cc: Steve Longerbeam , Philipp Zabel , Mauro Carvalho Chehab , Greg Kroah-Hartman , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Rui Miguel Silva , devel@driverdev.osuosl.org (open list:STAGING SUBSYSTEM), linux-arm-kernel@lists.infradead.org (moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 5/6] media: staging/imx: Remove capture_device_set_format Date: Thu, 25 Apr 2019 18:26:46 -0700 Message-Id: <20190426012647.7128-6-slongerbeam@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190426012647.7128-1-slongerbeam@gmail.com> References: <20190426012647.7128-1-slongerbeam@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Don't propagate the source pad format to the connected capture device. It's now the responsibility of userspace to call VIDIOC_S_FMT on the capture device to ensure the capture format and compose rectangle are compatible with the connected source. To check this, validate the capture format with the source before streaming starts. Signed-off-by: Steve Longerbeam --- drivers/staging/media/imx/imx-ic-prpencvf.c | 16 +---- drivers/staging/media/imx/imx-media-capture.c | 64 +++++++++++++------ drivers/staging/media/imx/imx-media-csi.c | 16 +---- drivers/staging/media/imx/imx-media.h | 2 - drivers/staging/media/imx/imx7-media-csi.c | 18 +----- 5 files changed, 50 insertions(+), 66 deletions(-) diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c index afaa3a8b15e9..63334fd61492 100644 --- a/drivers/staging/media/imx/imx-ic-prpencvf.c +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c @@ -906,9 +906,7 @@ static int prp_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *sdformat) { struct prp_priv *priv = sd_to_priv(sd); - struct imx_media_video_dev *vdev = priv->vdev; const struct imx_media_pixfmt *cc; - struct v4l2_pix_format vdev_fmt; struct v4l2_mbus_framefmt *fmt; int ret = 0; @@ -945,19 +943,9 @@ static int prp_set_fmt(struct v4l2_subdev *sd, priv->cc[PRPENCVF_SRC_PAD] = outcc; } - if (sdformat->which == V4L2_SUBDEV_FORMAT_TRY) - goto out; - - priv->cc[sdformat->pad] = cc; + if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE) + priv->cc[sdformat->pad] = cc; - /* propagate output pad format to capture device */ - imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt, - &priv->format_mbus[PRPENCVF_SRC_PAD], - priv->cc[PRPENCVF_SRC_PAD]); - mutex_unlock(&priv->lock); - imx_media_capture_device_set_format(vdev, &vdev_fmt); - - return 0; out: mutex_unlock(&priv->lock); return ret; diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c index 555f6204660b..b77a67bda47c 100644 --- a/drivers/staging/media/imx/imx-media-capture.c +++ b/drivers/staging/media/imx/imx-media-capture.c @@ -205,7 +205,8 @@ static int capture_g_fmt_vid_cap(struct file *file, void *fh, static int __capture_try_fmt_vid_cap(struct capture_priv *priv, struct v4l2_subdev_format *fmt_src, - struct v4l2_format *f) + struct v4l2_format *f, + struct v4l2_rect *compose) { const struct imx_media_pixfmt *cc, *cc_src; @@ -247,6 +248,13 @@ static int __capture_try_fmt_vid_cap(struct capture_priv *priv, imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix, &fmt_src->format, cc); + if (compose) { + compose->left = 0; + compose->top = 0; + compose->width = fmt_src->format.width; + compose->height = fmt_src->format.height; + } + return 0; } @@ -263,7 +271,7 @@ static int capture_try_fmt_vid_cap(struct file *file, void *fh, if (ret) return ret; - return __capture_try_fmt_vid_cap(priv, &fmt_src, f); + return __capture_try_fmt_vid_cap(priv, &fmt_src, f, NULL); } static int capture_s_fmt_vid_cap(struct file *file, void *fh, @@ -271,6 +279,7 @@ static int capture_s_fmt_vid_cap(struct file *file, void *fh, { struct capture_priv *priv = video_drvdata(file); struct v4l2_subdev_format fmt_src; + struct v4l2_rect compose; int ret; if (vb2_is_busy(&priv->q)) { @@ -284,17 +293,14 @@ static int capture_s_fmt_vid_cap(struct file *file, void *fh, if (ret) return ret; - ret = __capture_try_fmt_vid_cap(priv, &fmt_src, f); + ret = __capture_try_fmt_vid_cap(priv, &fmt_src, f, &compose); if (ret) return ret; priv->vdev.fmt.fmt.pix = f->fmt.pix; priv->vdev.cc = imx_media_find_format(f->fmt.pix.pixelformat, CS_SEL_ANY, true); - priv->vdev.compose.left = 0; - priv->vdev.compose.top = 0; - priv->vdev.compose.width = fmt_src.format.width; - priv->vdev.compose.height = fmt_src.format.height; + priv->vdev.compose = compose; return 0; } @@ -524,6 +530,33 @@ static void capture_buf_queue(struct vb2_buffer *vb) spin_unlock_irqrestore(&priv->q_lock, flags); } +static int capture_validate_fmt(struct capture_priv *priv) +{ + struct v4l2_subdev_format fmt_src; + struct v4l2_rect compose; + struct v4l2_format f; + int ret; + + fmt_src.pad = priv->src_sd_pad; + fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE; + ret = v4l2_subdev_call(priv->src_sd, pad, get_fmt, NULL, &fmt_src); + if (ret) + return ret; + + v4l2_fill_pix_format(&f.fmt.pix, &fmt_src.format); + + ret = __capture_try_fmt_vid_cap(priv, &fmt_src, &f, &compose); + if (ret) + return ret; + + return (priv->vdev.fmt.fmt.pix.width != f.fmt.pix.width || + priv->vdev.fmt.fmt.pix.height != f.fmt.pix.height || + priv->vdev.cc->cs != + ipu_pixelformat_to_colorspace(f.fmt.pix.pixelformat) || + priv->vdev.compose.width != compose.width || + priv->vdev.compose.height != compose.height) ? -EINVAL : 0; +} + static int capture_start_streaming(struct vb2_queue *vq, unsigned int count) { struct capture_priv *priv = vb2_get_drv_priv(vq); @@ -531,6 +564,10 @@ static int capture_start_streaming(struct vb2_queue *vq, unsigned int count) unsigned long flags; int ret; + ret = capture_validate_fmt(priv); + if (ret) + goto return_bufs; + ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity, true); if (ret) { @@ -654,19 +691,6 @@ static struct video_device capture_videodev = { .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING, }; -void imx_media_capture_device_set_format(struct imx_media_video_dev *vdev, - struct v4l2_pix_format *pix) -{ - struct capture_priv *priv = to_capture_priv(vdev); - - mutex_lock(&priv->mutex); - priv->vdev.fmt.fmt.pix = *pix; - priv->vdev.cc = imx_media_find_format(pix->pixelformat, CS_SEL_ANY, - true); - mutex_unlock(&priv->mutex); -} -EXPORT_SYMBOL_GPL(imx_media_capture_device_set_format); - struct imx_media_buffer * imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev) { diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c index 09b89a72eaa2..68c2b1a3066a 100644 --- a/drivers/staging/media/imx/imx-media-csi.c +++ b/drivers/staging/media/imx/imx-media-csi.c @@ -1506,10 +1506,8 @@ static int csi_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *sdformat) { struct csi_priv *priv = v4l2_get_subdevdata(sd); - struct imx_media_video_dev *vdev = priv->vdev; struct v4l2_fwnode_endpoint upstream_ep = { .bus_type = 0 }; const struct imx_media_pixfmt *cc; - struct v4l2_pix_format vdev_fmt; struct v4l2_mbus_framefmt *fmt; struct v4l2_rect *crop, *compose; int ret; @@ -1561,19 +1559,9 @@ static int csi_set_fmt(struct v4l2_subdev *sd, } } - if (sdformat->which == V4L2_SUBDEV_FORMAT_TRY) - goto out; - - priv->cc[sdformat->pad] = cc; + if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE) + priv->cc[sdformat->pad] = cc; - /* propagate IDMAC output pad format to capture device */ - imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt, - &priv->format_mbus[CSI_SRC_PAD_IDMAC], - priv->cc[CSI_SRC_PAD_IDMAC]); - mutex_unlock(&priv->lock); - imx_media_capture_device_set_format(vdev, &vdev_fmt); - - return 0; out: mutex_unlock(&priv->lock); return ret; diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h index ddea972b7bc4..f928697b0491 100644 --- a/drivers/staging/media/imx/imx-media.h +++ b/drivers/staging/media/imx/imx-media.h @@ -278,8 +278,6 @@ int imx_media_capture_device_register(struct imx_media_video_dev *vdev); void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev); struct imx_media_buffer * imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev); -void imx_media_capture_device_set_format(struct imx_media_video_dev *vdev, - struct v4l2_pix_format *pix); void imx_media_capture_device_error(struct imx_media_video_dev *vdev); /* subdev group ids */ diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c index f2037aba6e0e..0ec4c57259f9 100644 --- a/drivers/staging/media/imx/imx7-media-csi.c +++ b/drivers/staging/media/imx/imx7-media-csi.c @@ -1031,11 +1031,8 @@ static int imx7_csi_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *sdformat) { struct imx7_csi *csi = v4l2_get_subdevdata(sd); - struct imx_media_video_dev *vdev = csi->vdev; const struct imx_media_pixfmt *outcc; struct v4l2_mbus_framefmt *outfmt; - struct v4l2_pix_format vdev_fmt; - struct v4l2_rect vdev_compose; const struct imx_media_pixfmt *cc; struct v4l2_mbus_framefmt *fmt; struct v4l2_subdev_format format; @@ -1080,19 +1077,8 @@ static int imx7_csi_set_fmt(struct v4l2_subdev *sd, csi->cc[IMX7_CSI_PAD_SRC] = outcc; } - if (sdformat->which == V4L2_SUBDEV_FORMAT_TRY) - goto out_unlock; - - csi->cc[sdformat->pad] = cc; - - /* propagate output pad format to capture device */ - imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt, &vdev_compose, - &csi->format_mbus[IMX7_CSI_PAD_SRC], - csi->cc[IMX7_CSI_PAD_SRC]); - mutex_unlock(&csi->lock); - imx_media_capture_device_set_format(vdev, &vdev_fmt, &vdev_compose); - - return 0; + if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE) + csi->cc[sdformat->pad] = cc; out_unlock: mutex_unlock(&csi->lock); -- 2.17.1