xref: /openbmc/linux/include/media/v4l2-dev.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2401998faSMauro Carvalho Chehab /*
3401998faSMauro Carvalho Chehab  *
4401998faSMauro Carvalho Chehab  *	V 4 L 2   D R I V E R   H E L P E R   A P I
5401998faSMauro Carvalho Chehab  *
6401998faSMauro Carvalho Chehab  * Moved from videodev2.h
7401998faSMauro Carvalho Chehab  *
8401998faSMauro Carvalho Chehab  *	Some commonly needed functions for drivers (v4l2-common.o module)
9401998faSMauro Carvalho Chehab  */
10401998faSMauro Carvalho Chehab #ifndef _V4L2_DEV_H
11401998faSMauro Carvalho Chehab #define _V4L2_DEV_H
12401998faSMauro Carvalho Chehab 
13401998faSMauro Carvalho Chehab #include <linux/poll.h>
14401998faSMauro Carvalho Chehab #include <linux/fs.h>
15401998faSMauro Carvalho Chehab #include <linux/device.h>
167f8ecfabSHans Verkuil #include <linux/cdev.h>
17401998faSMauro Carvalho Chehab #include <linux/mutex.h>
18401998faSMauro Carvalho Chehab #include <linux/videodev2.h>
19401998faSMauro Carvalho Chehab 
202c0ab67bSLaurent Pinchart #include <media/media-entity.h>
212c0ab67bSLaurent Pinchart 
22401998faSMauro Carvalho Chehab #define VIDEO_MAJOR	81
23bfa8a273SHans Verkuil 
244839c58fSMauro Carvalho Chehab /**
254839c58fSMauro Carvalho Chehab  * enum vfl_devnode_type - type of V4L2 device node
264839c58fSMauro Carvalho Chehab  *
27238e4a5bSHans Verkuil  * @VFL_TYPE_VIDEO:	for video input/output devices
284839c58fSMauro Carvalho Chehab  * @VFL_TYPE_VBI:	for vertical blank data (i.e. closed captions, teletext)
294839c58fSMauro Carvalho Chehab  * @VFL_TYPE_RADIO:	for radio tuners
304839c58fSMauro Carvalho Chehab  * @VFL_TYPE_SUBDEV:	for V4L2 subdevices
314839c58fSMauro Carvalho Chehab  * @VFL_TYPE_SDR:	for Software Defined Radio tuners
324839c58fSMauro Carvalho Chehab  * @VFL_TYPE_TOUCH:	for touch sensors
335bc3744cSHans Verkuil  * @VFL_TYPE_MAX:	number of VFL types, must always be last in the enum
344839c58fSMauro Carvalho Chehab  */
354839c58fSMauro Carvalho Chehab enum vfl_devnode_type {
36238e4a5bSHans Verkuil 	VFL_TYPE_VIDEO,
37a95845baSMauro Carvalho Chehab 	VFL_TYPE_VBI,
38a95845baSMauro Carvalho Chehab 	VFL_TYPE_RADIO,
39a95845baSMauro Carvalho Chehab 	VFL_TYPE_SUBDEV,
40a95845baSMauro Carvalho Chehab 	VFL_TYPE_SDR,
41a95845baSMauro Carvalho Chehab 	VFL_TYPE_TOUCH,
42a95845baSMauro Carvalho Chehab 	VFL_TYPE_MAX /* Shall be the last one */
434839c58fSMauro Carvalho Chehab };
44401998faSMauro Carvalho Chehab 
45468fde0bSMauro Carvalho Chehab /**
46b0649455SMauro Carvalho Chehab  * enum  vfl_devnode_direction - Identifies if a &struct video_device
47b0649455SMauro Carvalho Chehab  * 	corresponds to a receiver, a transmitter or a mem-to-mem device.
48468fde0bSMauro Carvalho Chehab  *
49468fde0bSMauro Carvalho Chehab  * @VFL_DIR_RX:		device is a receiver.
50468fde0bSMauro Carvalho Chehab  * @VFL_DIR_TX:		device is a transmitter.
51468fde0bSMauro Carvalho Chehab  * @VFL_DIR_M2M:	device is a memory to memory device.
52468fde0bSMauro Carvalho Chehab  *
53468fde0bSMauro Carvalho Chehab  * Note: Ignored if &enum vfl_devnode_type is %VFL_TYPE_SUBDEV.
54468fde0bSMauro Carvalho Chehab  */
55468fde0bSMauro Carvalho Chehab enum vfl_devnode_direction {
56468fde0bSMauro Carvalho Chehab 	VFL_DIR_RX,
57468fde0bSMauro Carvalho Chehab 	VFL_DIR_TX,
58468fde0bSMauro Carvalho Chehab 	VFL_DIR_M2M,
59468fde0bSMauro Carvalho Chehab };
605c77879fSHans Verkuil 
61a399810cSHans Verkuil struct v4l2_ioctl_callbacks;
62bec43661SHans Verkuil struct video_device;
639bea3514SHans Verkuil struct v4l2_device;
640996517cSHans Verkuil struct v4l2_ctrl_handler;
65a399810cSHans Verkuil 
6663b31ffdSMauro Carvalho Chehab /**
6763b31ffdSMauro Carvalho Chehab  * enum v4l2_video_device_flags - Flags used by &struct video_device
6863b31ffdSMauro Carvalho Chehab  *
6963b31ffdSMauro Carvalho Chehab  * @V4L2_FL_REGISTERED:
7063b31ffdSMauro Carvalho Chehab  *	indicates that a &struct video_device is registered.
7163b31ffdSMauro Carvalho Chehab  *	Drivers can clear this flag if they want to block all future
7263b31ffdSMauro Carvalho Chehab  *	device access. It is cleared by video_unregister_device.
7363b31ffdSMauro Carvalho Chehab  * @V4L2_FL_USES_V4L2_FH:
7463b31ffdSMauro Carvalho Chehab  *	indicates that file->private_data points to &struct v4l2_fh.
7563b31ffdSMauro Carvalho Chehab  *	This flag is set by the core when v4l2_fh_init() is called.
7663b31ffdSMauro Carvalho Chehab  *	All new drivers should use it.
778cbd94bdSHans Verkuil  * @V4L2_FL_QUIRK_INVERTED_CROP:
788cbd94bdSHans Verkuil  *	some old M2M drivers use g/s_crop/cropcap incorrectly: crop and
798cbd94bdSHans Verkuil  *	compose are swapped. If this flag is set, then the selection
808cbd94bdSHans Verkuil  *	targets are swapped in the g/s_crop/cropcap functions in v4l2-ioctl.c.
818cbd94bdSHans Verkuil  *	This allows those drivers to correctly implement the selection API,
828cbd94bdSHans Verkuil  *	but the old crop API will still work as expected in order to preserve
838cbd94bdSHans Verkuil  *	backwards compatibility.
848cbd94bdSHans Verkuil  *	Never set this flag for new drivers.
85f75c431eSJacopo Mondi  * @V4L2_FL_SUBDEV_RO_DEVNODE:
86f75c431eSJacopo Mondi  *	indicates that the video device node is registered in read-only mode.
87f75c431eSJacopo Mondi  *	The flag only applies to device nodes registered for sub-devices, it is
88f75c431eSJacopo Mondi  *	set by the core when the sub-devices device nodes are registered with
89f75c431eSJacopo Mondi  *	v4l2_device_register_ro_subdev_nodes() and used by the sub-device ioctl
90f75c431eSJacopo Mondi  *	handler to restrict access to some ioctl calls.
9163b31ffdSMauro Carvalho Chehab  */
9263b31ffdSMauro Carvalho Chehab enum v4l2_video_device_flags {
9363b31ffdSMauro Carvalho Chehab 	V4L2_FL_REGISTERED		= 0,
9463b31ffdSMauro Carvalho Chehab 	V4L2_FL_USES_V4L2_FH		= 1,
958cbd94bdSHans Verkuil 	V4L2_FL_QUIRK_INVERTED_CROP	= 2,
96f75c431eSJacopo Mondi 	V4L2_FL_SUBDEV_RO_DEVNODE	= 3,
9763b31ffdSMauro Carvalho Chehab };
98dc93a70cSHans Verkuil 
9902265493SHans Verkuil /* Priority helper functions */
10002265493SHans Verkuil 
101d9d3d176SMauro Carvalho Chehab /**
102d9d3d176SMauro Carvalho Chehab  * struct v4l2_prio_state - stores the priority states
103d9d3d176SMauro Carvalho Chehab  *
104d9d3d176SMauro Carvalho Chehab  * @prios: array with elements to store the array priorities
105d9d3d176SMauro Carvalho Chehab  *
106d9d3d176SMauro Carvalho Chehab  *
107d9d3d176SMauro Carvalho Chehab  * .. note::
108d9d3d176SMauro Carvalho Chehab  *    The size of @prios array matches the number of priority types defined
109ffa0441eSMauro Carvalho Chehab  *    by enum &v4l2_priority.
110d9d3d176SMauro Carvalho Chehab  */
11102265493SHans Verkuil struct v4l2_prio_state {
11202265493SHans Verkuil 	atomic_t prios[4];
11302265493SHans Verkuil };
11402265493SHans Verkuil 
115d9d3d176SMauro Carvalho Chehab /**
116d9d3d176SMauro Carvalho Chehab  * v4l2_prio_init - initializes a struct v4l2_prio_state
117d9d3d176SMauro Carvalho Chehab  *
118d9d3d176SMauro Carvalho Chehab  * @global: pointer to &struct v4l2_prio_state
119d9d3d176SMauro Carvalho Chehab  */
12002265493SHans Verkuil void v4l2_prio_init(struct v4l2_prio_state *global);
121d9d3d176SMauro Carvalho Chehab 
122d9d3d176SMauro Carvalho Chehab /**
123d9d3d176SMauro Carvalho Chehab  * v4l2_prio_change - changes the v4l2 file handler priority
124d9d3d176SMauro Carvalho Chehab  *
125d9d3d176SMauro Carvalho Chehab  * @global: pointer to the &struct v4l2_prio_state of the device node.
126ffa0441eSMauro Carvalho Chehab  * @local: pointer to the desired priority, as defined by enum &v4l2_priority
127ffa0441eSMauro Carvalho Chehab  * @new: Priority type requested, as defined by enum &v4l2_priority.
128d9d3d176SMauro Carvalho Chehab  *
129d9d3d176SMauro Carvalho Chehab  * .. note::
130d9d3d176SMauro Carvalho Chehab  *	This function should be used only by the V4L2 core.
131d9d3d176SMauro Carvalho Chehab  */
13202265493SHans Verkuil int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
13302265493SHans Verkuil 		     enum v4l2_priority new);
134d9d3d176SMauro Carvalho Chehab 
135d9d3d176SMauro Carvalho Chehab /**
136d9d3d176SMauro Carvalho Chehab  * v4l2_prio_open - Implements the priority logic for a file handler open
137d9d3d176SMauro Carvalho Chehab  *
138d9d3d176SMauro Carvalho Chehab  * @global: pointer to the &struct v4l2_prio_state of the device node.
139ffa0441eSMauro Carvalho Chehab  * @local: pointer to the desired priority, as defined by enum &v4l2_priority
140d9d3d176SMauro Carvalho Chehab  *
141d9d3d176SMauro Carvalho Chehab  * .. note::
142d9d3d176SMauro Carvalho Chehab  *	This function should be used only by the V4L2 core.
143d9d3d176SMauro Carvalho Chehab  */
14402265493SHans Verkuil void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
145d9d3d176SMauro Carvalho Chehab 
146d9d3d176SMauro Carvalho Chehab /**
147d9d3d176SMauro Carvalho Chehab  * v4l2_prio_close - Implements the priority logic for a file handler close
148d9d3d176SMauro Carvalho Chehab  *
149d9d3d176SMauro Carvalho Chehab  * @global: pointer to the &struct v4l2_prio_state of the device node.
150ffa0441eSMauro Carvalho Chehab  * @local: priority to be released, as defined by enum &v4l2_priority
151d9d3d176SMauro Carvalho Chehab  *
152d9d3d176SMauro Carvalho Chehab  * .. note::
153d9d3d176SMauro Carvalho Chehab  *	This function should be used only by the V4L2 core.
154d9d3d176SMauro Carvalho Chehab  */
15502265493SHans Verkuil void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local);
156d9d3d176SMauro Carvalho Chehab 
157d9d3d176SMauro Carvalho Chehab /**
158d9d3d176SMauro Carvalho Chehab  * v4l2_prio_max - Return the maximum priority, as stored at the @global array.
159d9d3d176SMauro Carvalho Chehab  *
160d9d3d176SMauro Carvalho Chehab  * @global: pointer to the &struct v4l2_prio_state of the device node.
161d9d3d176SMauro Carvalho Chehab  *
162d9d3d176SMauro Carvalho Chehab  * .. note::
163d9d3d176SMauro Carvalho Chehab  *	This function should be used only by the V4L2 core.
164d9d3d176SMauro Carvalho Chehab  */
16502265493SHans Verkuil enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
166d9d3d176SMauro Carvalho Chehab 
167d9d3d176SMauro Carvalho Chehab /**
168e383ce07SMauro Carvalho Chehab  * v4l2_prio_check - Implements the priority logic for a file handler close
169d9d3d176SMauro Carvalho Chehab  *
170d9d3d176SMauro Carvalho Chehab  * @global: pointer to the &struct v4l2_prio_state of the device node.
171ffa0441eSMauro Carvalho Chehab  * @local: desired priority, as defined by enum &v4l2_priority local
172d9d3d176SMauro Carvalho Chehab  *
173d9d3d176SMauro Carvalho Chehab  * .. note::
174d9d3d176SMauro Carvalho Chehab  *	This function should be used only by the V4L2 core.
175d9d3d176SMauro Carvalho Chehab  */
17602265493SHans Verkuil int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local);
17702265493SHans Verkuil 
178d9d3d176SMauro Carvalho Chehab /**
179d9d3d176SMauro Carvalho Chehab  * struct v4l2_file_operations - fs operations used by a V4L2 device
180d9d3d176SMauro Carvalho Chehab  *
181d9d3d176SMauro Carvalho Chehab  * @owner: pointer to struct module
182d9d3d176SMauro Carvalho Chehab  * @read: operations needed to implement the read() syscall
183d9d3d176SMauro Carvalho Chehab  * @write: operations needed to implement the write() syscall
184d9d3d176SMauro Carvalho Chehab  * @poll: operations needed to implement the poll() syscall
185d9d3d176SMauro Carvalho Chehab  * @unlocked_ioctl: operations needed to implement the ioctl() syscall
186d9d3d176SMauro Carvalho Chehab  * @compat_ioctl32: operations needed to implement the ioctl() syscall for
187d9d3d176SMauro Carvalho Chehab  *	the special case where the Kernel uses 64 bits instructions, but
188d9d3d176SMauro Carvalho Chehab  *	the userspace uses 32 bits.
189d9d3d176SMauro Carvalho Chehab  * @get_unmapped_area: called by the mmap() syscall, used when %!CONFIG_MMU
190d9d3d176SMauro Carvalho Chehab  * @mmap: operations needed to implement the mmap() syscall
191d9d3d176SMauro Carvalho Chehab  * @open: operations needed to implement the open() syscall
192d9d3d176SMauro Carvalho Chehab  * @release: operations needed to implement the release() syscall
193d9d3d176SMauro Carvalho Chehab  *
194d9d3d176SMauro Carvalho Chehab  * .. note::
195d9d3d176SMauro Carvalho Chehab  *
196d9d3d176SMauro Carvalho Chehab  *	Those operations are used to implemente the fs struct file_operations
197d9d3d176SMauro Carvalho Chehab  *	at the V4L2 drivers. The V4L2 core overrides the fs ops with some
198d9d3d176SMauro Carvalho Chehab  *	extra logic needed by the subsystem.
199d9d3d176SMauro Carvalho Chehab  */
200bec43661SHans Verkuil struct v4l2_file_operations {
201bec43661SHans Verkuil 	struct module *owner;
202bec43661SHans Verkuil 	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
203bec43661SHans Verkuil 	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
204a3f8683bSAl Viro 	__poll_t (*poll) (struct file *, struct poll_table_struct *);
205bec43661SHans Verkuil 	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
206b9d0aa6eSLaurent Pinchart #ifdef CONFIG_COMPAT
207b9d0aa6eSLaurent Pinchart 	long (*compat_ioctl32) (struct file *, unsigned int, unsigned long);
208b9d0aa6eSLaurent Pinchart #endif
209ecc6517dSBob Liu 	unsigned long (*get_unmapped_area) (struct file *, unsigned long,
210ecc6517dSBob Liu 				unsigned long, unsigned long, unsigned long);
211bec43661SHans Verkuil 	int (*mmap) (struct file *, struct vm_area_struct *);
212bec43661SHans Verkuil 	int (*open) (struct file *);
213bec43661SHans Verkuil 	int (*release) (struct file *);
214bec43661SHans Verkuil };
215bec43661SHans Verkuil 
216401998faSMauro Carvalho Chehab /*
217401998faSMauro Carvalho Chehab  * Newer version of video_device, handled by videodev2.c
218401998faSMauro Carvalho Chehab  *	This version moves redundant code from video device code to
219401998faSMauro Carvalho Chehab  *	the common handler
220401998faSMauro Carvalho Chehab  */
221401998faSMauro Carvalho Chehab 
222d9d3d176SMauro Carvalho Chehab /**
223d9d3d176SMauro Carvalho Chehab  * struct video_device - Structure used to create and manage the V4L2 device
224d9d3d176SMauro Carvalho Chehab  *	nodes.
225d9d3d176SMauro Carvalho Chehab  *
226d9d3d176SMauro Carvalho Chehab  * @entity: &struct media_entity
227d9d3d176SMauro Carvalho Chehab  * @intf_devnode: pointer to &struct media_intf_devnode
228d9d3d176SMauro Carvalho Chehab  * @pipe: &struct media_pipeline
229d9d3d176SMauro Carvalho Chehab  * @fops: pointer to &struct v4l2_file_operations for the video device
230d9d3d176SMauro Carvalho Chehab  * @device_caps: device capabilities as used in v4l2_capabilities
231d9d3d176SMauro Carvalho Chehab  * @dev: &struct device for the video device
232d9d3d176SMauro Carvalho Chehab  * @cdev: character device
233d9d3d176SMauro Carvalho Chehab  * @v4l2_dev: pointer to &struct v4l2_device parent
234d9d3d176SMauro Carvalho Chehab  * @dev_parent: pointer to &struct device parent
235d9d3d176SMauro Carvalho Chehab  * @ctrl_handler: Control handler associated with this device node.
236d9d3d176SMauro Carvalho Chehab  *	 May be NULL.
237d9d3d176SMauro Carvalho Chehab  * @queue: &struct vb2_queue associated with this device node. May be NULL.
238d9d3d176SMauro Carvalho Chehab  * @prio: pointer to &struct v4l2_prio_state with device's Priority state.
239d9d3d176SMauro Carvalho Chehab  *	 If NULL, then v4l2_dev->prio will be used.
240d9d3d176SMauro Carvalho Chehab  * @name: video device name
2414839c58fSMauro Carvalho Chehab  * @vfl_type: V4L device type, as defined by &enum vfl_devnode_type
242d9d3d176SMauro Carvalho Chehab  * @vfl_dir: V4L receiver, transmitter or m2m
243d9d3d176SMauro Carvalho Chehab  * @minor: device node 'minor'. It is set to -1 if the registration failed
244d9d3d176SMauro Carvalho Chehab  * @num: number of the video device node
24563b31ffdSMauro Carvalho Chehab  * @flags: video device flags. Use bitops to set/clear/test flags.
24663b31ffdSMauro Carvalho Chehab  *	   Contains a set of &enum v4l2_video_device_flags.
247d9d3d176SMauro Carvalho Chehab  * @index: attribute to differentiate multiple indices on one physical device
248d9d3d176SMauro Carvalho Chehab  * @fh_lock: Lock for all v4l2_fhs
249d9d3d176SMauro Carvalho Chehab  * @fh_list: List of &struct v4l2_fh
250d9d3d176SMauro Carvalho Chehab  * @dev_debug: Internal device debug flags, not for use by drivers
251d9d3d176SMauro Carvalho Chehab  * @tvnorms: Supported tv norms
252d9d3d176SMauro Carvalho Chehab  *
253d9d3d176SMauro Carvalho Chehab  * @release: video device release() callback
254d9d3d176SMauro Carvalho Chehab  * @ioctl_ops: pointer to &struct v4l2_ioctl_ops with ioctl callbacks
255d9d3d176SMauro Carvalho Chehab  *
256d9d3d176SMauro Carvalho Chehab  * @valid_ioctls: bitmap with the valid ioctls for this device
257d9d3d176SMauro Carvalho Chehab  * @lock: pointer to &struct mutex serialization lock
258d9d3d176SMauro Carvalho Chehab  *
259d9d3d176SMauro Carvalho Chehab  * .. note::
260d9d3d176SMauro Carvalho Chehab  *	Only set @dev_parent if that can't be deduced from @v4l2_dev.
261d9d3d176SMauro Carvalho Chehab  */
262d9d3d176SMauro Carvalho Chehab 
263d66302f6SYajun Deng struct video_device {
2642c0ab67bSLaurent Pinchart #if defined(CONFIG_MEDIA_CONTROLLER)
2652c0ab67bSLaurent Pinchart 	struct media_entity entity;
266d9c21e3eSMauro Carvalho Chehab 	struct media_intf_devnode *intf_devnode;
267d0a164f5SShuah Khan 	struct media_pipeline pipe;
2682c0ab67bSLaurent Pinchart #endif
269bec43661SHans Verkuil 	const struct v4l2_file_operations *fops;
270401998faSMauro Carvalho Chehab 
2717bbe7813SHans Verkuil 	u32 device_caps;
2727bbe7813SHans Verkuil 
27354bd5b66SKay Sievers 	/* sysfs */
274d9d3d176SMauro Carvalho Chehab 	struct device dev;
275d9d3d176SMauro Carvalho Chehab 	struct cdev *cdev;
2769bea3514SHans Verkuil 
277d9d3d176SMauro Carvalho Chehab 	struct v4l2_device *v4l2_dev;
278d9d3d176SMauro Carvalho Chehab 	struct device *dev_parent;
27954bd5b66SKay Sievers 
2800996517cSHans Verkuil 	struct v4l2_ctrl_handler *ctrl_handler;
2810996517cSHans Verkuil 
2825a5adf6bSHans Verkuil 	struct vb2_queue *queue;
2835a5adf6bSHans Verkuil 
2840f62fd6aSHans Verkuil 	struct v4l2_prio_state *prio;
2850f62fd6aSHans Verkuil 
286401998faSMauro Carvalho Chehab 	/* device info */
287401998faSMauro Carvalho Chehab 	char name[32];
2884839c58fSMauro Carvalho Chehab 	enum vfl_devnode_type vfl_type;
289468fde0bSMauro Carvalho Chehab 	enum vfl_devnode_direction vfl_dir;
290401998faSMauro Carvalho Chehab 	int minor;
291dd89601dSHans Verkuil 	u16 num;
292dc93a70cSHans Verkuil 	unsigned long flags;
293539a7555Sbrandon@ifup.org 	int index;
294401998faSMauro Carvalho Chehab 
2951babcb46SSakari Ailus 	/* V4L2 file handles */
296d9d3d176SMauro Carvalho Chehab 	spinlock_t		fh_lock;
297d9d3d176SMauro Carvalho Chehab 	struct list_head	fh_list;
2981babcb46SSakari Ailus 
29917028cdbSHans Verkuil 	int dev_debug;
300401998faSMauro Carvalho Chehab 
301d9d3d176SMauro Carvalho Chehab 	v4l2_std_id tvnorms;
302401998faSMauro Carvalho Chehab 
303401998faSMauro Carvalho Chehab 	/* callbacks */
304dc93a70cSHans Verkuil 	void (*release)(struct video_device *vdev);
305a399810cSHans Verkuil 	const struct v4l2_ioctl_ops *ioctl_ops;
30648ea0be0SHans Verkuil 	DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
307ee6869afSHans Verkuil 
308ee6869afSHans Verkuil 	struct mutex *lock;
309401998faSMauro Carvalho Chehab };
310401998faSMauro Carvalho Chehab 
31169b925c5SMauro Carvalho Chehab /**
31269b925c5SMauro Carvalho Chehab  * media_entity_to_video_device - Returns a &struct video_device from
31369b925c5SMauro Carvalho Chehab  *	the &struct media_entity embedded on it.
31469b925c5SMauro Carvalho Chehab  *
3157b73ce9dSNiklas Söderlund  * @__entity: pointer to &struct media_entity
31669b925c5SMauro Carvalho Chehab  */
3177b73ce9dSNiklas Söderlund #define media_entity_to_video_device(__entity) \
3187b73ce9dSNiklas Söderlund 	container_of(__entity, struct video_device, entity)
31969b925c5SMauro Carvalho Chehab 
32069b925c5SMauro Carvalho Chehab /**
32169b925c5SMauro Carvalho Chehab  * to_video_device - Returns a &struct video_device from the
32269b925c5SMauro Carvalho Chehab  *	&struct device embedded on it.
32369b925c5SMauro Carvalho Chehab  *
32469b925c5SMauro Carvalho Chehab  * @cd: pointer to &struct device
32569b925c5SMauro Carvalho Chehab  */
32622a04f10SHans Verkuil #define to_video_device(cd) container_of(cd, struct video_device, dev)
327e90ff923SLinus Torvalds 
328d9d3d176SMauro Carvalho Chehab /**
329d9d3d176SMauro Carvalho Chehab  * __video_register_device - register video4linux devices
330d9d3d176SMauro Carvalho Chehab  *
331d9d3d176SMauro Carvalho Chehab  * @vdev: struct video_device to register
3324839c58fSMauro Carvalho Chehab  * @type: type of device to register, as defined by &enum vfl_devnode_type
333d9d3d176SMauro Carvalho Chehab  * @nr:   which device node number is desired:
334d9d3d176SMauro Carvalho Chehab  *	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
335d9d3d176SMauro Carvalho Chehab  * @warn_if_nr_in_use: warn if the desired device node number
336d9d3d176SMauro Carvalho Chehab  *        was already in use and another number was chosen instead.
337d9d3d176SMauro Carvalho Chehab  * @owner: module that owns the video device node
338d9d3d176SMauro Carvalho Chehab  *
339d9d3d176SMauro Carvalho Chehab  * The registration code assigns minor numbers and device node numbers
340d9d3d176SMauro Carvalho Chehab  * based on the requested type and registers the new device node with
341d9d3d176SMauro Carvalho Chehab  * the kernel.
342d9d3d176SMauro Carvalho Chehab  *
343d9d3d176SMauro Carvalho Chehab  * This function assumes that struct video_device was zeroed when it
344d9d3d176SMauro Carvalho Chehab  * was allocated and does not contain any stale date.
345d9d3d176SMauro Carvalho Chehab  *
346d9d3d176SMauro Carvalho Chehab  * An error is returned if no free minor or device node number could be
347d9d3d176SMauro Carvalho Chehab  * found, or if the registration of the device node failed.
348d9d3d176SMauro Carvalho Chehab  *
349d9d3d176SMauro Carvalho Chehab  * Returns 0 on success.
350d9d3d176SMauro Carvalho Chehab  *
351d9d3d176SMauro Carvalho Chehab  * .. note::
352d9d3d176SMauro Carvalho Chehab  *
353d9d3d176SMauro Carvalho Chehab  *	This function is meant to be used only inside the V4L2 core.
354d9d3d176SMauro Carvalho Chehab  *	Drivers should use video_register_device() or
355d9d3d176SMauro Carvalho Chehab  *	video_register_device_no_warn().
356d9d3d176SMauro Carvalho Chehab  */
3574839c58fSMauro Carvalho Chehab int __must_check __video_register_device(struct video_device *vdev,
3584839c58fSMauro Carvalho Chehab 					 enum vfl_devnode_type type,
3594839c58fSMauro Carvalho Chehab 					 int nr, int warn_if_nr_in_use,
3604839c58fSMauro Carvalho Chehab 					 struct module *owner);
3612096a5dcSLaurent Pinchart 
362d9d3d176SMauro Carvalho Chehab /**
363d9d3d176SMauro Carvalho Chehab  *  video_register_device - register video4linux devices
364d9d3d176SMauro Carvalho Chehab  *
365d9d3d176SMauro Carvalho Chehab  * @vdev: struct video_device to register
3664839c58fSMauro Carvalho Chehab  * @type: type of device to register, as defined by &enum vfl_devnode_type
367d9d3d176SMauro Carvalho Chehab  * @nr:   which device node number is desired:
368d9d3d176SMauro Carvalho Chehab  *	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
369d9d3d176SMauro Carvalho Chehab  *
370d9d3d176SMauro Carvalho Chehab  * Internally, it calls __video_register_device(). Please see its
371d9d3d176SMauro Carvalho Chehab  * documentation for more details.
372d9d3d176SMauro Carvalho Chehab  *
373d9d3d176SMauro Carvalho Chehab  * .. note::
374d9d3d176SMauro Carvalho Chehab  *	if video_register_device fails, the release() callback of
375d9d3d176SMauro Carvalho Chehab  *	&struct video_device structure is *not* called, so the caller
376d9d3d176SMauro Carvalho Chehab  *	is responsible for freeing any data. Usually that means that
377d9d3d176SMauro Carvalho Chehab  *	you video_device_release() should be called on failure.
378d9d3d176SMauro Carvalho Chehab  */
video_register_device(struct video_device * vdev,enum vfl_devnode_type type,int nr)3792096a5dcSLaurent Pinchart static inline int __must_check video_register_device(struct video_device *vdev,
3804839c58fSMauro Carvalho Chehab 						     enum vfl_devnode_type type,
3814839c58fSMauro Carvalho Chehab 						     int nr)
3822096a5dcSLaurent Pinchart {
3832096a5dcSLaurent Pinchart 	return __video_register_device(vdev, type, nr, 1, vdev->fops->owner);
3842096a5dcSLaurent Pinchart }
385dc93a70cSHans Verkuil 
386d9d3d176SMauro Carvalho Chehab /**
387d9d3d176SMauro Carvalho Chehab  *  video_register_device_no_warn - register video4linux devices
388d9d3d176SMauro Carvalho Chehab  *
389d9d3d176SMauro Carvalho Chehab  * @vdev: struct video_device to register
3904839c58fSMauro Carvalho Chehab  * @type: type of device to register, as defined by &enum vfl_devnode_type
391d9d3d176SMauro Carvalho Chehab  * @nr:   which device node number is desired:
392d9d3d176SMauro Carvalho Chehab  *	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
393d9d3d176SMauro Carvalho Chehab  *
394d9d3d176SMauro Carvalho Chehab  * This function is identical to video_register_device() except that no
395d9d3d176SMauro Carvalho Chehab  * warning is issued if the desired device node number was already in use.
396d9d3d176SMauro Carvalho Chehab  *
397d9d3d176SMauro Carvalho Chehab  * Internally, it calls __video_register_device(). Please see its
398d9d3d176SMauro Carvalho Chehab  * documentation for more details.
399d9d3d176SMauro Carvalho Chehab  *
400d9d3d176SMauro Carvalho Chehab  * .. note::
401d9d3d176SMauro Carvalho Chehab  *	if video_register_device fails, the release() callback of
402d9d3d176SMauro Carvalho Chehab  *	&struct video_device structure is *not* called, so the caller
403d9d3d176SMauro Carvalho Chehab  *	is responsible for freeing any data. Usually that means that
404d9d3d176SMauro Carvalho Chehab  *	you video_device_release() should be called on failure.
405d9d3d176SMauro Carvalho Chehab  */
4064839c58fSMauro Carvalho Chehab static inline int __must_check
video_register_device_no_warn(struct video_device * vdev,enum vfl_devnode_type type,int nr)4074839c58fSMauro Carvalho Chehab video_register_device_no_warn(struct video_device *vdev,
4084839c58fSMauro Carvalho Chehab 			      enum vfl_devnode_type type, int nr)
4092096a5dcSLaurent Pinchart {
4102096a5dcSLaurent Pinchart 	return __video_register_device(vdev, type, nr, 0, vdev->fops->owner);
4112096a5dcSLaurent Pinchart }
4126b5270d2SHans Verkuil 
413d9d3d176SMauro Carvalho Chehab /**
414d9d3d176SMauro Carvalho Chehab  * video_unregister_device - Unregister video devices.
415d9d3d176SMauro Carvalho Chehab  *
416d9d3d176SMauro Carvalho Chehab  * @vdev: &struct video_device to register
417d9d3d176SMauro Carvalho Chehab  *
418d9d3d176SMauro Carvalho Chehab  * Does nothing if vdev == NULL or if video_is_registered() returns false.
419d9d3d176SMauro Carvalho Chehab  */
420dc93a70cSHans Verkuil void video_unregister_device(struct video_device *vdev);
421401998faSMauro Carvalho Chehab 
422d9d3d176SMauro Carvalho Chehab /**
423d9d3d176SMauro Carvalho Chehab  * video_device_alloc - helper function to alloc &struct video_device
424d9d3d176SMauro Carvalho Chehab  *
425d9d3d176SMauro Carvalho Chehab  * Returns NULL if %-ENOMEM or a &struct video_device on success.
426d9d3d176SMauro Carvalho Chehab  */
427e138c592SHans Verkuil struct video_device * __must_check video_device_alloc(void);
428bfa8a273SHans Verkuil 
429d9d3d176SMauro Carvalho Chehab /**
430d9d3d176SMauro Carvalho Chehab  * video_device_release - helper function to release &struct video_device
431d9d3d176SMauro Carvalho Chehab  *
432d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
433d9d3d176SMauro Carvalho Chehab  *
434564aaf69SMauro Carvalho Chehab  * Can also be used for video_device->release\(\).
435d9d3d176SMauro Carvalho Chehab  */
436dc93a70cSHans Verkuil void video_device_release(struct video_device *vdev);
437bfa8a273SHans Verkuil 
438d9d3d176SMauro Carvalho Chehab /**
439d9d3d176SMauro Carvalho Chehab  * video_device_release_empty - helper function to implement the
440564aaf69SMauro Carvalho Chehab  *	video_device->release\(\) callback.
441d9d3d176SMauro Carvalho Chehab  *
442d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
443d9d3d176SMauro Carvalho Chehab  *
444d9d3d176SMauro Carvalho Chehab  * This release function does nothing.
445d9d3d176SMauro Carvalho Chehab  *
446d9d3d176SMauro Carvalho Chehab  * It should be used when the video_device is a static global struct.
447d9d3d176SMauro Carvalho Chehab  *
448d9d3d176SMauro Carvalho Chehab  * .. note::
449d9d3d176SMauro Carvalho Chehab  *	Having a static video_device is a dubious construction at best.
450d9d3d176SMauro Carvalho Chehab  */
451dc93a70cSHans Verkuil void video_device_release_empty(struct video_device *vdev);
452401998faSMauro Carvalho Chehab 
453d9d3d176SMauro Carvalho Chehab /**
454d9d3d176SMauro Carvalho Chehab  * v4l2_disable_ioctl- mark that a given command isn't implemented.
455d9d3d176SMauro Carvalho Chehab  *	shouldn't use core locking
456d9d3d176SMauro Carvalho Chehab  *
457d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
458d9d3d176SMauro Carvalho Chehab  * @cmd: ioctl command
459d9d3d176SMauro Carvalho Chehab  *
460d9d3d176SMauro Carvalho Chehab  * This function allows drivers to provide just one v4l2_ioctl_ops struct, but
461d9d3d176SMauro Carvalho Chehab  * disable ioctls based on the specific card that is actually found.
462d9d3d176SMauro Carvalho Chehab  *
463d9d3d176SMauro Carvalho Chehab  * .. note::
464d9d3d176SMauro Carvalho Chehab  *
465d9d3d176SMauro Carvalho Chehab  *    This must be called before video_register_device.
466d9d3d176SMauro Carvalho Chehab  *    See also the comments for determine_valid_ioctls().
467d9d3d176SMauro Carvalho Chehab  */
v4l2_disable_ioctl(struct video_device * vdev,unsigned int cmd)468d9d3d176SMauro Carvalho Chehab static inline void v4l2_disable_ioctl(struct video_device *vdev,
469d9d3d176SMauro Carvalho Chehab 				      unsigned int cmd)
47048ea0be0SHans Verkuil {
47148ea0be0SHans Verkuil 	if (_IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)
47248ea0be0SHans Verkuil 		set_bit(_IOC_NR(cmd), vdev->valid_ioctls);
47348ea0be0SHans Verkuil }
47448ea0be0SHans Verkuil 
475d9d3d176SMauro Carvalho Chehab /**
476d9d3d176SMauro Carvalho Chehab  * video_get_drvdata - gets private data from &struct video_device.
477d9d3d176SMauro Carvalho Chehab  *
478d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
479d9d3d176SMauro Carvalho Chehab  *
480d9d3d176SMauro Carvalho Chehab  * returns a pointer to the private data
481d9d3d176SMauro Carvalho Chehab  */
video_get_drvdata(struct video_device * vdev)482dc93a70cSHans Verkuil static inline void *video_get_drvdata(struct video_device *vdev)
483401998faSMauro Carvalho Chehab {
484dc93a70cSHans Verkuil 	return dev_get_drvdata(&vdev->dev);
485401998faSMauro Carvalho Chehab }
486401998faSMauro Carvalho Chehab 
487d9d3d176SMauro Carvalho Chehab /**
488d9d3d176SMauro Carvalho Chehab  * video_set_drvdata - sets private data from &struct video_device.
489d9d3d176SMauro Carvalho Chehab  *
490d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
491d9d3d176SMauro Carvalho Chehab  * @data: private data pointer
492d9d3d176SMauro Carvalho Chehab  */
video_set_drvdata(struct video_device * vdev,void * data)493dc93a70cSHans Verkuil static inline void video_set_drvdata(struct video_device *vdev, void *data)
494401998faSMauro Carvalho Chehab {
495dc93a70cSHans Verkuil 	dev_set_drvdata(&vdev->dev, data);
496401998faSMauro Carvalho Chehab }
49738ee04f0SMauro Carvalho Chehab 
498d9d3d176SMauro Carvalho Chehab /**
499d9d3d176SMauro Carvalho Chehab  * video_devdata - gets &struct video_device from struct file.
500d9d3d176SMauro Carvalho Chehab  *
501d9d3d176SMauro Carvalho Chehab  * @file: pointer to struct file
502d9d3d176SMauro Carvalho Chehab  */
503bfa8a273SHans Verkuil struct video_device *video_devdata(struct file *file);
504bfa8a273SHans Verkuil 
505d9d3d176SMauro Carvalho Chehab /**
506d9d3d176SMauro Carvalho Chehab  * video_drvdata - gets private data from &struct video_device using the
507d9d3d176SMauro Carvalho Chehab  *	struct file.
508d9d3d176SMauro Carvalho Chehab  *
509d9d3d176SMauro Carvalho Chehab  * @file: pointer to struct file
510d9d3d176SMauro Carvalho Chehab  *
511d9d3d176SMauro Carvalho Chehab  * This is function combines both video_get_drvdata() and video_devdata()
512d9d3d176SMauro Carvalho Chehab  * as this is used very often.
513d9d3d176SMauro Carvalho Chehab  */
video_drvdata(struct file * file)514bfa8a273SHans Verkuil static inline void *video_drvdata(struct file *file)
515bfa8a273SHans Verkuil {
516bfa8a273SHans Verkuil 	return video_get_drvdata(video_devdata(file));
517bfa8a273SHans Verkuil }
518401998faSMauro Carvalho Chehab 
519d9d3d176SMauro Carvalho Chehab /**
520d9d3d176SMauro Carvalho Chehab  * video_device_node_name - returns the video device name
521d9d3d176SMauro Carvalho Chehab  *
522d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
523d9d3d176SMauro Carvalho Chehab  *
524d9d3d176SMauro Carvalho Chehab  * Returns the device name string
525d9d3d176SMauro Carvalho Chehab  */
video_device_node_name(struct video_device * vdev)526eac8ea53SLaurent Pinchart static inline const char *video_device_node_name(struct video_device *vdev)
527eac8ea53SLaurent Pinchart {
528eac8ea53SLaurent Pinchart 	return dev_name(&vdev->dev);
529eac8ea53SLaurent Pinchart }
530eac8ea53SLaurent Pinchart 
531d9d3d176SMauro Carvalho Chehab /**
532d9d3d176SMauro Carvalho Chehab  * video_is_registered - returns true if the &struct video_device is registered.
533d9d3d176SMauro Carvalho Chehab  *
534d9d3d176SMauro Carvalho Chehab  *
535d9d3d176SMauro Carvalho Chehab  * @vdev: pointer to &struct video_device
536d9d3d176SMauro Carvalho Chehab  */
video_is_registered(struct video_device * vdev)537957b4aa9SLaurent Pinchart static inline int video_is_registered(struct video_device *vdev)
538dc93a70cSHans Verkuil {
539957b4aa9SLaurent Pinchart 	return test_bit(V4L2_FL_REGISTERED, &vdev->flags);
540dc93a70cSHans Verkuil }
541dc93a70cSHans Verkuil 
542340eba47STomi Valkeinen #if defined(CONFIG_MEDIA_CONTROLLER)
543340eba47STomi Valkeinen 
544340eba47STomi Valkeinen /**
545340eba47STomi Valkeinen  * video_device_pipeline_start - Mark a pipeline as streaming
546340eba47STomi Valkeinen  * @vdev: Starting video device
547340eba47STomi Valkeinen  * @pipe: Media pipeline to be assigned to all entities in the pipeline.
548340eba47STomi Valkeinen  *
549340eba47STomi Valkeinen  * Mark all entities connected to a given video device through enabled links,
550340eba47STomi Valkeinen  * either directly or indirectly, as streaming. The given pipeline object is
551*9e3576a1STomi Valkeinen  * assigned to every pad in the pipeline and stored in the media_pad pipe
552340eba47STomi Valkeinen  * field.
553340eba47STomi Valkeinen  *
554340eba47STomi Valkeinen  * Calls to this function can be nested, in which case the same number of
555340eba47STomi Valkeinen  * video_device_pipeline_stop() calls will be required to stop streaming. The
556340eba47STomi Valkeinen  * pipeline pointer must be identical for all nested calls to
557340eba47STomi Valkeinen  * video_device_pipeline_start().
558340eba47STomi Valkeinen  *
559340eba47STomi Valkeinen  * The video device must contain a single pad.
560340eba47STomi Valkeinen  *
561340eba47STomi Valkeinen  * This is a convenience wrapper around media_pipeline_start().
562340eba47STomi Valkeinen  */
563340eba47STomi Valkeinen __must_check int video_device_pipeline_start(struct video_device *vdev,
564340eba47STomi Valkeinen 					     struct media_pipeline *pipe);
565340eba47STomi Valkeinen 
566340eba47STomi Valkeinen /**
567340eba47STomi Valkeinen  * __video_device_pipeline_start - Mark a pipeline as streaming
568340eba47STomi Valkeinen  * @vdev: Starting video device
569340eba47STomi Valkeinen  * @pipe: Media pipeline to be assigned to all entities in the pipeline.
570340eba47STomi Valkeinen  *
571340eba47STomi Valkeinen  * ..note:: This is the non-locking version of video_device_pipeline_start()
572340eba47STomi Valkeinen  *
573340eba47STomi Valkeinen  * The video device must contain a single pad.
574340eba47STomi Valkeinen  *
575340eba47STomi Valkeinen  * This is a convenience wrapper around __media_pipeline_start().
576340eba47STomi Valkeinen  */
577340eba47STomi Valkeinen __must_check int __video_device_pipeline_start(struct video_device *vdev,
578340eba47STomi Valkeinen 					       struct media_pipeline *pipe);
579340eba47STomi Valkeinen 
580340eba47STomi Valkeinen /**
581340eba47STomi Valkeinen  * video_device_pipeline_stop - Mark a pipeline as not streaming
582340eba47STomi Valkeinen  * @vdev: Starting video device
583340eba47STomi Valkeinen  *
584340eba47STomi Valkeinen  * Mark all entities connected to a given video device through enabled links,
585*9e3576a1STomi Valkeinen  * either directly or indirectly, as not streaming. The media_pad pipe field
586340eba47STomi Valkeinen  * is reset to %NULL.
587340eba47STomi Valkeinen  *
588340eba47STomi Valkeinen  * If multiple calls to media_pipeline_start() have been made, the same
589340eba47STomi Valkeinen  * number of calls to this function are required to mark the pipeline as not
590340eba47STomi Valkeinen  * streaming.
591340eba47STomi Valkeinen  *
592340eba47STomi Valkeinen  * The video device must contain a single pad.
593340eba47STomi Valkeinen  *
594340eba47STomi Valkeinen  * This is a convenience wrapper around media_pipeline_stop().
595340eba47STomi Valkeinen  */
596340eba47STomi Valkeinen void video_device_pipeline_stop(struct video_device *vdev);
597340eba47STomi Valkeinen 
598340eba47STomi Valkeinen /**
599340eba47STomi Valkeinen  * __video_device_pipeline_stop - Mark a pipeline as not streaming
600340eba47STomi Valkeinen  * @vdev: Starting video device
601340eba47STomi Valkeinen  *
602340eba47STomi Valkeinen  * .. note:: This is the non-locking version of media_pipeline_stop()
603340eba47STomi Valkeinen  *
604340eba47STomi Valkeinen  * The video device must contain a single pad.
605340eba47STomi Valkeinen  *
606340eba47STomi Valkeinen  * This is a convenience wrapper around __media_pipeline_stop().
607340eba47STomi Valkeinen  */
608340eba47STomi Valkeinen void __video_device_pipeline_stop(struct video_device *vdev);
609340eba47STomi Valkeinen 
610340eba47STomi Valkeinen /**
611d9f44345STomi Valkeinen  * video_device_pipeline_alloc_start - Mark a pipeline as streaming
612d9f44345STomi Valkeinen  * @vdev: Starting video device
613d9f44345STomi Valkeinen  *
614d9f44345STomi Valkeinen  * video_device_pipeline_alloc_start() is similar to video_device_pipeline_start()
615d9f44345STomi Valkeinen  * but instead of working on a given pipeline the function will use an
616d9f44345STomi Valkeinen  * existing pipeline if the video device is already part of a pipeline, or
617d9f44345STomi Valkeinen  * allocate a new pipeline.
618d9f44345STomi Valkeinen  *
619d9f44345STomi Valkeinen  * Calls to video_device_pipeline_alloc_start() must be matched with
620d9f44345STomi Valkeinen  * video_device_pipeline_stop().
621d9f44345STomi Valkeinen  */
622d9f44345STomi Valkeinen __must_check int video_device_pipeline_alloc_start(struct video_device *vdev);
623d9f44345STomi Valkeinen 
624d9f44345STomi Valkeinen /**
625340eba47STomi Valkeinen  * video_device_pipeline - Get the media pipeline a video device is part of
626340eba47STomi Valkeinen  * @vdev: The video device
627340eba47STomi Valkeinen  *
628340eba47STomi Valkeinen  * This function returns the media pipeline that a video device has been
629340eba47STomi Valkeinen  * associated with when constructing the pipeline with
630340eba47STomi Valkeinen  * video_device_pipeline_start(). The pointer remains valid until
631340eba47STomi Valkeinen  * video_device_pipeline_stop() is called.
632340eba47STomi Valkeinen  *
633340eba47STomi Valkeinen  * Return: The media_pipeline the video device is part of, or NULL if the video
634340eba47STomi Valkeinen  * device is not part of any pipeline.
635340eba47STomi Valkeinen  *
636340eba47STomi Valkeinen  * The video device must contain a single pad.
637340eba47STomi Valkeinen  *
638340eba47STomi Valkeinen  * This is a convenience wrapper around media_entity_pipeline().
639340eba47STomi Valkeinen  */
640340eba47STomi Valkeinen struct media_pipeline *video_device_pipeline(struct video_device *vdev);
641340eba47STomi Valkeinen 
642340eba47STomi Valkeinen #endif /* CONFIG_MEDIA_CONTROLLER */
643340eba47STomi Valkeinen 
644401998faSMauro Carvalho Chehab #endif /* _V4L2_DEV_H */
645