aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2006-12-30 16:27:32 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-02-21 10:34:34 -0500
commit16eb40d37d5dd4dba85245899388d2d44eb0bc2a (patch)
treee67ea490324f38eb83d6b16c53049239887c7f20 /drivers/media
parentf13ed249ed8b880fe5497aaa05999bff8328a973 (diff)
V4L/DVB (5057): Pvrusb2: Stream configuration cleanups
Clean up and tighten logic involving stream configuration. This mainly involves changes to pvrusb2-v4l2.c, where we better clarify how we use the stream configuration enum and implement a cleaner means to control streaming for a given device node. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-encoder.c20
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c3
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.h9
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-v4l2.c186
4 files changed, 94 insertions, 124 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
index d094cac9f7a5..3ec8093ae97a 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
@@ -363,15 +363,19 @@ int pvr2_encoder_start(struct pvr2_hdw *hdw)
363 pvr2_encoder_vcmd(hdw,CX2341X_ENC_MUTE_VIDEO,1, 363 pvr2_encoder_vcmd(hdw,CX2341X_ENC_MUTE_VIDEO,1,
364 hdw->input_val == PVR2_CVAL_INPUT_RADIO ? 1 : 0); 364 hdw->input_val == PVR2_CVAL_INPUT_RADIO ? 1 : 0);
365 365
366 if (hdw->config == pvr2_config_vbi) { 366 switch (hdw->config) {
367 case pvr2_config_vbi:
367 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 368 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2,
368 0x01,0x14); 369 0x01,0x14);
369 } else if (hdw->config == pvr2_config_mpeg) { 370 break;
371 case pvr2_config_mpeg:
370 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 372 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2,
371 0,0x13); 373 0,0x13);
372 } else { 374 break;
375 default: /* Unhandled cases for now */
373 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 376 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2,
374 0,0x13); 377 0,0x13);
378 break;
375 } 379 }
376 if (!status) { 380 if (!status) {
377 hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_RUN); 381 hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_RUN);
@@ -386,15 +390,19 @@ int pvr2_encoder_stop(struct pvr2_hdw *hdw)
386 /* mask all interrupts */ 390 /* mask all interrupts */
387 pvr2_write_register(hdw, 0x0048, 0xffffffff); 391 pvr2_write_register(hdw, 0x0048, 0xffffffff);
388 392
389 if (hdw->config == pvr2_config_vbi) { 393 switch (hdw->config) {
394 case pvr2_config_vbi:
390 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 395 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3,
391 0x01,0x01,0x14); 396 0x01,0x01,0x14);
392 } else if (hdw->config == pvr2_config_mpeg) { 397 break;
398 case pvr2_config_mpeg:
393 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 399 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3,
394 0x01,0,0x13); 400 0x01,0,0x13);
395 } else { 401 break;
402 default: /* Unhandled cases for now */
396 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 403 status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3,
397 0x01,0,0x13); 404 0x01,0,0x13);
405 break;
398 } 406 }
399 407
400 /* change some GPIO data */ 408 /* change some GPIO data */
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index aa763028057b..2de595112224 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -957,7 +957,8 @@ const char *pvr2_config_get_name(enum pvr2_config cfg)
957 case pvr2_config_empty: return "empty"; 957 case pvr2_config_empty: return "empty";
958 case pvr2_config_mpeg: return "mpeg"; 958 case pvr2_config_mpeg: return "mpeg";
959 case pvr2_config_vbi: return "vbi"; 959 case pvr2_config_vbi: return "vbi";
960 case pvr2_config_radio: return "radio"; 960 case pvr2_config_pcm: return "pcm";
961 case pvr2_config_rawvideo: return "raw video";
961 } 962 }
962 return "<unknown>"; 963 return "<unknown>";
963} 964}
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
index 19af4d636c3f..d803f24cc9e0 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
@@ -72,10 +72,11 @@
72 PVR2_SUBSYS_RUN_ALL ) 72 PVR2_SUBSYS_RUN_ALL )
73 73
74enum pvr2_config { 74enum pvr2_config {
75 pvr2_config_empty, 75 pvr2_config_empty, /* No configuration */
76 pvr2_config_mpeg, 76 pvr2_config_mpeg, /* Encoded / compressed video */
77 pvr2_config_vbi, 77 pvr2_config_vbi, /* Standard vbi info */
78 pvr2_config_radio, 78 pvr2_config_pcm, /* Audio raw pcm stream */
79 pvr2_config_rawvideo, /* Video raw frames */
79}; 80};
80 81
81enum pvr2_v4l_type { 82enum pvr2_v4l_type {
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
index cc3260f37e84..7a8b34dbc363 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
@@ -40,7 +40,10 @@ struct pvr2_v4l2_dev {
40 struct video_device devbase; /* MUST be first! */ 40 struct video_device devbase; /* MUST be first! */
41 struct pvr2_v4l2 *v4lp; 41 struct pvr2_v4l2 *v4lp;
42 struct pvr2_context_stream *stream; 42 struct pvr2_context_stream *stream;
43 enum pvr2_config config; 43 /* Information about this device: */
44 enum pvr2_config config; /* Expected stream format */
45 int v4l_type; /* V4L defined type for this device node */
46 enum pvr2_v4l_type minor_type; /* pvr2-understood minor device type */
44}; 47};
45 48
46struct pvr2_v4l2_fh { 49struct pvr2_v4l2_fh {
@@ -163,6 +166,18 @@ static struct v4l2_format pvr_format [] = {
163 } 166 }
164}; 167};
165 168
169
170static const char *get_v4l_name(int v4l_type)
171{
172 switch (v4l_type) {
173 case VFL_TYPE_GRABBER: return "video";
174 case VFL_TYPE_RADIO: return "radio";
175 case VFL_TYPE_VBI: return "vbi";
176 default: return "?";
177 }
178}
179
180
166/* 181/*
167 * pvr_ioctl() 182 * pvr_ioctl()
168 * 183 *
@@ -521,6 +536,13 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
521 536
522 case VIDIOC_STREAMON: 537 case VIDIOC_STREAMON:
523 { 538 {
539 if (!fh->dev_info->stream) {
540 /* No stream defined for this node. This means
541 that we're not currently allowed to stream from
542 this node. */
543 ret = -EPERM;
544 break;
545 }
524 ret = pvr2_hdw_set_stream_type(hdw,dev_info->config); 546 ret = pvr2_hdw_set_stream_type(hdw,dev_info->config);
525 if (ret < 0) return ret; 547 if (ret < 0) return ret;
526 ret = pvr2_hdw_set_streaming(hdw,!0); 548 ret = pvr2_hdw_set_streaming(hdw,!0);
@@ -529,6 +551,13 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
529 551
530 case VIDIOC_STREAMOFF: 552 case VIDIOC_STREAMOFF:
531 { 553 {
554 if (!fh->dev_info->stream) {
555 /* No stream defined for this node. This means
556 that we're not currently allowed to stream from
557 this node. */
558 ret = -EPERM;
559 break;
560 }
532 ret = pvr2_hdw_set_streaming(hdw,0); 561 ret = pvr2_hdw_set_streaming(hdw,0);
533 break; 562 break;
534 } 563 }
@@ -734,26 +763,12 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
734 763
735static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip) 764static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
736{ 765{
737 enum pvr2_config cfg = dip->config;
738 int minor_id = dip->devbase.minor; 766 int minor_id = dip->devbase.minor;
739 enum pvr2_v4l_type pvt;
740 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw; 767 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
768 enum pvr2_config cfg = dip->config;
769 int v4l_type = dip->v4l_type;
741 770
742 switch (cfg) { 771 pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1);
743 case pvr2_config_mpeg:
744 pvt = pvr2_v4l_type_video;
745 break;
746 case pvr2_config_vbi:
747 pvt = pvr2_v4l_type_vbi;
748 break;
749 case pvr2_config_radio:
750 pvt = pvr2_v4l_type_radio;
751 break;
752 default: /* paranoia */
753 pvt = pvr2_v4l_type_video;
754 break;
755 }
756 pvr2_hdw_v4l_store_minor_number(hdw,pvt,-1);
757 772
758 /* Paranoia */ 773 /* Paranoia */
759 dip->v4lp = NULL; 774 dip->v4lp = NULL;
@@ -763,25 +778,9 @@ static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
763 are gone. */ 778 are gone. */
764 video_unregister_device(&dip->devbase); 779 video_unregister_device(&dip->devbase);
765 780
766 switch (cfg) { 781 printk(KERN_INFO "pvrusb2: unregistered device %s%u [%s]\n",
767 case pvr2_config_mpeg: 782 get_v4l_name(v4l_type),minor_id & 0x1f,
768 printk(KERN_INFO "pvrusb2: unregistered device video%d [%s]\n", 783 pvr2_config_get_name(cfg));
769 minor_id & 0x1f,
770 pvr2_config_get_name(cfg));
771 break;
772 case pvr2_config_radio:
773 printk(KERN_INFO "pvrusb2: unregistered device radio%d [%s]\n",
774 minor_id & 0x1f,
775 pvr2_config_get_name(cfg));
776 break;
777 case pvr2_config_vbi:
778 printk(KERN_INFO "pvrusb2: unregistered device vbi%d [%s]\n",
779 minor_id & 0x1f,
780 pvr2_config_get_name(cfg));
781 break;
782 default:
783 break;
784 }
785 784
786} 785}
787 786
@@ -852,17 +851,6 @@ static int pvr2_v4l2_release(struct inode *inode, struct file *file)
852 fhp->rhp = NULL; 851 fhp->rhp = NULL;
853 } 852 }
854 853
855 if (fhp->dev_info->config == pvr2_config_radio) {
856 int ret;
857 struct pvr2_hdw *hdw;
858 hdw = fhp->channel.mc_head->hdw;
859 if ((ret = pvr2_ctrl_set_value(
860 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
861 PVR2_CVAL_INPUT_TV))) {
862 return ret;
863 }
864 }
865
866 v4l2_prio_close(&vp->prio, &fhp->prio); 854 v4l2_prio_close(&vp->prio, &fhp->prio);
867 file->private_data = NULL; 855 file->private_data = NULL;
868 856
@@ -929,7 +917,7 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
929 So execute that here. Note that you can get the 917 So execute that here. Note that you can get the
930 IDENTICAL effect merely by opening the normal video 918 IDENTICAL effect merely by opening the normal video
931 device and setting the input appropriately. */ 919 device and setting the input appropriately. */
932 if (dip->config == pvr2_config_radio) { 920 if (dip->v4l_type == VFL_TYPE_RADIO) {
933 pvr2_ctrl_set_value( 921 pvr2_ctrl_set_value(
934 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT), 922 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
935 PVR2_CVAL_INPUT_RADIO); 923 PVR2_CVAL_INPUT_RADIO);
@@ -968,6 +956,12 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
968 struct pvr2_hdw *hdw; 956 struct pvr2_hdw *hdw;
969 if (fh->rhp) return 0; 957 if (fh->rhp) return 0;
970 958
959 if (!fh->dev_info->stream) {
960 /* No stream defined for this node. This means that we're
961 not currently allowed to stream from this node. */
962 return -EPERM;
963 }
964
971 /* First read() attempt. Try to claim the stream and start 965 /* First read() attempt. Try to claim the stream and start
972 it... */ 966 it... */
973 if ((ret = pvr2_channel_claim_stream(&fh->channel, 967 if ((ret = pvr2_channel_claim_stream(&fh->channel,
@@ -1032,12 +1026,6 @@ static ssize_t pvr2_v4l2_read(struct file *file,
1032 return tcnt; 1026 return tcnt;
1033 } 1027 }
1034 1028
1035 if (fh->dev_info->config == pvr2_config_radio) {
1036 /* Radio device nodes on this device
1037 cannot be read or written. */
1038 return -EPERM;
1039 }
1040
1041 if (!fh->rhp) { 1029 if (!fh->rhp) {
1042 ret = pvr2_v4l2_iosetup(fh); 1030 ret = pvr2_v4l2_iosetup(fh);
1043 if (ret) { 1031 if (ret) {
@@ -1072,12 +1060,6 @@ static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
1072 return mask; 1060 return mask;
1073 } 1061 }
1074 1062
1075 if (fh->dev_info->config == pvr2_config_radio) {
1076 /* Radio device nodes on this device
1077 cannot be read or written. */
1078 return -EPERM;
1079 }
1080
1081 if (!fh->rhp) { 1063 if (!fh->rhp) {
1082 ret = pvr2_v4l2_iosetup(fh); 1064 ret = pvr2_v4l2_iosetup(fh);
1083 if (ret) return POLLERR; 1065 if (ret) return POLLERR;
@@ -1119,29 +1101,31 @@ static struct video_device vdev_template = {
1119 1101
1120static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, 1102static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1121 struct pvr2_v4l2 *vp, 1103 struct pvr2_v4l2 *vp,
1122 enum pvr2_config cfg) 1104 int v4l_type)
1123{ 1105{
1124 int mindevnum; 1106 int mindevnum;
1125 int unit_number; 1107 int unit_number;
1126 int v4l_type; 1108 int *nr_ptr = 0;
1127 enum pvr2_v4l_type pvt;
1128 dip->v4lp = vp; 1109 dip->v4lp = vp;
1129 dip->config = cfg;
1130 1110
1131 1111
1132 switch (dip->config) { 1112 dip->v4l_type = v4l_type;
1133 case pvr2_config_mpeg: 1113 switch (v4l_type) {
1134 v4l_type = VFL_TYPE_GRABBER; 1114 case VFL_TYPE_GRABBER:
1135 pvt = pvr2_v4l_type_video;
1136 dip->stream = &vp->channel.mc_head->video_stream; 1115 dip->stream = &vp->channel.mc_head->video_stream;
1116 dip->config = pvr2_config_mpeg;
1117 dip->minor_type = pvr2_v4l_type_video;
1118 nr_ptr = video_nr;
1137 break; 1119 break;
1138 case pvr2_config_vbi: 1120 case VFL_TYPE_VBI:
1139 v4l_type = VFL_TYPE_VBI; 1121 dip->config = pvr2_config_vbi;
1140 pvt = pvr2_v4l_type_vbi; 1122 dip->minor_type = pvr2_v4l_type_vbi;
1123 nr_ptr = vbi_nr;
1141 break; 1124 break;
1142 case pvr2_config_radio: 1125 case VFL_TYPE_RADIO:
1143 v4l_type = VFL_TYPE_RADIO; 1126 dip->config = pvr2_config_pcm;
1144 pvt = pvr2_v4l_type_radio; 1127 dip->minor_type = pvr2_v4l_type_radio;
1128 nr_ptr = radio_nr;
1145 break; 1129 break;
1146 default: 1130 default:
1147 /* Bail out (this should be impossible) */ 1131 /* Bail out (this should be impossible) */
@@ -1151,7 +1135,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1151 } 1135 }
1152 1136
1153 /* radio device doesn 't need its own stream */ 1137 /* radio device doesn 't need its own stream */
1154 if (!dip->stream && dip->config != pvr2_config_radio) { 1138 if (!dip->stream && dip->v4l_type == VFL_TYPE_GRABBER) {
1155 err("Failed to set up pvrusb2 v4l dev" 1139 err("Failed to set up pvrusb2 v4l dev"
1156 " due to missing stream instance"); 1140 " due to missing stream instance");
1157 return; 1141 return;
@@ -1162,46 +1146,22 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1162 1146
1163 mindevnum = -1; 1147 mindevnum = -1;
1164 unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw); 1148 unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw);
1165 if ((unit_number >= 0) && (unit_number < PVR_NUM)) { 1149 if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) {
1166 switch (v4l_type) { 1150 mindevnum = nr_ptr[unit_number];
1167 case VFL_TYPE_VBI:
1168 mindevnum = vbi_nr[unit_number];
1169 break;
1170 case VFL_TYPE_RADIO:
1171 mindevnum = radio_nr[unit_number];
1172 break;
1173 case VFL_TYPE_GRABBER:
1174 default:
1175 mindevnum = video_nr[unit_number];
1176 break;
1177 }
1178 } 1151 }
1179 if ((video_register_device(&dip->devbase, v4l_type, mindevnum) < 0) && 1152 if ((video_register_device(&dip->devbase,
1180 (video_register_device(&dip->devbase, v4l_type, -1) < 0)) { 1153 dip->v4l_type, mindevnum) < 0) &&
1154 (video_register_device(&dip->devbase,
1155 dip->v4l_type, -1) < 0)) {
1181 err("Failed to register pvrusb2 v4l device"); 1156 err("Failed to register pvrusb2 v4l device");
1182 } 1157 }
1183 switch (dip->config) { 1158
1184 case pvr2_config_mpeg: 1159 printk(KERN_INFO "pvrusb2: registered device %s%u [%s]\n",
1185 printk(KERN_INFO "pvrusb2: registered device video%d [%s]\n", 1160 get_v4l_name(dip->v4l_type),dip->devbase.minor & 0x1f,
1186 dip->devbase.minor & 0x1f, 1161 pvr2_config_get_name(dip->config));
1187 pvr2_config_get_name(dip->config));
1188 break;
1189 case pvr2_config_radio:
1190 printk(KERN_INFO "pvrusb2: registered device radio%d [%s]\n",
1191 dip->devbase.minor & 0x1f,
1192 pvr2_config_get_name(dip->config));
1193 break;
1194 case pvr2_config_vbi:
1195 printk(KERN_INFO "pvrusb2: registered device vbi%d [%s]\n",
1196 dip->devbase.minor & 0x1f,
1197 pvr2_config_get_name(dip->config));
1198 break;
1199 default:
1200 break;
1201 }
1202 1162
1203 pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, 1163 pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
1204 pvt,dip->devbase.minor); 1164 dip->minor_type,dip->devbase.minor);
1205} 1165}
1206 1166
1207 1167
@@ -1228,8 +1188,8 @@ struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
1228 vp->channel.check_func = pvr2_v4l2_internal_check; 1188 vp->channel.check_func = pvr2_v4l2_internal_check;
1229 1189
1230 /* register streams */ 1190 /* register streams */
1231 pvr2_v4l2_dev_init(vp->dev_video,vp,pvr2_config_mpeg); 1191 pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER);
1232 pvr2_v4l2_dev_init(vp->dev_radio,vp,pvr2_config_radio); 1192 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO);
1233 1193
1234 return vp; 1194 return vp;
1235} 1195}