1db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/*
2db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * V4L2 subdev userspace API
3db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *
4db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * Copyright (C) 2010 Nokia Corporation
5db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *
6db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
7db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *	     Sakari Ailus <sakari.ailus@iki.fi>
8db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *
9db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * This program is free software; you can redistribute it and/or modify
10db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * it under the terms of the GNU General Public License version 2 as
11db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * published by the Free Software Foundation.
12db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *
13db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * This program is distributed in the hope that it will be useful,
14db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * but WITHOUT ANY WARRANTY; without even the implied warranty of
15db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * GNU General Public License for more details.
17db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann *
18db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * You should have received a copy of the GNU General Public License
19db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * along with this program; if not, write to the Free Software
20db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
22db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
23db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#ifndef __LINUX_V4L2_SUBDEV_H
24db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define __LINUX_V4L2_SUBDEV_H
25db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
26db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#include <linux/ioctl.h>
27db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#include <linux/types.h>
28db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#include "v4l2-mediabus.h"
29db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
30db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
31db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * enum v4l2_subdev_format_whence - Media bus format type
32db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @V4L2_SUBDEV_FORMAT_TRY: try format, for negotiation only
33db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @V4L2_SUBDEV_FORMAT_ACTIVE: active format, applied to the device
34db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
35db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannenum v4l2_subdev_format_whence {
36db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	V4L2_SUBDEV_FORMAT_TRY = 0,
37db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	V4L2_SUBDEV_FORMAT_ACTIVE = 1,
38db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
39db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
40db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
41db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_format - Pad-level media bus format
42db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @which: format type (from enum v4l2_subdev_format_whence)
43db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
44db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @format: media bus format (format code and frame size)
45db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
46db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_format {
47db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 which;
48db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
49db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	struct v4l2_mbus_framefmt format;
50db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[8];
51db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
52db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
53db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
54db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_crop - Pad-level crop settings
55db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @which: format type (from enum v4l2_subdev_format_whence)
56db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
57db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @rect: pad crop rectangle boundaries
58db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
59db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_crop {
60db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 which;
61db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
62db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	struct v4l2_rect rect;
63db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[8];
64db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
65db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
66db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
67db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration
68db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
69db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @index: format index during enumeration
70db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @code: format code (from enum v4l2_mbus_pixelcode)
71db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
72db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_mbus_code_enum {
73db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
74db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 index;
75db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 code;
76db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[9];
77db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
78db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
79db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
80db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_frame_size_enum - Media bus format enumeration
81db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
82db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @index: format index during enumeration
83db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @code: format code (from enum v4l2_mbus_pixelcode)
84db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
85db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_frame_size_enum {
86db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 index;
87db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
88db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 code;
89db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 min_width;
90db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 max_width;
91db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 min_height;
92db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 max_height;
93db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[9];
94db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
95db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
96db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
97db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_frame_interval - Pad-level frame rate
98db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
99db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @interval: frame interval in seconds
100db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
101db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_frame_interval {
102db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
103db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	struct v4l2_fract interval;
104db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[9];
105db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
106db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
107db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann/**
108db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * struct v4l2_subdev_frame_interval_enum - Frame interval enumeration
109db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @pad: pad number, as reported by the media API
110db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @index: frame interval index during enumeration
111db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @code: format code (from enum v4l2_mbus_pixelcode)
112db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @width: frame width in pixels
113db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @height: frame height in pixels
114db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann * @interval: frame interval in seconds
115db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann */
116db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmannstruct v4l2_subdev_frame_interval_enum {
117db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 index;
118db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 pad;
119db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 code;
120db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 width;
121db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 height;
122db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	struct v4l2_fract interval;
123db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann	__u32 reserved[9];
124db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann};
125db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
126db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_G_FMT	_IOWR('V',  4, struct v4l2_subdev_format)
127db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_S_FMT	_IOWR('V',  5, struct v4l2_subdev_format)
128db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_G_FRAME_INTERVAL \
129db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann			_IOWR('V', 21, struct v4l2_subdev_frame_interval)
130db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_S_FRAME_INTERVAL \
131db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann			_IOWR('V', 22, struct v4l2_subdev_frame_interval)
132db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_ENUM_MBUS_CODE \
133db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann			_IOWR('V',  2, struct v4l2_subdev_mbus_code_enum)
134db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_ENUM_FRAME_SIZE \
135db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann			_IOWR('V', 74, struct v4l2_subdev_frame_size_enum)
136db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL \
137db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann			_IOWR('V', 75, struct v4l2_subdev_frame_interval_enum)
138db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_G_CROP	_IOWR('V', 59, struct v4l2_subdev_crop)
139db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#define VIDIOC_SUBDEV_S_CROP	_IOWR('V', 60, struct v4l2_subdev_crop)
140db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann
141db7d80d7a4d9ef6c8fbca602a78531f82f72f0a2Greg Hackmann#endif
142