1 /* 2 * 3 * 4 * Copyright (C) 2005 Mike Isely <isely@pobox.com> 5 * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/slab.h> 24 #include "pvrusb2-context.h" 25 #include "pvrusb2-hdw.h" 26 #include "pvrusb2.h" 27 #include "pvrusb2-debug.h" 28 #include "pvrusb2-v4l2.h" 29 #include "pvrusb2-ioread.h" 30 #include <linux/videodev2.h> 31 #include <linux/module.h> 32 #include <media/v4l2-dev.h> 33 #include <media/v4l2-device.h> 34 #include <media/v4l2-fh.h> 35 #include <media/v4l2-common.h> 36 #include <media/v4l2-ioctl.h> 37 38 struct pvr2_v4l2_dev; 39 struct pvr2_v4l2_fh; 40 struct pvr2_v4l2; 41 42 struct pvr2_v4l2_dev { 43 struct video_device devbase; /* MUST be first! */ 44 struct pvr2_v4l2 *v4lp; 45 struct pvr2_context_stream *stream; 46 /* Information about this device: */ 47 enum pvr2_config config; /* Expected stream format */ 48 int v4l_type; /* V4L defined type for this device node */ 49 enum pvr2_v4l_type minor_type; /* pvr2-understood minor device type */ 50 }; 51 52 struct pvr2_v4l2_fh { 53 struct v4l2_fh fh; 54 struct pvr2_channel channel; 55 struct pvr2_v4l2_dev *pdi; 56 struct pvr2_ioread *rhp; 57 struct file *file; 58 wait_queue_head_t wait_data; 59 int fw_mode_flag; 60 /* Map contiguous ordinal value to input id */ 61 unsigned char *input_map; 62 unsigned int input_cnt; 63 }; 64 65 struct pvr2_v4l2 { 66 struct pvr2_channel channel; 67 68 /* streams - Note that these must be separately, individually, 69 * allocated pointers. This is because the v4l core is going to 70 * manage their deletion - separately, individually... */ 71 struct pvr2_v4l2_dev *dev_video; 72 struct pvr2_v4l2_dev *dev_radio; 73 }; 74 75 static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; 76 module_param_array(video_nr, int, NULL, 0444); 77 MODULE_PARM_DESC(video_nr, "Offset for device's video dev minor"); 78 static int radio_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; 79 module_param_array(radio_nr, int, NULL, 0444); 80 MODULE_PARM_DESC(radio_nr, "Offset for device's radio dev minor"); 81 static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; 82 module_param_array(vbi_nr, int, NULL, 0444); 83 MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); 84 85 static struct v4l2_fmtdesc pvr_fmtdesc [] = { 86 { 87 .index = 0, 88 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 89 .flags = V4L2_FMT_FLAG_COMPRESSED, 90 .description = "MPEG1/2", 91 // This should really be V4L2_PIX_FMT_MPEG, but xawtv 92 // breaks when I do that. 93 .pixelformat = 0, // V4L2_PIX_FMT_MPEG, 94 } 95 }; 96 97 #define PVR_FORMAT_PIX 0 98 #define PVR_FORMAT_VBI 1 99 100 static struct v4l2_format pvr_format [] = { 101 [PVR_FORMAT_PIX] = { 102 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 103 .fmt = { 104 .pix = { 105 .width = 720, 106 .height = 576, 107 // This should really be V4L2_PIX_FMT_MPEG, 108 // but xawtv breaks when I do that. 109 .pixelformat = 0, // V4L2_PIX_FMT_MPEG, 110 .field = V4L2_FIELD_INTERLACED, 111 .bytesperline = 0, // doesn't make sense 112 // here 113 //FIXME : Don't know what to put here... 114 .sizeimage = (32*1024), 115 .colorspace = 0, // doesn't make sense here 116 .priv = 0 117 } 118 } 119 }, 120 [PVR_FORMAT_VBI] = { 121 .type = V4L2_BUF_TYPE_VBI_CAPTURE, 122 .fmt = { 123 .vbi = { 124 .sampling_rate = 27000000, 125 .offset = 248, 126 .samples_per_line = 1443, 127 .sample_format = V4L2_PIX_FMT_GREY, 128 .start = { 0, 0 }, 129 .count = { 0, 0 }, 130 .flags = 0, 131 } 132 } 133 } 134 }; 135 136 137 138 /* 139 * This is part of Video 4 Linux API. These procedures handle ioctl() calls. 140 */ 141 static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability *cap) 142 { 143 struct pvr2_v4l2_fh *fh = file->private_data; 144 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 145 146 strlcpy(cap->driver, "pvrusb2", sizeof(cap->driver)); 147 strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), 148 sizeof(cap->bus_info)); 149 strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); 150 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | 151 V4L2_CAP_AUDIO | V4L2_CAP_RADIO | 152 V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS; 153 switch (fh->pdi->devbase.vfl_type) { 154 case VFL_TYPE_GRABBER: 155 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO; 156 break; 157 case VFL_TYPE_RADIO: 158 cap->device_caps = V4L2_CAP_RADIO; 159 break; 160 } 161 cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE; 162 return 0; 163 } 164 165 static int pvr2_g_std(struct file *file, void *priv, v4l2_std_id *std) 166 { 167 struct pvr2_v4l2_fh *fh = file->private_data; 168 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 169 int val = 0; 170 int ret; 171 172 ret = pvr2_ctrl_get_value( 173 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDCUR), &val); 174 *std = val; 175 return ret; 176 } 177 178 static int pvr2_s_std(struct file *file, void *priv, v4l2_std_id std) 179 { 180 struct pvr2_v4l2_fh *fh = file->private_data; 181 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 182 183 return pvr2_ctrl_set_value( 184 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDCUR), std); 185 } 186 187 static int pvr2_querystd(struct file *file, void *priv, v4l2_std_id *std) 188 { 189 struct pvr2_v4l2_fh *fh = file->private_data; 190 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 191 int val = 0; 192 int ret; 193 194 ret = pvr2_ctrl_get_value( 195 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDDETECT), &val); 196 *std = val; 197 return ret; 198 } 199 200 static int pvr2_enum_input(struct file *file, void *priv, struct v4l2_input *vi) 201 { 202 struct pvr2_v4l2_fh *fh = file->private_data; 203 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 204 struct pvr2_ctrl *cptr; 205 struct v4l2_input tmp; 206 unsigned int cnt; 207 int val; 208 209 cptr = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT); 210 211 memset(&tmp, 0, sizeof(tmp)); 212 tmp.index = vi->index; 213 if (vi->index >= fh->input_cnt) 214 return -EINVAL; 215 val = fh->input_map[vi->index]; 216 switch (val) { 217 case PVR2_CVAL_INPUT_TV: 218 case PVR2_CVAL_INPUT_DTV: 219 case PVR2_CVAL_INPUT_RADIO: 220 tmp.type = V4L2_INPUT_TYPE_TUNER; 221 break; 222 case PVR2_CVAL_INPUT_SVIDEO: 223 case PVR2_CVAL_INPUT_COMPOSITE: 224 tmp.type = V4L2_INPUT_TYPE_CAMERA; 225 break; 226 default: 227 return -EINVAL; 228 } 229 230 cnt = 0; 231 pvr2_ctrl_get_valname(cptr, val, 232 tmp.name, sizeof(tmp.name) - 1, &cnt); 233 tmp.name[cnt] = 0; 234 235 /* Don't bother with audioset, since this driver currently 236 always switches the audio whenever the video is 237 switched. */ 238 239 /* Handling std is a tougher problem. It doesn't make 240 sense in cases where a device might be multi-standard. 241 We could just copy out the current value for the 242 standard, but it can change over time. For now just 243 leave it zero. */ 244 *vi = tmp; 245 return 0; 246 } 247 248 static int pvr2_g_input(struct file *file, void *priv, unsigned int *i) 249 { 250 struct pvr2_v4l2_fh *fh = file->private_data; 251 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 252 unsigned int idx; 253 struct pvr2_ctrl *cptr; 254 int val; 255 int ret; 256 257 cptr = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT); 258 val = 0; 259 ret = pvr2_ctrl_get_value(cptr, &val); 260 *i = 0; 261 for (idx = 0; idx < fh->input_cnt; idx++) { 262 if (fh->input_map[idx] == val) { 263 *i = idx; 264 break; 265 } 266 } 267 return ret; 268 } 269 270 static int pvr2_s_input(struct file *file, void *priv, unsigned int inp) 271 { 272 struct pvr2_v4l2_fh *fh = file->private_data; 273 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 274 275 if (inp >= fh->input_cnt) 276 return -EINVAL; 277 return pvr2_ctrl_set_value( 278 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT), 279 fh->input_map[inp]); 280 } 281 282 static int pvr2_enumaudio(struct file *file, void *priv, struct v4l2_audio *vin) 283 { 284 /* pkt: FIXME: We are returning one "fake" input here 285 which could very well be called "whatever_we_like". 286 This is for apps that want to see an audio input 287 just to feel comfortable, as well as to test if 288 it can do stereo or sth. There is actually no guarantee 289 that the actual audio input cannot change behind the app's 290 back, but most applications should not mind that either. 291 292 Hopefully, mplayer people will work with us on this (this 293 whole mess is to support mplayer pvr://), or Hans will come 294 up with a more standard way to say "we have inputs but we 295 don 't want you to change them independent of video" which 296 will sort this mess. 297 */ 298 299 if (vin->index > 0) 300 return -EINVAL; 301 strncpy(vin->name, "PVRUSB2 Audio", 14); 302 vin->capability = V4L2_AUDCAP_STEREO; 303 return 0; 304 } 305 306 static int pvr2_g_audio(struct file *file, void *priv, struct v4l2_audio *vin) 307 { 308 /* pkt: FIXME: see above comment (VIDIOC_ENUMAUDIO) */ 309 vin->index = 0; 310 strncpy(vin->name, "PVRUSB2 Audio", 14); 311 vin->capability = V4L2_AUDCAP_STEREO; 312 return 0; 313 } 314 315 static int pvr2_s_audio(struct file *file, void *priv, const struct v4l2_audio *vout) 316 { 317 if (vout->index) 318 return -EINVAL; 319 return 0; 320 } 321 322 static int pvr2_g_tuner(struct file *file, void *priv, struct v4l2_tuner *vt) 323 { 324 struct pvr2_v4l2_fh *fh = file->private_data; 325 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 326 327 if (vt->index != 0) 328 return -EINVAL; /* Only answer for the 1st tuner */ 329 330 pvr2_hdw_execute_tuner_poll(hdw); 331 return pvr2_hdw_get_tuner_status(hdw, vt); 332 } 333 334 static int pvr2_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *vt) 335 { 336 struct pvr2_v4l2_fh *fh = file->private_data; 337 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 338 339 if (vt->index != 0) 340 return -EINVAL; 341 342 return pvr2_ctrl_set_value( 343 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_AUDIOMODE), 344 vt->audmode); 345 } 346 347 static int pvr2_s_frequency(struct file *file, void *priv, const struct v4l2_frequency *vf) 348 { 349 struct pvr2_v4l2_fh *fh = file->private_data; 350 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 351 unsigned long fv; 352 struct v4l2_tuner vt; 353 int cur_input; 354 struct pvr2_ctrl *ctrlp; 355 int ret; 356 357 ret = pvr2_hdw_get_tuner_status(hdw, &vt); 358 if (ret != 0) 359 return ret; 360 ctrlp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT); 361 ret = pvr2_ctrl_get_value(ctrlp, &cur_input); 362 if (ret != 0) 363 return ret; 364 if (vf->type == V4L2_TUNER_RADIO) { 365 if (cur_input != PVR2_CVAL_INPUT_RADIO) 366 pvr2_ctrl_set_value(ctrlp, PVR2_CVAL_INPUT_RADIO); 367 } else { 368 if (cur_input == PVR2_CVAL_INPUT_RADIO) 369 pvr2_ctrl_set_value(ctrlp, PVR2_CVAL_INPUT_TV); 370 } 371 fv = vf->frequency; 372 if (vt.capability & V4L2_TUNER_CAP_LOW) 373 fv = (fv * 125) / 2; 374 else 375 fv = fv * 62500; 376 return pvr2_ctrl_set_value( 377 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),fv); 378 } 379 380 static int pvr2_g_frequency(struct file *file, void *priv, struct v4l2_frequency *vf) 381 { 382 struct pvr2_v4l2_fh *fh = file->private_data; 383 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 384 int val = 0; 385 int cur_input; 386 struct v4l2_tuner vt; 387 int ret; 388 389 ret = pvr2_hdw_get_tuner_status(hdw, &vt); 390 if (ret != 0) 391 return ret; 392 ret = pvr2_ctrl_get_value( 393 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_FREQUENCY), 394 &val); 395 if (ret != 0) 396 return ret; 397 pvr2_ctrl_get_value( 398 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT), 399 &cur_input); 400 if (cur_input == PVR2_CVAL_INPUT_RADIO) 401 vf->type = V4L2_TUNER_RADIO; 402 else 403 vf->type = V4L2_TUNER_ANALOG_TV; 404 if (vt.capability & V4L2_TUNER_CAP_LOW) 405 val = (val * 2) / 125; 406 else 407 val /= 62500; 408 vf->frequency = val; 409 return 0; 410 } 411 412 static int pvr2_enum_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fmtdesc *fd) 413 { 414 /* Only one format is supported : mpeg.*/ 415 if (fd->index != 0) 416 return -EINVAL; 417 418 memcpy(fd, pvr_fmtdesc, sizeof(struct v4l2_fmtdesc)); 419 return 0; 420 } 421 422 static int pvr2_g_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf) 423 { 424 struct pvr2_v4l2_fh *fh = file->private_data; 425 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 426 int val; 427 428 memcpy(vf, &pvr_format[PVR_FORMAT_PIX], sizeof(struct v4l2_format)); 429 val = 0; 430 pvr2_ctrl_get_value( 431 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES), 432 &val); 433 vf->fmt.pix.width = val; 434 val = 0; 435 pvr2_ctrl_get_value( 436 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES), 437 &val); 438 vf->fmt.pix.height = val; 439 return 0; 440 } 441 442 static int pvr2_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf) 443 { 444 struct pvr2_v4l2_fh *fh = file->private_data; 445 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 446 int lmin, lmax, ldef; 447 struct pvr2_ctrl *hcp, *vcp; 448 int h = vf->fmt.pix.height; 449 int w = vf->fmt.pix.width; 450 451 hcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES); 452 vcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES); 453 454 lmin = pvr2_ctrl_get_min(hcp); 455 lmax = pvr2_ctrl_get_max(hcp); 456 pvr2_ctrl_get_def(hcp, &ldef); 457 if (w == -1) 458 w = ldef; 459 else if (w < lmin) 460 w = lmin; 461 else if (w > lmax) 462 w = lmax; 463 lmin = pvr2_ctrl_get_min(vcp); 464 lmax = pvr2_ctrl_get_max(vcp); 465 pvr2_ctrl_get_def(vcp, &ldef); 466 if (h == -1) 467 h = ldef; 468 else if (h < lmin) 469 h = lmin; 470 else if (h > lmax) 471 h = lmax; 472 473 memcpy(vf, &pvr_format[PVR_FORMAT_PIX], 474 sizeof(struct v4l2_format)); 475 vf->fmt.pix.width = w; 476 vf->fmt.pix.height = h; 477 return 0; 478 } 479 480 static int pvr2_s_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf) 481 { 482 struct pvr2_v4l2_fh *fh = file->private_data; 483 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 484 struct pvr2_ctrl *hcp, *vcp; 485 int ret = pvr2_try_fmt_vid_cap(file, fh, vf); 486 487 if (ret) 488 return ret; 489 hcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES); 490 vcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES); 491 pvr2_ctrl_set_value(hcp, vf->fmt.pix.width); 492 pvr2_ctrl_set_value(vcp, vf->fmt.pix.height); 493 return 0; 494 } 495 496 static int pvr2_streamon(struct file *file, void *priv, enum v4l2_buf_type i) 497 { 498 struct pvr2_v4l2_fh *fh = file->private_data; 499 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 500 struct pvr2_v4l2_dev *pdi = fh->pdi; 501 int ret; 502 503 if (!fh->pdi->stream) { 504 /* No stream defined for this node. This means 505 that we're not currently allowed to stream from 506 this node. */ 507 return -EPERM; 508 } 509 ret = pvr2_hdw_set_stream_type(hdw, pdi->config); 510 if (ret < 0) 511 return ret; 512 return pvr2_hdw_set_streaming(hdw, !0); 513 } 514 515 static int pvr2_streamoff(struct file *file, void *priv, enum v4l2_buf_type i) 516 { 517 struct pvr2_v4l2_fh *fh = file->private_data; 518 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 519 520 if (!fh->pdi->stream) { 521 /* No stream defined for this node. This means 522 that we're not currently allowed to stream from 523 this node. */ 524 return -EPERM; 525 } 526 return pvr2_hdw_set_streaming(hdw, 0); 527 } 528 529 static int pvr2_queryctrl(struct file *file, void *priv, 530 struct v4l2_queryctrl *vc) 531 { 532 struct pvr2_v4l2_fh *fh = file->private_data; 533 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 534 struct pvr2_ctrl *cptr; 535 int val; 536 537 if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) { 538 cptr = pvr2_hdw_get_ctrl_nextv4l( 539 hdw, (vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL)); 540 if (cptr) 541 vc->id = pvr2_ctrl_get_v4lid(cptr); 542 } else { 543 cptr = pvr2_hdw_get_ctrl_v4l(hdw, vc->id); 544 } 545 if (!cptr) { 546 pvr2_trace(PVR2_TRACE_V4LIOCTL, 547 "QUERYCTRL id=0x%x not implemented here", 548 vc->id); 549 return -EINVAL; 550 } 551 552 pvr2_trace(PVR2_TRACE_V4LIOCTL, 553 "QUERYCTRL id=0x%x mapping name=%s (%s)", 554 vc->id, pvr2_ctrl_get_name(cptr), 555 pvr2_ctrl_get_desc(cptr)); 556 strlcpy(vc->name, pvr2_ctrl_get_desc(cptr), sizeof(vc->name)); 557 vc->flags = pvr2_ctrl_get_v4lflags(cptr); 558 pvr2_ctrl_get_def(cptr, &val); 559 vc->default_value = val; 560 switch (pvr2_ctrl_get_type(cptr)) { 561 case pvr2_ctl_enum: 562 vc->type = V4L2_CTRL_TYPE_MENU; 563 vc->minimum = 0; 564 vc->maximum = pvr2_ctrl_get_cnt(cptr) - 1; 565 vc->step = 1; 566 break; 567 case pvr2_ctl_bool: 568 vc->type = V4L2_CTRL_TYPE_BOOLEAN; 569 vc->minimum = 0; 570 vc->maximum = 1; 571 vc->step = 1; 572 break; 573 case pvr2_ctl_int: 574 vc->type = V4L2_CTRL_TYPE_INTEGER; 575 vc->minimum = pvr2_ctrl_get_min(cptr); 576 vc->maximum = pvr2_ctrl_get_max(cptr); 577 vc->step = 1; 578 break; 579 default: 580 pvr2_trace(PVR2_TRACE_V4LIOCTL, 581 "QUERYCTRL id=0x%x name=%s not mappable", 582 vc->id, pvr2_ctrl_get_name(cptr)); 583 return -EINVAL; 584 } 585 return 0; 586 } 587 588 static int pvr2_querymenu(struct file *file, void *priv, struct v4l2_querymenu *vm) 589 { 590 struct pvr2_v4l2_fh *fh = file->private_data; 591 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 592 unsigned int cnt = 0; 593 int ret; 594 595 ret = pvr2_ctrl_get_valname(pvr2_hdw_get_ctrl_v4l(hdw, vm->id), 596 vm->index, 597 vm->name, sizeof(vm->name) - 1, 598 &cnt); 599 vm->name[cnt] = 0; 600 return ret; 601 } 602 603 static int pvr2_g_ctrl(struct file *file, void *priv, struct v4l2_control *vc) 604 { 605 struct pvr2_v4l2_fh *fh = file->private_data; 606 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 607 int val = 0; 608 int ret; 609 610 ret = pvr2_ctrl_get_value(pvr2_hdw_get_ctrl_v4l(hdw, vc->id), 611 &val); 612 vc->value = val; 613 return ret; 614 } 615 616 static int pvr2_s_ctrl(struct file *file, void *priv, struct v4l2_control *vc) 617 { 618 struct pvr2_v4l2_fh *fh = file->private_data; 619 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 620 621 return pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_v4l(hdw, vc->id), 622 vc->value); 623 } 624 625 static int pvr2_g_ext_ctrls(struct file *file, void *priv, 626 struct v4l2_ext_controls *ctls) 627 { 628 struct pvr2_v4l2_fh *fh = file->private_data; 629 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 630 struct v4l2_ext_control *ctrl; 631 unsigned int idx; 632 int val; 633 int ret; 634 635 ret = 0; 636 for (idx = 0; idx < ctls->count; idx++) { 637 ctrl = ctls->controls + idx; 638 ret = pvr2_ctrl_get_value( 639 pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id), &val); 640 if (ret) { 641 ctls->error_idx = idx; 642 return ret; 643 } 644 /* Ensure that if read as a 64 bit value, the user 645 will still get a hopefully sane value */ 646 ctrl->value64 = 0; 647 ctrl->value = val; 648 } 649 return 0; 650 } 651 652 static int pvr2_s_ext_ctrls(struct file *file, void *priv, 653 struct v4l2_ext_controls *ctls) 654 { 655 struct pvr2_v4l2_fh *fh = file->private_data; 656 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 657 struct v4l2_ext_control *ctrl; 658 unsigned int idx; 659 int ret; 660 661 ret = 0; 662 for (idx = 0; idx < ctls->count; idx++) { 663 ctrl = ctls->controls + idx; 664 ret = pvr2_ctrl_set_value( 665 pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id), 666 ctrl->value); 667 if (ret) { 668 ctls->error_idx = idx; 669 return ret; 670 } 671 } 672 return 0; 673 } 674 675 static int pvr2_try_ext_ctrls(struct file *file, void *priv, 676 struct v4l2_ext_controls *ctls) 677 { 678 struct pvr2_v4l2_fh *fh = file->private_data; 679 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 680 struct v4l2_ext_control *ctrl; 681 struct pvr2_ctrl *pctl; 682 unsigned int idx; 683 684 /* For the moment just validate that the requested control 685 actually exists. */ 686 for (idx = 0; idx < ctls->count; idx++) { 687 ctrl = ctls->controls + idx; 688 pctl = pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id); 689 if (!pctl) { 690 ctls->error_idx = idx; 691 return -EINVAL; 692 } 693 } 694 return 0; 695 } 696 697 static int pvr2_cropcap(struct file *file, void *priv, struct v4l2_cropcap *cap) 698 { 699 struct pvr2_v4l2_fh *fh = file->private_data; 700 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 701 int ret; 702 703 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 704 return -EINVAL; 705 ret = pvr2_hdw_get_cropcap(hdw, cap); 706 cap->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; /* paranoia */ 707 return ret; 708 } 709 710 static int pvr2_g_crop(struct file *file, void *priv, struct v4l2_crop *crop) 711 { 712 struct pvr2_v4l2_fh *fh = file->private_data; 713 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 714 int val = 0; 715 int ret; 716 717 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 718 return -EINVAL; 719 ret = pvr2_ctrl_get_value( 720 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPL), &val); 721 if (ret != 0) 722 return -EINVAL; 723 crop->c.left = val; 724 ret = pvr2_ctrl_get_value( 725 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPT), &val); 726 if (ret != 0) 727 return -EINVAL; 728 crop->c.top = val; 729 ret = pvr2_ctrl_get_value( 730 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPW), &val); 731 if (ret != 0) 732 return -EINVAL; 733 crop->c.width = val; 734 ret = pvr2_ctrl_get_value( 735 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPH), &val); 736 if (ret != 0) 737 return -EINVAL; 738 crop->c.height = val; 739 return 0; 740 } 741 742 static int pvr2_s_crop(struct file *file, void *priv, const struct v4l2_crop *crop) 743 { 744 struct pvr2_v4l2_fh *fh = file->private_data; 745 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 746 int ret; 747 748 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 749 return -EINVAL; 750 ret = pvr2_ctrl_set_value( 751 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPL), 752 crop->c.left); 753 if (ret != 0) 754 return -EINVAL; 755 ret = pvr2_ctrl_set_value( 756 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPT), 757 crop->c.top); 758 if (ret != 0) 759 return -EINVAL; 760 ret = pvr2_ctrl_set_value( 761 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPW), 762 crop->c.width); 763 if (ret != 0) 764 return -EINVAL; 765 ret = pvr2_ctrl_set_value( 766 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPH), 767 crop->c.height); 768 if (ret != 0) 769 return -EINVAL; 770 return 0; 771 } 772 773 static int pvr2_log_status(struct file *file, void *priv) 774 { 775 struct pvr2_v4l2_fh *fh = file->private_data; 776 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 777 778 pvr2_hdw_trigger_module_log(hdw); 779 return 0; 780 } 781 782 static const struct v4l2_ioctl_ops pvr2_ioctl_ops = { 783 .vidioc_querycap = pvr2_querycap, 784 .vidioc_s_audio = pvr2_s_audio, 785 .vidioc_g_audio = pvr2_g_audio, 786 .vidioc_enumaudio = pvr2_enumaudio, 787 .vidioc_enum_input = pvr2_enum_input, 788 .vidioc_cropcap = pvr2_cropcap, 789 .vidioc_s_crop = pvr2_s_crop, 790 .vidioc_g_crop = pvr2_g_crop, 791 .vidioc_g_input = pvr2_g_input, 792 .vidioc_s_input = pvr2_s_input, 793 .vidioc_g_frequency = pvr2_g_frequency, 794 .vidioc_s_frequency = pvr2_s_frequency, 795 .vidioc_s_tuner = pvr2_s_tuner, 796 .vidioc_g_tuner = pvr2_g_tuner, 797 .vidioc_g_std = pvr2_g_std, 798 .vidioc_s_std = pvr2_s_std, 799 .vidioc_querystd = pvr2_querystd, 800 .vidioc_log_status = pvr2_log_status, 801 .vidioc_enum_fmt_vid_cap = pvr2_enum_fmt_vid_cap, 802 .vidioc_g_fmt_vid_cap = pvr2_g_fmt_vid_cap, 803 .vidioc_s_fmt_vid_cap = pvr2_s_fmt_vid_cap, 804 .vidioc_try_fmt_vid_cap = pvr2_try_fmt_vid_cap, 805 .vidioc_streamon = pvr2_streamon, 806 .vidioc_streamoff = pvr2_streamoff, 807 .vidioc_queryctrl = pvr2_queryctrl, 808 .vidioc_querymenu = pvr2_querymenu, 809 .vidioc_g_ctrl = pvr2_g_ctrl, 810 .vidioc_s_ctrl = pvr2_s_ctrl, 811 .vidioc_g_ext_ctrls = pvr2_g_ext_ctrls, 812 .vidioc_s_ext_ctrls = pvr2_s_ext_ctrls, 813 .vidioc_try_ext_ctrls = pvr2_try_ext_ctrls, 814 }; 815 816 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip) 817 { 818 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw; 819 enum pvr2_config cfg = dip->config; 820 char msg[80]; 821 unsigned int mcnt; 822 823 /* Construct the unregistration message *before* we actually 824 perform the unregistration step. By doing it this way we don't 825 have to worry about potentially touching deleted resources. */ 826 mcnt = scnprintf(msg, sizeof(msg) - 1, 827 "pvrusb2: unregistered device %s [%s]", 828 video_device_node_name(&dip->devbase), 829 pvr2_config_get_name(cfg)); 830 msg[mcnt] = 0; 831 832 pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1); 833 834 /* Paranoia */ 835 dip->v4lp = NULL; 836 dip->stream = NULL; 837 838 /* Actual deallocation happens later when all internal references 839 are gone. */ 840 video_unregister_device(&dip->devbase); 841 842 printk(KERN_INFO "%s\n", msg); 843 844 } 845 846 847 static void pvr2_v4l2_dev_disassociate_parent(struct pvr2_v4l2_dev *dip) 848 { 849 if (!dip) return; 850 if (!dip->devbase.v4l2_dev->dev) return; 851 dip->devbase.v4l2_dev->dev = NULL; 852 device_move(&dip->devbase.dev, NULL, DPM_ORDER_NONE); 853 } 854 855 856 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) 857 { 858 if (vp->dev_video) { 859 pvr2_v4l2_dev_destroy(vp->dev_video); 860 vp->dev_video = NULL; 861 } 862 if (vp->dev_radio) { 863 pvr2_v4l2_dev_destroy(vp->dev_radio); 864 vp->dev_radio = NULL; 865 } 866 867 pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); 868 pvr2_channel_done(&vp->channel); 869 kfree(vp); 870 } 871 872 873 static void pvr2_video_device_release(struct video_device *vdev) 874 { 875 struct pvr2_v4l2_dev *dev; 876 dev = container_of(vdev,struct pvr2_v4l2_dev,devbase); 877 kfree(dev); 878 } 879 880 881 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp) 882 { 883 struct pvr2_v4l2 *vp; 884 vp = container_of(chp,struct pvr2_v4l2,channel); 885 if (!vp->channel.mc_head->disconnect_flag) return; 886 pvr2_v4l2_dev_disassociate_parent(vp->dev_video); 887 pvr2_v4l2_dev_disassociate_parent(vp->dev_radio); 888 if (!list_empty(&vp->dev_video->devbase.fh_list) || 889 !list_empty(&vp->dev_radio->devbase.fh_list)) 890 return; 891 pvr2_v4l2_destroy_no_lock(vp); 892 } 893 894 895 static long pvr2_v4l2_ioctl(struct file *file, 896 unsigned int cmd, unsigned long arg) 897 { 898 899 struct pvr2_v4l2_fh *fh = file->private_data; 900 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 901 long ret = -EINVAL; 902 903 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) 904 v4l_printk_ioctl(pvr2_hdw_get_driver_name(hdw), cmd); 905 906 if (!pvr2_hdw_dev_ok(hdw)) { 907 pvr2_trace(PVR2_TRACE_ERROR_LEGS, 908 "ioctl failed - bad or no context"); 909 return -EFAULT; 910 } 911 912 ret = video_ioctl2(file, cmd, arg); 913 914 pvr2_hdw_commit_ctl(hdw); 915 916 if (ret < 0) { 917 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) { 918 pvr2_trace(PVR2_TRACE_V4LIOCTL, 919 "pvr2_v4l2_do_ioctl failure, ret=%ld" 920 " command was:", ret); 921 v4l_printk_ioctl(pvr2_hdw_get_driver_name(hdw), cmd); 922 } 923 } else { 924 pvr2_trace(PVR2_TRACE_V4LIOCTL, 925 "pvr2_v4l2_do_ioctl complete, ret=%ld (0x%lx)", 926 ret, ret); 927 } 928 return ret; 929 930 } 931 932 933 static int pvr2_v4l2_release(struct file *file) 934 { 935 struct pvr2_v4l2_fh *fhp = file->private_data; 936 struct pvr2_v4l2 *vp = fhp->pdi->v4lp; 937 struct pvr2_hdw *hdw = fhp->channel.mc_head->hdw; 938 939 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_release"); 940 941 if (fhp->rhp) { 942 struct pvr2_stream *sp; 943 pvr2_hdw_set_streaming(hdw,0); 944 sp = pvr2_ioread_get_stream(fhp->rhp); 945 if (sp) pvr2_stream_set_callback(sp,NULL,NULL); 946 pvr2_ioread_destroy(fhp->rhp); 947 fhp->rhp = NULL; 948 } 949 950 v4l2_fh_del(&fhp->fh); 951 v4l2_fh_exit(&fhp->fh); 952 file->private_data = NULL; 953 954 pvr2_channel_done(&fhp->channel); 955 pvr2_trace(PVR2_TRACE_STRUCT, 956 "Destroying pvr_v4l2_fh id=%p",fhp); 957 if (fhp->input_map) { 958 kfree(fhp->input_map); 959 fhp->input_map = NULL; 960 } 961 kfree(fhp); 962 if (vp->channel.mc_head->disconnect_flag && 963 list_empty(&vp->dev_video->devbase.fh_list) && 964 list_empty(&vp->dev_radio->devbase.fh_list)) { 965 pvr2_v4l2_destroy_no_lock(vp); 966 } 967 return 0; 968 } 969 970 971 static int pvr2_v4l2_open(struct file *file) 972 { 973 struct pvr2_v4l2_dev *dip; /* Our own context pointer */ 974 struct pvr2_v4l2_fh *fhp; 975 struct pvr2_v4l2 *vp; 976 struct pvr2_hdw *hdw; 977 unsigned int input_mask = 0; 978 unsigned int input_cnt,idx; 979 int ret = 0; 980 981 dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase); 982 983 vp = dip->v4lp; 984 hdw = vp->channel.hdw; 985 986 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_open"); 987 988 if (!pvr2_hdw_dev_ok(hdw)) { 989 pvr2_trace(PVR2_TRACE_OPEN_CLOSE, 990 "pvr2_v4l2_open: hardware not ready"); 991 return -EIO; 992 } 993 994 fhp = kzalloc(sizeof(*fhp),GFP_KERNEL); 995 if (!fhp) { 996 return -ENOMEM; 997 } 998 999 v4l2_fh_init(&fhp->fh, &dip->devbase); 1000 init_waitqueue_head(&fhp->wait_data); 1001 fhp->pdi = dip; 1002 1003 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp); 1004 pvr2_channel_init(&fhp->channel,vp->channel.mc_head); 1005 1006 if (dip->v4l_type == VFL_TYPE_RADIO) { 1007 /* Opening device as a radio, legal input selection subset 1008 is just the radio. */ 1009 input_mask = (1 << PVR2_CVAL_INPUT_RADIO); 1010 } else { 1011 /* Opening the main V4L device, legal input selection 1012 subset includes all analog inputs. */ 1013 input_mask = ((1 << PVR2_CVAL_INPUT_RADIO) | 1014 (1 << PVR2_CVAL_INPUT_TV) | 1015 (1 << PVR2_CVAL_INPUT_COMPOSITE) | 1016 (1 << PVR2_CVAL_INPUT_SVIDEO)); 1017 } 1018 ret = pvr2_channel_limit_inputs(&fhp->channel,input_mask); 1019 if (ret) { 1020 pvr2_channel_done(&fhp->channel); 1021 pvr2_trace(PVR2_TRACE_STRUCT, 1022 "Destroying pvr_v4l2_fh id=%p (input mask error)", 1023 fhp); 1024 1025 kfree(fhp); 1026 return ret; 1027 } 1028 1029 input_mask &= pvr2_hdw_get_input_available(hdw); 1030 input_cnt = 0; 1031 for (idx = 0; idx < (sizeof(input_mask) << 3); idx++) { 1032 if (input_mask & (1 << idx)) input_cnt++; 1033 } 1034 fhp->input_cnt = input_cnt; 1035 fhp->input_map = kzalloc(input_cnt,GFP_KERNEL); 1036 if (!fhp->input_map) { 1037 pvr2_channel_done(&fhp->channel); 1038 pvr2_trace(PVR2_TRACE_STRUCT, 1039 "Destroying pvr_v4l2_fh id=%p (input map failure)", 1040 fhp); 1041 kfree(fhp); 1042 return -ENOMEM; 1043 } 1044 input_cnt = 0; 1045 for (idx = 0; idx < (sizeof(input_mask) << 3); idx++) { 1046 if (!(input_mask & (1 << idx))) continue; 1047 fhp->input_map[input_cnt++] = idx; 1048 } 1049 1050 fhp->file = file; 1051 file->private_data = fhp; 1052 1053 fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw); 1054 v4l2_fh_add(&fhp->fh); 1055 1056 return 0; 1057 } 1058 1059 1060 static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp) 1061 { 1062 wake_up(&fhp->wait_data); 1063 } 1064 1065 static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh) 1066 { 1067 int ret; 1068 struct pvr2_stream *sp; 1069 struct pvr2_hdw *hdw; 1070 if (fh->rhp) return 0; 1071 1072 if (!fh->pdi->stream) { 1073 /* No stream defined for this node. This means that we're 1074 not currently allowed to stream from this node. */ 1075 return -EPERM; 1076 } 1077 1078 /* First read() attempt. Try to claim the stream and start 1079 it... */ 1080 if ((ret = pvr2_channel_claim_stream(&fh->channel, 1081 fh->pdi->stream)) != 0) { 1082 /* Someone else must already have it */ 1083 return ret; 1084 } 1085 1086 fh->rhp = pvr2_channel_create_mpeg_stream(fh->pdi->stream); 1087 if (!fh->rhp) { 1088 pvr2_channel_claim_stream(&fh->channel,NULL); 1089 return -ENOMEM; 1090 } 1091 1092 hdw = fh->channel.mc_head->hdw; 1093 sp = fh->pdi->stream->stream; 1094 pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh); 1095 pvr2_hdw_set_stream_type(hdw,fh->pdi->config); 1096 if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret; 1097 return pvr2_ioread_set_enabled(fh->rhp,!0); 1098 } 1099 1100 1101 static ssize_t pvr2_v4l2_read(struct file *file, 1102 char __user *buff, size_t count, loff_t *ppos) 1103 { 1104 struct pvr2_v4l2_fh *fh = file->private_data; 1105 int ret; 1106 1107 if (fh->fw_mode_flag) { 1108 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; 1109 char *tbuf; 1110 int c1,c2; 1111 int tcnt = 0; 1112 unsigned int offs = *ppos; 1113 1114 tbuf = kmalloc(PAGE_SIZE,GFP_KERNEL); 1115 if (!tbuf) return -ENOMEM; 1116 1117 while (count) { 1118 c1 = count; 1119 if (c1 > PAGE_SIZE) c1 = PAGE_SIZE; 1120 c2 = pvr2_hdw_cpufw_get(hdw,offs,tbuf,c1); 1121 if (c2 < 0) { 1122 tcnt = c2; 1123 break; 1124 } 1125 if (!c2) break; 1126 if (copy_to_user(buff,tbuf,c2)) { 1127 tcnt = -EFAULT; 1128 break; 1129 } 1130 offs += c2; 1131 tcnt += c2; 1132 buff += c2; 1133 count -= c2; 1134 *ppos += c2; 1135 } 1136 kfree(tbuf); 1137 return tcnt; 1138 } 1139 1140 if (!fh->rhp) { 1141 ret = pvr2_v4l2_iosetup(fh); 1142 if (ret) { 1143 return ret; 1144 } 1145 } 1146 1147 for (;;) { 1148 ret = pvr2_ioread_read(fh->rhp,buff,count); 1149 if (ret >= 0) break; 1150 if (ret != -EAGAIN) break; 1151 if (file->f_flags & O_NONBLOCK) break; 1152 /* Doing blocking I/O. Wait here. */ 1153 ret = wait_event_interruptible( 1154 fh->wait_data, 1155 pvr2_ioread_avail(fh->rhp) >= 0); 1156 if (ret < 0) break; 1157 } 1158 1159 return ret; 1160 } 1161 1162 1163 static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait) 1164 { 1165 unsigned int mask = 0; 1166 struct pvr2_v4l2_fh *fh = file->private_data; 1167 int ret; 1168 1169 if (fh->fw_mode_flag) { 1170 mask |= POLLIN | POLLRDNORM; 1171 return mask; 1172 } 1173 1174 if (!fh->rhp) { 1175 ret = pvr2_v4l2_iosetup(fh); 1176 if (ret) return POLLERR; 1177 } 1178 1179 poll_wait(file,&fh->wait_data,wait); 1180 1181 if (pvr2_ioread_avail(fh->rhp) >= 0) { 1182 mask |= POLLIN | POLLRDNORM; 1183 } 1184 1185 return mask; 1186 } 1187 1188 1189 static const struct v4l2_file_operations vdev_fops = { 1190 .owner = THIS_MODULE, 1191 .open = pvr2_v4l2_open, 1192 .release = pvr2_v4l2_release, 1193 .read = pvr2_v4l2_read, 1194 .unlocked_ioctl = pvr2_v4l2_ioctl, 1195 .poll = pvr2_v4l2_poll, 1196 }; 1197 1198 1199 static struct video_device vdev_template = { 1200 .fops = &vdev_fops, 1201 }; 1202 1203 1204 static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, 1205 struct pvr2_v4l2 *vp, 1206 int v4l_type) 1207 { 1208 int mindevnum; 1209 int unit_number; 1210 struct pvr2_hdw *hdw; 1211 int *nr_ptr = NULL; 1212 dip->v4lp = vp; 1213 1214 hdw = vp->channel.mc_head->hdw; 1215 dip->v4l_type = v4l_type; 1216 switch (v4l_type) { 1217 case VFL_TYPE_GRABBER: 1218 dip->stream = &vp->channel.mc_head->video_stream; 1219 dip->config = pvr2_config_mpeg; 1220 dip->minor_type = pvr2_v4l_type_video; 1221 nr_ptr = video_nr; 1222 if (!dip->stream) { 1223 pr_err(KBUILD_MODNAME 1224 ": Failed to set up pvrusb2 v4l video dev" 1225 " due to missing stream instance\n"); 1226 return; 1227 } 1228 break; 1229 case VFL_TYPE_VBI: 1230 dip->config = pvr2_config_vbi; 1231 dip->minor_type = pvr2_v4l_type_vbi; 1232 nr_ptr = vbi_nr; 1233 break; 1234 case VFL_TYPE_RADIO: 1235 dip->stream = &vp->channel.mc_head->video_stream; 1236 dip->config = pvr2_config_mpeg; 1237 dip->minor_type = pvr2_v4l_type_radio; 1238 nr_ptr = radio_nr; 1239 break; 1240 default: 1241 /* Bail out (this should be impossible) */ 1242 pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev" 1243 " due to unrecognized config\n"); 1244 return; 1245 } 1246 1247 dip->devbase = vdev_template; 1248 dip->devbase.release = pvr2_video_device_release; 1249 dip->devbase.ioctl_ops = &pvr2_ioctl_ops; 1250 { 1251 int val; 1252 pvr2_ctrl_get_value( 1253 pvr2_hdw_get_ctrl_by_id(hdw, 1254 PVR2_CID_STDAVAIL), &val); 1255 dip->devbase.tvnorms = (v4l2_std_id)val; 1256 } 1257 1258 mindevnum = -1; 1259 unit_number = pvr2_hdw_get_unit_number(hdw); 1260 if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) { 1261 mindevnum = nr_ptr[unit_number]; 1262 } 1263 pvr2_hdw_set_v4l2_dev(hdw, &dip->devbase); 1264 if ((video_register_device(&dip->devbase, 1265 dip->v4l_type, mindevnum) < 0) && 1266 (video_register_device(&dip->devbase, 1267 dip->v4l_type, -1) < 0)) { 1268 pr_err(KBUILD_MODNAME 1269 ": Failed to register pvrusb2 v4l device\n"); 1270 } 1271 1272 printk(KERN_INFO "pvrusb2: registered device %s [%s]\n", 1273 video_device_node_name(&dip->devbase), 1274 pvr2_config_get_name(dip->config)); 1275 1276 pvr2_hdw_v4l_store_minor_number(hdw, 1277 dip->minor_type,dip->devbase.minor); 1278 } 1279 1280 1281 struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp) 1282 { 1283 struct pvr2_v4l2 *vp; 1284 1285 vp = kzalloc(sizeof(*vp),GFP_KERNEL); 1286 if (!vp) return vp; 1287 pvr2_channel_init(&vp->channel,mnp); 1288 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp); 1289 1290 vp->channel.check_func = pvr2_v4l2_internal_check; 1291 1292 /* register streams */ 1293 vp->dev_video = kzalloc(sizeof(*vp->dev_video),GFP_KERNEL); 1294 if (!vp->dev_video) goto fail; 1295 pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER); 1296 if (pvr2_hdw_get_input_available(vp->channel.mc_head->hdw) & 1297 (1 << PVR2_CVAL_INPUT_RADIO)) { 1298 vp->dev_radio = kzalloc(sizeof(*vp->dev_radio),GFP_KERNEL); 1299 if (!vp->dev_radio) goto fail; 1300 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO); 1301 } 1302 1303 return vp; 1304 fail: 1305 pvr2_trace(PVR2_TRACE_STRUCT,"Failure creating pvr2_v4l2 id=%p",vp); 1306 pvr2_v4l2_destroy_no_lock(vp); 1307 return NULL; 1308 } 1309