aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/Makefile2
-rw-r--r--drivers/media/video/v4l2-dev.c4
-rw-r--r--drivers/media/video/v4l2-fh.c66
-rw-r--r--include/media/v4l2-dev.h5
-rw-r--r--include/media/v4l2-fh.h63
5 files changed, 139 insertions, 1 deletions
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
index a688a0f43879..c84175c55268 100644
--- a/drivers/media/video/Makefile
+++ b/drivers/media/video/Makefile
@@ -10,7 +10,7 @@ stkwebcam-objs := stk-webcam.o stk-sensor.o
10 10
11omap2cam-objs := omap24xxcam.o omap24xxcam-dma.o 11omap2cam-objs := omap24xxcam.o omap24xxcam-dma.o
12 12
13videodev-objs := v4l2-dev.o v4l2-ioctl.o v4l2-device.o 13videodev-objs := v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o
14 14
15# V4L2 core modules 15# V4L2 core modules
16 16
diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c
index 709069916068..65a7b30524ca 100644
--- a/drivers/media/video/v4l2-dev.c
+++ b/drivers/media/video/v4l2-dev.c
@@ -421,6 +421,10 @@ static int __video_register_device(struct video_device *vdev, int type, int nr,
421 if (!vdev->release) 421 if (!vdev->release)
422 return -EINVAL; 422 return -EINVAL;
423 423
424 /* v4l2_fh support */
425 spin_lock_init(&vdev->fh_lock);
426 INIT_LIST_HEAD(&vdev->fh_list);
427
424 /* Part 1: check device type */ 428 /* Part 1: check device type */
425 switch (type) { 429 switch (type) {
426 case VFL_TYPE_GRABBER: 430 case VFL_TYPE_GRABBER:
diff --git a/drivers/media/video/v4l2-fh.c b/drivers/media/video/v4l2-fh.c
new file mode 100644
index 000000000000..93ea0af5fac1
--- /dev/null
+++ b/drivers/media/video/v4l2-fh.c
@@ -0,0 +1,66 @@
1/*
2 * v4l2-fh.c
3 *
4 * V4L2 file handles.
5 *
6 * Copyright (C) 2009--2010 Nokia Corporation.
7 *
8 * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * version 2 as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22 * 02110-1301 USA
23 */
24
25#include <linux/bitops.h>
26#include <media/v4l2-dev.h>
27#include <media/v4l2-fh.h>
28
29int v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev)
30{
31 fh->vdev = vdev;
32 INIT_LIST_HEAD(&fh->list);
33 set_bit(V4L2_FL_USES_V4L2_FH, &fh->vdev->flags);
34
35 return 0;
36}
37EXPORT_SYMBOL_GPL(v4l2_fh_init);
38
39void v4l2_fh_add(struct v4l2_fh *fh)
40{
41 unsigned long flags;
42
43 spin_lock_irqsave(&fh->vdev->fh_lock, flags);
44 list_add(&fh->list, &fh->vdev->fh_list);
45 spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
46}
47EXPORT_SYMBOL_GPL(v4l2_fh_add);
48
49void v4l2_fh_del(struct v4l2_fh *fh)
50{
51 unsigned long flags;
52
53 spin_lock_irqsave(&fh->vdev->fh_lock, flags);
54 list_del_init(&fh->list);
55 spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
56}
57EXPORT_SYMBOL_GPL(v4l2_fh_del);
58
59void v4l2_fh_exit(struct v4l2_fh *fh)
60{
61 if (fh->vdev == NULL)
62 return;
63
64 fh->vdev = NULL;
65}
66EXPORT_SYMBOL_GPL(v4l2_fh_exit);
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
index 2dee93892ea2..bebe44b03e0f 100644
--- a/include/media/v4l2-dev.h
+++ b/include/media/v4l2-dev.h
@@ -32,6 +32,7 @@ struct v4l2_device;
32 Drivers can clear this flag if they want to block all future 32 Drivers can clear this flag if they want to block all future
33 device access. It is cleared by video_unregister_device. */ 33 device access. It is cleared by video_unregister_device. */
34#define V4L2_FL_REGISTERED (0) 34#define V4L2_FL_REGISTERED (0)
35#define V4L2_FL_USES_V4L2_FH (1)
35 36
36struct v4l2_file_operations { 37struct v4l2_file_operations {
37 struct module *owner; 38 struct module *owner;
@@ -77,6 +78,10 @@ struct video_device
77 /* attribute to differentiate multiple indices on one physical device */ 78 /* attribute to differentiate multiple indices on one physical device */
78 int index; 79 int index;
79 80
81 /* V4L2 file handles */
82 spinlock_t fh_lock; /* Lock for all v4l2_fhs */
83 struct list_head fh_list; /* List of struct v4l2_fh */
84
80 int debug; /* Activates debug level*/ 85 int debug; /* Activates debug level*/
81 86
82 /* Video standard vars */ 87 /* Video standard vars */
diff --git a/include/media/v4l2-fh.h b/include/media/v4l2-fh.h
new file mode 100644
index 000000000000..4aaa1508c8b5
--- /dev/null
+++ b/include/media/v4l2-fh.h
@@ -0,0 +1,63 @@
1/*
2 * v4l2-fh.h
3 *
4 * V4L2 file handle. Store per file handle data for the V4L2
5 * framework. Using file handles is optional for the drivers.
6 *
7 * Copyright (C) 2009--2010 Nokia Corporation.
8 *
9 * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * version 2 as published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 * 02110-1301 USA
24 */
25
26#ifndef V4L2_FH_H
27#define V4L2_FH_H
28
29#include <linux/list.h>
30
31struct video_device;
32
33struct v4l2_fh {
34 struct list_head list;
35 struct video_device *vdev;
36};
37
38/*
39 * Initialise the file handle. Parts of the V4L2 framework using the
40 * file handles should be initialised in this function. Must be called
41 * from driver's v4l2_file_operations->open() handler if the driver
42 * uses v4l2_fh.
43 */
44int v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
45/*
46 * Add the fh to the list of file handles on a video_device. The file
47 * handle must be initialised first.
48 */
49void v4l2_fh_add(struct v4l2_fh *fh);
50/*
51 * Remove file handle from the list of file handles. Must be called in
52 * v4l2_file_operations->release() handler if the driver uses v4l2_fh.
53 */
54void v4l2_fh_del(struct v4l2_fh *fh);
55/*
56 * Release resources related to a file handle. Parts of the V4L2
57 * framework using the v4l2_fh must release their resources here, too.
58 * Must be called in v4l2_file_operations->release() handler if the
59 * driver uses v4l2_fh.
60 */
61void v4l2_fh_exit(struct v4l2_fh *fh);
62
63#endif /* V4L2_EVENT_H */