Re: [PATCH v2] [media] v4l2: add V4L2_CAP_IO_MC
Hi Hans, Thanks for reviewing this On 2017-06-19 08:15 AM, Hans Verkuil wrote: On 06/14/2017 06:50 AM, Helen Koike wrote: Add V4L2_CAP_IO_MC to be used in struct v4l2_capability to indicate that input and output are controlled by the Media Controller instead of V4L2 API. When this flag is set, ioctls for get, set and enum input and outputs are automatically enabled and programmed to call helper function. Signed-off-by: Helen Koike--- Changes in v2:: - replace the type by capability - erase V4L2_INPUT_TYPE_DEFAULT - also consider output - plug helpers in the ops automatically so drivers doesn't need to set it by hand - update docs - commit message and title --- Documentation/media/uapi/v4l/vidioc-querycap.rst | 3 + Documentation/media/videodev2.h.rst.exceptions | 1 + drivers/media/v4l2-core/v4l2-dev.c | 35 +++-- drivers/media/v4l2-core/v4l2-ioctl.c | 91 ++-- include/uapi/linux/videodev2.h | 2 + 5 files changed, 120 insertions(+), 12 deletions(-) diff --git a/Documentation/media/uapi/v4l/vidioc-querycap.rst b/Documentation/media/uapi/v4l/vidioc-querycap.rst index 12e0d9a..2bd1223 100644 --- a/Documentation/media/uapi/v4l/vidioc-querycap.rst +++ b/Documentation/media/uapi/v4l/vidioc-querycap.rst @@ -252,6 +252,9 @@ specification the ioctl returns an ``EINVAL`` error code. * - ``V4L2_CAP_TOUCH`` - 0x1000 - This is a touch device. +* - ``V4L2_CAP_IO_MC`` + - 0x2000 + - This device has its inputs and outputs controller by the Media Controller controller -> controlled Sorry, I'll remember to use a spell checker next time But I would rephrase this a bit: - The inputs and/or outputs of this device are controlled by the Media Controller (see: ). Sure, much better. In this document, almost all the flags start with "The device supports..." or "The device has...", I was thinking to do something similar. * - ``V4L2_CAP_DEVICE_CAPS`` - 0x8000 - The driver fills the ``device_caps`` field. This capability can diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions index a5cb0a8..0b48cd0 100644 --- a/Documentation/media/videodev2.h.rst.exceptions +++ b/Documentation/media/videodev2.h.rst.exceptions @@ -159,6 +159,7 @@ replace define V4L2_CAP_ASYNCIO device-capabilities replace define V4L2_CAP_STREAMING device-capabilities replace define V4L2_CAP_DEVICE_CAPS device-capabilities replace define V4L2_CAP_TOUCH device-capabilities +replace define V4L2_CAP_IO_MC device-capabilities # V4L2 pix flags replace define V4L2_PIX_FMT_PRIV_MAGIC :c:type:`v4l2_pix_format` diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index c647ba6..0f272fe 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -688,22 +688,34 @@ static void determine_valid_ioctls(struct video_device *vdev) SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std); if (is_rx) { SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd); -SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); -SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); -SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio); SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid); +if (vdev->device_caps & V4L2_CAP_IO_MC) { +set_bit(_IOC_NR(VIDIOC_ENUMINPUT), valid_ioctls); +set_bit(_IOC_NR(VIDIOC_G_INPUT), valid_ioctls); +set_bit(_IOC_NR(VIDIOC_S_INPUT), valid_ioctls); +} else { +SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); +SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); +SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); +} } if (is_tx) { -SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); -SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output); -SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout); SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout); SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout); +if (vdev->device_caps & V4L2_CAP_IO_MC) { +set_bit(_IOC_NR(VIDIOC_ENUMOUTPUT), valid_ioctls); +set_bit(_IOC_NR(VIDIOC_G_OUTPUT), valid_ioctls); +
Re: [PATCH v2] [media] v4l2: add V4L2_CAP_IO_MC
On 06/14/2017 06:50 AM, Helen Koike wrote: Add V4L2_CAP_IO_MC to be used in struct v4l2_capability to indicate that input and output are controlled by the Media Controller instead of V4L2 API. When this flag is set, ioctls for get, set and enum input and outputs are automatically enabled and programmed to call helper function. Signed-off-by: Helen Koike--- Changes in v2:: - replace the type by capability - erase V4L2_INPUT_TYPE_DEFAULT - also consider output - plug helpers in the ops automatically so drivers doesn't need to set it by hand - update docs - commit message and title --- Documentation/media/uapi/v4l/vidioc-querycap.rst | 3 + Documentation/media/videodev2.h.rst.exceptions | 1 + drivers/media/v4l2-core/v4l2-dev.c | 35 +++-- drivers/media/v4l2-core/v4l2-ioctl.c | 91 ++-- include/uapi/linux/videodev2.h | 2 + 5 files changed, 120 insertions(+), 12 deletions(-) diff --git a/Documentation/media/uapi/v4l/vidioc-querycap.rst b/Documentation/media/uapi/v4l/vidioc-querycap.rst index 12e0d9a..2bd1223 100644 --- a/Documentation/media/uapi/v4l/vidioc-querycap.rst +++ b/Documentation/media/uapi/v4l/vidioc-querycap.rst @@ -252,6 +252,9 @@ specification the ioctl returns an ``EINVAL`` error code. * - ``V4L2_CAP_TOUCH`` - 0x1000 - This is a touch device. +* - ``V4L2_CAP_IO_MC`` + - 0x2000 + - This device has its inputs and outputs controller by the Media Controller controller -> controlled But I would rephrase this a bit: - The inputs and/or outputs of this device are controlled by the Media Controller (see: ). * - ``V4L2_CAP_DEVICE_CAPS`` - 0x8000 - The driver fills the ``device_caps`` field. This capability can diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions index a5cb0a8..0b48cd0 100644 --- a/Documentation/media/videodev2.h.rst.exceptions +++ b/Documentation/media/videodev2.h.rst.exceptions @@ -159,6 +159,7 @@ replace define V4L2_CAP_ASYNCIO device-capabilities replace define V4L2_CAP_STREAMING device-capabilities replace define V4L2_CAP_DEVICE_CAPS device-capabilities replace define V4L2_CAP_TOUCH device-capabilities +replace define V4L2_CAP_IO_MC device-capabilities # V4L2 pix flags replace define V4L2_PIX_FMT_PRIV_MAGIC :c:type:`v4l2_pix_format` diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index c647ba6..0f272fe 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -688,22 +688,34 @@ static void determine_valid_ioctls(struct video_device *vdev) SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std); if (is_rx) { SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd); - SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); - SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); - SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio); SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid); + if (vdev->device_caps & V4L2_CAP_IO_MC) { + set_bit(_IOC_NR(VIDIOC_ENUMINPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_G_INPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_S_INPUT), valid_ioctls); + } else { + SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); + SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); + SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); + } } if (is_tx) { - SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); - SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output); - SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout); SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout); SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout); + if (vdev->device_caps & V4L2_CAP_IO_MC) { + set_bit(_IOC_NR(VIDIOC_ENUMOUTPUT), valid_ioctls); +
[PATCH v2] [media] v4l2: add V4L2_CAP_IO_MC
Add V4L2_CAP_IO_MC to be used in struct v4l2_capability to indicate that input and output are controlled by the Media Controller instead of V4L2 API. When this flag is set, ioctls for get, set and enum input and outputs are automatically enabled and programmed to call helper function. Signed-off-by: Helen Koike--- Changes in v2:: - replace the type by capability - erase V4L2_INPUT_TYPE_DEFAULT - also consider output - plug helpers in the ops automatically so drivers doesn't need to set it by hand - update docs - commit message and title --- Documentation/media/uapi/v4l/vidioc-querycap.rst | 3 + Documentation/media/videodev2.h.rst.exceptions | 1 + drivers/media/v4l2-core/v4l2-dev.c | 35 +++-- drivers/media/v4l2-core/v4l2-ioctl.c | 91 ++-- include/uapi/linux/videodev2.h | 2 + 5 files changed, 120 insertions(+), 12 deletions(-) diff --git a/Documentation/media/uapi/v4l/vidioc-querycap.rst b/Documentation/media/uapi/v4l/vidioc-querycap.rst index 12e0d9a..2bd1223 100644 --- a/Documentation/media/uapi/v4l/vidioc-querycap.rst +++ b/Documentation/media/uapi/v4l/vidioc-querycap.rst @@ -252,6 +252,9 @@ specification the ioctl returns an ``EINVAL`` error code. * - ``V4L2_CAP_TOUCH`` - 0x1000 - This is a touch device. +* - ``V4L2_CAP_IO_MC`` + - 0x2000 + - This device has its inputs and outputs controller by the Media Controller * - ``V4L2_CAP_DEVICE_CAPS`` - 0x8000 - The driver fills the ``device_caps`` field. This capability can diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions index a5cb0a8..0b48cd0 100644 --- a/Documentation/media/videodev2.h.rst.exceptions +++ b/Documentation/media/videodev2.h.rst.exceptions @@ -159,6 +159,7 @@ replace define V4L2_CAP_ASYNCIO device-capabilities replace define V4L2_CAP_STREAMING device-capabilities replace define V4L2_CAP_DEVICE_CAPS device-capabilities replace define V4L2_CAP_TOUCH device-capabilities +replace define V4L2_CAP_IO_MC device-capabilities # V4L2 pix flags replace define V4L2_PIX_FMT_PRIV_MAGIC :c:type:`v4l2_pix_format` diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index c647ba6..0f272fe 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -688,22 +688,34 @@ static void determine_valid_ioctls(struct video_device *vdev) SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std); if (is_rx) { SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd); - SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); - SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); - SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio); SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid); + if (vdev->device_caps & V4L2_CAP_IO_MC) { + set_bit(_IOC_NR(VIDIOC_ENUMINPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_G_INPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_S_INPUT), valid_ioctls); + } else { + SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); + SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input); + SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input); + } } if (is_tx) { - SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); - SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output); - SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output); SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout); SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout); SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout); + if (vdev->device_caps & V4L2_CAP_IO_MC) { + set_bit(_IOC_NR(VIDIOC_ENUMOUTPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_G_OUTPUT), valid_ioctls); + set_bit(_IOC_NR(VIDIOC_S_OUTPUT), valid_ioctls); + } else { + SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT,