From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
To: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-sunxi@lists.linux.dev
Cc: Yong Deng <yong.deng@magewell.com>,
Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Chen-Yu Tsai <wens@csie.org>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Samuel Holland <samuel@sholland.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: [PATCH v3 34/46] media: sun6i-csi: Implement capture link validation with logic
Date: Fri, 11 Mar 2022 15:35:20 +0100 [thread overview]
Message-ID: <20220311143532.265091-35-paul.kocialkowski@bootlin.com> (raw)
In-Reply-To: <20220311143532.265091-1-paul.kocialkowski@bootlin.com>
Rework the capture link validate implementation with actual logic that
reflects the possibilities of the device instead of the combinatory
helper functions, using the match list when needed.
Remove the previous dedicated helper.
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
---
.../platform/sunxi/sun6i-csi/sun6i_csi.c | 120 ------------------
.../platform/sunxi/sun6i-csi/sun6i_csi.h | 9 --
.../sunxi/sun6i-csi/sun6i_csi_capture.c | 106 +++++++++-------
3 files changed, 62 insertions(+), 173 deletions(-)
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
index b0aa5cfdd681..298a0c74d12c 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
@@ -28,126 +28,6 @@
#include "sun6i_csi.h"
#include "sun6i_csi_reg.h"
-/* Helpers */
-
-/* TODO add 10&12 bit YUV, RGB support */
-bool sun6i_csi_is_format_supported(struct sun6i_csi_device *csi_dev,
- u32 pixformat, u32 mbus_code)
-{
- struct v4l2_fwnode_endpoint *endpoint =
- &csi_dev->bridge.source->endpoint;
-
- /*
- * Some video receivers have the ability to be compatible with
- * 8bit and 16bit bus width.
- * Identify the media bus format from device tree.
- */
- if ((endpoint->bus_type == V4L2_MBUS_PARALLEL
- || endpoint->bus_type == V4L2_MBUS_BT656)
- && endpoint->bus.parallel.bus_width == 16) {
- switch (pixformat) {
- case V4L2_PIX_FMT_NV12_16L16:
- case V4L2_PIX_FMT_NV12:
- case V4L2_PIX_FMT_NV21:
- case V4L2_PIX_FMT_NV16:
- case V4L2_PIX_FMT_NV61:
- case V4L2_PIX_FMT_YUV420:
- case V4L2_PIX_FMT_YVU420:
- case V4L2_PIX_FMT_YUV422P:
- switch (mbus_code) {
- case MEDIA_BUS_FMT_UYVY8_1X16:
- case MEDIA_BUS_FMT_VYUY8_1X16:
- case MEDIA_BUS_FMT_YUYV8_1X16:
- case MEDIA_BUS_FMT_YVYU8_1X16:
- return true;
- default:
- dev_dbg(csi_dev->dev,
- "Unsupported mbus code: 0x%x\n",
- mbus_code);
- break;
- }
- break;
- default:
- dev_dbg(csi_dev->dev, "Unsupported pixformat: 0x%x\n",
- pixformat);
- break;
- }
- return false;
- }
-
- switch (pixformat) {
- case V4L2_PIX_FMT_SBGGR8:
- return (mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8);
- case V4L2_PIX_FMT_SGBRG8:
- return (mbus_code == MEDIA_BUS_FMT_SGBRG8_1X8);
- case V4L2_PIX_FMT_SGRBG8:
- return (mbus_code == MEDIA_BUS_FMT_SGRBG8_1X8);
- case V4L2_PIX_FMT_SRGGB8:
- return (mbus_code == MEDIA_BUS_FMT_SRGGB8_1X8);
- case V4L2_PIX_FMT_SBGGR10:
- return (mbus_code == MEDIA_BUS_FMT_SBGGR10_1X10);
- case V4L2_PIX_FMT_SGBRG10:
- return (mbus_code == MEDIA_BUS_FMT_SGBRG10_1X10);
- case V4L2_PIX_FMT_SGRBG10:
- return (mbus_code == MEDIA_BUS_FMT_SGRBG10_1X10);
- case V4L2_PIX_FMT_SRGGB10:
- return (mbus_code == MEDIA_BUS_FMT_SRGGB10_1X10);
- case V4L2_PIX_FMT_SBGGR12:
- return (mbus_code == MEDIA_BUS_FMT_SBGGR12_1X12);
- case V4L2_PIX_FMT_SGBRG12:
- return (mbus_code == MEDIA_BUS_FMT_SGBRG12_1X12);
- case V4L2_PIX_FMT_SGRBG12:
- return (mbus_code == MEDIA_BUS_FMT_SGRBG12_1X12);
- case V4L2_PIX_FMT_SRGGB12:
- return (mbus_code == MEDIA_BUS_FMT_SRGGB12_1X12);
-
- case V4L2_PIX_FMT_YUYV:
- return (mbus_code == MEDIA_BUS_FMT_YUYV8_2X8);
- case V4L2_PIX_FMT_YVYU:
- return (mbus_code == MEDIA_BUS_FMT_YVYU8_2X8);
- case V4L2_PIX_FMT_UYVY:
- return (mbus_code == MEDIA_BUS_FMT_UYVY8_2X8);
- case V4L2_PIX_FMT_VYUY:
- return (mbus_code == MEDIA_BUS_FMT_VYUY8_2X8);
-
- case V4L2_PIX_FMT_NV12_16L16:
- case V4L2_PIX_FMT_NV12:
- case V4L2_PIX_FMT_NV21:
- case V4L2_PIX_FMT_NV16:
- case V4L2_PIX_FMT_NV61:
- case V4L2_PIX_FMT_YUV420:
- case V4L2_PIX_FMT_YVU420:
- case V4L2_PIX_FMT_YUV422P:
- switch (mbus_code) {
- case MEDIA_BUS_FMT_UYVY8_2X8:
- case MEDIA_BUS_FMT_VYUY8_2X8:
- case MEDIA_BUS_FMT_YUYV8_2X8:
- case MEDIA_BUS_FMT_YVYU8_2X8:
- return true;
- default:
- dev_dbg(csi_dev->dev, "Unsupported mbus code: 0x%x\n",
- mbus_code);
- break;
- }
- break;
-
- case V4L2_PIX_FMT_RGB565:
- return (mbus_code == MEDIA_BUS_FMT_RGB565_2X8_LE);
- case V4L2_PIX_FMT_RGB565X:
- return (mbus_code == MEDIA_BUS_FMT_RGB565_2X8_BE);
-
- case V4L2_PIX_FMT_JPEG:
- return (mbus_code == MEDIA_BUS_FMT_JPEG_1X8);
-
- default:
- dev_dbg(csi_dev->dev, "Unsupported pixformat: 0x%x\n",
- pixformat);
- break;
- }
-
- return false;
-}
-
/* Media */
static const struct media_device_ops sun6i_csi_media_ops = {
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
index 21932aae3636..941c88920669 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
@@ -52,13 +52,4 @@ struct sun6i_csi_variant {
unsigned long clk_mod_rate;
};
-/**
- * sun6i_csi_is_format_supported() - check if the format supported by csi
- * @csi: pointer to the csi
- * @pixformat: v4l2 pixel format (V4L2_PIX_FMT_*)
- * @mbus_code: media bus format code (MEDIA_BUS_FMT_*)
- */
-bool sun6i_csi_is_format_supported(struct sun6i_csi_device *csi_dev,
- u32 pixformat, u32 mbus_code);
-
#endif /* __SUN6I_CSI_H__ */
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
index 91f2295cbdc6..be1a4fe8fe5f 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
@@ -1131,63 +1131,81 @@ static const struct v4l2_file_operations sun6i_csi_capture_fops = {
/* Media Entity */
-static int
-sun6i_csi_capture_link_validate_get_format(struct media_pad *pad,
- struct v4l2_subdev_format *fmt)
+static int sun6i_csi_capture_link_validate(struct media_link *link)
{
- if (is_media_entity_v4l2_subdev(pad->entity)) {
- struct v4l2_subdev *sd =
- media_entity_to_v4l2_subdev(pad->entity);
+ struct video_device *video_dev =
+ media_entity_to_video_device(link->sink->entity);
+ struct sun6i_csi_device *csi_dev = video_get_drvdata(video_dev);
+ struct v4l2_device *v4l2_dev = &csi_dev->v4l2.v4l2_dev;
+ const struct sun6i_csi_capture_format *capture_format;
+ const struct sun6i_csi_bridge_format *bridge_format;
+ unsigned int capture_width, capture_height;
+ unsigned int bridge_width, bridge_height;
+ const struct v4l2_format_info *format_info;
+ u32 pixelformat, capture_field;
+ u32 mbus_code, bridge_field;
+ bool match;
- fmt->which = V4L2_SUBDEV_FORMAT_ACTIVE;
- fmt->pad = pad->index;
- return v4l2_subdev_call(sd, pad, get_fmt, NULL, fmt);
- }
+ sun6i_csi_capture_dimensions(csi_dev, &capture_width, &capture_height);
- return -EINVAL;
-}
+ sun6i_csi_capture_format(csi_dev, &pixelformat, &capture_field);
+ capture_format = sun6i_csi_capture_format_find(pixelformat);
+ if (WARN_ON(!capture_format))
+ return -EINVAL;
-static int sun6i_csi_capture_link_validate(struct media_link *link)
-{
- struct video_device *vdev = container_of(link->sink->entity,
- struct video_device, entity);
- struct sun6i_csi_device *csi_dev = video_get_drvdata(vdev);
- struct sun6i_csi_capture *capture = &csi_dev->capture;
- struct v4l2_subdev_format source_fmt;
- int ret;
+ sun6i_csi_bridge_dimensions(csi_dev, &bridge_width, &bridge_height);
- if (!media_entity_remote_pad(link->sink->entity->pads)) {
- dev_info(csi_dev->dev, "capture node %s pad not connected\n",
- vdev->name);
- return -ENOLINK;
+ sun6i_csi_bridge_format(csi_dev, &mbus_code, &bridge_field);
+ bridge_format = sun6i_csi_bridge_format_find(mbus_code);
+ if (WARN_ON(!bridge_format))
+ return -EINVAL;
+
+ /* No cropping/scaling is supported. */
+ if (capture_width != bridge_width || capture_height != bridge_height) {
+ v4l2_err(v4l2_dev,
+ "invalid input/output dimensions: %ux%u/%ux%u\n",
+ bridge_width, bridge_height, capture_width,
+ capture_height);
+ return -EINVAL;
}
- ret = sun6i_csi_capture_link_validate_get_format(link->source,
- &source_fmt);
- if (ret < 0)
- return ret;
+ format_info = v4l2_format_info(pixelformat);
+ /* Some formats are not listed. */
+ if (!format_info)
+ return 0;
+
+ if (format_info->pixel_enc == V4L2_PIXEL_ENC_BAYER &&
+ bridge_format->input_format != SUN6I_CSI_INPUT_FMT_RAW)
+ goto invalid;
+
+ if (format_info->pixel_enc == V4L2_PIXEL_ENC_RGB &&
+ bridge_format->input_format != SUN6I_CSI_INPUT_FMT_RAW)
+ goto invalid;
- if (!sun6i_csi_is_format_supported(csi_dev,
- capture->format.fmt.pix.pixelformat,
- source_fmt.format.code)) {
- dev_err(csi_dev->dev,
- "Unsupported pixformat: 0x%x with mbus code: 0x%x!\n",
- capture->format.fmt.pix.pixelformat,
- source_fmt.format.code);
- return -EPIPE;
+ if (format_info->pixel_enc == V4L2_PIXEL_ENC_YUV) {
+ if (bridge_format->input_format != SUN6I_CSI_INPUT_FMT_YUV420 &&
+ bridge_format->input_format != SUN6I_CSI_INPUT_FMT_YUV422)
+ goto invalid;
+
+ /* YUV420 input can't produce YUV422 output. */
+ if (bridge_format->input_format == SUN6I_CSI_INPUT_FMT_YUV420 &&
+ format_info->vdiv == 1)
+ goto invalid;
}
- if (source_fmt.format.width != capture->format.fmt.pix.width ||
- source_fmt.format.height != capture->format.fmt.pix.height) {
- dev_err(csi_dev->dev,
- "Wrong width or height %ux%u (%ux%u expected)\n",
- capture->format.fmt.pix.width,
- capture->format.fmt.pix.height,
- source_fmt.format.width, source_fmt.format.height);
- return -EPIPE;
+ /* With raw input mode, we need a 1:1 match between input and output. */
+ if (bridge_format->input_format == SUN6I_CSI_INPUT_FMT_RAW ||
+ capture_format->input_format_raw) {
+ match = sun6i_csi_capture_format_match(pixelformat, mbus_code);
+ if (!match)
+ goto invalid;
}
return 0;
+
+invalid:
+ v4l2_err(v4l2_dev, "invalid input/output format combination\n");
+ return -EINVAL;
}
static const struct media_entity_operations sun6i_csi_capture_media_ops = {
--
2.35.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-03-11 14:53 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-11 14:34 [PATCH v3 00/46] Allwinner A31/A83T MIPI CSI-2 and A31 ISP / CSI Rework Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 01/46] media: sun6i-csi: Define and use driver name and (reworked) description Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 02/46] media: sun6i-csi: Refactor main driver data structures Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 03/46] media: sun6i-csi: Grab bus clock instead of passing it to regmap Paul Kocialkowski
2022-03-15 19:22 ` Jernej Škrabec
2022-03-18 8:49 ` Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 04/46] media: sun6i-csi: Tidy up platform code Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 05/46] media: sun6i-csi: Always set exclusive module clock rate Paul Kocialkowski
2022-03-15 19:27 ` Jernej Škrabec
2022-03-11 14:34 ` [PATCH v3 06/46] media: sun6i-csi: Define and use variant to get " Paul Kocialkowski
2022-03-15 19:31 ` Jernej Škrabec
2022-03-18 8:54 ` Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 07/46] media: sun6i-csi: Use runtime pm for clocks and reset Paul Kocialkowski
2022-03-15 19:46 ` Jernej Škrabec
2022-03-18 16:15 ` Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 08/46] media: sun6i-csi: Tidy up Kconfig Paul Kocialkowski
2022-03-15 19:51 ` Jernej Škrabec
2022-03-11 14:34 ` [PATCH v3 09/46] media: sun6i-csi: Tidy up v4l2 code Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 10/46] media: sun6i-csi: Tidy up video code Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 11/46] media: sun6i-csi: Pass and store csi device directly in " Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 12/46] media: sun6i-csi: Register the media device after creation Paul Kocialkowski
2022-03-11 14:34 ` [PATCH v3 13/46] media: sun6i-csi: Add media ops with link notify callback Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 14/46] media: sun6i-csi: Introduce and use video helper functions Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 15/46] media: sun6i-csi: Move csi buffer definition to main header file Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 16/46] media: sun6i-csi: Add bridge v4l2 subdev with port management Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 17/46] media: sun6i-csi: Rename sun6i_video to sun6i_csi_capture Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 18/46] media: sun6i-csi: Add capture state using vsync for page flip Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 19/46] media: sun6i-csi: Rework register definitions, invert misleading fields Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 20/46] media: sun6i-csi: Add dimensions and format helpers to capture Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 21/46] media: sun6i-csi: Implement address configuration without indirection Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 22/46] media: sun6i-csi: Split stream sequences and irq code in capture Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 23/46] media: sun6i-csi: Move power management to runtime pm " Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 24/46] media: sun6i-csi: Move register configuration to capture Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 25/46] media: sun6i-csi: Rework capture format management with helper Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 26/46] media: sun6i-csi: Remove custom format helper and rework configure Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 27/46] media: sun6i-csi: Add bridge dimensions and format helpers Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 28/46] media: sun6i-csi: Get mbus code from bridge instead of storing it Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 29/46] media: sun6i-csi: Tidy capture configure code Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 30/46] media: sun6i-csi: Introduce bridge format structure, list and helper Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 31/46] media: sun6i-csi: Introduce capture " Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 32/46] media: sun6i-csi: Configure registers from format tables Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 33/46] media: sun6i-csi: Introduce format match structure, list and helper Paul Kocialkowski
2022-03-11 14:35 ` Paul Kocialkowski [this message]
2022-03-11 14:35 ` [PATCH v3 35/46] media: sun6i-csi: Get bridge subdev directly in capture stream ops Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 36/46] media: sun6i-csi: Move hardware control to the bridge Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 37/46] media: sun6i-csi: Unset bridge source on capture streamon fail Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 38/46] media: sun6i-csi: Rename the capture video device to sun6i-csi-capture Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 39/46] media: sun6i-csi: Cleanup headers and includes, update copyright lines Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 40/46] media: sun6i-csi: Add support for MIPI CSI-2 to the bridge code Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 41/46] media: sun6i-csi: Only configure capture when streaming Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 42/46] media: sun6i-csi: Add extra checks to the interrupt routine Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 43/46] media: sun6i-csi: Request a shared interrupt Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 44/46] media: sun6i-csi: Detect the availability of the ISP Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 45/46] media: sun6i-csi: Add support for hooking to the isp devices Paul Kocialkowski
2022-03-11 14:35 ` [PATCH v3 46/46] MAINTAINERS: Add myself as sun6i-csi maintainer and rename/move entry Paul Kocialkowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220311143532.265091-35-paul.kocialkowski@bootlin.com \
--to=paul.kocialkowski@bootlin.com \
--cc=jernej.skrabec@gmail.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-sunxi@lists.linux.dev \
--cc=mchehab@kernel.org \
--cc=mripard@kernel.org \
--cc=samuel@sholland.org \
--cc=thomas.petazzoni@bootlin.com \
--cc=wens@csie.org \
--cc=yong.deng@magewell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).