mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
[media] v4l2_prio: move from v4l2-common to v4l2-dev
We are going to move priority handling into the v4l2 core. As a consequence the v4l2_prio helper functions need to be moved into the core videodev module as well to prevent circular dependencies. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
8c1476ffc0
commit
0226549308
@ -80,69 +80,6 @@ MODULE_LICENSE("GPL");
|
||||
* Video Standard Operations (contributed by Michael Schimek)
|
||||
*/
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* priority handling */
|
||||
|
||||
#define V4L2_PRIO_VALID(val) (val == V4L2_PRIORITY_BACKGROUND || \
|
||||
val == V4L2_PRIORITY_INTERACTIVE || \
|
||||
val == V4L2_PRIORITY_RECORD)
|
||||
|
||||
void v4l2_prio_init(struct v4l2_prio_state *global)
|
||||
{
|
||||
memset(global, 0, sizeof(*global));
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_init);
|
||||
|
||||
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
|
||||
enum v4l2_priority new)
|
||||
{
|
||||
if (!V4L2_PRIO_VALID(new))
|
||||
return -EINVAL;
|
||||
if (*local == new)
|
||||
return 0;
|
||||
|
||||
atomic_inc(&global->prios[new]);
|
||||
if (V4L2_PRIO_VALID(*local))
|
||||
atomic_dec(&global->prios[*local]);
|
||||
*local = new;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_change);
|
||||
|
||||
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
|
||||
{
|
||||
v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_open);
|
||||
|
||||
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
|
||||
{
|
||||
if (V4L2_PRIO_VALID(local))
|
||||
atomic_dec(&global->prios[local]);
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_close);
|
||||
|
||||
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
|
||||
{
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
|
||||
return V4L2_PRIORITY_RECORD;
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
|
||||
return V4L2_PRIORITY_INTERACTIVE;
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
|
||||
return V4L2_PRIORITY_BACKGROUND;
|
||||
return V4L2_PRIORITY_UNSET;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_max);
|
||||
|
||||
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
|
||||
{
|
||||
return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_check);
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
/* Helper functions for control handling */
|
||||
|
||||
/* Check for correctness of the ctrl's value based on the data from
|
||||
|
@ -182,6 +182,70 @@ struct video_device *video_devdata(struct file *file)
|
||||
}
|
||||
EXPORT_SYMBOL(video_devdata);
|
||||
|
||||
|
||||
/* Priority handling */
|
||||
|
||||
static inline bool prio_is_valid(enum v4l2_priority prio)
|
||||
{
|
||||
return prio == V4L2_PRIORITY_BACKGROUND ||
|
||||
prio == V4L2_PRIORITY_INTERACTIVE ||
|
||||
prio == V4L2_PRIORITY_RECORD;
|
||||
}
|
||||
|
||||
void v4l2_prio_init(struct v4l2_prio_state *global)
|
||||
{
|
||||
memset(global, 0, sizeof(*global));
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_init);
|
||||
|
||||
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
|
||||
enum v4l2_priority new)
|
||||
{
|
||||
if (!prio_is_valid(new))
|
||||
return -EINVAL;
|
||||
if (*local == new)
|
||||
return 0;
|
||||
|
||||
atomic_inc(&global->prios[new]);
|
||||
if (prio_is_valid(*local))
|
||||
atomic_dec(&global->prios[*local]);
|
||||
*local = new;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_change);
|
||||
|
||||
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
|
||||
{
|
||||
v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_open);
|
||||
|
||||
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
|
||||
{
|
||||
if (prio_is_valid(local))
|
||||
atomic_dec(&global->prios[local]);
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_close);
|
||||
|
||||
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
|
||||
{
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
|
||||
return V4L2_PRIORITY_RECORD;
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
|
||||
return V4L2_PRIORITY_INTERACTIVE;
|
||||
if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
|
||||
return V4L2_PRIORITY_BACKGROUND;
|
||||
return V4L2_PRIORITY_UNSET;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_max);
|
||||
|
||||
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
|
||||
{
|
||||
return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_prio_check);
|
||||
|
||||
|
||||
static ssize_t v4l2_read(struct file *filp, char __user *buf,
|
||||
size_t sz, loff_t *off)
|
||||
{
|
||||
|
@ -80,21 +80,6 @@
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* Priority helper functions */
|
||||
|
||||
struct v4l2_prio_state {
|
||||
atomic_t prios[4];
|
||||
};
|
||||
void v4l2_prio_init(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
|
||||
enum v4l2_priority new);
|
||||
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
|
||||
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* Control helper functions */
|
||||
|
||||
int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
|
||||
|
@ -37,6 +37,21 @@ struct v4l2_ctrl_handler;
|
||||
#define V4L2_FL_REGISTERED (0)
|
||||
#define V4L2_FL_USES_V4L2_FH (1)
|
||||
|
||||
/* Priority helper functions */
|
||||
|
||||
struct v4l2_prio_state {
|
||||
atomic_t prios[4];
|
||||
};
|
||||
|
||||
void v4l2_prio_init(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
|
||||
enum v4l2_priority new);
|
||||
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
|
||||
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
|
||||
|
||||
struct v4l2_file_operations {
|
||||
struct module *owner;
|
||||
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
||||
|
Loading…
Reference in New Issue
Block a user