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

Commit ea1f83ce authored by Thierry MERLE's avatar Thierry MERLE Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5643): Usbvision: make common video and radio ioctls



Radio and video ioctls are the same,
delete the usbvision_do_radio_ioctl function
add the special cases for radio in usbvision_v4l2_do_ioctl

Signed-off-by: default avatarThierry MERLE <thierry.merle@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 8c7189d1
Loading
Loading
Loading
Loading
+22 −144
Original line number Original line Diff line number Diff line
@@ -692,11 +692,18 @@ static int usbvision_v4l2_do_ioctl(struct inode *inode, struct file *file,


			if (!usbvision->have_tuner || vt->index)	// Only tuner 0
			if (!usbvision->have_tuner || vt->index)	// Only tuner 0
				return -EINVAL;
				return -EINVAL;
			if(usbvision->radio) {
				strcpy(vt->name, "Radio");
				vt->type = V4L2_TUNER_RADIO;
			}
			else {
				strcpy(vt->name, "Television");
				strcpy(vt->name, "Television");
			}
			/* Let clients fill in the remainder of this struct */
			/* Let clients fill in the remainder of this struct */
			call_i2c_clients(usbvision,VIDIOC_G_TUNER,vt);
			call_i2c_clients(usbvision,VIDIOC_G_TUNER,vt);


			PDEBUG(DBG_IOCTL, "VIDIOC_G_TUNER signal=%x, afc=%x",vt->signal,vt->afc);
			PDEBUG(DBG_IOCTL, "VIDIOC_G_TUNER for %s signal=%x, afc=%x",
			       vt->name, vt->signal,vt->afc);
			return 0;
			return 0;
		}
		}
		case VIDIOC_S_TUNER:
		case VIDIOC_S_TUNER:
@@ -717,7 +724,12 @@ static int usbvision_v4l2_do_ioctl(struct inode *inode, struct file *file,
			struct v4l2_frequency *freq = arg;
			struct v4l2_frequency *freq = arg;


			freq->tuner = 0; // Only one tuner
			freq->tuner = 0; // Only one tuner
			if(usbvision->radio) {
				freq->type = V4L2_TUNER_RADIO;
			}
			else {
				freq->type = V4L2_TUNER_ANALOG_TV;
				freq->type = V4L2_TUNER_ANALOG_TV;
			}
			freq->frequency = usbvision->freq;
			freq->frequency = usbvision->freq;
			PDEBUG(DBG_IOCTL, "VIDIOC_G_FREQUENCY freq=0x%X", (unsigned)freq->frequency);
			PDEBUG(DBG_IOCTL, "VIDIOC_G_FREQUENCY freq=0x%X", (unsigned)freq->frequency);
			return 0;
			return 0;
@@ -739,7 +751,12 @@ static int usbvision_v4l2_do_ioctl(struct inode *inode, struct file *file,
		{
		{
			struct v4l2_audio *v = arg;
			struct v4l2_audio *v = arg;
			memset(v,0, sizeof(v));
			memset(v,0, sizeof(v));
			if(usbvision->radio) {
				strcpy(v->name,"Radio");
			}
			else {
				strcpy(v->name, "TV");
				strcpy(v->name, "TV");
			}
			PDEBUG(DBG_IOCTL, "VIDIOC_G_AUDIO");
			PDEBUG(DBG_IOCTL, "VIDIOC_G_AUDIO");
			return 0;
			return 0;
		}
		}
@@ -1219,7 +1236,6 @@ static int usbvision_radio_open(struct inode *inode, struct file *file)
{
{
	struct video_device *dev = video_devdata(file);
	struct video_device *dev = video_devdata(file);
	struct usb_usbvision *usbvision = (struct usb_usbvision *) video_get_drvdata(dev);
	struct usb_usbvision *usbvision = (struct usb_usbvision *) video_get_drvdata(dev);
	struct v4l2_frequency freq;
	int errCode = 0;
	int errCode = 0;


	PDEBUG(DBG_IO, "%s:", __FUNCTION__);
	PDEBUG(DBG_IO, "%s:", __FUNCTION__);
@@ -1249,8 +1265,6 @@ static int usbvision_radio_open(struct inode *inode, struct file *file)
		// If so far no errors then we shall start the radio
		// If so far no errors then we shall start the radio
		usbvision->radio = 1;
		usbvision->radio = 1;
		call_i2c_clients(usbvision,AUDC_SET_RADIO,&usbvision->tuner_type);
		call_i2c_clients(usbvision,AUDC_SET_RADIO,&usbvision->tuner_type);
		freq.frequency = 1517; //SWR3 @ 94.8MHz
		call_i2c_clients(usbvision, VIDIOC_S_FREQUENCY, &freq);
		usbvision_set_audio(usbvision, USBVISION_AUDIO_RADIO);
		usbvision_set_audio(usbvision, USBVISION_AUDIO_RADIO);
		usbvision->user++;
		usbvision->user++;
	}
	}
@@ -1304,146 +1318,10 @@ static int usbvision_radio_close(struct inode *inode, struct file *file)
	return errCode;
	return errCode;
}
}


static int usbvision_do_radio_ioctl(struct inode *inode, struct file *file,
				 unsigned int cmd, void *arg)
{
	struct video_device *dev = video_devdata(file);
	struct usb_usbvision *usbvision = (struct usb_usbvision *) video_get_drvdata(dev);

	if (!USBVISION_IS_OPERATIONAL(usbvision))
		return -EIO;

	switch (cmd) {
		case VIDIOC_QUERYCAP:
		{
			struct v4l2_capability *vc=arg;

			memset(vc, 0, sizeof(*vc));
			strlcpy(vc->driver, "USBVision", sizeof(vc->driver));
			strlcpy(vc->card, usbvision_device_data[usbvision->DevModel].ModelString,
				sizeof(vc->card));
			strlcpy(vc->bus_info, usbvision->dev->dev.bus_id,
				sizeof(vc->bus_info));
			vc->version = USBVISION_DRIVER_VERSION;
			vc->capabilities = (usbvision->have_tuner ? V4L2_CAP_TUNER : 0);
			PDEBUG(DBG_IO, "VIDIOC_QUERYCAP");
			return 0;
		}
		case VIDIOC_QUERYCTRL:
		{
			struct v4l2_queryctrl *ctrl = arg;
			int id=ctrl->id;

			memset(ctrl,0,sizeof(*ctrl));
			ctrl->id=id;

			call_i2c_clients(usbvision, cmd, arg);
			PDEBUG(DBG_IO,"VIDIOC_QUERYCTRL id=%x value=%x",ctrl->id,ctrl->type);

			if (ctrl->type)
				return 0;
			else
				return -EINVAL;

		}
		case VIDIOC_G_CTRL:
		{
			struct v4l2_control *ctrl = arg;

			call_i2c_clients(usbvision, VIDIOC_G_CTRL, ctrl);
			PDEBUG(DBG_IO,"VIDIOC_G_CTRL id=%x value=%x",ctrl->id,ctrl->value);
			return 0;
		}
		case VIDIOC_S_CTRL:
		{
			struct v4l2_control *ctrl = arg;

			call_i2c_clients(usbvision, VIDIOC_S_CTRL, ctrl);
			PDEBUG(DBG_IO, "VIDIOC_S_CTRL id=%x value=%x",ctrl->id,ctrl->value);
			return 0;
		}
		case VIDIOC_G_TUNER:
		{
			struct v4l2_tuner *t = arg;

			if (t->index > 0)
				return -EINVAL;

			memset(t,0,sizeof(*t));
			strcpy(t->name, "Radio");
			t->type = V4L2_TUNER_RADIO;

			/* Let clients fill in the remainder of this struct */
			call_i2c_clients(usbvision,VIDIOC_G_TUNER,t);
			PDEBUG(DBG_IO, "VIDIOC_G_TUNER signal=%x, afc=%x",t->signal,t->afc);
			return 0;
		}
		case VIDIOC_S_TUNER:
		{
			struct v4l2_tuner *vt = arg;

			// Only no or one tuner for now
			if (!usbvision->have_tuner || vt->index)
				return -EINVAL;
			/* let clients handle this */
			call_i2c_clients(usbvision,VIDIOC_S_TUNER,vt);

			PDEBUG(DBG_IO, "VIDIOC_S_TUNER");
			return 0;
		}
		case VIDIOC_G_AUDIO:
		{
			struct v4l2_audio *a = arg;

			memset(a,0,sizeof(*a));
			strcpy(a->name,"Radio");
			PDEBUG(DBG_IO, "VIDIOC_G_AUDIO");
			return 0;
		}
		case VIDIOC_S_AUDIO:
		case VIDIOC_S_INPUT:
		case VIDIOC_S_STD:
		return 0;

		case VIDIOC_G_FREQUENCY:
		{
			struct v4l2_frequency *f = arg;

			memset(f,0,sizeof(*f));

			f->type = V4L2_TUNER_RADIO;
			f->frequency = usbvision->freq;
			call_i2c_clients(usbvision, cmd, f);
			PDEBUG(DBG_IO, "VIDIOC_G_FREQUENCY freq=0x%X", (unsigned)f->frequency);

			return 0;
		}
		case VIDIOC_S_FREQUENCY:
		{
			struct v4l2_frequency *f = arg;

			if (f->tuner != 0)
				return -EINVAL;
			usbvision->freq = f->frequency;
			call_i2c_clients(usbvision, cmd, f);
			PDEBUG(DBG_IO, "VIDIOC_S_FREQUENCY freq=0x%X", (unsigned)f->frequency);

			return 0;
		}
		default:
		{
			PDEBUG(DBG_IO, "%s: Unknown command %x", __FUNCTION__, cmd);
			return -ENOIOCTLCMD;
		}
	}
	return 0;
}


static int usbvision_radio_ioctl(struct inode *inode, struct file *file,
static int usbvision_radio_ioctl(struct inode *inode, struct file *file,
		       unsigned int cmd, unsigned long arg)
		       unsigned int cmd, unsigned long arg)
{
{
	return video_usercopy(inode, file, cmd, arg, usbvision_do_radio_ioctl);
	return video_usercopy(inode, file, cmd, arg, usbvision_v4l2_do_ioctl);
}
}