1/* 2 * 3 * Support for the mpeg transport stream transfers 4 * PCI function #2 of the cx2388x. 5 * 6 * (c) 2004 Jelle Foks <jelle@foks.us> 7 * (c) 2004 Chris Pascoe <c.pascoe@itee.uq.edu.au> 8 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25#include <linux/module.h> 26#include <linux/slab.h> 27#include <linux/init.h> 28#include <linux/device.h> 29#include <linux/dma-mapping.h> 30#include <linux/interrupt.h> 31#include <asm/delay.h> 32 33#include "cx88.h" 34 35/* ------------------------------------------------------------------ */ 36 37MODULE_DESCRIPTION("mpeg driver for cx2388x based TV cards"); 38MODULE_AUTHOR("Jelle Foks <jelle@foks.us>"); 39MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); 40MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); 41MODULE_LICENSE("GPL"); 42MODULE_VERSION(CX88_VERSION); 43 44static unsigned int debug; 45module_param(debug,int,0644); 46MODULE_PARM_DESC(debug,"enable debug messages [mpeg]"); 47 48#define dprintk(level, fmt, arg...) do { \ 49 if (debug + 1 > level) \ 50 printk(KERN_DEBUG "%s/2-mpeg: " fmt, dev->core->name, ## arg); \ 51} while(0) 52 53#define mpeg_dbg(level, fmt, arg...) do { \ 54 if (debug + 1 > level) \ 55 printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg); \ 56} while(0) 57 58#if defined(CONFIG_MODULES) && defined(MODULE) 59static void request_module_async(struct work_struct *work) 60{ 61 struct cx8802_dev *dev=container_of(work, struct cx8802_dev, request_module_wk); 62 63 if (dev->core->board.mpeg & CX88_MPEG_DVB) 64 request_module("cx88-dvb"); 65 if (dev->core->board.mpeg & CX88_MPEG_BLACKBIRD) 66 request_module("cx88-blackbird"); 67} 68 69static void request_modules(struct cx8802_dev *dev) 70{ 71 INIT_WORK(&dev->request_module_wk, request_module_async); 72 schedule_work(&dev->request_module_wk); 73} 74 75static void flush_request_modules(struct cx8802_dev *dev) 76{ 77 flush_work(&dev->request_module_wk); 78} 79#else 80#define request_modules(dev) 81#define flush_request_modules(dev) 82#endif /* CONFIG_MODULES */ 83 84 85static LIST_HEAD(cx8802_devlist); 86static DEFINE_MUTEX(cx8802_mutex); 87/* ------------------------------------------------------------------ */ 88 89static int cx8802_start_dma(struct cx8802_dev *dev, 90 struct cx88_dmaqueue *q, 91 struct cx88_buffer *buf) 92{ 93 struct cx88_core *core = dev->core; 94 95 dprintk(1, "cx8802_start_dma w: %d, h: %d, f: %d\n", 96 buf->vb.width, buf->vb.height, buf->vb.field); 97 98 /* setup fifo + format */ 99 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28], 100 dev->ts_packet_size, buf->risc.dma); 101 102 /* write TS length to chip */ 103 cx_write(MO_TS_LNGTH, buf->vb.width); 104 105 /* FIXME: this needs a review. 106 * also: move to cx88-blackbird + cx88-dvb source files? */ 107 108 dprintk( 1, "core->active_type_id = 0x%08x\n", core->active_type_id); 109 110 if ( (core->active_type_id == CX88_MPEG_DVB) && 111 (core->board.mpeg & CX88_MPEG_DVB) ) { 112 113 dprintk( 1, "cx8802_start_dma doing .dvb\n"); 114 /* negedge driven & software reset */ 115 cx_write(TS_GEN_CNTRL, 0x0040 | dev->ts_gen_cntrl); 116 udelay(100); 117 cx_write(MO_PINMUX_IO, 0x00); 118 cx_write(TS_HW_SOP_CNTRL, 0x47<<16|188<<4|0x01); 119 switch (core->boardnr) { 120 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: 121 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T: 122 case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD: 123 case CX88_BOARD_PCHDTV_HD5500: 124 cx_write(TS_SOP_STAT, 1<<13); 125 break; 126 case CX88_BOARD_SAMSUNG_SMT_7020: 127 cx_write(TS_SOP_STAT, 0x00); 128 break; 129 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: 130 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: 131 cx_write(MO_PINMUX_IO, 0x88); /* Enable MPEG parallel IO and video signal pins */ 132 udelay(100); 133 break; 134 case CX88_BOARD_HAUPPAUGE_HVR1300: 135 /* Enable MPEG parallel IO and video signal pins */ 136 cx_write(MO_PINMUX_IO, 0x88); 137 cx_write(TS_SOP_STAT, 0); 138 cx_write(TS_VALERR_CNTRL, 0); 139 break; 140 case CX88_BOARD_PINNACLE_PCTV_HD_800i: 141 /* Enable MPEG parallel IO and video signal pins */ 142 cx_write(MO_PINMUX_IO, 0x88); 143 cx_write(TS_HW_SOP_CNTRL, (0x47 << 16) | (188 << 4)); 144 dev->ts_gen_cntrl = 5; 145 cx_write(TS_SOP_STAT, 0); 146 cx_write(TS_VALERR_CNTRL, 0); 147 udelay(100); 148 break; 149 default: 150 cx_write(TS_SOP_STAT, 0x00); 151 break; 152 } 153 cx_write(TS_GEN_CNTRL, dev->ts_gen_cntrl); 154 udelay(100); 155 } else if ( (core->active_type_id == CX88_MPEG_BLACKBIRD) && 156 (core->board.mpeg & CX88_MPEG_BLACKBIRD) ) { 157 dprintk( 1, "cx8802_start_dma doing .blackbird\n"); 158 cx_write(MO_PINMUX_IO, 0x88); /* enable MPEG parallel IO */ 159 160 cx_write(TS_GEN_CNTRL, 0x46); /* punctured clock TS & posedge driven & software reset */ 161 udelay(100); 162 163 cx_write(TS_HW_SOP_CNTRL, 0x408); /* mpeg start byte */ 164 cx_write(TS_VALERR_CNTRL, 0x2000); 165 166 cx_write(TS_GEN_CNTRL, 0x06); /* punctured clock TS & posedge driven */ 167 udelay(100); 168 } else { 169 printk( "%s() Failed. Unsupported value in .mpeg (0x%08x)\n", __func__, 170 core->board.mpeg ); 171 return -EINVAL; 172 } 173 174 /* reset counter */ 175 cx_write(MO_TS_GPCNTRL, GP_COUNT_CONTROL_RESET); 176 q->count = 1; 177 178 /* enable irqs */ 179 dprintk( 1, "setting the interrupt mask\n" ); 180 cx_set(MO_PCI_INTMSK, core->pci_irqmask | PCI_INT_TSINT); 181 cx_set(MO_TS_INTMSK, 0x1f0011); 182 183 /* start dma */ 184 cx_set(MO_DEV_CNTRL2, (1<<5)); 185 cx_set(MO_TS_DMACNTRL, 0x11); 186 return 0; 187} 188 189static int cx8802_stop_dma(struct cx8802_dev *dev) 190{ 191 struct cx88_core *core = dev->core; 192 dprintk( 1, "cx8802_stop_dma\n" ); 193 194 /* stop dma */ 195 cx_clear(MO_TS_DMACNTRL, 0x11); 196 197 /* disable irqs */ 198 cx_clear(MO_PCI_INTMSK, PCI_INT_TSINT); 199 cx_clear(MO_TS_INTMSK, 0x1f0011); 200 201 /* Reset the controller */ 202 cx_write(TS_GEN_CNTRL, 0xcd); 203 return 0; 204} 205 206static int cx8802_restart_queue(struct cx8802_dev *dev, 207 struct cx88_dmaqueue *q) 208{ 209 struct cx88_buffer *buf; 210 211 dprintk( 1, "cx8802_restart_queue\n" ); 212 if (list_empty(&q->active)) 213 { 214 struct cx88_buffer *prev; 215 prev = NULL; 216 217 dprintk(1, "cx8802_restart_queue: queue is empty\n" ); 218 219 for (;;) { 220 if (list_empty(&q->queued)) 221 return 0; 222 buf = list_entry(q->queued.next, struct cx88_buffer, vb.queue); 223 if (NULL == prev) { 224 list_move_tail(&buf->vb.queue, &q->active); 225 cx8802_start_dma(dev, q, buf); 226 buf->vb.state = VIDEOBUF_ACTIVE; 227 buf->count = q->count++; 228 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 229 dprintk(1,"[%p/%d] restart_queue - first active\n", 230 buf,buf->vb.i); 231 232 } else if (prev->vb.width == buf->vb.width && 233 prev->vb.height == buf->vb.height && 234 prev->fmt == buf->fmt) { 235 list_move_tail(&buf->vb.queue, &q->active); 236 buf->vb.state = VIDEOBUF_ACTIVE; 237 buf->count = q->count++; 238 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); 239 dprintk(1,"[%p/%d] restart_queue - move to active\n", 240 buf,buf->vb.i); 241 } else { 242 return 0; 243 } 244 prev = buf; 245 } 246 return 0; 247 } 248 249 buf = list_entry(q->active.next, struct cx88_buffer, vb.queue); 250 dprintk(2,"restart_queue [%p/%d]: restart dma\n", 251 buf, buf->vb.i); 252 cx8802_start_dma(dev, q, buf); 253 list_for_each_entry(buf, &q->active, vb.queue) 254 buf->count = q->count++; 255 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); 256 return 0; 257} 258 259/* ------------------------------------------------------------------ */ 260 261int cx8802_buf_prepare(struct videobuf_queue *q, struct cx8802_dev *dev, 262 struct cx88_buffer *buf, enum v4l2_field field) 263{ 264 int size = dev->ts_packet_size * dev->ts_packet_count; 265 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb); 266 int rc; 267 268 dprintk(1, "%s: %p\n", __func__, buf); 269 if (0 != buf->vb.baddr && buf->vb.bsize < size) 270 return -EINVAL; 271 272 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) { 273 buf->vb.width = dev->ts_packet_size; 274 buf->vb.height = dev->ts_packet_count; 275 buf->vb.size = size; 276 buf->vb.field = field /*V4L2_FIELD_TOP*/; 277 278 if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL))) 279 goto fail; 280 cx88_risc_databuffer(dev->pci, &buf->risc, 281 dma->sglist, 282 buf->vb.width, buf->vb.height, 0); 283 } 284 buf->vb.state = VIDEOBUF_PREPARED; 285 return 0; 286 287 fail: 288 cx88_free_buffer(q,buf); 289 return rc; 290} 291 292void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf) 293{ 294 struct cx88_buffer *prev; 295 struct cx88_dmaqueue *cx88q = &dev->mpegq; 296 297 dprintk( 1, "cx8802_buf_queue\n" ); 298 /* add jump to stopper */ 299 buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC); 300 buf->risc.jmp[1] = cpu_to_le32(cx88q->stopper.dma); 301 302 if (list_empty(&cx88q->active)) { 303 dprintk( 1, "queue is empty - first active\n" ); 304 list_add_tail(&buf->vb.queue,&cx88q->active); 305 cx8802_start_dma(dev, cx88q, buf); 306 buf->vb.state = VIDEOBUF_ACTIVE; 307 buf->count = cx88q->count++; 308 mod_timer(&cx88q->timeout, jiffies+BUFFER_TIMEOUT); 309 dprintk(1,"[%p/%d] %s - first active\n", 310 buf, buf->vb.i, __func__); 311 312 } else { 313 dprintk( 1, "queue is not empty - append to active\n" ); 314 prev = list_entry(cx88q->active.prev, struct cx88_buffer, vb.queue); 315 list_add_tail(&buf->vb.queue,&cx88q->active); 316 buf->vb.state = VIDEOBUF_ACTIVE; 317 buf->count = cx88q->count++; 318 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); 319 dprintk( 1, "[%p/%d] %s - append to active\n", 320 buf, buf->vb.i, __func__); 321 } 322} 323 324/* ----------------------------------------------------------- */ 325 326static void do_cancel_buffers(struct cx8802_dev *dev, const char *reason, int restart) 327{ 328 struct cx88_dmaqueue *q = &dev->mpegq; 329 struct cx88_buffer *buf; 330 unsigned long flags; 331 332 spin_lock_irqsave(&dev->slock,flags); 333 while (!list_empty(&q->active)) { 334 buf = list_entry(q->active.next, struct cx88_buffer, vb.queue); 335 list_del(&buf->vb.queue); 336 buf->vb.state = VIDEOBUF_ERROR; 337 wake_up(&buf->vb.done); 338 dprintk(1,"[%p/%d] %s - dma=0x%08lx\n", 339 buf, buf->vb.i, reason, (unsigned long)buf->risc.dma); 340 } 341 if (restart) 342 { 343 dprintk(1, "restarting queue\n" ); 344 cx8802_restart_queue(dev,q); 345 } 346 spin_unlock_irqrestore(&dev->slock,flags); 347} 348 349void cx8802_cancel_buffers(struct cx8802_dev *dev) 350{ 351 struct cx88_dmaqueue *q = &dev->mpegq; 352 353 dprintk( 1, "cx8802_cancel_buffers" ); 354 del_timer_sync(&q->timeout); 355 cx8802_stop_dma(dev); 356 do_cancel_buffers(dev,"cancel",0); 357} 358 359static void cx8802_timeout(unsigned long data) 360{ 361 struct cx8802_dev *dev = (struct cx8802_dev*)data; 362 363 dprintk(1, "%s\n",__func__); 364 365 if (debug) 366 cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH28]); 367 cx8802_stop_dma(dev); 368 do_cancel_buffers(dev,"timeout",1); 369} 370 371static const char * cx88_mpeg_irqs[32] = { 372 "ts_risci1", NULL, NULL, NULL, 373 "ts_risci2", NULL, NULL, NULL, 374 "ts_oflow", NULL, NULL, NULL, 375 "ts_sync", NULL, NULL, NULL, 376 "opc_err", "par_err", "rip_err", "pci_abort", 377 "ts_err?", 378}; 379 380static void cx8802_mpeg_irq(struct cx8802_dev *dev) 381{ 382 struct cx88_core *core = dev->core; 383 u32 status, mask, count; 384 385 dprintk( 1, "cx8802_mpeg_irq\n" ); 386 status = cx_read(MO_TS_INTSTAT); 387 mask = cx_read(MO_TS_INTMSK); 388 if (0 == (status & mask)) 389 return; 390 391 cx_write(MO_TS_INTSTAT, status); 392 393 if (debug || (status & mask & ~0xff)) 394 cx88_print_irqbits(core->name, "irq mpeg ", 395 cx88_mpeg_irqs, ARRAY_SIZE(cx88_mpeg_irqs), 396 status, mask); 397 398 /* risc op code error */ 399 if (status & (1 << 16)) { 400 printk(KERN_WARNING "%s: mpeg risc op code error\n",core->name); 401 cx_clear(MO_TS_DMACNTRL, 0x11); 402 cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH28]); 403 } 404 405 /* risc1 y */ 406 if (status & 0x01) { 407 dprintk( 1, "wake up\n" ); 408 spin_lock(&dev->slock); 409 count = cx_read(MO_TS_GPCNT); 410 cx88_wakeup(dev->core, &dev->mpegq, count); 411 spin_unlock(&dev->slock); 412 } 413 414 /* risc2 y */ 415 if (status & 0x10) { 416 spin_lock(&dev->slock); 417 cx8802_restart_queue(dev,&dev->mpegq); 418 spin_unlock(&dev->slock); 419 } 420 421 /* other general errors */ 422 if (status & 0x1f0100) { 423 dprintk( 0, "general errors: 0x%08x\n", status & 0x1f0100 ); 424 spin_lock(&dev->slock); 425 cx8802_stop_dma(dev); 426 cx8802_restart_queue(dev,&dev->mpegq); 427 spin_unlock(&dev->slock); 428 } 429} 430 431#define MAX_IRQ_LOOP 10 432 433static irqreturn_t cx8802_irq(int irq, void *dev_id) 434{ 435 struct cx8802_dev *dev = dev_id; 436 struct cx88_core *core = dev->core; 437 u32 status; 438 int loop, handled = 0; 439 440 for (loop = 0; loop < MAX_IRQ_LOOP; loop++) { 441 status = cx_read(MO_PCI_INTSTAT) & 442 (core->pci_irqmask | PCI_INT_TSINT); 443 if (0 == status) 444 goto out; 445 dprintk( 1, "cx8802_irq\n" ); 446 dprintk( 1, " loop: %d/%d\n", loop, MAX_IRQ_LOOP ); 447 dprintk( 1, " status: %d\n", status ); 448 handled = 1; 449 cx_write(MO_PCI_INTSTAT, status); 450 451 if (status & core->pci_irqmask) 452 cx88_core_irq(core,status); 453 if (status & PCI_INT_TSINT) 454 cx8802_mpeg_irq(dev); 455 } 456 if (MAX_IRQ_LOOP == loop) { 457 dprintk( 0, "clearing mask\n" ); 458 printk(KERN_WARNING "%s/0: irq loop -- clearing mask\n", 459 core->name); 460 cx_write(MO_PCI_INTMSK,0); 461 } 462 463 out: 464 return IRQ_RETVAL(handled); 465} 466 467static int cx8802_init_common(struct cx8802_dev *dev) 468{ 469 struct cx88_core *core = dev->core; 470 int err; 471 472 /* pci init */ 473 if (pci_enable_device(dev->pci)) 474 return -EIO; 475 pci_set_master(dev->pci); 476 if (!pci_dma_supported(dev->pci,DMA_BIT_MASK(32))) { 477 printk("%s/2: Oops: no 32bit PCI DMA ???\n",dev->core->name); 478 return -EIO; 479 } 480 481 dev->pci_rev = dev->pci->revision; 482 pci_read_config_byte(dev->pci, PCI_LATENCY_TIMER, &dev->pci_lat); 483 printk(KERN_INFO "%s/2: found at %s, rev: %d, irq: %d, " 484 "latency: %d, mmio: 0x%llx\n", dev->core->name, 485 pci_name(dev->pci), dev->pci_rev, dev->pci->irq, 486 dev->pci_lat,(unsigned long long)pci_resource_start(dev->pci,0)); 487 488 /* initialize driver struct */ 489 spin_lock_init(&dev->slock); 490 491 /* init dma queue */ 492 INIT_LIST_HEAD(&dev->mpegq.active); 493 INIT_LIST_HEAD(&dev->mpegq.queued); 494 dev->mpegq.timeout.function = cx8802_timeout; 495 dev->mpegq.timeout.data = (unsigned long)dev; 496 init_timer(&dev->mpegq.timeout); 497 cx88_risc_stopper(dev->pci,&dev->mpegq.stopper, 498 MO_TS_DMACNTRL,0x11,0x00); 499 500 /* get irq */ 501 err = request_irq(dev->pci->irq, cx8802_irq, 502 IRQF_SHARED, dev->core->name, dev); 503 if (err < 0) { 504 printk(KERN_ERR "%s: can't get IRQ %d\n", 505 dev->core->name, dev->pci->irq); 506 return err; 507 } 508 cx_set(MO_PCI_INTMSK, core->pci_irqmask); 509 510 /* everything worked */ 511 pci_set_drvdata(dev->pci,dev); 512 return 0; 513} 514 515static void cx8802_fini_common(struct cx8802_dev *dev) 516{ 517 dprintk( 2, "cx8802_fini_common\n" ); 518 cx8802_stop_dma(dev); 519 pci_disable_device(dev->pci); 520 521 /* unregister stuff */ 522 free_irq(dev->pci->irq, dev); 523 524 /* free memory */ 525 btcx_riscmem_free(dev->pci,&dev->mpegq.stopper); 526} 527 528/* ----------------------------------------------------------- */ 529 530static int cx8802_suspend_common(struct pci_dev *pci_dev, pm_message_t state) 531{ 532 struct cx8802_dev *dev = pci_get_drvdata(pci_dev); 533 struct cx88_core *core = dev->core; 534 unsigned long flags; 535 536 /* stop mpeg dma */ 537 spin_lock_irqsave(&dev->slock, flags); 538 if (!list_empty(&dev->mpegq.active)) { 539 dprintk( 2, "suspend\n" ); 540 printk("%s: suspend mpeg\n", core->name); 541 cx8802_stop_dma(dev); 542 del_timer(&dev->mpegq.timeout); 543 } 544 spin_unlock_irqrestore(&dev->slock, flags); 545 546 /* FIXME -- shutdown device */ 547 cx88_shutdown(dev->core); 548 549 pci_save_state(pci_dev); 550 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) { 551 pci_disable_device(pci_dev); 552 dev->state.disabled = 1; 553 } 554 return 0; 555} 556 557static int cx8802_resume_common(struct pci_dev *pci_dev) 558{ 559 struct cx8802_dev *dev = pci_get_drvdata(pci_dev); 560 struct cx88_core *core = dev->core; 561 unsigned long flags; 562 int err; 563 564 if (dev->state.disabled) { 565 err=pci_enable_device(pci_dev); 566 if (err) { 567 printk(KERN_ERR "%s: can't enable device\n", 568 dev->core->name); 569 return err; 570 } 571 dev->state.disabled = 0; 572 } 573 err=pci_set_power_state(pci_dev, PCI_D0); 574 if (err) { 575 printk(KERN_ERR "%s: can't enable device\n", 576 dev->core->name); 577 pci_disable_device(pci_dev); 578 dev->state.disabled = 1; 579 580 return err; 581 } 582 pci_restore_state(pci_dev); 583 584 /* FIXME: re-initialize hardware */ 585 cx88_reset(dev->core); 586 587 /* restart video+vbi capture */ 588 spin_lock_irqsave(&dev->slock, flags); 589 if (!list_empty(&dev->mpegq.active)) { 590 printk("%s: resume mpeg\n", core->name); 591 cx8802_restart_queue(dev,&dev->mpegq); 592 } 593 spin_unlock_irqrestore(&dev->slock, flags); 594 595 return 0; 596} 597 598struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board_type btype) 599{ 600 struct cx8802_driver *d; 601 602 list_for_each_entry(d, &dev->drvlist, drvlist) 603 if (d->type_id == btype) 604 return d; 605 606 return NULL; 607} 608 609/* Driver asked for hardware access. */ 610static int cx8802_request_acquire(struct cx8802_driver *drv) 611{ 612 struct cx88_core *core = drv->core; 613 unsigned int i; 614 615 /* Fail a request for hardware if the device is busy. */ 616 if (core->active_type_id != CX88_BOARD_NONE && 617 core->active_type_id != drv->type_id) 618 return -EBUSY; 619 620 if (drv->type_id == CX88_MPEG_DVB) { 621 /* When switching to DVB, always set the input to the tuner */ 622 core->last_analog_input = core->input; 623 core->input = 0; 624 for (i = 0; 625 i < (sizeof(core->board.input) / sizeof(struct cx88_input)); 626 i++) { 627 if (core->board.input[i].type == CX88_VMUX_DVB) { 628 core->input = i; 629 break; 630 } 631 } 632 } 633 634 if (drv->advise_acquire) 635 { 636 core->active_ref++; 637 if (core->active_type_id == CX88_BOARD_NONE) { 638 core->active_type_id = drv->type_id; 639 drv->advise_acquire(drv); 640 } 641 642 mpeg_dbg(1,"%s() Post acquire GPIO=%x\n", __func__, cx_read(MO_GP0_IO)); 643 } 644 645 return 0; 646} 647 648/* Driver asked to release hardware. */ 649static int cx8802_request_release(struct cx8802_driver *drv) 650{ 651 struct cx88_core *core = drv->core; 652 653 if (drv->advise_release && --core->active_ref == 0) 654 { 655 if (drv->type_id == CX88_MPEG_DVB) { 656 /* If the DVB driver is releasing, reset the input 657 state to the last configured analog input */ 658 core->input = core->last_analog_input; 659 } 660 661 drv->advise_release(drv); 662 core->active_type_id = CX88_BOARD_NONE; 663 mpeg_dbg(1,"%s() Post release GPIO=%x\n", __func__, cx_read(MO_GP0_IO)); 664 } 665 666 return 0; 667} 668 669static int cx8802_check_driver(struct cx8802_driver *drv) 670{ 671 if (drv == NULL) 672 return -ENODEV; 673 674 if ((drv->type_id != CX88_MPEG_DVB) && 675 (drv->type_id != CX88_MPEG_BLACKBIRD)) 676 return -EINVAL; 677 678 if ((drv->hw_access != CX8802_DRVCTL_SHARED) && 679 (drv->hw_access != CX8802_DRVCTL_EXCLUSIVE)) 680 return -EINVAL; 681 682 if ((drv->probe == NULL) || 683 (drv->remove == NULL) || 684 (drv->advise_acquire == NULL) || 685 (drv->advise_release == NULL)) 686 return -EINVAL; 687 688 return 0; 689} 690 691int cx8802_register_driver(struct cx8802_driver *drv) 692{ 693 struct cx8802_dev *dev; 694 struct cx8802_driver *driver; 695 int err, i = 0; 696 697 printk(KERN_INFO 698 "cx88/2: registering cx8802 driver, type: %s access: %s\n", 699 drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird", 700 drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive"); 701 702 if ((err = cx8802_check_driver(drv)) != 0) { 703 printk(KERN_ERR "cx88/2: cx8802_driver is invalid\n"); 704 return err; 705 } 706 707 mutex_lock(&cx8802_mutex); 708 709 list_for_each_entry(dev, &cx8802_devlist, devlist) { 710 printk(KERN_INFO 711 "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n", 712 dev->core->name, dev->pci->subsystem_vendor, 713 dev->pci->subsystem_device, dev->core->board.name, 714 dev->core->boardnr); 715 716 /* Bring up a new struct for each driver instance */ 717 driver = kzalloc(sizeof(*drv),GFP_KERNEL); 718 if (driver == NULL) { 719 err = -ENOMEM; 720 goto out; 721 } 722 723 /* Snapshot of the driver registration data */ 724 drv->core = dev->core; 725 drv->suspend = cx8802_suspend_common; 726 drv->resume = cx8802_resume_common; 727 drv->request_acquire = cx8802_request_acquire; 728 drv->request_release = cx8802_request_release; 729 memcpy(driver, drv, sizeof(*driver)); 730 731 mutex_lock(&drv->core->lock); 732 err = drv->probe(driver); 733 if (err == 0) { 734 i++; 735 list_add_tail(&driver->drvlist, &dev->drvlist); 736 } else { 737 printk(KERN_ERR 738 "%s/2: cx8802 probe failed, err = %d\n", 739 dev->core->name, err); 740 } 741 mutex_unlock(&drv->core->lock); 742 } 743 744 err = i ? 0 : -ENODEV; 745out: 746 mutex_unlock(&cx8802_mutex); 747 return err; 748} 749 750int cx8802_unregister_driver(struct cx8802_driver *drv) 751{ 752 struct cx8802_dev *dev; 753 struct cx8802_driver *d, *dtmp; 754 int err = 0; 755 756 printk(KERN_INFO 757 "cx88/2: unregistering cx8802 driver, type: %s access: %s\n", 758 drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird", 759 drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive"); 760 761 mutex_lock(&cx8802_mutex); 762 763 list_for_each_entry(dev, &cx8802_devlist, devlist) { 764 printk(KERN_INFO 765 "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n", 766 dev->core->name, dev->pci->subsystem_vendor, 767 dev->pci->subsystem_device, dev->core->board.name, 768 dev->core->boardnr); 769 770 mutex_lock(&dev->core->lock); 771 772 list_for_each_entry_safe(d, dtmp, &dev->drvlist, drvlist) { 773 /* only unregister the correct driver type */ 774 if (d->type_id != drv->type_id) 775 continue; 776 777 err = d->remove(d); 778 if (err == 0) { 779 list_del(&d->drvlist); 780 kfree(d); 781 } else 782 printk(KERN_ERR "%s/2: cx8802 driver remove " 783 "failed (%d)\n", dev->core->name, err); 784 } 785 786 mutex_unlock(&dev->core->lock); 787 } 788 789 mutex_unlock(&cx8802_mutex); 790 791 return err; 792} 793 794/* ----------------------------------------------------------- */ 795static int cx8802_probe(struct pci_dev *pci_dev, 796 const struct pci_device_id *pci_id) 797{ 798 struct cx8802_dev *dev; 799 struct cx88_core *core; 800 int err; 801 802 /* general setup */ 803 core = cx88_core_get(pci_dev); 804 if (NULL == core) 805 return -EINVAL; 806 807 printk("%s/2: cx2388x 8802 Driver Manager\n", core->name); 808 809 err = -ENODEV; 810 if (!core->board.mpeg) 811 goto fail_core; 812 813 err = -ENOMEM; 814 dev = kzalloc(sizeof(*dev),GFP_KERNEL); 815 if (NULL == dev) 816 goto fail_core; 817 dev->pci = pci_dev; 818 dev->core = core; 819 820 /* Maintain a reference so cx88-video can query the 8802 device. */ 821 core->dvbdev = dev; 822 823 err = cx8802_init_common(dev); 824 if (err != 0) 825 goto fail_free; 826 827 INIT_LIST_HEAD(&dev->drvlist); 828 mutex_lock(&cx8802_mutex); 829 list_add_tail(&dev->devlist,&cx8802_devlist); 830 mutex_unlock(&cx8802_mutex); 831 832 /* now autoload cx88-dvb or cx88-blackbird */ 833 request_modules(dev); 834 return 0; 835 836 fail_free: 837 kfree(dev); 838 fail_core: 839 core->dvbdev = NULL; 840 cx88_core_put(core,pci_dev); 841 return err; 842} 843 844static void cx8802_remove(struct pci_dev *pci_dev) 845{ 846 struct cx8802_dev *dev; 847 848 dev = pci_get_drvdata(pci_dev); 849 850 dprintk( 1, "%s\n", __func__); 851 852 flush_request_modules(dev); 853 854 mutex_lock(&dev->core->lock); 855 856 if (!list_empty(&dev->drvlist)) { 857 struct cx8802_driver *drv, *tmp; 858 int err; 859 860 printk(KERN_WARNING "%s/2: Trying to remove cx8802 driver " 861 "while cx8802 sub-drivers still loaded?!\n", 862 dev->core->name); 863 864 list_for_each_entry_safe(drv, tmp, &dev->drvlist, drvlist) { 865 err = drv->remove(drv); 866 if (err == 0) { 867 list_del(&drv->drvlist); 868 } else 869 printk(KERN_ERR "%s/2: cx8802 driver remove " 870 "failed (%d)\n", dev->core->name, err); 871 kfree(drv); 872 } 873 } 874 875 mutex_unlock(&dev->core->lock); 876 877 /* Destroy any 8802 reference. */ 878 dev->core->dvbdev = NULL; 879 880 /* common */ 881 cx8802_fini_common(dev); 882 cx88_core_put(dev->core,dev->pci); 883 kfree(dev); 884} 885 886static const struct pci_device_id cx8802_pci_tbl[] = { 887 { 888 .vendor = 0x14f1, 889 .device = 0x8802, 890 .subvendor = PCI_ANY_ID, 891 .subdevice = PCI_ANY_ID, 892 },{ 893 /* --- end of list --- */ 894 } 895}; 896MODULE_DEVICE_TABLE(pci, cx8802_pci_tbl); 897 898static struct pci_driver cx8802_pci_driver = { 899 .name = "cx88-mpeg driver manager", 900 .id_table = cx8802_pci_tbl, 901 .probe = cx8802_probe, 902 .remove = cx8802_remove, 903}; 904 905module_pci_driver(cx8802_pci_driver); 906 907EXPORT_SYMBOL(cx8802_buf_prepare); 908EXPORT_SYMBOL(cx8802_buf_queue); 909EXPORT_SYMBOL(cx8802_cancel_buffers); 910 911EXPORT_SYMBOL(cx8802_register_driver); 912EXPORT_SYMBOL(cx8802_unregister_driver); 913EXPORT_SYMBOL(cx8802_get_driver); 914/* ----------------------------------------------------------- */ 915/* 916 * Local variables: 917 * c-basic-offset: 8 918 * End: 919 * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off 920 */ 921