V4L/DVB (5410): Add VIDIOC_G/S_PRIORITY support to ivtv.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
a542fe47fe
commit
d46c17d7aa
@ -502,6 +502,7 @@ struct ivtv_stream {
|
|||||||
struct ivtv_open_id {
|
struct ivtv_open_id {
|
||||||
u32 open_id;
|
u32 open_id;
|
||||||
int type;
|
int type;
|
||||||
|
enum v4l2_priority prio;
|
||||||
struct ivtv *itv;
|
struct ivtv *itv;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -732,6 +733,7 @@ struct ivtv {
|
|||||||
u32 base_addr;
|
u32 base_addr;
|
||||||
u32 irqmask;
|
u32 irqmask;
|
||||||
|
|
||||||
|
struct v4l2_prio_state prio;
|
||||||
struct workqueue_struct *irq_work_queues;
|
struct workqueue_struct *irq_work_queues;
|
||||||
struct work_struct irq_work_queue;
|
struct work_struct irq_work_queue;
|
||||||
struct timer_list dma_timer; /* Timer used to catch unfinished DMAs */
|
struct timer_list dma_timer; /* Timer used to catch unfinished DMAs */
|
||||||
|
@ -766,6 +766,8 @@ int ivtv_v4l2_close(struct inode *inode, struct file *filp)
|
|||||||
|
|
||||||
IVTV_DEBUG_IOCTL("close() of %s\n", s->name);
|
IVTV_DEBUG_IOCTL("close() of %s\n", s->name);
|
||||||
|
|
||||||
|
v4l2_prio_close(&itv->prio, &id->prio);
|
||||||
|
|
||||||
/* Easy case first: this stream was never claimed by us */
|
/* Easy case first: this stream was never claimed by us */
|
||||||
if (s->id != id->open_id) {
|
if (s->id != id->open_id) {
|
||||||
kfree(id);
|
kfree(id);
|
||||||
@ -849,6 +851,7 @@ int ivtv_v4l2_open(struct inode *inode, struct file *filp)
|
|||||||
}
|
}
|
||||||
item->itv = itv;
|
item->itv = itv;
|
||||||
item->type = y;
|
item->type = y;
|
||||||
|
v4l2_prio_open(&itv->prio, &item->prio);
|
||||||
|
|
||||||
item->open_id = itv->open_id++;
|
item->open_id = itv->open_id++;
|
||||||
filp->private_data = item;
|
filp->private_data = item;
|
||||||
|
@ -703,6 +703,21 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
|
|||||||
if (filp) id = (struct ivtv_open_id *)filp->private_data;
|
if (filp) id = (struct ivtv_open_id *)filp->private_data;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
case VIDIOC_G_PRIORITY:
|
||||||
|
{
|
||||||
|
enum v4l2_priority *p = arg;
|
||||||
|
|
||||||
|
*p = v4l2_prio_max(&itv->prio);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case VIDIOC_S_PRIORITY:
|
||||||
|
{
|
||||||
|
enum v4l2_priority *prio = arg;
|
||||||
|
|
||||||
|
return v4l2_prio_change(&itv->prio, &id->prio, *prio);
|
||||||
|
}
|
||||||
|
|
||||||
case VIDIOC_QUERYCAP:{
|
case VIDIOC_QUERYCAP:{
|
||||||
struct v4l2_capability *vcap = arg;
|
struct v4l2_capability *vcap = arg;
|
||||||
|
|
||||||
@ -1441,9 +1456,29 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
|
|||||||
{
|
{
|
||||||
struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
|
struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
|
||||||
struct ivtv *itv = id->itv;
|
struct ivtv *itv = id->itv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
IVTV_DEBUG_IOCTL("v4l2 ioctl 0x%08x\n", cmd);
|
IVTV_DEBUG_IOCTL("v4l2 ioctl 0x%08x\n", cmd);
|
||||||
|
|
||||||
|
/* check priority */
|
||||||
|
switch (cmd) {
|
||||||
|
case VIDIOC_S_CTRL:
|
||||||
|
case VIDIOC_S_STD:
|
||||||
|
case VIDIOC_S_INPUT:
|
||||||
|
case VIDIOC_S_OUTPUT:
|
||||||
|
case VIDIOC_S_TUNER:
|
||||||
|
case VIDIOC_S_FREQUENCY:
|
||||||
|
case VIDIOC_S_FMT:
|
||||||
|
case VIDIOC_S_CROP:
|
||||||
|
case VIDIOC_S_AUDIO:
|
||||||
|
case VIDIOC_S_AUDOUT:
|
||||||
|
case VIDIOC_S_EXT_CTRLS:
|
||||||
|
case VIDIOC_S_FBUF:
|
||||||
|
ret = v4l2_prio_check(&itv->prio, &id->prio);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case VIDIOC_DBG_G_REGISTER:
|
case VIDIOC_DBG_G_REGISTER:
|
||||||
case VIDIOC_DBG_S_REGISTER:
|
case VIDIOC_DBG_S_REGISTER:
|
||||||
@ -1452,6 +1487,8 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
|
|||||||
case VIDIOC_INT_RESET:
|
case VIDIOC_INT_RESET:
|
||||||
return ivtv_internal_ioctls(filp, cmd, arg);
|
return ivtv_internal_ioctls(filp, cmd, arg);
|
||||||
|
|
||||||
|
case VIDIOC_G_PRIORITY:
|
||||||
|
case VIDIOC_S_PRIORITY:
|
||||||
case VIDIOC_QUERYCAP:
|
case VIDIOC_QUERYCAP:
|
||||||
case VIDIOC_ENUMINPUT:
|
case VIDIOC_ENUMINPUT:
|
||||||
case VIDIOC_G_INPUT:
|
case VIDIOC_G_INPUT:
|
||||||
|
Loading…
Reference in New Issue
Block a user