[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:
committed by
Mauro Carvalho Chehab
parent
8c1476ffc0
commit
0226549308
@@ -80,69 +80,6 @@ MODULE_LICENSE("GPL");
|
|||||||
* Video Standard Operations (contributed by Michael Schimek)
|
* 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 */
|
/* Helper functions for control handling */
|
||||||
|
|
||||||
/* Check for correctness of the ctrl's value based on the data from
|
/* 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);
|
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,
|
static ssize_t v4l2_read(struct file *filp, char __user *buf,
|
||||||
size_t sz, loff_t *off)
|
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 */
|
/* Control helper functions */
|
||||||
|
|
||||||
int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
|
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_REGISTERED (0)
|
||||||
#define V4L2_FL_USES_V4L2_FH (1)
|
#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 v4l2_file_operations {
|
||||||
struct module *owner;
|
struct module *owner;
|
||||||
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
||||||
|
Reference in New Issue
Block a user