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

[media] v4l2-ioctl: make tuner 'type' check more strict for S_FREQUENCY



As per the feature removal document, make the tuner type check more strict
so that it is no longer possible to set the radio frequency through a video
node or the TV frequency through a radio node.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent dacd4fa3
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -98,8 +98,11 @@ the &v4l2-output; <structfield>modulator</structfield> field and the
	    <entry>&v4l2-tuner-type;</entry>
	    <entry><structfield>type</structfield></entry>
	    <entry>The tuner type. This is the same value as in the
&v4l2-tuner; <structfield>type</structfield> field. The field is not
applicable to modulators, &ie; ignored by drivers.</entry>
&v4l2-tuner; <structfield>type</structfield> field. The type must be set
to <constant>V4L2_TUNER_RADIO</constant> for <filename>/dev/radioX</filename>
device nodes, and to <constant>V4L2_TUNER_ANALOG_TV</constant>
for all others. The field is not applicable to modulators, &ie; ignored
by drivers.</entry>
	  </row>
	  <row>
	    <entry>__u32</entry>
+0 −11
Original line number Diff line number Diff line
@@ -460,17 +460,6 @@ Who: Jean Delvare <khali@linux-fr.org>

----------------------------

What:	For VIDIOC_S_FREQUENCY the type field must match the device node's type.
	If not, return -EINVAL.
When:	3.2
Why:	It makes no sense to switch the tuner to radio mode by calling
	VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by
	calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a
	move to more consistent handling of tv and radio tuners.
Who:	Hans Verkuil <hans.verkuil@cisco.com>

----------------------------

What:	Opening a radio device node will no longer automatically switch the
	tuner mode from tv to radio.
When:	3.3
+7 −1
Original line number Diff line number Diff line
@@ -1871,6 +1871,7 @@ static long __video_do_ioctl(struct file *file,
	case VIDIOC_S_FREQUENCY:
	{
		struct v4l2_frequency *p = arg;
		enum v4l2_tuner_type type;

		if (!ops->vidioc_s_frequency)
			break;
@@ -1878,8 +1879,13 @@ static long __video_do_ioctl(struct file *file,
			ret = ret_prio;
			break;
		}
		type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
			V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
		dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
				p->tuner, p->type, p->frequency);
		if (p->type != type)
			ret = -EINVAL;
		else
			ret = ops->vidioc_s_frequency(file, fh, p);
		break;
	}