summaryrefslogtreecommitdiff
path: root/linux/include/media/v4l2-dev.h
blob: 9158ad8b5716b6615c2e244e0cc03dc987ffb880 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 *
 *	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>
#include <linux/cdev.h>
#include <linux/mutex.h>
#include <linux/videodev2.h>

#define VIDEO_MAJOR	81

/* Minor device allocation */
#define MINOR_VFL_TYPE_GRABBER_MIN   0
#define MINOR_VFL_TYPE_GRABBER_MAX  63
#define MINOR_VFL_TYPE_RADIO_MIN    64
#define MINOR_VFL_TYPE_RADIO_MAX   127
#define MINOR_VFL_TYPE_VTX_MIN     192
#define MINOR_VFL_TYPE_VTX_MAX     223
#define MINOR_VFL_TYPE_VBI_MIN     224
#define MINOR_VFL_TYPE_VBI_MAX     255

#define VFL_TYPE_GRABBER	0
#define VFL_TYPE_VBI		1
#define VFL_TYPE_RADIO		2
#define VFL_TYPE_VTX		3

struct v4l2_ioctl_callbacks;

/*
 * Newer version of video_device, handled by videodev2.c
 * 	This version moves redundant code from video device code to
 *	the common handler
 */

struct video_device
{
	/* device ops */
	const struct file_operations *fops;

	/* sysfs */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
	struct device dev;		/* v4l device */
#else
	struct class_device dev;
#endif
	struct cdev cdev;		/* character device */
	void (*cdev_release)(struct kobject *kobj);
	struct device *parent;		/* device parent */

	/* device info */
	char name[32];
	int vfl_type;
	int minor;
	/* attribute to differentiate multiple indices on one physical device */
	int index;

	int debug;			/* Activates debug level*/

	/* Video standard vars */
	v4l2_std_id tvnorms;		/* Supported tv norms */
	v4l2_std_id current_norm;	/* Current tvnorm */

	/* callbacks */
	void (*release)(struct video_device *vfd);

	/* ioctl callbacks */
	const struct v4l2_ioctl_ops *ioctl_ops;
};

/* dev to video-device */
#define to_video_device(cd) container_of(cd, struct video_device, dev)

/* Register and unregister devices. Note that if video_register_device fails,
   the release() callback of the video_device structure is *not* called, so
   the caller is responsible for freeing any data. Usually that means that
   you call video_device_release() on failure. */
int __must_check video_register_device(struct video_device *vfd, int type, int nr);
int __must_check video_register_device_index(struct video_device *vfd,
						int type, int nr, int index);
void video_unregister_device(struct video_device *vfd);

/* helper functions to alloc/release struct video_device, the
   latter can also be used for video_device->release(). */
struct video_device * __must_check video_device_alloc(void);

/* this release function frees the vfd pointer */
void video_device_release(struct video_device *vfd);

/* this release function does nothing, use when the video_device is a
   static global struct. Note that having a static video_device is
   a dubious construction at best. */
void video_device_release_empty(struct video_device *vfd);

/* helper functions to access driver private data. */
static inline void *video_get_drvdata(struct video_device *dev)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
	return class_get_devdata(&dev->dev);
#else
	return dev_get_drvdata(&dev->dev);
#endif
}

static inline void video_set_drvdata(struct video_device *dev, void *data)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
	class_set_devdata(&dev->dev, data);
#else
	dev_set_drvdata(&dev->dev, data);
#endif
}

struct video_device *video_devdata(struct file *file);

/* Combine video_get_drvdata and video_devdata as this is
   used very often. */
static inline void *video_drvdata(struct file *file)
{
	return video_get_drvdata(video_devdata(file));
}

#endif /* _V4L2_DEV_H */