cx23885-video.c revision 0d5a19f15837de69f864b2a43a93f119224d778c
1/* 2 * Driver for the Conexant CX23885 PCIe bridge 3 * 4 * Copyright (c) 2007 Steven Toth <stoth@linuxtv.org> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 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 * 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22#include <linux/init.h> 23#include <linux/list.h> 24#include <linux/module.h> 25#include <linux/moduleparam.h> 26#include <linux/kmod.h> 27#include <linux/kernel.h> 28#include <linux/slab.h> 29#include <linux/interrupt.h> 30#include <linux/delay.h> 31#include <linux/kthread.h> 32#include <asm/div64.h> 33 34#include "cx23885.h" 35#include <media/v4l2-common.h> 36#include <media/v4l2-ioctl.h> 37 38MODULE_DESCRIPTION("v4l2 driver module for cx23885 based TV cards"); 39MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>"); 40MODULE_LICENSE("GPL"); 41 42/* ------------------------------------------------------------------ */ 43 44static unsigned int video_nr[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET }; 45static unsigned int vbi_nr[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET }; 46static unsigned int radio_nr[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET }; 47 48module_param_array(video_nr, int, NULL, 0444); 49module_param_array(vbi_nr, int, NULL, 0444); 50module_param_array(radio_nr, int, NULL, 0444); 51 52MODULE_PARM_DESC(video_nr, "video device numbers"); 53MODULE_PARM_DESC(vbi_nr, "vbi device numbers"); 54MODULE_PARM_DESC(radio_nr, "radio device numbers"); 55 56static unsigned int video_debug; 57module_param(video_debug, int, 0644); 58MODULE_PARM_DESC(video_debug, "enable debug messages [video]"); 59 60static unsigned int irq_debug; 61module_param(irq_debug, int, 0644); 62MODULE_PARM_DESC(irq_debug, "enable debug messages [IRQ handler]"); 63 64static unsigned int vid_limit = 16; 65module_param(vid_limit, int, 0644); 66MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes"); 67 68#define dprintk(level, fmt, arg...)\ 69 do { if (video_debug >= level)\ 70 printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\ 71 } while (0) 72 73/* ------------------------------------------------------------------- */ 74/* static data */ 75 76#define FORMAT_FLAGS_PACKED 0x01 77 78static struct cx23885_fmt formats[] = { 79 { 80 .name = "8 bpp, gray", 81 .fourcc = V4L2_PIX_FMT_GREY, 82 .depth = 8, 83 .flags = FORMAT_FLAGS_PACKED, 84 }, { 85 .name = "15 bpp RGB, le", 86 .fourcc = V4L2_PIX_FMT_RGB555, 87 .depth = 16, 88 .flags = FORMAT_FLAGS_PACKED, 89 }, { 90 .name = "15 bpp RGB, be", 91 .fourcc = V4L2_PIX_FMT_RGB555X, 92 .depth = 16, 93 .flags = FORMAT_FLAGS_PACKED, 94 }, { 95 .name = "16 bpp RGB, le", 96 .fourcc = V4L2_PIX_FMT_RGB565, 97 .depth = 16, 98 .flags = FORMAT_FLAGS_PACKED, 99 }, { 100 .name = "16 bpp RGB, be", 101 .fourcc = V4L2_PIX_FMT_RGB565X, 102 .depth = 16, 103 .flags = FORMAT_FLAGS_PACKED, 104 }, { 105 .name = "24 bpp RGB, le", 106 .fourcc = V4L2_PIX_FMT_BGR24, 107 .depth = 24, 108 .flags = FORMAT_FLAGS_PACKED, 109 }, { 110 .name = "32 bpp RGB, le", 111 .fourcc = V4L2_PIX_FMT_BGR32, 112 .depth = 32, 113 .flags = FORMAT_FLAGS_PACKED, 114 }, { 115 .name = "32 bpp RGB, be", 116 .fourcc = V4L2_PIX_FMT_RGB32, 117 .depth = 32, 118 .flags = FORMAT_FLAGS_PACKED, 119 }, { 120 .name = "4:2:2, packed, YUYV", 121 .fourcc = V4L2_PIX_FMT_YUYV, 122 .depth = 16, 123 .flags = FORMAT_FLAGS_PACKED, 124 }, { 125 .name = "4:2:2, packed, UYVY", 126 .fourcc = V4L2_PIX_FMT_UYVY, 127 .depth = 16, 128 .flags = FORMAT_FLAGS_PACKED, 129 }, 130}; 131 132static struct cx23885_fmt *format_by_fourcc(unsigned int fourcc) 133{ 134 unsigned int i; 135 136 for (i = 0; i < ARRAY_SIZE(formats); i++) 137 if (formats[i].fourcc == fourcc) 138 return formats+i; 139 140 printk(KERN_ERR "%s(0x%08x) NOT FOUND\n", __func__, fourcc); 141 return NULL; 142} 143 144/* ------------------------------------------------------------------- */ 145 146static const struct v4l2_queryctrl no_ctl = { 147 .name = "42", 148 .flags = V4L2_CTRL_FLAG_DISABLED, 149}; 150 151static struct cx23885_ctrl cx23885_ctls[] = { 152 /* --- video --- */ 153 { 154 .v = { 155 .id = V4L2_CID_BRIGHTNESS, 156 .name = "Brightness", 157 .minimum = 0x00, 158 .maximum = 0xff, 159 .step = 1, 160 .default_value = 0x7f, 161 .type = V4L2_CTRL_TYPE_INTEGER, 162 }, 163 .off = 128, 164 .reg = LUMA_CTRL, 165 .mask = 0x00ff, 166 .shift = 0, 167 }, { 168 .v = { 169 .id = V4L2_CID_CONTRAST, 170 .name = "Contrast", 171 .minimum = 0, 172 .maximum = 0xff, 173 .step = 1, 174 .default_value = 0x3f, 175 .type = V4L2_CTRL_TYPE_INTEGER, 176 }, 177 .off = 0, 178 .reg = LUMA_CTRL, 179 .mask = 0xff00, 180 .shift = 8, 181 }, { 182 .v = { 183 .id = V4L2_CID_HUE, 184 .name = "Hue", 185 .minimum = 0, 186 .maximum = 0xff, 187 .step = 1, 188 .default_value = 0x7f, 189 .type = V4L2_CTRL_TYPE_INTEGER, 190 }, 191 .off = 128, 192 .reg = CHROMA_CTRL, 193 .mask = 0xff0000, 194 .shift = 16, 195 }, { 196 /* strictly, this only describes only U saturation. 197 * V saturation is handled specially through code. 198 */ 199 .v = { 200 .id = V4L2_CID_SATURATION, 201 .name = "Saturation", 202 .minimum = 0, 203 .maximum = 0xff, 204 .step = 1, 205 .default_value = 0x7f, 206 .type = V4L2_CTRL_TYPE_INTEGER, 207 }, 208 .off = 0, 209 .reg = CHROMA_CTRL, 210 .mask = 0x00ff, 211 .shift = 0, 212 }, { 213 /* --- audio --- */ 214 .v = { 215 .id = V4L2_CID_AUDIO_MUTE, 216 .name = "Mute", 217 .minimum = 0, 218 .maximum = 1, 219 .default_value = 1, 220 .type = V4L2_CTRL_TYPE_BOOLEAN, 221 }, 222 .reg = PATH1_CTL1, 223 .mask = (0x1f << 24), 224 .shift = 24, 225 }, { 226 .v = { 227 .id = V4L2_CID_AUDIO_VOLUME, 228 .name = "Volume", 229 .minimum = 0, 230 .maximum = 0x3f, 231 .step = 1, 232 .default_value = 0x3f, 233 .type = V4L2_CTRL_TYPE_INTEGER, 234 }, 235 .reg = PATH1_VOL_CTL, 236 .mask = 0xff, 237 .shift = 0, 238 } 239}; 240static const int CX23885_CTLS = ARRAY_SIZE(cx23885_ctls); 241 242/* Must be sorted from low to high control ID! */ 243static const u32 cx23885_user_ctrls[] = { 244 V4L2_CID_USER_CLASS, 245 V4L2_CID_BRIGHTNESS, 246 V4L2_CID_CONTRAST, 247 V4L2_CID_SATURATION, 248 V4L2_CID_HUE, 249 V4L2_CID_AUDIO_VOLUME, 250 V4L2_CID_AUDIO_MUTE, 251 0 252}; 253 254static const u32 *ctrl_classes[] = { 255 cx23885_user_ctrls, 256 NULL 257}; 258 259static void cx23885_video_wakeup(struct cx23885_dev *dev, 260 struct cx23885_dmaqueue *q, u32 count) 261{ 262 struct cx23885_buffer *buf; 263 int bc; 264 265 for (bc = 0;; bc++) { 266 if (list_empty(&q->active)) 267 break; 268 buf = list_entry(q->active.next, 269 struct cx23885_buffer, vb.queue); 270 271 /* count comes from the hw and is is 16bit wide -- 272 * this trick handles wrap-arounds correctly for 273 * up to 32767 buffers in flight... */ 274 if ((s16) (count - buf->count) < 0) 275 break; 276 277 do_gettimeofday(&buf->vb.ts); 278 dprintk(2, "[%p/%d] wakeup reg=%d buf=%d\n", buf, buf->vb.i, 279 count, buf->count); 280 buf->vb.state = VIDEOBUF_DONE; 281 list_del(&buf->vb.queue); 282 wake_up(&buf->vb.done); 283 } 284 if (list_empty(&q->active)) 285 del_timer(&q->timeout); 286 else 287 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 288 if (bc != 1) 289 printk(KERN_ERR "%s: %d buffers handled (should be 1)\n", 290 __func__, bc); 291} 292 293static int cx23885_set_tvnorm(struct cx23885_dev *dev, v4l2_std_id norm) 294{ 295 dprintk(1, "%s(norm = 0x%08x) name: [%s]\n", 296 __func__, 297 (unsigned int)norm, 298 v4l2_norm_to_name(norm)); 299 300 dev->tvnorm = norm; 301 302 call_all(dev, tuner, s_std, norm); 303 304 return 0; 305} 306 307static struct video_device *cx23885_vdev_init(struct cx23885_dev *dev, 308 struct pci_dev *pci, 309 struct video_device *template, 310 char *type) 311{ 312 struct video_device *vfd; 313 dprintk(1, "%s()\n", __func__); 314 315 vfd = video_device_alloc(); 316 if (NULL == vfd) 317 return NULL; 318 *vfd = *template; 319 vfd->minor = -1; 320 vfd->v4l2_dev = &dev->v4l2_dev; 321 vfd->release = video_device_release; 322 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", 323 dev->name, type, cx23885_boards[dev->board].name); 324 return vfd; 325} 326 327static int cx23885_ctrl_query(struct v4l2_queryctrl *qctrl) 328{ 329 int i; 330 331 if (qctrl->id < V4L2_CID_BASE || 332 qctrl->id >= V4L2_CID_LASTP1) 333 return -EINVAL; 334 for (i = 0; i < CX23885_CTLS; i++) 335 if (cx23885_ctls[i].v.id == qctrl->id) 336 break; 337 if (i == CX23885_CTLS) { 338 *qctrl = no_ctl; 339 return 0; 340 } 341 *qctrl = cx23885_ctls[i].v; 342 return 0; 343} 344 345/* ------------------------------------------------------------------- */ 346/* resource management */ 347 348static int res_get(struct cx23885_dev *dev, struct cx23885_fh *fh, 349 unsigned int bit) 350{ 351 dprintk(1, "%s()\n", __func__); 352 if (fh->resources & bit) 353 /* have it already allocated */ 354 return 1; 355 356 /* is it free? */ 357 mutex_lock(&dev->lock); 358 if (dev->resources & bit) { 359 /* no, someone else uses it */ 360 mutex_unlock(&dev->lock); 361 return 0; 362 } 363 /* it's free, grab it */ 364 fh->resources |= bit; 365 dev->resources |= bit; 366 dprintk(1, "res: get %d\n", bit); 367 mutex_unlock(&dev->lock); 368 return 1; 369} 370 371static int res_check(struct cx23885_fh *fh, unsigned int bit) 372{ 373 return fh->resources & bit; 374} 375 376static int res_locked(struct cx23885_dev *dev, unsigned int bit) 377{ 378 return dev->resources & bit; 379} 380 381static void res_free(struct cx23885_dev *dev, struct cx23885_fh *fh, 382 unsigned int bits) 383{ 384 BUG_ON((fh->resources & bits) != bits); 385 dprintk(1, "%s()\n", __func__); 386 387 mutex_lock(&dev->lock); 388 fh->resources &= ~bits; 389 dev->resources &= ~bits; 390 dprintk(1, "res: put %d\n", bits); 391 mutex_unlock(&dev->lock); 392} 393 394static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input) 395{ 396 struct v4l2_routing route; 397 memset(&route, 0, sizeof(route)); 398 399 dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n", 400 __func__, 401 input, INPUT(input)->vmux, 402 INPUT(input)->gpio0, INPUT(input)->gpio1, 403 INPUT(input)->gpio2, INPUT(input)->gpio3); 404 dev->input = input; 405 406 route.input = INPUT(input)->vmux; 407 408 /* Tell the internal A/V decoder */ 409 v4l2_subdev_call(dev->sd_cx25840, video, s_routing, &route); 410 411 return 0; 412} 413 414/* ------------------------------------------------------------------ */ 415static int cx23885_set_scale(struct cx23885_dev *dev, unsigned int width, 416 unsigned int height, enum v4l2_field field) 417{ 418 dprintk(1, "%s()\n", __func__); 419 return 0; 420} 421 422static int cx23885_start_video_dma(struct cx23885_dev *dev, 423 struct cx23885_dmaqueue *q, 424 struct cx23885_buffer *buf) 425{ 426 dprintk(1, "%s()\n", __func__); 427 428 /* setup fifo + format */ 429 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH01], 430 buf->bpl, buf->risc.dma); 431 cx23885_set_scale(dev, buf->vb.width, buf->vb.height, buf->vb.field); 432 433 /* reset counter */ 434 cx_write(VID_A_GPCNT_CTL, 3); 435 q->count = 1; 436 437 /* enable irq */ 438 cx_set(PCI_INT_MSK, cx_read(PCI_INT_MSK) | 0x01); 439 cx_set(VID_A_INT_MSK, 0x000011); 440 441 /* start dma */ 442 cx_set(DEV_CNTRL2, (1<<5)); 443 cx_set(VID_A_DMA_CTL, 0x11); /* FIFO and RISC enable */ 444 445 return 0; 446} 447 448 449static int cx23885_restart_video_queue(struct cx23885_dev *dev, 450 struct cx23885_dmaqueue *q) 451{ 452 struct cx23885_buffer *buf, *prev; 453 struct list_head *item; 454 dprintk(1, "%s()\n", __func__); 455 456 if (!list_empty(&q->active)) { 457 buf = list_entry(q->active.next, struct cx23885_buffer, 458 vb.queue); 459 dprintk(2, "restart_queue [%p/%d]: restart dma\n", 460 buf, buf->vb.i); 461 cx23885_start_video_dma(dev, q, buf); 462 list_for_each(item, &q->active) { 463 buf = list_entry(item, struct cx23885_buffer, 464 vb.queue); 465 buf->count = q->count++; 466 } 467 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 468 return 0; 469 } 470 471 prev = NULL; 472 for (;;) { 473 if (list_empty(&q->queued)) 474 return 0; 475 buf = list_entry(q->queued.next, struct cx23885_buffer, 476 vb.queue); 477 if (NULL == prev) { 478 list_move_tail(&buf->vb.queue, &q->active); 479 cx23885_start_video_dma(dev, q, buf); 480 buf->vb.state = VIDEOBUF_ACTIVE; 481 buf->count = q->count++; 482 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 483 dprintk(2, "[%p/%d] restart_queue - first active\n", 484 buf, buf->vb.i); 485 486 } else if (prev->vb.width == buf->vb.width && 487 prev->vb.height == buf->vb.height && 488 prev->fmt == buf->fmt) { 489 list_move_tail(&buf->vb.queue, &q->active); 490 buf->vb.state = VIDEOBUF_ACTIVE; 491 buf->count = q->count++; 492 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); 493 prev->risc.jmp[2] = cpu_to_le32(0); /* Bits 63 - 32 */ 494 dprintk(2, "[%p/%d] restart_queue - move to active\n", 495 buf, buf->vb.i); 496 } else { 497 return 0; 498 } 499 prev = buf; 500 } 501} 502 503static int buffer_setup(struct videobuf_queue *q, unsigned int *count, 504 unsigned int *size) 505{ 506 struct cx23885_fh *fh = q->priv_data; 507 508 *size = fh->fmt->depth*fh->width*fh->height >> 3; 509 if (0 == *count) 510 *count = 32; 511 while (*size * *count > vid_limit * 1024 * 1024) 512 (*count)--; 513 return 0; 514} 515 516static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, 517 enum v4l2_field field) 518{ 519 struct cx23885_fh *fh = q->priv_data; 520 struct cx23885_dev *dev = fh->dev; 521 struct cx23885_buffer *buf = 522 container_of(vb, struct cx23885_buffer, vb); 523 int rc, init_buffer = 0; 524 u32 line0_offset, line1_offset; 525 struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb); 526 527 BUG_ON(NULL == fh->fmt); 528 if (fh->width < 48 || fh->width > norm_maxw(dev->tvnorm) || 529 fh->height < 32 || fh->height > norm_maxh(dev->tvnorm)) 530 return -EINVAL; 531 buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 3; 532 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size) 533 return -EINVAL; 534 535 if (buf->fmt != fh->fmt || 536 buf->vb.width != fh->width || 537 buf->vb.height != fh->height || 538 buf->vb.field != field) { 539 buf->fmt = fh->fmt; 540 buf->vb.width = fh->width; 541 buf->vb.height = fh->height; 542 buf->vb.field = field; 543 init_buffer = 1; 544 } 545 546 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) { 547 init_buffer = 1; 548 rc = videobuf_iolock(q, &buf->vb, NULL); 549 if (0 != rc) 550 goto fail; 551 } 552 553 if (init_buffer) { 554 buf->bpl = buf->vb.width * buf->fmt->depth >> 3; 555 switch (buf->vb.field) { 556 case V4L2_FIELD_TOP: 557 cx23885_risc_buffer(dev->pci, &buf->risc, 558 dma->sglist, 0, UNSET, 559 buf->bpl, 0, buf->vb.height); 560 break; 561 case V4L2_FIELD_BOTTOM: 562 cx23885_risc_buffer(dev->pci, &buf->risc, 563 dma->sglist, UNSET, 0, 564 buf->bpl, 0, buf->vb.height); 565 break; 566 case V4L2_FIELD_INTERLACED: 567 if (dev->tvnorm & V4L2_STD_NTSC) { 568 /* cx25840 transmits NTSC bottom field first */ 569 dprintk(1, "%s() Creating NTSC risc\n", 570 __func__); 571 line0_offset = buf->bpl; 572 line1_offset = 0; 573 } else { 574 /* All other formats are top field first */ 575 dprintk(1, "%s() Creating PAL/SECAM risc\n", 576 __func__); 577 line0_offset = 0; 578 line1_offset = buf->bpl; 579 } 580 cx23885_risc_buffer(dev->pci, &buf->risc, 581 dma->sglist, line0_offset, 582 line1_offset, 583 buf->bpl, buf->bpl, 584 buf->vb.height >> 1); 585 break; 586 case V4L2_FIELD_SEQ_TB: 587 cx23885_risc_buffer(dev->pci, &buf->risc, 588 dma->sglist, 589 0, buf->bpl * (buf->vb.height >> 1), 590 buf->bpl, 0, 591 buf->vb.height >> 1); 592 break; 593 case V4L2_FIELD_SEQ_BT: 594 cx23885_risc_buffer(dev->pci, &buf->risc, 595 dma->sglist, 596 buf->bpl * (buf->vb.height >> 1), 0, 597 buf->bpl, 0, 598 buf->vb.height >> 1); 599 break; 600 default: 601 BUG(); 602 } 603 } 604 dprintk(2, "[%p/%d] buffer_prep - %dx%d %dbpp \"%s\" - dma=0x%08lx\n", 605 buf, buf->vb.i, 606 fh->width, fh->height, fh->fmt->depth, fh->fmt->name, 607 (unsigned long)buf->risc.dma); 608 609 buf->vb.state = VIDEOBUF_PREPARED; 610 return 0; 611 612 fail: 613 cx23885_free_buffer(q, buf); 614 return rc; 615} 616 617static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb) 618{ 619 struct cx23885_buffer *buf = container_of(vb, 620 struct cx23885_buffer, vb); 621 struct cx23885_buffer *prev; 622 struct cx23885_fh *fh = vq->priv_data; 623 struct cx23885_dev *dev = fh->dev; 624 struct cx23885_dmaqueue *q = &dev->vidq; 625 626 /* add jump to stopper */ 627 buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC); 628 buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma); 629 buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */ 630 631 if (!list_empty(&q->queued)) { 632 list_add_tail(&buf->vb.queue, &q->queued); 633 buf->vb.state = VIDEOBUF_QUEUED; 634 dprintk(2, "[%p/%d] buffer_queue - append to queued\n", 635 buf, buf->vb.i); 636 637 } else if (list_empty(&q->active)) { 638 list_add_tail(&buf->vb.queue, &q->active); 639 cx23885_start_video_dma(dev, q, buf); 640 buf->vb.state = VIDEOBUF_ACTIVE; 641 buf->count = q->count++; 642 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 643 dprintk(2, "[%p/%d] buffer_queue - first active\n", 644 buf, buf->vb.i); 645 646 } else { 647 prev = list_entry(q->active.prev, struct cx23885_buffer, 648 vb.queue); 649 if (prev->vb.width == buf->vb.width && 650 prev->vb.height == buf->vb.height && 651 prev->fmt == buf->fmt) { 652 list_add_tail(&buf->vb.queue, &q->active); 653 buf->vb.state = VIDEOBUF_ACTIVE; 654 buf->count = q->count++; 655 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); 656 /* 64 bit bits 63-32 */ 657 prev->risc.jmp[2] = cpu_to_le32(0); 658 dprintk(2, "[%p/%d] buffer_queue - append to active\n", 659 buf, buf->vb.i); 660 661 } else { 662 list_add_tail(&buf->vb.queue, &q->queued); 663 buf->vb.state = VIDEOBUF_QUEUED; 664 dprintk(2, "[%p/%d] buffer_queue - first queued\n", 665 buf, buf->vb.i); 666 } 667 } 668} 669 670static void buffer_release(struct videobuf_queue *q, 671 struct videobuf_buffer *vb) 672{ 673 struct cx23885_buffer *buf = container_of(vb, 674 struct cx23885_buffer, vb); 675 676 cx23885_free_buffer(q, buf); 677} 678 679static struct videobuf_queue_ops cx23885_video_qops = { 680 .buf_setup = buffer_setup, 681 .buf_prepare = buffer_prepare, 682 .buf_queue = buffer_queue, 683 .buf_release = buffer_release, 684}; 685 686static struct videobuf_queue *get_queue(struct cx23885_fh *fh) 687{ 688 switch (fh->type) { 689 case V4L2_BUF_TYPE_VIDEO_CAPTURE: 690 return &fh->vidq; 691 case V4L2_BUF_TYPE_VBI_CAPTURE: 692 return &fh->vbiq; 693 default: 694 BUG(); 695 return NULL; 696 } 697} 698 699static int get_resource(struct cx23885_fh *fh) 700{ 701 switch (fh->type) { 702 case V4L2_BUF_TYPE_VIDEO_CAPTURE: 703 return RESOURCE_VIDEO; 704 case V4L2_BUF_TYPE_VBI_CAPTURE: 705 return RESOURCE_VBI; 706 default: 707 BUG(); 708 return 0; 709 } 710} 711 712static int video_open(struct file *file) 713{ 714 int minor = video_devdata(file)->minor; 715 struct cx23885_dev *h, *dev = NULL; 716 struct cx23885_fh *fh; 717 struct list_head *list; 718 enum v4l2_buf_type type = 0; 719 int radio = 0; 720 721 lock_kernel(); 722 list_for_each(list, &cx23885_devlist) { 723 h = list_entry(list, struct cx23885_dev, devlist); 724 if (h->video_dev && 725 h->video_dev->minor == minor) { 726 dev = h; 727 type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 728 } 729 if (h->vbi_dev && 730 h->vbi_dev->minor == minor) { 731 dev = h; 732 type = V4L2_BUF_TYPE_VBI_CAPTURE; 733 } 734 if (h->radio_dev && 735 h->radio_dev->minor == minor) { 736 radio = 1; 737 dev = h; 738 } 739 } 740 if (NULL == dev) { 741 unlock_kernel(); 742 return -ENODEV; 743 } 744 745 dprintk(1, "open minor=%d radio=%d type=%s\n", 746 minor, radio, v4l2_type_names[type]); 747 748 /* allocate + initialize per filehandle data */ 749 fh = kzalloc(sizeof(*fh), GFP_KERNEL); 750 if (NULL == fh) { 751 unlock_kernel(); 752 return -ENOMEM; 753 } 754 file->private_data = fh; 755 fh->dev = dev; 756 fh->radio = radio; 757 fh->type = type; 758 fh->width = 320; 759 fh->height = 240; 760 fh->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24); 761 762 videobuf_queue_sg_init(&fh->vidq, &cx23885_video_qops, 763 &dev->pci->dev, &dev->slock, 764 V4L2_BUF_TYPE_VIDEO_CAPTURE, 765 V4L2_FIELD_INTERLACED, 766 sizeof(struct cx23885_buffer), 767 fh); 768 769 dprintk(1, "post videobuf_queue_init()\n"); 770 771 unlock_kernel(); 772 773 return 0; 774} 775 776static ssize_t video_read(struct file *file, char __user *data, 777 size_t count, loff_t *ppos) 778{ 779 struct cx23885_fh *fh = file->private_data; 780 781 switch (fh->type) { 782 case V4L2_BUF_TYPE_VIDEO_CAPTURE: 783 if (res_locked(fh->dev, RESOURCE_VIDEO)) 784 return -EBUSY; 785 return videobuf_read_one(&fh->vidq, data, count, ppos, 786 file->f_flags & O_NONBLOCK); 787 case V4L2_BUF_TYPE_VBI_CAPTURE: 788 if (!res_get(fh->dev, fh, RESOURCE_VBI)) 789 return -EBUSY; 790 return videobuf_read_stream(&fh->vbiq, data, count, ppos, 1, 791 file->f_flags & O_NONBLOCK); 792 default: 793 BUG(); 794 return 0; 795 } 796} 797 798static unsigned int video_poll(struct file *file, 799 struct poll_table_struct *wait) 800{ 801 struct cx23885_fh *fh = file->private_data; 802 struct cx23885_buffer *buf; 803 804 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) { 805 if (!res_get(fh->dev, fh, RESOURCE_VBI)) 806 return POLLERR; 807 return videobuf_poll_stream(file, &fh->vbiq, wait); 808 } 809 810 if (res_check(fh, RESOURCE_VIDEO)) { 811 /* streaming capture */ 812 if (list_empty(&fh->vidq.stream)) 813 return POLLERR; 814 buf = list_entry(fh->vidq.stream.next, 815 struct cx23885_buffer, vb.stream); 816 } else { 817 /* read() capture */ 818 buf = (struct cx23885_buffer *)fh->vidq.read_buf; 819 if (NULL == buf) 820 return POLLERR; 821 } 822 poll_wait(file, &buf->vb.done, wait); 823 if (buf->vb.state == VIDEOBUF_DONE || 824 buf->vb.state == VIDEOBUF_ERROR) 825 return POLLIN|POLLRDNORM; 826 return 0; 827} 828 829static int video_release(struct file *file) 830{ 831 struct cx23885_fh *fh = file->private_data; 832 struct cx23885_dev *dev = fh->dev; 833 834 /* turn off overlay */ 835 if (res_check(fh, RESOURCE_OVERLAY)) { 836 /* FIXME */ 837 res_free(dev, fh, RESOURCE_OVERLAY); 838 } 839 840 /* stop video capture */ 841 if (res_check(fh, RESOURCE_VIDEO)) { 842 videobuf_queue_cancel(&fh->vidq); 843 res_free(dev, fh, RESOURCE_VIDEO); 844 } 845 if (fh->vidq.read_buf) { 846 buffer_release(&fh->vidq, fh->vidq.read_buf); 847 kfree(fh->vidq.read_buf); 848 } 849 850 /* stop vbi capture */ 851 if (res_check(fh, RESOURCE_VBI)) { 852 if (fh->vbiq.streaming) 853 videobuf_streamoff(&fh->vbiq); 854 if (fh->vbiq.reading) 855 videobuf_read_stop(&fh->vbiq); 856 res_free(dev, fh, RESOURCE_VBI); 857 } 858 859 videobuf_mmap_free(&fh->vidq); 860 file->private_data = NULL; 861 kfree(fh); 862 863 /* We are not putting the tuner to sleep here on exit, because 864 * we want to use the mpeg encoder in another session to capture 865 * tuner video. Closing this will result in no video to the encoder. 866 */ 867 868 return 0; 869} 870 871static int video_mmap(struct file *file, struct vm_area_struct *vma) 872{ 873 struct cx23885_fh *fh = file->private_data; 874 875 return videobuf_mmap_mapper(get_queue(fh), vma); 876} 877 878/* ------------------------------------------------------------------ */ 879/* VIDEO CTRL IOCTLS */ 880 881static int cx23885_get_control(struct cx23885_dev *dev, 882 struct v4l2_control *ctl) 883{ 884 dprintk(1, "%s() calling cx25840(VIDIOC_G_CTRL)\n", __func__); 885 call_all(dev, core, g_ctrl, ctl); 886 return 0; 887} 888 889static int cx23885_set_control(struct cx23885_dev *dev, 890 struct v4l2_control *ctl) 891{ 892 dprintk(1, "%s() calling cx25840(VIDIOC_S_CTRL)" 893 " (disabled - no action)\n", __func__); 894 return 0; 895} 896 897static void init_controls(struct cx23885_dev *dev) 898{ 899 struct v4l2_control ctrl; 900 int i; 901 902 for (i = 0; i < CX23885_CTLS; i++) { 903 ctrl.id = cx23885_ctls[i].v.id; 904 ctrl.value = cx23885_ctls[i].v.default_value; 905 906 cx23885_set_control(dev, &ctrl); 907 } 908} 909 910/* ------------------------------------------------------------------ */ 911/* VIDEO IOCTLS */ 912 913static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, 914 struct v4l2_format *f) 915{ 916 struct cx23885_fh *fh = priv; 917 918 f->fmt.pix.width = fh->width; 919 f->fmt.pix.height = fh->height; 920 f->fmt.pix.field = fh->vidq.field; 921 f->fmt.pix.pixelformat = fh->fmt->fourcc; 922 f->fmt.pix.bytesperline = 923 (f->fmt.pix.width * fh->fmt->depth) >> 3; 924 f->fmt.pix.sizeimage = 925 f->fmt.pix.height * f->fmt.pix.bytesperline; 926 927 return 0; 928} 929 930static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, 931 struct v4l2_format *f) 932{ 933 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 934 struct cx23885_fmt *fmt; 935 enum v4l2_field field; 936 unsigned int maxw, maxh; 937 938 fmt = format_by_fourcc(f->fmt.pix.pixelformat); 939 if (NULL == fmt) 940 return -EINVAL; 941 942 field = f->fmt.pix.field; 943 maxw = norm_maxw(dev->tvnorm); 944 maxh = norm_maxh(dev->tvnorm); 945 946 if (V4L2_FIELD_ANY == field) { 947 field = (f->fmt.pix.height > maxh/2) 948 ? V4L2_FIELD_INTERLACED 949 : V4L2_FIELD_BOTTOM; 950 } 951 952 switch (field) { 953 case V4L2_FIELD_TOP: 954 case V4L2_FIELD_BOTTOM: 955 maxh = maxh / 2; 956 break; 957 case V4L2_FIELD_INTERLACED: 958 break; 959 default: 960 return -EINVAL; 961 } 962 963 f->fmt.pix.field = field; 964 if (f->fmt.pix.height < 32) 965 f->fmt.pix.height = 32; 966 if (f->fmt.pix.height > maxh) 967 f->fmt.pix.height = maxh; 968 if (f->fmt.pix.width < 48) 969 f->fmt.pix.width = 48; 970 if (f->fmt.pix.width > maxw) 971 f->fmt.pix.width = maxw; 972 f->fmt.pix.width &= ~0x03; 973 f->fmt.pix.bytesperline = 974 (f->fmt.pix.width * fmt->depth) >> 3; 975 f->fmt.pix.sizeimage = 976 f->fmt.pix.height * f->fmt.pix.bytesperline; 977 978 return 0; 979} 980 981static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, 982 struct v4l2_format *f) 983{ 984 struct cx23885_fh *fh = priv; 985 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 986 int err; 987 988 dprintk(2, "%s()\n", __func__); 989 err = vidioc_try_fmt_vid_cap(file, priv, f); 990 991 if (0 != err) 992 return err; 993 fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); 994 fh->width = f->fmt.pix.width; 995 fh->height = f->fmt.pix.height; 996 fh->vidq.field = f->fmt.pix.field; 997 dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, 998 fh->width, fh->height, fh->vidq.field); 999 call_all(dev, video, s_fmt, f); 1000 return 0; 1001} 1002 1003static int vidioc_querycap(struct file *file, void *priv, 1004 struct v4l2_capability *cap) 1005{ 1006 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1007 1008 strcpy(cap->driver, "cx23885"); 1009 strlcpy(cap->card, cx23885_boards[dev->board].name, 1010 sizeof(cap->card)); 1011 sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci)); 1012 cap->version = CX23885_VERSION_CODE; 1013 cap->capabilities = 1014 V4L2_CAP_VIDEO_CAPTURE | 1015 V4L2_CAP_READWRITE | 1016 V4L2_CAP_STREAMING | 1017 V4L2_CAP_VBI_CAPTURE; 1018 if (UNSET != dev->tuner_type) 1019 cap->capabilities |= V4L2_CAP_TUNER; 1020 return 0; 1021} 1022 1023static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, 1024 struct v4l2_fmtdesc *f) 1025{ 1026 if (unlikely(f->index >= ARRAY_SIZE(formats))) 1027 return -EINVAL; 1028 1029 strlcpy(f->description, formats[f->index].name, 1030 sizeof(f->description)); 1031 f->pixelformat = formats[f->index].fourcc; 1032 1033 return 0; 1034} 1035 1036#ifdef CONFIG_VIDEO_V4L1_COMPAT 1037static int vidiocgmbuf(struct file *file, void *priv, 1038 struct video_mbuf *mbuf) 1039{ 1040 struct cx23885_fh *fh = priv; 1041 struct videobuf_queue *q; 1042 struct v4l2_requestbuffers req; 1043 unsigned int i; 1044 int err; 1045 1046 q = get_queue(fh); 1047 memset(&req, 0, sizeof(req)); 1048 req.type = q->type; 1049 req.count = 8; 1050 req.memory = V4L2_MEMORY_MMAP; 1051 err = videobuf_reqbufs(q, &req); 1052 if (err < 0) 1053 return err; 1054 1055 mbuf->frames = req.count; 1056 mbuf->size = 0; 1057 for (i = 0; i < mbuf->frames; i++) { 1058 mbuf->offsets[i] = q->bufs[i]->boff; 1059 mbuf->size += q->bufs[i]->bsize; 1060 } 1061 return 0; 1062} 1063#endif 1064 1065static int vidioc_reqbufs(struct file *file, void *priv, 1066 struct v4l2_requestbuffers *p) 1067{ 1068 struct cx23885_fh *fh = priv; 1069 return videobuf_reqbufs(get_queue(fh), p); 1070} 1071 1072static int vidioc_querybuf(struct file *file, void *priv, 1073 struct v4l2_buffer *p) 1074{ 1075 struct cx23885_fh *fh = priv; 1076 return videobuf_querybuf(get_queue(fh), p); 1077} 1078 1079static int vidioc_qbuf(struct file *file, void *priv, 1080 struct v4l2_buffer *p) 1081{ 1082 struct cx23885_fh *fh = priv; 1083 return videobuf_qbuf(get_queue(fh), p); 1084} 1085 1086static int vidioc_dqbuf(struct file *file, void *priv, 1087 struct v4l2_buffer *p) 1088{ 1089 struct cx23885_fh *fh = priv; 1090 return videobuf_dqbuf(get_queue(fh), p, 1091 file->f_flags & O_NONBLOCK); 1092} 1093 1094static int vidioc_streamon(struct file *file, void *priv, 1095 enum v4l2_buf_type i) 1096{ 1097 struct cx23885_fh *fh = priv; 1098 struct cx23885_dev *dev = fh->dev; 1099 dprintk(1, "%s()\n", __func__); 1100 1101 if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)) 1102 return -EINVAL; 1103 if (unlikely(i != fh->type)) 1104 return -EINVAL; 1105 1106 if (unlikely(!res_get(dev, fh, get_resource(fh)))) 1107 return -EBUSY; 1108 return videobuf_streamon(get_queue(fh)); 1109} 1110 1111static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i) 1112{ 1113 struct cx23885_fh *fh = priv; 1114 struct cx23885_dev *dev = fh->dev; 1115 int err, res; 1116 dprintk(1, "%s()\n", __func__); 1117 1118 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 1119 return -EINVAL; 1120 if (i != fh->type) 1121 return -EINVAL; 1122 1123 res = get_resource(fh); 1124 err = videobuf_streamoff(get_queue(fh)); 1125 if (err < 0) 1126 return err; 1127 res_free(dev, fh, res); 1128 return 0; 1129} 1130 1131static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *tvnorms) 1132{ 1133 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1134 dprintk(1, "%s()\n", __func__); 1135 1136 mutex_lock(&dev->lock); 1137 cx23885_set_tvnorm(dev, *tvnorms); 1138 mutex_unlock(&dev->lock); 1139 1140 return 0; 1141} 1142 1143static int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i) 1144{ 1145 static const char *iname[] = { 1146 [CX23885_VMUX_COMPOSITE1] = "Composite1", 1147 [CX23885_VMUX_COMPOSITE2] = "Composite2", 1148 [CX23885_VMUX_COMPOSITE3] = "Composite3", 1149 [CX23885_VMUX_COMPOSITE4] = "Composite4", 1150 [CX23885_VMUX_SVIDEO] = "S-Video", 1151 [CX23885_VMUX_TELEVISION] = "Television", 1152 [CX23885_VMUX_CABLE] = "Cable TV", 1153 [CX23885_VMUX_DVB] = "DVB", 1154 [CX23885_VMUX_DEBUG] = "for debug only", 1155 }; 1156 unsigned int n; 1157 dprintk(1, "%s()\n", __func__); 1158 1159 n = i->index; 1160 if (n >= 4) 1161 return -EINVAL; 1162 1163 if (0 == INPUT(n)->type) 1164 return -EINVAL; 1165 1166 memset(i, 0, sizeof(*i)); 1167 i->index = n; 1168 i->type = V4L2_INPUT_TYPE_CAMERA; 1169 strcpy(i->name, iname[INPUT(n)->type]); 1170 if ((CX23885_VMUX_TELEVISION == INPUT(n)->type) || 1171 (CX23885_VMUX_CABLE == INPUT(n)->type)) 1172 i->type = V4L2_INPUT_TYPE_TUNER; 1173 i->std = CX23885_NORMS; 1174 return 0; 1175} 1176 1177static int vidioc_enum_input(struct file *file, void *priv, 1178 struct v4l2_input *i) 1179{ 1180 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1181 dprintk(1, "%s()\n", __func__); 1182 return cx23885_enum_input(dev, i); 1183} 1184 1185static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) 1186{ 1187 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1188 1189 *i = dev->input; 1190 dprintk(1, "%s() returns %d\n", __func__, *i); 1191 return 0; 1192} 1193 1194static int vidioc_s_input(struct file *file, void *priv, unsigned int i) 1195{ 1196 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1197 1198 dprintk(1, "%s(%d)\n", __func__, i); 1199 1200 if (i >= 4) { 1201 dprintk(1, "%s() -EINVAL\n", __func__); 1202 return -EINVAL; 1203 } 1204 1205 mutex_lock(&dev->lock); 1206 cx23885_video_mux(dev, i); 1207 mutex_unlock(&dev->lock); 1208 return 0; 1209} 1210 1211static int vidioc_queryctrl(struct file *file, void *priv, 1212 struct v4l2_queryctrl *qctrl) 1213{ 1214 qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); 1215 if (unlikely(qctrl->id == 0)) 1216 return -EINVAL; 1217 return cx23885_ctrl_query(qctrl); 1218} 1219 1220static int vidioc_g_ctrl(struct file *file, void *priv, 1221 struct v4l2_control *ctl) 1222{ 1223 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1224 1225 return cx23885_get_control(dev, ctl); 1226} 1227 1228static int vidioc_s_ctrl(struct file *file, void *priv, 1229 struct v4l2_control *ctl) 1230{ 1231 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1232 1233 return cx23885_set_control(dev, ctl); 1234} 1235 1236static int vidioc_g_tuner(struct file *file, void *priv, 1237 struct v4l2_tuner *t) 1238{ 1239 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1240 1241 if (unlikely(UNSET == dev->tuner_type)) 1242 return -EINVAL; 1243 if (0 != t->index) 1244 return -EINVAL; 1245 1246 strcpy(t->name, "Television"); 1247 t->type = V4L2_TUNER_ANALOG_TV; 1248 t->capability = V4L2_TUNER_CAP_NORM; 1249 t->rangehigh = 0xffffffffUL; 1250 t->signal = 0xffff ; /* LOCKED */ 1251 return 0; 1252} 1253 1254static int vidioc_s_tuner(struct file *file, void *priv, 1255 struct v4l2_tuner *t) 1256{ 1257 struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev; 1258 1259 if (UNSET == dev->tuner_type) 1260 return -EINVAL; 1261 if (0 != t->index) 1262 return -EINVAL; 1263 return 0; 1264} 1265 1266static int vidioc_g_frequency(struct file *file, void *priv, 1267 struct v4l2_frequency *f) 1268{ 1269 struct cx23885_fh *fh = priv; 1270 struct cx23885_dev *dev = fh->dev; 1271 1272 if (unlikely(UNSET == dev->tuner_type)) 1273 return -EINVAL; 1274 1275 /* f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; */ 1276 f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 1277 f->frequency = dev->freq; 1278 1279 call_all(dev, tuner, g_frequency, f); 1280 1281 return 0; 1282} 1283 1284static int cx23885_set_freq(struct cx23885_dev *dev, struct v4l2_frequency *f) 1285{ 1286 if (unlikely(UNSET == dev->tuner_type)) 1287 return -EINVAL; 1288 if (unlikely(f->tuner != 0)) 1289 return -EINVAL; 1290 1291 mutex_lock(&dev->lock); 1292 dev->freq = f->frequency; 1293 1294 call_all(dev, tuner, s_frequency, f); 1295 1296 /* When changing channels it is required to reset TVAUDIO */ 1297 msleep(10); 1298 1299 mutex_unlock(&dev->lock); 1300 1301 return 0; 1302} 1303 1304static int vidioc_s_frequency(struct file *file, void *priv, 1305 struct v4l2_frequency *f) 1306{ 1307 struct cx23885_fh *fh = priv; 1308 struct cx23885_dev *dev = fh->dev; 1309 1310 if (unlikely(0 == fh->radio && f->type != V4L2_TUNER_ANALOG_TV)) 1311 return -EINVAL; 1312 if (unlikely(1 == fh->radio && f->type != V4L2_TUNER_RADIO)) 1313 return -EINVAL; 1314 1315 return 1316 cx23885_set_freq(dev, f); 1317} 1318 1319#ifdef CONFIG_VIDEO_ADV_DEBUG 1320static int vidioc_g_register(struct file *file, void *fh, 1321 struct v4l2_dbg_register *reg) 1322{ 1323 struct cx23885_dev *dev = ((struct cx23885_fh *)fh)->dev; 1324 1325 if (!v4l2_chip_match_host(®->match)) 1326 return -EINVAL; 1327 1328 call_all(dev, core, g_register, reg); 1329 1330 return 0; 1331} 1332 1333static int vidioc_s_register(struct file *file, void *fh, 1334 struct v4l2_dbg_register *reg) 1335{ 1336 struct cx23885_dev *dev = ((struct cx23885_fh *)fh)->dev; 1337 1338 if (!v4l2_chip_match_host(®->match)) 1339 return -EINVAL; 1340 1341 call_all(dev, core, s_register, reg); 1342 1343 return 0; 1344} 1345#endif 1346 1347/* ----------------------------------------------------------- */ 1348 1349static void cx23885_vid_timeout(unsigned long data) 1350{ 1351 struct cx23885_dev *dev = (struct cx23885_dev *)data; 1352 struct cx23885_dmaqueue *q = &dev->vidq; 1353 struct cx23885_buffer *buf; 1354 unsigned long flags; 1355 1356 cx23885_sram_channel_dump(dev, &dev->sram_channels[SRAM_CH01]); 1357 1358 cx_clear(VID_A_DMA_CTL, 0x11); 1359 1360 spin_lock_irqsave(&dev->slock, flags); 1361 while (!list_empty(&q->active)) { 1362 buf = list_entry(q->active.next, 1363 struct cx23885_buffer, vb.queue); 1364 list_del(&buf->vb.queue); 1365 buf->vb.state = VIDEOBUF_ERROR; 1366 wake_up(&buf->vb.done); 1367 printk(KERN_ERR "%s/0: [%p/%d] timeout - dma=0x%08lx\n", 1368 dev->name, buf, buf->vb.i, 1369 (unsigned long)buf->risc.dma); 1370 } 1371 cx23885_restart_video_queue(dev, q); 1372 spin_unlock_irqrestore(&dev->slock, flags); 1373} 1374 1375int cx23885_video_irq(struct cx23885_dev *dev, u32 status) 1376{ 1377 u32 mask, count; 1378 int handled = 0; 1379 1380 mask = cx_read(VID_A_INT_MSK); 1381 if (0 == (status & mask)) 1382 return handled; 1383 cx_write(VID_A_INT_STAT, status); 1384 1385 dprintk(2, "%s() status = 0x%08x\n", __func__, status); 1386 /* risc op code error */ 1387 if (status & (1 << 16)) { 1388 printk(KERN_WARNING "%s/0: video risc op code error\n", 1389 dev->name); 1390 cx_clear(VID_A_DMA_CTL, 0x11); 1391 cx23885_sram_channel_dump(dev, &dev->sram_channels[SRAM_CH01]); 1392 } 1393 1394 /* risc1 y */ 1395 if (status & 0x01) { 1396 spin_lock(&dev->slock); 1397 count = cx_read(VID_A_GPCNT); 1398 cx23885_video_wakeup(dev, &dev->vidq, count); 1399 spin_unlock(&dev->slock); 1400 handled++; 1401 } 1402 /* risc2 y */ 1403 if (status & 0x10) { 1404 dprintk(2, "stopper video\n"); 1405 spin_lock(&dev->slock); 1406 cx23885_restart_video_queue(dev, &dev->vidq); 1407 spin_unlock(&dev->slock); 1408 handled++; 1409 } 1410 1411 return handled; 1412} 1413 1414/* ----------------------------------------------------------- */ 1415/* exported stuff */ 1416 1417static const struct v4l2_file_operations video_fops = { 1418 .owner = THIS_MODULE, 1419 .open = video_open, 1420 .release = video_release, 1421 .read = video_read, 1422 .poll = video_poll, 1423 .mmap = video_mmap, 1424 .ioctl = video_ioctl2, 1425}; 1426 1427static const struct v4l2_ioctl_ops video_ioctl_ops = { 1428 .vidioc_querycap = vidioc_querycap, 1429 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, 1430 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, 1431 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, 1432 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, 1433 .vidioc_g_fmt_vbi_cap = cx23885_vbi_fmt, 1434 .vidioc_try_fmt_vbi_cap = cx23885_vbi_fmt, 1435 .vidioc_s_fmt_vbi_cap = cx23885_vbi_fmt, 1436 .vidioc_reqbufs = vidioc_reqbufs, 1437 .vidioc_querybuf = vidioc_querybuf, 1438 .vidioc_qbuf = vidioc_qbuf, 1439 .vidioc_dqbuf = vidioc_dqbuf, 1440 .vidioc_s_std = vidioc_s_std, 1441 .vidioc_enum_input = vidioc_enum_input, 1442 .vidioc_g_input = vidioc_g_input, 1443 .vidioc_s_input = vidioc_s_input, 1444 .vidioc_queryctrl = vidioc_queryctrl, 1445 .vidioc_g_ctrl = vidioc_g_ctrl, 1446 .vidioc_s_ctrl = vidioc_s_ctrl, 1447 .vidioc_streamon = vidioc_streamon, 1448 .vidioc_streamoff = vidioc_streamoff, 1449#ifdef CONFIG_VIDEO_V4L1_COMPAT 1450 .vidiocgmbuf = vidiocgmbuf, 1451#endif 1452 .vidioc_g_tuner = vidioc_g_tuner, 1453 .vidioc_s_tuner = vidioc_s_tuner, 1454 .vidioc_g_frequency = vidioc_g_frequency, 1455 .vidioc_s_frequency = vidioc_s_frequency, 1456#ifdef CONFIG_VIDEO_ADV_DEBUG 1457 .vidioc_g_register = vidioc_g_register, 1458 .vidioc_s_register = vidioc_s_register, 1459#endif 1460}; 1461 1462static struct video_device cx23885_vbi_template; 1463static struct video_device cx23885_video_template = { 1464 .name = "cx23885-video", 1465 .fops = &video_fops, 1466 .minor = -1, 1467 .ioctl_ops = &video_ioctl_ops, 1468 .tvnorms = CX23885_NORMS, 1469 .current_norm = V4L2_STD_NTSC_M, 1470}; 1471 1472static const struct v4l2_file_operations radio_fops = { 1473 .owner = THIS_MODULE, 1474 .open = video_open, 1475 .release = video_release, 1476 .ioctl = video_ioctl2, 1477}; 1478 1479 1480void cx23885_video_unregister(struct cx23885_dev *dev) 1481{ 1482 dprintk(1, "%s()\n", __func__); 1483 cx_clear(PCI_INT_MSK, 1); 1484 1485 if (dev->video_dev) { 1486 if (-1 != dev->video_dev->minor) 1487 video_unregister_device(dev->video_dev); 1488 else 1489 video_device_release(dev->video_dev); 1490 dev->video_dev = NULL; 1491 1492 btcx_riscmem_free(dev->pci, &dev->vidq.stopper); 1493 } 1494} 1495 1496int cx23885_video_register(struct cx23885_dev *dev) 1497{ 1498 int err; 1499 1500 dprintk(1, "%s()\n", __func__); 1501 spin_lock_init(&dev->slock); 1502 1503 /* Initialize VBI template */ 1504 memcpy(&cx23885_vbi_template, &cx23885_video_template, 1505 sizeof(cx23885_vbi_template)); 1506 strcpy(cx23885_vbi_template.name, "cx23885-vbi"); 1507 1508 dev->tvnorm = cx23885_video_template.current_norm; 1509 1510 /* init video dma queues */ 1511 INIT_LIST_HEAD(&dev->vidq.active); 1512 INIT_LIST_HEAD(&dev->vidq.queued); 1513 dev->vidq.timeout.function = cx23885_vid_timeout; 1514 dev->vidq.timeout.data = (unsigned long)dev; 1515 init_timer(&dev->vidq.timeout); 1516 cx23885_risc_stopper(dev->pci, &dev->vidq.stopper, 1517 VID_A_DMA_CTL, 0x11, 0x00); 1518 1519 /* Don't enable VBI yet */ 1520 cx_set(PCI_INT_MSK, 1); 1521 1522 if (TUNER_ABSENT != dev->tuner_type) { 1523 struct v4l2_subdev *sd = NULL; 1524 1525 if (dev->tuner_addr) 1526 sd = v4l2_i2c_new_subdev(&dev->i2c_bus[1].i2c_adap, 1527 "tuner", "tuner", dev->tuner_addr); 1528 else 1529 sd = v4l2_i2c_new_probed_subdev(&dev->i2c_bus[1].i2c_adap, 1530 "tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_TV)); 1531 if (sd) { 1532 struct tuner_setup tun_setup; 1533 1534 tun_setup.mode_mask = T_ANALOG_TV; 1535 tun_setup.type = dev->tuner_type; 1536 tun_setup.addr = v4l2_i2c_subdev_addr(sd); 1537 1538 v4l2_subdev_call(sd, tuner, s_type_addr, &tun_setup); 1539 } 1540 } 1541 1542 1543 /* register v4l devices */ 1544 dev->video_dev = cx23885_vdev_init(dev, dev->pci, 1545 &cx23885_video_template, "video"); 1546 err = video_register_device(dev->video_dev, VFL_TYPE_GRABBER, 1547 video_nr[dev->nr]); 1548 if (err < 0) { 1549 printk(KERN_INFO "%s: can't register video device\n", 1550 dev->name); 1551 goto fail_unreg; 1552 } 1553 printk(KERN_INFO "%s/0: registered device video%d [v4l2]\n", 1554 dev->name, dev->video_dev->num); 1555 /* initial device configuration */ 1556 mutex_lock(&dev->lock); 1557 cx23885_set_tvnorm(dev, dev->tvnorm); 1558 init_controls(dev); 1559 cx23885_video_mux(dev, 0); 1560 mutex_unlock(&dev->lock); 1561 1562 return 0; 1563 1564fail_unreg: 1565 cx23885_video_unregister(dev); 1566 return err; 1567} 1568 1569