aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/cx88/cx88-blackbird.c69
1 files changed, 29 insertions, 40 deletions
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
index 0ba6ef39b04c..54380ddb12c5 100644
--- a/drivers/media/video/cx88/cx88-blackbird.c
+++ b/drivers/media/video/cx88/cx88-blackbird.c
@@ -956,12 +956,31 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
956 } 956 }
957 case VIDIOC_S_FREQUENCY: 957 case VIDIOC_S_FREQUENCY:
958 { 958 {
959 struct v4l2_frequency *f = arg;
960
959 blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, 961 blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0,
960 BLACKBIRD_END_NOW, 962 BLACKBIRD_END_NOW,
961 BLACKBIRD_MPEG_CAPTURE, 963 BLACKBIRD_MPEG_CAPTURE,
962 BLACKBIRD_RAW_BITS_NONE); 964 BLACKBIRD_RAW_BITS_NONE);
963 965
964 cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, cx88_ioctl_hook); 966 if (UNSET == core->tuner_type)
967 return -EINVAL;
968 if (f->tuner != 0)
969 return -EINVAL;
970 if (0 == radio && f->type != V4L2_TUNER_ANALOG_TV)
971 return -EINVAL;
972 if (1 == radio && f->type != V4L2_TUNER_RADIO)
973 return -EINVAL;
974 mutex_lock(&core->lock);
975 core->freq = f->frequency;
976 cx88_newstation(core);
977 cx88_call_i2c_clients(core,VIDIOC_S_FREQUENCY,f);
978
979 /* When changing channels it is required to reset TVAUDIO */
980 msleep (10);
981 cx88_set_tvaudio(core);
982
983 mutex_unlock(&core->lock);
965 984
966 blackbird_initialize_codec(dev); 985 blackbird_initialize_codec(dev);
967 cx88_set_scale(dev->core, dev->width, dev->height, 986 cx88_set_scale(dev->core, dev->width, dev->height,
@@ -985,11 +1004,17 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
985 return blackbird_querymenu(dev, arg); 1004 return blackbird_querymenu(dev, arg);
986 case VIDIOC_QUERYCTRL: 1005 case VIDIOC_QUERYCTRL:
987 { 1006 {
988 struct v4l2_queryctrl *c = arg; 1007 struct v4l2_queryctrl *qctrl = arg;
989 1008
990 if (blackbird_queryctrl(dev, c) == 0) 1009 if (blackbird_queryctrl(dev, qctrl) == 0)
991 return 0; 1010 return 0;
992 return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl); 1011
1012 struct v4l2_queryctrl *qctrl = arg;
1013
1014 qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
1015 if (unlikely(qctrl->id == 0))
1016 return -EINVAL;
1017 return cx8800_ctrl_query(qctrl);
993 } 1018 }
994 1019
995 default: 1020 default:
@@ -1164,42 +1189,6 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
1164 return 0; 1189 return 0;
1165 } 1190 }
1166 1191
1167
1168 /* --- controls ---------------------------------------------- */
1169 case VIDIOC_QUERYCTRL:
1170 {
1171 struct v4l2_queryctrl *qctrl = arg;
1172
1173 qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
1174 if (unlikely(qctrl->id == 0))
1175 return -EINVAL;
1176 return cx8800_ctrl_query(qctrl);
1177 }
1178 /* --- tuner ioctls ------------------------------------------ */
1179 case VIDIOC_S_FREQUENCY:
1180 {
1181 struct v4l2_frequency *f = arg;
1182
1183 if (UNSET == core->tuner_type)
1184 return -EINVAL;
1185 if (f->tuner != 0)
1186 return -EINVAL;
1187 if (0 == radio && f->type != V4L2_TUNER_ANALOG_TV)
1188 return -EINVAL;
1189 if (1 == radio && f->type != V4L2_TUNER_RADIO)
1190 return -EINVAL;
1191 mutex_lock(&core->lock);
1192 core->freq = f->frequency;
1193 cx88_newstation(core);
1194 cx88_call_i2c_clients(core,VIDIOC_S_FREQUENCY,f);
1195
1196 /* When changing channels it is required to reset TVAUDIO */
1197 msleep (10);
1198 cx88_set_tvaudio(core);
1199
1200 mutex_unlock(&core->lock);
1201 return 0;
1202 }
1203#ifdef CONFIG_VIDEO_ADV_DEBUG 1192#ifdef CONFIG_VIDEO_ADV_DEBUG
1204 /* ioctls to allow direct acces to the cx2388x registers */ 1193 /* ioctls to allow direct acces to the cx2388x registers */
1205 case VIDIOC_INT_G_REGISTER: 1194 case VIDIOC_INT_G_REGISTER: