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