Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
media
v4l2-core
v4l2-fh.c
Go to the documentation of this file.
1
/*
2
* v4l2-fh.c
3
*
4
* V4L2 file handles.
5
*
6
* Copyright (C) 2009--2010 Nokia Corporation.
7
*
8
* Contact: Sakari Ailus <
[email protected]
>
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 <linux/slab.h>
27
#include <linux/export.h>
28
#include <
media/v4l2-dev.h
>
29
#include <
media/v4l2-fh.h
>
30
#include <
media/v4l2-event.h
>
31
#include <
media/v4l2-ioctl.h
>
32
33
void
v4l2_fh_init
(
struct
v4l2_fh
*
fh
,
struct
video_device
*vdev)
34
{
35
fh->
vdev
= vdev;
36
/* Inherit from video_device. May be overridden by the driver. */
37
fh->
ctrl_handler
= vdev->
ctrl_handler
;
38
INIT_LIST_HEAD(&fh->
list
);
39
set_bit
(
V4L2_FL_USES_V4L2_FH
, &fh->
vdev
->flags);
40
fh->
prio
=
V4L2_PRIORITY_UNSET
;
41
init_waitqueue_head
(&fh->
wait
);
42
INIT_LIST_HEAD(&fh->
available
);
43
INIT_LIST_HEAD(&fh->
subscribed
);
44
fh->
sequence
= -1;
45
}
46
EXPORT_SYMBOL_GPL
(
v4l2_fh_init
);
47
48
void
v4l2_fh_add
(
struct
v4l2_fh
*
fh
)
49
{
50
unsigned
long
flags
;
51
52
if
(
test_bit
(
V4L2_FL_USE_FH_PRIO
, &fh->
vdev
->flags))
53
v4l2_prio_open
(fh->
vdev
->prio, &fh->
prio
);
54
spin_lock_irqsave
(&fh->
vdev
->fh_lock, flags);
55
list_add(&fh->
list
, &fh->
vdev
->fh_list);
56
spin_unlock_irqrestore(&fh->
vdev
->fh_lock, flags);
57
}
58
EXPORT_SYMBOL_GPL
(
v4l2_fh_add
);
59
60
int
v4l2_fh_open
(
struct
file
*filp)
61
{
62
struct
video_device
*vdev =
video_devdata
(filp);
63
struct
v4l2_fh
*fh = kzalloc(
sizeof
(*fh),
GFP_KERNEL
);
64
65
filp->
private_data
= fh;
66
if
(fh ==
NULL
)
67
return
-
ENOMEM
;
68
v4l2_fh_init
(fh, vdev);
69
v4l2_fh_add
(fh);
70
return
0;
71
}
72
EXPORT_SYMBOL_GPL
(
v4l2_fh_open
);
73
74
void
v4l2_fh_del
(
struct
v4l2_fh
*fh)
75
{
76
unsigned
long
flags
;
77
78
spin_lock_irqsave
(&fh->
vdev
->fh_lock, flags);
79
list_del_init(&fh->
list
);
80
spin_unlock_irqrestore(&fh->
vdev
->fh_lock, flags);
81
if
(
test_bit
(
V4L2_FL_USE_FH_PRIO
, &fh->
vdev
->flags))
82
v4l2_prio_close
(fh->
vdev
->prio, fh->
prio
);
83
}
84
EXPORT_SYMBOL_GPL
(
v4l2_fh_del
);
85
86
void
v4l2_fh_exit
(
struct
v4l2_fh
*fh)
87
{
88
if
(fh->
vdev
==
NULL
)
89
return
;
90
v4l2_event_unsubscribe_all
(fh);
91
fh->
vdev
=
NULL
;
92
}
93
EXPORT_SYMBOL_GPL
(
v4l2_fh_exit
);
94
95
int
v4l2_fh_release
(
struct
file
*filp)
96
{
97
struct
v4l2_fh
*fh = filp->
private_data
;
98
99
if
(fh) {
100
v4l2_fh_del
(fh);
101
v4l2_fh_exit
(fh);
102
kfree
(fh);
103
}
104
return
0;
105
}
106
EXPORT_SYMBOL_GPL
(
v4l2_fh_release
);
107
108
int
v4l2_fh_is_singular
(
struct
v4l2_fh
*fh)
109
{
110
unsigned
long
flags
;
111
int
is_singular;
112
113
if
(fh ==
NULL
|| fh->
vdev
==
NULL
)
114
return
0;
115
spin_lock_irqsave
(&fh->
vdev
->fh_lock, flags);
116
is_singular = list_is_singular(&fh->
list
);
117
spin_unlock_irqrestore(&fh->
vdev
->fh_lock, flags);
118
return
is_singular;
119
}
120
EXPORT_SYMBOL_GPL
(
v4l2_fh_is_singular
);
Generated on Thu Jan 10 2013 13:52:55 for Linux Kernel by
1.8.2