Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d46c17d7 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5410): Add VIDIOC_G/S_PRIORITY support to ivtv.

parent a542fe47
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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 */
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;
+37 −0
Original line number Original line Diff line number Diff line
@@ -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: