OSDN Git Service

media: subdev: Split V4L2_SUBDEV_ROUTING_NO_STREAM_MIX
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Thu, 2 Mar 2023 09:57:47 +0000 (10:57 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sun, 19 Mar 2023 23:38:23 +0000 (00:38 +0100)
V4L2_SUBDEV_ROUTING_NO_STREAM_MIX routing validation flag means that all
routes from a sink pad must go to the same source pad and all routes
going to the same source pad must originate from the same sink pad.

This does not cover all use cases. For example, if a device routes
all streams from a single sink pad to any of the source pads, but
streams from multiple sink pads can go to the same source pad, the
current flag is too restrictive.

Split the flag into two parts, V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX
and V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX, which add the restriction
only on one side of the device. Together they mean the same as
V4L2_SUBDEV_ROUTING_NO_STREAM_MIX.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/v4l2-core/v4l2-subdev.c
include/media/v4l2-subdev.h

index 4c30920..b376c47 100644 (file)
@@ -1737,10 +1737,10 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
                }
 
                /*
-                * V4L2_SUBDEV_ROUTING_NO_STREAM_MIX: Streams on the same pad
-                * shall not be routed to streams on different pads.
+                * V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX: all streams from a
+                * sink pad must be routed to a single source pad.
                 */
-               if (disallow & V4L2_SUBDEV_ROUTING_NO_STREAM_MIX) {
+               if (disallow & V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX) {
                        if (remote_pads[route->sink_pad] != U32_MAX &&
                            remote_pads[route->sink_pad] != route->source_pad) {
                                dev_dbg(sd->dev,
@@ -1749,6 +1749,14 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
                                goto out;
                        }
 
+                       remote_pads[route->sink_pad] = route->source_pad;
+               }
+
+               /*
+                * V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX: all streams on a
+                * source pad must originate from a single sink pad.
+                */
+               if (disallow & V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX) {
                        if (remote_pads[route->source_pad] != U32_MAX &&
                            remote_pads[route->source_pad] != route->sink_pad) {
                                dev_dbg(sd->dev,
@@ -1757,7 +1765,6 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
                                goto out;
                        }
 
-                       remote_pads[route->sink_pad] = route->source_pad;
                        remote_pads[route->source_pad] = route->sink_pad;
                }
 
index f6acb05..f921d8a 100644 (file)
@@ -1647,19 +1647,30 @@ u64 v4l2_subdev_state_xlate_streams(const struct v4l2_subdev_state *state,
  * @V4L2_SUBDEV_ROUTING_NO_N_TO_1:
  *     multiple input streams shall not be routed to the same output stream
  *     (stream merging)
- * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
- *     streams on the same pad shall not be routed to streams on different pads
+ * @V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX:
+ *     all streams from a sink pad must be routed to a single source pad
+ * @V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX:
+ *     all streams on a source pad must originate from a single sink pad
  * @V4L2_SUBDEV_ROUTING_ONLY_1_TO_1:
  *     only non-overlapping 1-to-1 stream routing is allowed (a combination of
  *     @V4L2_SUBDEV_ROUTING_NO_1_TO_N and @V4L2_SUBDEV_ROUTING_NO_N_TO_1)
+ * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
+ *     all streams from a sink pad must be routed to a single source pad, and
+ *     that source pad shall not get routes from any other sink pad
+ *     (a combination of @V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX and
+ *     @V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX)
  */
 enum v4l2_subdev_routing_restriction {
        V4L2_SUBDEV_ROUTING_NO_1_TO_N = BIT(0),
        V4L2_SUBDEV_ROUTING_NO_N_TO_1 = BIT(1),
-       V4L2_SUBDEV_ROUTING_NO_STREAM_MIX = BIT(2),
+       V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX = BIT(2),
+       V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX = BIT(3),
        V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 =
                V4L2_SUBDEV_ROUTING_NO_1_TO_N |
                V4L2_SUBDEV_ROUTING_NO_N_TO_1,
+       V4L2_SUBDEV_ROUTING_NO_STREAM_MIX =
+               V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX |
+               V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX,
 };
 
 /**