diff options
| -rw-r--r-- | Documentation/feature-removal-schedule.txt | 22 | ||||
| -rw-r--r-- | drivers/media/video/bt8xx/bttv-driver.c | 2 | ||||
| -rw-r--r-- | drivers/media/video/cx18/cx18-ioctl.c | 8 | ||||
| -rw-r--r-- | drivers/media/video/ivtv/ivtv-ioctl.c | 8 | ||||
| -rw-r--r-- | drivers/media/video/msp3400-driver.c | 12 | ||||
| -rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.c | 4 | ||||
| -rw-r--r-- | drivers/media/video/tuner-core.c | 229 | ||||
| -rw-r--r-- | drivers/media/video/v4l2-ioctl.c | 18 | ||||
| -rw-r--r-- | include/media/v4l2-subdev.h | 10 |
9 files changed, 174 insertions, 139 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 72e238465b0b..b1c921c27519 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl. | |||
| 583 | Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 583 | Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| 584 | 584 | ||
| 585 | ---------------------------- | 585 | ---------------------------- |
| 586 | |||
| 587 | What: For VIDIOC_S_FREQUENCY the type field must match the device node's type. | ||
| 588 | If not, return -EINVAL. | ||
| 589 | When: 3.2 | ||
| 590 | Why: It makes no sense to switch the tuner to radio mode by calling | ||
| 591 | VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by | ||
| 592 | calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a | ||
| 593 | move to more consistent handling of tv and radio tuners. | ||
| 594 | Who: Hans Verkuil <hans.verkuil@cisco.com> | ||
| 595 | |||
| 596 | ---------------------------- | ||
| 597 | |||
| 598 | What: Opening a radio device node will no longer automatically switch the | ||
| 599 | tuner mode from tv to radio. | ||
| 600 | When: 3.3 | ||
| 601 | Why: Just opening a V4L device should not change the state of the hardware | ||
| 602 | like that. It's very unexpected and against the V4L spec. Instead, you | ||
| 603 | switch to radio mode by calling VIDIOC_S_FREQUENCY. This is the second | ||
| 604 | and last step of the move to consistent handling of tv and radio tuners. | ||
| 605 | Who: Hans Verkuil <hans.verkuil@cisco.com> | ||
| 606 | |||
| 607 | ---------------------------- | ||
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index a97cf2750bd9..834a48394bce 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
| @@ -3474,7 +3474,7 @@ static int radio_s_tuner(struct file *file, void *priv, | |||
| 3474 | if (0 != t->index) | 3474 | if (0 != t->index) |
| 3475 | return -EINVAL; | 3475 | return -EINVAL; |
| 3476 | 3476 | ||
| 3477 | bttv_call_all(btv, tuner, g_tuner, t); | 3477 | bttv_call_all(btv, tuner, s_tuner, t); |
| 3478 | return 0; | 3478 | return 0; |
| 3479 | } | 3479 | } |
| 3480 | 3480 | ||
diff --git a/drivers/media/video/cx18/cx18-ioctl.c b/drivers/media/video/cx18/cx18-ioctl.c index 1933d4d11bf2..e80134f52ef5 100644 --- a/drivers/media/video/cx18/cx18-ioctl.c +++ b/drivers/media/video/cx18/cx18-ioctl.c | |||
| @@ -695,14 +695,10 @@ static int cx18_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt) | |||
| 695 | 695 | ||
| 696 | cx18_call_all(cx, tuner, g_tuner, vt); | 696 | cx18_call_all(cx, tuner, g_tuner, vt); |
| 697 | 697 | ||
| 698 | if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) { | 698 | if (vt->type == V4L2_TUNER_RADIO) |
| 699 | strlcpy(vt->name, "cx18 Radio Tuner", sizeof(vt->name)); | 699 | strlcpy(vt->name, "cx18 Radio Tuner", sizeof(vt->name)); |
| 700 | vt->type = V4L2_TUNER_RADIO; | 700 | else |
| 701 | } else { | ||
| 702 | strlcpy(vt->name, "cx18 TV Tuner", sizeof(vt->name)); | 701 | strlcpy(vt->name, "cx18 TV Tuner", sizeof(vt->name)); |
| 703 | vt->type = V4L2_TUNER_ANALOG_TV; | ||
| 704 | } | ||
| 705 | |||
| 706 | return 0; | 702 | return 0; |
| 707 | } | 703 | } |
| 708 | 704 | ||
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index f9e347dae739..120c7d8e0895 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
| @@ -1184,14 +1184,10 @@ static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt) | |||
| 1184 | 1184 | ||
| 1185 | ivtv_call_all(itv, tuner, g_tuner, vt); | 1185 | ivtv_call_all(itv, tuner, g_tuner, vt); |
| 1186 | 1186 | ||
| 1187 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) { | 1187 | if (vt->type == V4L2_TUNER_RADIO) |
| 1188 | strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name)); | 1188 | strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name)); |
| 1189 | vt->type = V4L2_TUNER_RADIO; | 1189 | else |
| 1190 | } else { | ||
| 1191 | strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name)); | 1190 | strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name)); |
| 1192 | vt->type = V4L2_TUNER_ANALOG_TV; | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | return 0; | 1191 | return 0; |
| 1196 | } | 1192 | } |
| 1197 | 1193 | ||
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index de5d481b0328..c43c81f5f978 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
| @@ -480,12 +480,14 @@ static int msp_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) | |||
| 480 | struct msp_state *state = to_state(sd); | 480 | struct msp_state *state = to_state(sd); |
| 481 | struct i2c_client *client = v4l2_get_subdevdata(sd); | 481 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 482 | 482 | ||
| 483 | if (state->radio) | 483 | if (vt->type != V4L2_TUNER_ANALOG_TV) |
| 484 | return 0; | 484 | return 0; |
| 485 | if (state->opmode == OPMODE_AUTOSELECT) | 485 | if (!state->radio) { |
| 486 | msp_detect_stereo(client); | 486 | if (state->opmode == OPMODE_AUTOSELECT) |
| 487 | vt->audmode = state->audmode; | 487 | msp_detect_stereo(client); |
| 488 | vt->rxsubchans = state->rxsubchans; | 488 | vt->rxsubchans = state->rxsubchans; |
| 489 | } | ||
| 490 | vt->audmode = state->audmode; | ||
| 489 | vt->capability |= V4L2_TUNER_CAP_STEREO | | 491 | vt->capability |= V4L2_TUNER_CAP_STEREO | |
| 490 | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2; | 492 | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2; |
| 491 | return 0; | 493 | return 0; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 9d0dd08f57f8..e98d38212791 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
| @@ -3046,6 +3046,8 @@ static void pvr2_subdev_update(struct pvr2_hdw *hdw) | |||
| 3046 | if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) { | 3046 | if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) { |
| 3047 | struct v4l2_tuner vt; | 3047 | struct v4l2_tuner vt; |
| 3048 | memset(&vt, 0, sizeof(vt)); | 3048 | memset(&vt, 0, sizeof(vt)); |
| 3049 | vt.type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ? | ||
| 3050 | V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; | ||
| 3049 | vt.audmode = hdw->audiomode_val; | 3051 | vt.audmode = hdw->audiomode_val; |
| 3050 | v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt); | 3052 | v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt); |
| 3051 | } | 3053 | } |
| @@ -5171,6 +5173,8 @@ void pvr2_hdw_status_poll(struct pvr2_hdw *hdw) | |||
| 5171 | { | 5173 | { |
| 5172 | struct v4l2_tuner *vtp = &hdw->tuner_signal_info; | 5174 | struct v4l2_tuner *vtp = &hdw->tuner_signal_info; |
| 5173 | memset(vtp, 0, sizeof(*vtp)); | 5175 | memset(vtp, 0, sizeof(*vtp)); |
| 5176 | vtp->type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ? | ||
| 5177 | V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; | ||
| 5174 | hdw->tuner_signal_stale = 0; | 5178 | hdw->tuner_signal_stale = 0; |
| 5175 | /* Note: There apparently is no replacement for VIDIOC_CROPCAP | 5179 | /* Note: There apparently is no replacement for VIDIOC_CROPCAP |
| 5176 | using v4l2-subdev - therefore we can't support that AT ALL right | 5180 | using v4l2-subdev - therefore we can't support that AT ALL right |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 9363ed91a4cb..cfa9f7efe93d 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
| @@ -724,19 +724,15 @@ static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode) | |||
| 724 | } | 724 | } |
| 725 | 725 | ||
| 726 | /** | 726 | /** |
| 727 | * set_mode_freq - Switch tuner to other mode. | 727 | * set_mode - Switch tuner to other mode. |
| 728 | * @client: struct i2c_client pointer | ||
| 729 | * @t: a pointer to the module's internal struct_tuner | 728 | * @t: a pointer to the module's internal struct_tuner |
| 730 | * @mode: enum v4l2_type (radio or TV) | 729 | * @mode: enum v4l2_type (radio or TV) |
| 731 | * @freq: frequency to set (0 means to use the previous one) | ||
| 732 | * | 730 | * |
| 733 | * If tuner doesn't support the needed mode (radio or TV), prints a | 731 | * If tuner doesn't support the needed mode (radio or TV), prints a |
| 734 | * debug message and returns -EINVAL, changing its state to standby. | 732 | * debug message and returns -EINVAL, changing its state to standby. |
| 735 | * Otherwise, changes the state and sets frequency to the last value, if | 733 | * Otherwise, changes the mode and returns 0. |
| 736 | * the tuner can sleep or if it supports both Radio and TV. | ||
| 737 | */ | 734 | */ |
| 738 | static int set_mode_freq(struct i2c_client *client, struct tuner *t, | 735 | static int set_mode(struct tuner *t, enum v4l2_tuner_type mode) |
| 739 | enum v4l2_tuner_type mode, unsigned int freq) | ||
| 740 | { | 736 | { |
| 741 | struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops; | 737 | struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops; |
| 742 | 738 | ||
| @@ -752,17 +748,27 @@ static int set_mode_freq(struct i2c_client *client, struct tuner *t, | |||
| 752 | t->mode = mode; | 748 | t->mode = mode; |
| 753 | tuner_dbg("Changing to mode %d\n", mode); | 749 | tuner_dbg("Changing to mode %d\n", mode); |
| 754 | } | 750 | } |
| 751 | return 0; | ||
| 752 | } | ||
