mirror of
https://github.com/torvalds/linux.git
synced 2026-05-03 14:02:43 -04:00
Due to a historical mishap, the v4l2_subdev_frame_interval structure is the only part of the V4L2 subdev userspace API that doesn't contain a 'which' field. This prevents trying frame intervals using the subdev 'TRY' state mechanism. Adding a 'which' field is simple as the structure has 8 reserved fields. This would however break userspace as the field is currently set to 0, corresponding to V4L2_SUBDEV_FORMAT_TRY, while the corresponding ioctls currently operate on the 'ACTIVE' state. We thus need to add a new subdev client cap, V4L2_SUBDEV_CLIENT_CAP_INTERVAL_USES_WHICH, to indicate that userspace is aware of this new field. All drivers that implement the subdev .get_frame_interval() and .set_frame_interval() operations are updated to return -EINVAL when operating on the TRY state, preserving the current behaviour. While at it, fix a bad copy&paste in the documentation of the struct v4l2_subdev_frame_interval_enum 'which' field. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> # for imx-media Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> # for tegra-video Reviewed-by: Mauro Carvalho Chehab <mchehab@kernel.org> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
89 lines
3.0 KiB
ReStructuredText
89 lines
3.0 KiB
ReStructuredText
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
|
|
.. c:namespace:: V4L
|
|
|
|
.. _VIDIOC_SUBDEV_G_CLIENT_CAP:
|
|
|
|
************************************************************
|
|
ioctl VIDIOC_SUBDEV_G_CLIENT_CAP, VIDIOC_SUBDEV_S_CLIENT_CAP
|
|
************************************************************
|
|
|
|
Name
|
|
====
|
|
|
|
VIDIOC_SUBDEV_G_CLIENT_CAP - VIDIOC_SUBDEV_S_CLIENT_CAP - Get or set client
|
|
capabilities.
|
|
|
|
Synopsis
|
|
========
|
|
|
|
.. c:macro:: VIDIOC_SUBDEV_G_CLIENT_CAP
|
|
|
|
``int ioctl(int fd, VIDIOC_SUBDEV_G_CLIENT_CAP, struct v4l2_subdev_client_capability *argp)``
|
|
|
|
.. c:macro:: VIDIOC_SUBDEV_S_CLIENT_CAP
|
|
|
|
``int ioctl(int fd, VIDIOC_SUBDEV_S_CLIENT_CAP, struct v4l2_subdev_client_capability *argp)``
|
|
|
|
Arguments
|
|
=========
|
|
|
|
``fd``
|
|
File descriptor returned by :ref:`open() <func-open>`.
|
|
|
|
``argp``
|
|
Pointer to struct :c:type:`v4l2_subdev_client_capability`.
|
|
|
|
Description
|
|
===========
|
|
|
|
These ioctls are used to get and set the client (the application using the
|
|
subdevice ioctls) capabilities. The client capabilities are stored in the file
|
|
handle of the opened subdev device node, and the client must set the
|
|
capabilities for each opened subdev separately.
|
|
|
|
By default no client capabilities are set when a subdev device node is opened.
|
|
|
|
The purpose of the client capabilities are to inform the kernel of the behavior
|
|
of the client, mainly related to maintaining compatibility with different
|
|
kernel and userspace versions.
|
|
|
|
The ``VIDIOC_SUBDEV_G_CLIENT_CAP`` ioctl returns the current client capabilities
|
|
associated with the file handle ``fd``.
|
|
|
|
The ``VIDIOC_SUBDEV_S_CLIENT_CAP`` ioctl sets client capabilities for the file
|
|
handle ``fd``. The new capabilities fully replace the current capabilities, the
|
|
ioctl can therefore also be used to remove capabilities that have previously
|
|
been set.
|
|
|
|
``VIDIOC_SUBDEV_S_CLIENT_CAP`` modifies the struct
|
|
:c:type:`v4l2_subdev_client_capability` to reflect the capabilities that have
|
|
been accepted. A common case for the kernel not accepting a capability is that
|
|
the kernel is older than the headers the userspace uses, and thus the capability
|
|
is unknown to the kernel.
|
|
|
|
.. flat-table:: Client Capabilities
|
|
:header-rows: 1
|
|
|
|
* - Capability
|
|
- Description
|
|
* - ``V4L2_SUBDEV_CLIENT_CAP_STREAMS``
|
|
- The client is aware of streams. Setting this flag enables the use
|
|
of 'stream' fields (referring to the stream number) with various
|
|
ioctls. If this is not set (which is the default), the 'stream' fields
|
|
will be forced to 0 by the kernel.
|
|
* - ``V4L2_SUBDEV_CLIENT_CAP_INTERVAL_USES_WHICH``
|
|
- The client is aware of the :c:type:`v4l2_subdev_frame_interval`
|
|
``which`` field. If this is not set (which is the default), the
|
|
``which`` field is forced to ``V4L2_SUBDEV_FORMAT_ACTIVE`` by the
|
|
kernel.
|
|
|
|
Return Value
|
|
============
|
|
|
|
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.
|
|
|
|
ENOIOCTLCMD
|
|
The kernel does not support this ioctl.
|