v4l2-dev.h 15.0 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 *
 *	V 4 L 2   D R I V E R   H E L P E R   A P I
 *
 * Moved from videodev2.h
 *
 *	Some commonly needed functions for drivers (v4l2-common.o module)
 */
#ifndef _V4L2_DEV_H
#define _V4L2_DEV_H

#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/device.h>
16
#include <linux/cdev.h>
17 18 19
#include <linux/mutex.h>
#include <linux/videodev2.h>

20 21
#include <media/media-entity.h>

22
#define VIDEO_MAJOR	81
23

24 25 26
#define VFL_TYPE_GRABBER	0
#define VFL_TYPE_VBI		1
#define VFL_TYPE_RADIO		2
27
#define VFL_TYPE_SUBDEV		3
28
#define VFL_TYPE_SDR		4
29 30
#define VFL_TYPE_TOUCH		5
#define VFL_TYPE_MAX		6
31

32 33 34 35 36 37
/* Is this a receiver, transmitter or mem-to-mem? */
/* Ignored for VFL_TYPE_SUBDEV. */
#define VFL_DIR_RX		0
#define VFL_DIR_TX		1
#define VFL_DIR_M2M		2

38
struct v4l2_ioctl_callbacks;
39
struct video_device;
40
struct v4l2_device;
41
struct v4l2_ctrl_handler;
42

43 44 45 46
/* Flag to mark the video_device struct as registered.
   Drivers can clear this flag if they want to block all future
   device access. It is cleared by video_unregister_device. */
#define V4L2_FL_REGISTERED	(0)
47
/* file->private_data points to struct v4l2_fh */
S
Sakari Ailus 已提交
48
#define V4L2_FL_USES_V4L2_FH	(1)
49

50 51
/* Priority helper functions */

52 53 54 55 56 57 58 59
/**
 * struct v4l2_prio_state - stores the priority states
 *
 * @prios: array with elements to store the array priorities
 *
 *
 * .. note::
 *    The size of @prios array matches the number of priority types defined
60
 *    by enum &v4l2_priority.
61
 */
62 63 64 65
struct v4l2_prio_state {
	atomic_t prios[4];
};

66 67 68 69 70
/**
 * v4l2_prio_init - initializes a struct v4l2_prio_state
 *
 * @global: pointer to &struct v4l2_prio_state
 */
71
void v4l2_prio_init(struct v4l2_prio_state *global);
72 73 74 75 76

/**
 * v4l2_prio_change - changes the v4l2 file handler priority
 *
 * @global: pointer to the &struct v4l2_prio_state of the device node.
77 78
 * @local: pointer to the desired priority, as defined by enum &v4l2_priority
 * @new: Priority type requested, as defined by enum &v4l2_priority.
79 80 81 82
 *
 * .. note::
 *	This function should be used only by the V4L2 core.
 */
83 84
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
		     enum v4l2_priority new);
85 86 87 88 89

/**
 * v4l2_prio_open - Implements the priority logic for a file handler open
 *
 * @global: pointer to the &struct v4l2_prio_state of the device node.
90
 * @local: pointer to the desired priority, as defined by enum &v4l2_priority
91 92 93 94
 *
 * .. note::
 *	This function should be used only by the V4L2 core.
 */
95
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
96 97 98 99 100

/**
 * v4l2_prio_close - Implements the priority logic for a file handler close
 *
 * @global: pointer to the &struct v4l2_prio_state of the device node.
101
 * @local: priority to be released, as defined by enum &v4l2_priority
102 103 104 105
 *
 * .. note::
 *	This function should be used only by the V4L2 core.
 */
106
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local);
107 108 109 110 111 112 113 114 115

/**
 * v4l2_prio_max - Return the maximum priority, as stored at the @global array.
 *
 * @global: pointer to the &struct v4l2_prio_state of the device node.
 *
 * .. note::
 *	This function should be used only by the V4L2 core.
 */
116 117
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);

118
/**
119
 * v4l2_prio_check - Implements the priority logic for a file handler close
120 121
 *
 * @global: pointer to the &struct v4l2_prio_state of the device node.
122
 * @local: desired priority, as defined by enum &v4l2_priority local
123 124 125 126 127
 *
 * .. note::
 *	This function should be used only by the V4L2 core.
 */
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local);
128

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
/**
 * struct v4l2_file_operations - fs operations used by a V4L2 device
 *
 * @owner: pointer to struct module
 * @read: operations needed to implement the read() syscall
 * @write: operations needed to implement the write() syscall
 * @poll: operations needed to implement the poll() syscall
 * @unlocked_ioctl: operations needed to implement the ioctl() syscall
 * @compat_ioctl32: operations needed to implement the ioctl() syscall for
 *	the special case where the Kernel uses 64 bits instructions, but
 *	the userspace uses 32 bits.
 * @get_unmapped_area: called by the mmap() syscall, used when %!CONFIG_MMU
 * @mmap: operations needed to implement the mmap() syscall
 * @open: operations needed to implement the open() syscall
 * @release: operations needed to implement the release() syscall
 *
 * .. note::
 *
 *	Those operations are used to implemente the fs struct file_operations
 *	at the V4L2 drivers. The V4L2 core overrides the fs ops with some
 *	extra logic needed by the subsystem.
 */
151 152 153 154
struct v4l2_file_operations {
	struct module *owner;
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
A
Al Viro 已提交
155
	__poll_t (*poll) (struct file *, struct poll_table_struct *);
156
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
157 158 159
#ifdef CONFIG_COMPAT
	long (*compat_ioctl32) (struct file *, unsigned int, unsigned long);
#endif
160 161
	unsigned long (*get_unmapped_area) (struct file *, unsigned long,
				unsigned long, unsigned long, unsigned long);
162 163 164 165 166
	int (*mmap) (struct file *, struct vm_area_struct *);
	int (*open) (struct file *);
	int (*release) (struct file *);
};

167 168 169 170 171 172
/*
 * Newer version of video_device, handled by videodev2.c
 * 	This version moves redundant code from video device code to
 *	the common handler
 */

173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
/**
 * struct video_device - Structure used to create and manage the V4L2 device
 *	nodes.
 *
 * @entity: &struct media_entity
 * @intf_devnode: pointer to &struct media_intf_devnode
 * @pipe: &struct media_pipeline
 * @fops: pointer to &struct v4l2_file_operations for the video device
 * @device_caps: device capabilities as used in v4l2_capabilities
 * @dev: &struct device for the video device
 * @cdev: character device
 * @v4l2_dev: pointer to &struct v4l2_device parent
 * @dev_parent: pointer to &struct device parent
 * @ctrl_handler: Control handler associated with this device node.
 *	 May be NULL.
 * @queue: &struct vb2_queue associated with this device node. May be NULL.
 * @prio: pointer to &struct v4l2_prio_state with device's Priority state.
 *	 If NULL, then v4l2_dev->prio will be used.
 * @name: video device name
 * @vfl_type: V4L device type
 * @vfl_dir: V4L receiver, transmitter or m2m
 * @minor: device node 'minor'. It is set to -1 if the registration failed
 * @num: number of the video device node
 * @flags: video device flags. Use bitops to set/clear/test flags
 * @index: attribute to differentiate multiple indices on one physical device
 * @fh_lock: Lock for all v4l2_fhs
 * @fh_list: List of &struct v4l2_fh
 * @dev_debug: Internal device debug flags, not for use by drivers
 * @tvnorms: Supported tv norms
 *
 * @release: video device release() callback
 * @ioctl_ops: pointer to &struct v4l2_ioctl_ops with ioctl callbacks
 *
 * @valid_ioctls: bitmap with the valid ioctls for this device
 * @disable_locking: bitmap with the ioctls that don't require locking
 * @lock: pointer to &struct mutex serialization lock
 *
 * .. note::
 *	Only set @dev_parent if that can't be deduced from @v4l2_dev.
 */

214 215
struct video_device
{
216 217
#if defined(CONFIG_MEDIA_CONTROLLER)
	struct media_entity entity;
218
	struct media_intf_devnode *intf_devnode;
219
	struct media_pipeline pipe;
220
#endif
221
	const struct v4l2_file_operations *fops;
222

223 224
	u32 device_caps;

225
	/* sysfs */
226 227
	struct device dev;
	struct cdev *cdev;
228

229 230
	struct v4l2_device *v4l2_dev;
	struct device *dev_parent;
231

232 233
	struct v4l2_ctrl_handler *ctrl_handler;

234 235
	struct vb2_queue *queue;

236 237
	struct v4l2_prio_state *prio;

238 239
	/* device info */
	char name[32];
240 241
	int vfl_type;
	int vfl_dir;
242
	int minor;
243
	u16 num;
244
	unsigned long flags;
245
	int index;
246

S
Sakari Ailus 已提交
247
	/* V4L2 file handles */
248 249
	spinlock_t		fh_lock;
	struct list_head	fh_list;
S
Sakari Ailus 已提交
250

251
	int dev_debug;
252

253
	v4l2_std_id tvnorms;
254 255

	/* callbacks */
256
	void (*release)(struct video_device *vdev);
257
	const struct v4l2_ioctl_ops *ioctl_ops;
258
	DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
259

260
	DECLARE_BITMAP(disable_locking, BASE_VIDIOC_PRIVATE);
261
	struct mutex *lock;
262 263
};

264 265
#define media_entity_to_video_device(__e) \
	container_of(__e, struct video_device, entity)
266
/* dev to video-device */
267
#define to_video_device(cd) container_of(cd, struct video_device, dev)
268

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
/**
 * __video_register_device - register video4linux devices
 *
 * @vdev: struct video_device to register
 * @type: type of device to register
 * @nr:   which device node number is desired:
 * 	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
 * @warn_if_nr_in_use: warn if the desired device node number
 *        was already in use and another number was chosen instead.
 * @owner: module that owns the video device node
 *
 * The registration code assigns minor numbers and device node numbers
 * based on the requested type and registers the new device node with
 * the kernel.
 *
 * This function assumes that struct video_device was zeroed when it
 * was allocated and does not contain any stale date.
 *
 * An error is returned if no free minor or device node number could be
 * found, or if the registration of the device node failed.
 *
 * Returns 0 on success.
 *
 * Valid values for @type are:
 *
 *	- %VFL_TYPE_GRABBER - A frame grabber
 *	- %VFL_TYPE_VBI - Vertical blank data (undecoded)
 *	- %VFL_TYPE_RADIO - A radio card
 *	- %VFL_TYPE_SUBDEV - A subdevice
 *	- %VFL_TYPE_SDR - Software Defined Radio
299
 *	- %VFL_TYPE_TOUCH - A touch sensor
300 301 302 303 304 305 306
 *
 * .. note::
 *
 *	This function is meant to be used only inside the V4L2 core.
 *	Drivers should use video_register_device() or
 *	video_register_device_no_warn().
 */
307 308 309
int __must_check __video_register_device(struct video_device *vdev, int type,
		int nr, int warn_if_nr_in_use, struct module *owner);

310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
/**
 *  video_register_device - register video4linux devices
 *
 * @vdev: struct video_device to register
 * @type: type of device to register
 * @nr:   which device node number is desired:
 * 	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
 *
 * Internally, it calls __video_register_device(). Please see its
 * documentation for more details.
 *
 * .. note::
 * 	if video_register_device fails, the release() callback of
 *	&struct video_device structure is *not* called, so the caller
 *	is responsible for freeing any data. Usually that means that
 *	you video_device_release() should be called on failure.
 */
327 328 329 330 331
static inline int __must_check video_register_device(struct video_device *vdev,
		int type, int nr)
{
	return __video_register_device(vdev, type, nr, 1, vdev->fops->owner);
}
332

333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
/**
 *  video_register_device_no_warn - register video4linux devices
 *
 * @vdev: struct video_device to register
 * @type: type of device to register
 * @nr:   which device node number is desired:
 * 	(0 == /dev/video0, 1 == /dev/video1, ..., -1 == first free)
 *
 * This function is identical to video_register_device() except that no
 * warning is issued if the desired device node number was already in use.
 *
 * Internally, it calls __video_register_device(). Please see its
 * documentation for more details.
 *
 * .. note::
 * 	if video_register_device fails, the release() callback of
 *	&struct video_device structure is *not* called, so the caller
 *	is responsible for freeing any data. Usually that means that
 *	you video_device_release() should be called on failure.
 */
353 354 355 356 357
static inline int __must_check video_register_device_no_warn(
		struct video_device *vdev, int type, int nr)
{
	return __video_register_device(vdev, type, nr, 0, vdev->fops->owner);
}
358

359 360 361 362 363 364 365
/**
 * video_unregister_device - Unregister video devices.
 *
 * @vdev: &struct video_device to register
 *
 * Does nothing if vdev == NULL or if video_is_registered() returns false.
 */
366
void video_unregister_device(struct video_device *vdev);
367

368 369 370 371 372
/**
 * video_device_alloc - helper function to alloc &struct video_device
 *
 * Returns NULL if %-ENOMEM or a &struct video_device on success.
 */
373
struct video_device * __must_check video_device_alloc(void);
374

375 376 377 378 379
/**
 * video_device_release - helper function to release &struct video_device
 *
 * @vdev: pointer to &struct video_device
 *
380
 * Can also be used for video_device->release\(\).
381
 */
382
void video_device_release(struct video_device *vdev);
383

384 385
/**
 * video_device_release_empty - helper function to implement the
386
 * 	video_device->release\(\) callback.
387 388 389 390 391 392 393 394 395 396
 *
 * @vdev: pointer to &struct video_device
 *
 * This release function does nothing.
 *
 * It should be used when the video_device is a static global struct.
 *
 * .. note::
 *	Having a static video_device is a dubious construction at best.
 */
397
void video_device_release_empty(struct video_device *vdev);
398

399 400 401 402 403 404 405
/**
 * v4l2_is_known_ioctl - Checks if a given cmd is a known V4L ioctl
 *
 * @cmd: ioctl command
 *
 * returns true if cmd is a known V4L2 ioctl
 */
406 407
bool v4l2_is_known_ioctl(unsigned int cmd);

408 409 410 411 412 413 414 415
/** v4l2_disable_ioctl_locking - mark that a given command
 *	shouldn't use core locking
 *
 * @vdev: pointer to &struct video_device
 * @cmd: ioctl command
 */
static inline void v4l2_disable_ioctl_locking(struct video_device *vdev,
					      unsigned int cmd)
416 417
{
	if (_IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)
418
		set_bit(_IOC_NR(cmd), vdev->disable_locking);
419 420
}

421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
/**
 * v4l2_disable_ioctl- mark that a given command isn't implemented.
 *	shouldn't use core locking
 *
 * @vdev: pointer to &struct video_device
 * @cmd: ioctl command
 *
 * This function allows drivers to provide just one v4l2_ioctl_ops struct, but
 * disable ioctls based on the specific card that is actually found.
 *
 * .. note::
 *
 *    This must be called before video_register_device.
 *    See also the comments for determine_valid_ioctls().
 */
static inline void v4l2_disable_ioctl(struct video_device *vdev,
				      unsigned int cmd)
438 439 440 441 442
{
	if (_IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)
		set_bit(_IOC_NR(cmd), vdev->valid_ioctls);
}

443 444 445 446 447 448 449
/**
 * video_get_drvdata - gets private data from &struct video_device.
 *
 * @vdev: pointer to &struct video_device
 *
 * returns a pointer to the private data
 */
450
static inline void *video_get_drvdata(struct video_device *vdev)
451
{
452
	return dev_get_drvdata(&vdev->dev);
453 454
}

455 456 457 458 459 460
/**
 * video_set_drvdata - sets private data from &struct video_device.
 *
 * @vdev: pointer to &struct video_device
 * @data: private data pointer
 */
461
static inline void video_set_drvdata(struct video_device *vdev, void *data)
462
{
463
	dev_set_drvdata(&vdev->dev, data);
464
}
465

466 467 468 469 470
/**
 * video_devdata - gets &struct video_device from struct file.
 *
 * @file: pointer to struct file
 */
471 472
struct video_device *video_devdata(struct file *file);

473 474 475 476 477 478 479 480 481
/**
 * video_drvdata - gets private data from &struct video_device using the
 *	struct file.
 *
 * @file: pointer to struct file
 *
 * This is function combines both video_get_drvdata() and video_devdata()
 * as this is used very often.
 */
482 483 484 485
static inline void *video_drvdata(struct file *file)
{
	return video_get_drvdata(video_devdata(file));
}
486

487 488 489 490 491 492 493
/**
 * video_device_node_name - returns the video device name
 *
 * @vdev: pointer to &struct video_device
 *
 * Returns the device name string
 */
494 495 496 497 498
static inline const char *video_device_node_name(struct video_device *vdev)
{
	return dev_name(&vdev->dev);
}

499 500 501 502 503 504
/**
 * video_is_registered - returns true if the &struct video_device is registered.
 *
 *
 * @vdev: pointer to &struct video_device
 */
505
static inline int video_is_registered(struct video_device *vdev)
506
{
507
	return test_bit(V4L2_FL_REGISTERED, &vdev->flags);
508 509
}

510
#endif /* _V4L2_DEV_H */