Commit 91e99e5a authored by Sakari Ailus's avatar Sakari Ailus Committed by Hans Verkuil
Browse files

media: v4l: subdev: Return routes set using S_ROUTING



Return the routes set using S_ROUTING back to the user. Also reflect this
in documentation.

Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 83a22a07
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -44,7 +44,8 @@ Drivers report their current routing tables using the
``VIDIOC_SUBDEV_G_ROUTING`` ioctl and application may enable or disable routes
with the ``VIDIOC_SUBDEV_S_ROUTING`` ioctl, by adding or removing routes and
setting or clearing flags of the ``flags`` field of a struct
:c:type:`v4l2_subdev_route`.
:c:type:`v4l2_subdev_route`. Similarly to ``VIDIOC_SUBDEV_G_ROUTING``, also
``VIDIOC_SUBDEV_S_ROUTING`` returns the routes back to the user.

All stream configurations are reset when ``VIDIOC_SUBDEV_S_ROUTING`` is called.
This means that the userspace must reconfigure all stream formats and selections
@@ -153,10 +154,6 @@ On success 0 is returned, on error -1 and the ``errno`` variable is set
appropriately. The generic error codes are described at the
:ref:`Generic Error Codes <gen-errors>` chapter.

ENOSPC
   The application provided ``num_routes`` is not big enough to contain
   all the available routes the subdevice exposes.

EINVAL
   The sink or source pad identifiers reference a non-existing pad or reference
   pads of different types (ie. the sink_pad identifiers refers to a source
+11 −1
Original line number Diff line number Diff line
@@ -1017,8 +1017,18 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg,
		krouting.len_routes = routing->len_routes;
		krouting.routes = routes;

		return v4l2_subdev_call(sd, pad, set_routing, state,
		rval = v4l2_subdev_call(sd, pad, set_routing, state,
					routing->which, &krouting);
		if (rval < 0)
			return rval;

		memcpy((struct v4l2_subdev_route *)(uintptr_t)routing->routes,
		       state->routing.routes,
		       min(state->routing.num_routes, routing->len_routes) *
		       sizeof(*state->routing.routes));
		routing->num_routes = state->routing.num_routes;

		return 0;
	}

	case VIDIOC_SUBDEV_G_CLIENT_CAP: {