[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250219-rcar-streams-v1-11-f1b93e370aab@ideasonboard.com>
Date: Wed, 19 Feb 2025 15:49:05 +0200
From: Tomi Valkeinen <tomi.valkeinen+renesas@...asonboard.com>
To: Niklas Söderlund <niklas.soderlund@...natech.se>,
Mauro Carvalho Chehab <mchehab@...nel.org>,
Sakari Ailus <sakari.ailus@...ux.intel.com>
Cc: linux-media@...r.kernel.org, linux-renesas-soc@...r.kernel.org,
linux-kernel@...r.kernel.org,
Niklas Söderlund <niklas.soderlund+renesas@...natech.se>,
Mauro Carvalho Chehab <mchehab+huawei@...nel.org>,
Laurent Pinchart <laurent.pinchart@...asonboard.com>,
Jacopo Mondi <jacopo.mondi@...asonboard.com>,
Tomi Valkeinen <tomi.valkeinen+renesas@...asonboard.com>
Subject: [PATCH 11/18] media: rcar-csi2: Switch to Streams API
Switch to Streams API with a single hardcoded route. This breaks any
existing userspace which depended on the custom rcar streams
implementation, but a single camera use case should continue to work.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@...asonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 47 +++++++++++++++++++++---------
1 file changed, 33 insertions(+), 14 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index d6d5c18b0b4c..71836a9e063b 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1024,7 +1024,7 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
if (ret)
return ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
if (!fmt)
return -EINVAL;
@@ -1065,7 +1065,7 @@ static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
int mbps, ret;
/* Use the format on the sink pad to compute the receiver config. */
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
dev_dbg(priv->dev, "Input size (%ux%u%c)\n",
fmt->width, fmt->height,
@@ -1646,8 +1646,7 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct rcar_csi2 *priv = sd_to_csi2(sd);
- unsigned int num_pads = rcsi2_num_pads(priv);
+ struct v4l2_mbus_framefmt *fmt;
if (format->pad > RCAR_CSI2_SINK)
return v4l2_subdev_get_fmt(sd, state, format);
@@ -1655,11 +1654,20 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
if (!rcsi2_code_to_fmt(format->format.code))
format->format.code = rcar_csi2_formats[0].code;
- *v4l2_subdev_state_get_format(state, format->pad) = format->format;
+ /* Set sink format */
+ fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ /* Propagate to source format */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+ format->stream);
+ if (!fmt)
+ return -EINVAL;
- /* Propagate the format to the source pads. */
- for (unsigned int i = RCAR_CSI2_SOURCE_VC0; i < num_pads; i++)
- *v4l2_subdev_state_get_format(state, i) = format->format;
+ *fmt = format->format;
return 0;
}
@@ -1679,8 +1687,15 @@ static const struct v4l2_subdev_ops rcar_csi2_subdev_ops = {
static int rcsi2_init_state(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state)
{
- struct rcar_csi2 *priv = sd_to_csi2(sd);
- unsigned int num_pads = rcsi2_num_pads(priv);
+ static struct v4l2_subdev_route routes[] = {
+ {
+ .sink_pad = RCAR_CSI2_SINK,
+ .sink_stream = 0,
+ .source_pad = RCAR_CSI2_SOURCE_VC0,
+ .source_stream = 0,
+ .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
+ },
+ };
static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt = {
.width = 1920,
@@ -1693,10 +1708,13 @@ static int rcsi2_init_state(struct v4l2_subdev *sd,
.xfer_func = V4L2_XFER_FUNC_DEFAULT,
};
- for (unsigned int i = RCAR_CSI2_SINK; i < num_pads; i++)
- *v4l2_subdev_state_get_format(state, i) = rcar_csi2_default_fmt;
+ static const struct v4l2_subdev_krouting routing = {
+ .num_routes = ARRAY_SIZE(routes),
+ .routes = routes,
+ };
- return 0;
+ return v4l2_subdev_set_routing_with_fmt(sd, state, &routing,
+ &rcar_csi2_default_fmt);
}
static const struct v4l2_subdev_internal_ops rcar_csi2_internal_ops = {
@@ -2352,7 +2370,8 @@ static int rcsi2_probe(struct platform_device *pdev)
v4l2_set_subdevdata(&priv->subdev, &pdev->dev);
snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %s",
KBUILD_MODNAME, dev_name(&pdev->dev));
- priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
+ priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
+ V4L2_SUBDEV_FL_STREAMS;
priv->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
priv->subdev.entity.ops = &rcar_csi2_entity_ops;
--
2.43.0
Powered by blists - more mailing lists