@@ -1579,3 +1579,27 @@ int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
return 0;
}
EXPORT_SYMBOL_GPL(v4l2_subdev_get_fmt);
+
+int v4l2_subdev_routing_validate_1_to_1(const struct v4l2_subdev_krouting *routing)
+{
+ unsigned int i, j;
+
+ for (i = 0; i < routing->num_routes; ++i) {
+ const struct v4l2_subdev_route *route = &routing->routes[i];
+
+ for (j = i + 1; j < routing->num_routes; ++j) {
+ const struct v4l2_subdev_route *r = &routing->routes[j];
+
+ if (route->sink_pad == r->sink_pad &&
+ route->sink_stream == r->sink_stream)
+ return -EINVAL;
+
+ if (route->source_pad == r->source_pad &&
+ route->source_stream == r->source_stream)
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(v4l2_subdev_routing_validate_1_to_1);
@@ -1572,4 +1572,18 @@ v4l2_subdev_state_get_opposite_stream_format(struct v4l2_subdev_state *state,
int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format);
+/**
+ * v4l2_subdev_routing_validate_1_to_1() - Verify that all streams are
+ * non-overlapping 1-to-1 streams
+ * @routing: routing to verify
+ *
+ * This verifies that the given routing contains only non-overlapping 1-to-1
+ * streams. In other words, no two streams have the same source or sink
+ * stream ID on a single pad. This is the most common case of routing
+ * supported by devices.
+ *
+ * Returns 0 on success, error value otherwise.
+ */
+int v4l2_subdev_routing_validate_1_to_1(const struct v4l2_subdev_krouting *routing);
+
#endif