1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * V4L2 subdev userspace API 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2010 Nokia Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 8*4882a593Smuzhiyun * Sakari Ailus <sakari.ailus@iki.fi> 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 11*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 12*4882a593Smuzhiyun * published by the Free Software Foundation. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 15*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*4882a593Smuzhiyun * GNU General Public License for more details. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * You should have received a copy of the GNU General Public License 20*4882a593Smuzhiyun * along with this program; if not, write to the Free Software 21*4882a593Smuzhiyun * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef __LINUX_V4L2_SUBDEV_H 25*4882a593Smuzhiyun #define __LINUX_V4L2_SUBDEV_H 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #include <linux/ioctl.h> 28*4882a593Smuzhiyun #include <linux/types.h> 29*4882a593Smuzhiyun #include <linux/v4l2-common.h> 30*4882a593Smuzhiyun #include <linux/v4l2-mediabus.h> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /** 33*4882a593Smuzhiyun * enum v4l2_subdev_format_whence - Media bus format type 34*4882a593Smuzhiyun * @V4L2_SUBDEV_FORMAT_TRY: try format, for negotiation only 35*4882a593Smuzhiyun * @V4L2_SUBDEV_FORMAT_ACTIVE: active format, applied to the device 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun enum v4l2_subdev_format_whence { 38*4882a593Smuzhiyun V4L2_SUBDEV_FORMAT_TRY = 0, 39*4882a593Smuzhiyun V4L2_SUBDEV_FORMAT_ACTIVE = 1, 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /** 43*4882a593Smuzhiyun * struct v4l2_subdev_format - Pad-level media bus format 44*4882a593Smuzhiyun * @which: format type (from enum v4l2_subdev_format_whence) 45*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 46*4882a593Smuzhiyun * @format: media bus format (format code and frame size) 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun struct v4l2_subdev_format { 49*4882a593Smuzhiyun __u32 which; 50*4882a593Smuzhiyun __u32 pad; 51*4882a593Smuzhiyun struct v4l2_mbus_framefmt format; 52*4882a593Smuzhiyun __u32 reserved[8]; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /** 56*4882a593Smuzhiyun * struct v4l2_subdev_crop - Pad-level crop settings 57*4882a593Smuzhiyun * @which: format type (from enum v4l2_subdev_format_whence) 58*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 59*4882a593Smuzhiyun * @rect: pad crop rectangle boundaries 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun struct v4l2_subdev_crop { 62*4882a593Smuzhiyun __u32 which; 63*4882a593Smuzhiyun __u32 pad; 64*4882a593Smuzhiyun struct v4l2_rect rect; 65*4882a593Smuzhiyun __u32 reserved[8]; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE 0x00000001 69*4882a593Smuzhiyun #define V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC 0x00000002 70*4882a593Smuzhiyun #define V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC 0x00000004 71*4882a593Smuzhiyun #define V4L2_SUBDEV_MBUS_CODE_CSC_HSV_ENC V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC 72*4882a593Smuzhiyun #define V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION 0x00000008 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /** 75*4882a593Smuzhiyun * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration 76*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 77*4882a593Smuzhiyun * @index: format index during enumeration 78*4882a593Smuzhiyun * @code: format code (MEDIA_BUS_FMT_ definitions) 79*4882a593Smuzhiyun * @which: format type (from enum v4l2_subdev_format_whence) 80*4882a593Smuzhiyun * @flags: flags set by the driver, (V4L2_SUBDEV_MBUS_CODE_*) 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun struct v4l2_subdev_mbus_code_enum { 83*4882a593Smuzhiyun __u32 pad; 84*4882a593Smuzhiyun __u32 index; 85*4882a593Smuzhiyun __u32 code; 86*4882a593Smuzhiyun __u32 which; 87*4882a593Smuzhiyun __u32 flags; 88*4882a593Smuzhiyun __u32 reserved[7]; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /** 92*4882a593Smuzhiyun * struct v4l2_subdev_frame_size_enum - Media bus format enumeration 93*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 94*4882a593Smuzhiyun * @index: format index during enumeration 95*4882a593Smuzhiyun * @code: format code (MEDIA_BUS_FMT_ definitions) 96*4882a593Smuzhiyun * @which: format type (from enum v4l2_subdev_format_whence) 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun struct v4l2_subdev_frame_size_enum { 99*4882a593Smuzhiyun __u32 index; 100*4882a593Smuzhiyun __u32 pad; 101*4882a593Smuzhiyun __u32 code; 102*4882a593Smuzhiyun __u32 min_width; 103*4882a593Smuzhiyun __u32 max_width; 104*4882a593Smuzhiyun __u32 min_height; 105*4882a593Smuzhiyun __u32 max_height; 106*4882a593Smuzhiyun __u32 which; 107*4882a593Smuzhiyun __u32 reserved[8]; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /** 111*4882a593Smuzhiyun * struct v4l2_subdev_frame_interval - Pad-level frame rate 112*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 113*4882a593Smuzhiyun * @interval: frame interval in seconds 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun struct v4l2_subdev_frame_interval { 116*4882a593Smuzhiyun __u32 pad; 117*4882a593Smuzhiyun struct v4l2_fract interval; 118*4882a593Smuzhiyun __u32 reserved[9]; 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /** 122*4882a593Smuzhiyun * struct v4l2_subdev_frame_interval_enum - Frame interval enumeration 123*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 124*4882a593Smuzhiyun * @index: frame interval index during enumeration 125*4882a593Smuzhiyun * @code: format code (MEDIA_BUS_FMT_ definitions) 126*4882a593Smuzhiyun * @width: frame width in pixels 127*4882a593Smuzhiyun * @height: frame height in pixels 128*4882a593Smuzhiyun * @interval: frame interval in seconds 129*4882a593Smuzhiyun * @which: format type (from enum v4l2_subdev_format_whence) 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun struct v4l2_subdev_frame_interval_enum { 132*4882a593Smuzhiyun __u32 index; 133*4882a593Smuzhiyun __u32 pad; 134*4882a593Smuzhiyun __u32 code; 135*4882a593Smuzhiyun __u32 width; 136*4882a593Smuzhiyun __u32 height; 137*4882a593Smuzhiyun struct v4l2_fract interval; 138*4882a593Smuzhiyun __u32 which; 139*4882a593Smuzhiyun __u32 reserved[8]; 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /** 143*4882a593Smuzhiyun * struct v4l2_subdev_selection - selection info 144*4882a593Smuzhiyun * 145*4882a593Smuzhiyun * @which: either V4L2_SUBDEV_FORMAT_ACTIVE or V4L2_SUBDEV_FORMAT_TRY 146*4882a593Smuzhiyun * @pad: pad number, as reported by the media API 147*4882a593Smuzhiyun * @target: Selection target, used to choose one of possible rectangles, 148*4882a593Smuzhiyun * defined in v4l2-common.h; V4L2_SEL_TGT_* . 149*4882a593Smuzhiyun * @flags: constraint flags, defined in v4l2-common.h; V4L2_SEL_FLAG_*. 150*4882a593Smuzhiyun * @r: coordinates of the selection window 151*4882a593Smuzhiyun * @reserved: for future use, set to zero for now 152*4882a593Smuzhiyun * 153*4882a593Smuzhiyun * Hardware may use multiple helper windows to process a video stream. 154*4882a593Smuzhiyun * The structure is used to exchange this selection areas between 155*4882a593Smuzhiyun * an application and a driver. 156*4882a593Smuzhiyun */ 157*4882a593Smuzhiyun struct v4l2_subdev_selection { 158*4882a593Smuzhiyun __u32 which; 159*4882a593Smuzhiyun __u32 pad; 160*4882a593Smuzhiyun __u32 target; 161*4882a593Smuzhiyun __u32 flags; 162*4882a593Smuzhiyun struct v4l2_rect r; 163*4882a593Smuzhiyun __u32 reserved[8]; 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /** 167*4882a593Smuzhiyun * struct v4l2_subdev_capability - subdev capabilities 168*4882a593Smuzhiyun * @version: the driver versioning number 169*4882a593Smuzhiyun * @capabilities: the subdev capabilities, see V4L2_SUBDEV_CAP_* 170*4882a593Smuzhiyun * @reserved: for future use, set to zero for now 171*4882a593Smuzhiyun */ 172*4882a593Smuzhiyun struct v4l2_subdev_capability { 173*4882a593Smuzhiyun __u32 version; 174*4882a593Smuzhiyun __u32 capabilities; 175*4882a593Smuzhiyun __u32 reserved[14]; 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* The v4l2 sub-device video device node is registered in read-only mode. */ 179*4882a593Smuzhiyun #define V4L2_SUBDEV_CAP_RO_SUBDEV 0x00000001 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Backwards compatibility define --- to be removed */ 182*4882a593Smuzhiyun #define v4l2_subdev_edid v4l2_edid 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define VIDIOC_SUBDEV_QUERYCAP _IOR('V', 0, struct v4l2_subdev_capability) 185*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_FMT _IOWR('V', 4, struct v4l2_subdev_format) 186*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_FMT _IOWR('V', 5, struct v4l2_subdev_format) 187*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_FRAME_INTERVAL _IOWR('V', 21, struct v4l2_subdev_frame_interval) 188*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_FRAME_INTERVAL _IOWR('V', 22, struct v4l2_subdev_frame_interval) 189*4882a593Smuzhiyun #define VIDIOC_SUBDEV_ENUM_MBUS_CODE _IOWR('V', 2, struct v4l2_subdev_mbus_code_enum) 190*4882a593Smuzhiyun #define VIDIOC_SUBDEV_ENUM_FRAME_SIZE _IOWR('V', 74, struct v4l2_subdev_frame_size_enum) 191*4882a593Smuzhiyun #define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL _IOWR('V', 75, struct v4l2_subdev_frame_interval_enum) 192*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_CROP _IOWR('V', 59, struct v4l2_subdev_crop) 193*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_CROP _IOWR('V', 60, struct v4l2_subdev_crop) 194*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_SELECTION _IOWR('V', 61, struct v4l2_subdev_selection) 195*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_SELECTION _IOWR('V', 62, struct v4l2_subdev_selection) 196*4882a593Smuzhiyun /* The following ioctls are identical to the ioctls in videodev2.h */ 197*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_STD _IOR('V', 23, v4l2_std_id) 198*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_STD _IOW('V', 24, v4l2_std_id) 199*4882a593Smuzhiyun #define VIDIOC_SUBDEV_ENUMSTD _IOWR('V', 25, struct v4l2_standard) 200*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_EDID _IOWR('V', 40, struct v4l2_edid) 201*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_EDID _IOWR('V', 41, struct v4l2_edid) 202*4882a593Smuzhiyun #define VIDIOC_SUBDEV_QUERYSTD _IOR('V', 63, v4l2_std_id) 203*4882a593Smuzhiyun #define VIDIOC_SUBDEV_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings) 204*4882a593Smuzhiyun #define VIDIOC_SUBDEV_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings) 205*4882a593Smuzhiyun #define VIDIOC_SUBDEV_ENUM_DV_TIMINGS _IOWR('V', 98, struct v4l2_enum_dv_timings) 206*4882a593Smuzhiyun #define VIDIOC_SUBDEV_QUERY_DV_TIMINGS _IOR('V', 99, struct v4l2_dv_timings) 207*4882a593Smuzhiyun #define VIDIOC_SUBDEV_DV_TIMINGS_CAP _IOWR('V', 100, struct v4l2_dv_timings_cap) 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #endif 210