1 /* 2 * device driver for Conexant 2388x based TV cards 3 * driver core 4 * 5 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] 6 * 7 * (c) 2005-2006 Mauro Carvalho Chehab <mchehab@infradead.org> 8 * - Multituner support 9 * - video_ioctl2 conversion 10 * - PAL/M fixes 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 */ 22 23 #include "cx88.h" 24 25 #include <linux/init.h> 26 #include <linux/list.h> 27 #include <linux/module.h> 28 #include <linux/kernel.h> 29 #include <linux/slab.h> 30 #include <linux/kmod.h> 31 #include <linux/sound.h> 32 #include <linux/interrupt.h> 33 #include <linux/pci.h> 34 #include <linux/delay.h> 35 #include <linux/videodev2.h> 36 #include <linux/mutex.h> 37 38 #include <media/v4l2-common.h> 39 #include <media/v4l2-ioctl.h> 40 41 MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards"); 42 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); 43 MODULE_LICENSE("GPL"); 44 45 /* ------------------------------------------------------------------ */ 46 47 unsigned int cx88_core_debug; 48 module_param_named(core_debug, cx88_core_debug, int, 0644); 49 MODULE_PARM_DESC(core_debug, "enable debug messages [core]"); 50 51 static unsigned int nicam; 52 module_param(nicam, int, 0644); 53 MODULE_PARM_DESC(nicam, "tv audio is nicam"); 54 55 static unsigned int nocomb; 56 module_param(nocomb, int, 0644); 57 MODULE_PARM_DESC(nocomb, "disable comb filter"); 58 59 #define dprintk0(fmt, arg...) \ 60 printk(KERN_DEBUG pr_fmt("%s: core:" fmt), \ 61 __func__, ##arg) \ 62 63 #define dprintk(level, fmt, arg...) do { \ 64 if (cx88_core_debug >= level) \ 65 printk(KERN_DEBUG pr_fmt("%s: core:" fmt), \ 66 __func__, ##arg); \ 67 } while (0) 68 69 static unsigned int cx88_devcount; 70 static LIST_HEAD(cx88_devlist); 71 static DEFINE_MUTEX(devlist); 72 73 #define NO_SYNC_LINE (-1U) 74 75 /* 76 * @lpi: lines per IRQ, or 0 to not generate irqs. Note: IRQ to be 77 * generated _after_ lpi lines are transferred. 78 */ 79 static __le32 *cx88_risc_field(__le32 *rp, struct scatterlist *sglist, 80 unsigned int offset, u32 sync_line, 81 unsigned int bpl, unsigned int padding, 82 unsigned int lines, unsigned int lpi, bool jump) 83 { 84 struct scatterlist *sg; 85 unsigned int line, todo, sol; 86 87 if (jump) { 88 (*rp++) = cpu_to_le32(RISC_JUMP); 89 (*rp++) = 0; 90 } 91 92 /* sync instruction */ 93 if (sync_line != NO_SYNC_LINE) 94 *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); 95 96 /* scan lines */ 97 sg = sglist; 98 for (line = 0; line < lines; line++) { 99 while (offset && offset >= sg_dma_len(sg)) { 100 offset -= sg_dma_len(sg); 101 sg = sg_next(sg); 102 } 103 if (lpi && line > 0 && !(line % lpi)) 104 sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC; 105 else 106 sol = RISC_SOL; 107 if (bpl <= sg_dma_len(sg) - offset) { 108 /* fits into current chunk */ 109 *(rp++) = cpu_to_le32(RISC_WRITE | sol | 110 RISC_EOL | bpl); 111 *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset); 112 offset += bpl; 113 } else { 114 /* scanline needs to be split */ 115 todo = bpl; 116 *(rp++) = cpu_to_le32(RISC_WRITE | sol | 117 (sg_dma_len(sg) - offset)); 118 *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset); 119 todo -= (sg_dma_len(sg) - offset); 120 offset = 0; 121 sg = sg_next(sg); 122 while (todo > sg_dma_len(sg)) { 123 *(rp++) = cpu_to_le32(RISC_WRITE | 124 sg_dma_len(sg)); 125 *(rp++) = cpu_to_le32(sg_dma_address(sg)); 126 todo -= sg_dma_len(sg); 127 sg = sg_next(sg); 128 } 129 *(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo); 130 *(rp++) = cpu_to_le32(sg_dma_address(sg)); 131 offset += todo; 132 } 133 offset += padding; 134 } 135 136 return rp; 137 } 138 139 int cx88_risc_buffer(struct pci_dev *pci, struct cx88_riscmem *risc, 140 struct scatterlist *sglist, 141 unsigned int top_offset, unsigned int bottom_offset, 142 unsigned int bpl, unsigned int padding, unsigned int lines) 143 { 144 u32 instructions, fields; 145 __le32 *rp; 146 147 fields = 0; 148 if (top_offset != UNSET) 149 fields++; 150 if (bottom_offset != UNSET) 151 fields++; 152 153 /* 154 * estimate risc mem: worst case is one write per page border + 155 * one write per scan line + syncs + jump (all 2 dwords). Padding 156 * can cause next bpl to start close to a page border. First DMA 157 * region may be smaller than PAGE_SIZE 158 */ 159 instructions = fields * (1 + ((bpl + padding) * lines) / 160 PAGE_SIZE + lines); 161 instructions += 4; 162 risc->size = instructions * 8; 163 risc->dma = 0; 164 risc->cpu = pci_zalloc_consistent(pci, risc->size, &risc->dma); 165 if (!risc->cpu) 166 return -ENOMEM; 167 168 /* write risc instructions */ 169 rp = risc->cpu; 170 if (top_offset != UNSET) 171 rp = cx88_risc_field(rp, sglist, top_offset, 0, 172 bpl, padding, lines, 0, true); 173 if (bottom_offset != UNSET) 174 rp = cx88_risc_field(rp, sglist, bottom_offset, 0x200, 175 bpl, padding, lines, 0, 176 top_offset == UNSET); 177 178 /* save pointer to jmp instruction address */ 179 risc->jmp = rp; 180 WARN_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size); 181 return 0; 182 } 183 EXPORT_SYMBOL(cx88_risc_buffer); 184 185 int cx88_risc_databuffer(struct pci_dev *pci, struct cx88_riscmem *risc, 186 struct scatterlist *sglist, unsigned int bpl, 187 unsigned int lines, unsigned int lpi) 188 { 189 u32 instructions; 190 __le32 *rp; 191 192 /* 193 * estimate risc mem: worst case is one write per page border + 194 * one write per scan line + syncs + jump (all 2 dwords). Here 195 * there is no padding and no sync. First DMA region may be smaller 196 * than PAGE_SIZE 197 */ 198 instructions = 1 + (bpl * lines) / PAGE_SIZE + lines; 199 instructions += 3; 200 risc->size = instructions * 8; 201 risc->dma = 0; 202 risc->cpu = pci_zalloc_consistent(pci, risc->size, &risc->dma); 203 if (!risc->cpu) 204 return -ENOMEM; 205 206 /* write risc instructions */ 207 rp = risc->cpu; 208 rp = cx88_risc_field(rp, sglist, 0, NO_SYNC_LINE, bpl, 0, 209 lines, lpi, !lpi); 210 211 /* save pointer to jmp instruction address */ 212 risc->jmp = rp; 213 WARN_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size); 214 return 0; 215 } 216 EXPORT_SYMBOL(cx88_risc_databuffer); 217 218 /* 219 * our SRAM memory layout 220 */ 221 222 /* 223 * we are going to put all thr risc programs into host memory, so we 224 * can use the whole SDRAM for the DMA fifos. To simplify things, we 225 * use a static memory layout. That surely will waste memory in case 226 * we don't use all DMA channels at the same time (which will be the 227 * case most of the time). But that still gives us enough FIFO space 228 * to be able to deal with insane long pci latencies ... 229 * 230 * FIFO space allocations: 231 * channel 21 (y video) - 10.0k 232 * channel 22 (u video) - 2.0k 233 * channel 23 (v video) - 2.0k 234 * channel 24 (vbi) - 4.0k 235 * channels 25+26 (audio) - 4.0k 236 * channel 28 (mpeg) - 4.0k 237 * channel 27 (audio rds)- 3.0k 238 * TOTAL = 29.0k 239 * 240 * Every channel has 160 bytes control data (64 bytes instruction 241 * queue and 6 CDT entries), which is close to 2k total. 242 * 243 * Address layout: 244 * 0x0000 - 0x03ff CMDs / reserved 245 * 0x0400 - 0x0bff instruction queues + CDs 246 * 0x0c00 - FIFOs 247 */ 248 249 const struct sram_channel cx88_sram_channels[] = { 250 [SRAM_CH21] = { 251 .name = "video y / packed", 252 .cmds_start = 0x180040, 253 .ctrl_start = 0x180400, 254 .cdt = 0x180400 + 64, 255 .fifo_start = 0x180c00, 256 .fifo_size = 0x002800, 257 .ptr1_reg = MO_DMA21_PTR1, 258 .ptr2_reg = MO_DMA21_PTR2, 259 .cnt1_reg = MO_DMA21_CNT1, 260 .cnt2_reg = MO_DMA21_CNT2, 261 }, 262 [SRAM_CH22] = { 263 .name = "video u", 264 .cmds_start = 0x180080, 265 .ctrl_start = 0x1804a0, 266 .cdt = 0x1804a0 + 64, 267 .fifo_start = 0x183400, 268 .fifo_size = 0x000800, 269 .ptr1_reg = MO_DMA22_PTR1, 270 .ptr2_reg = MO_DMA22_PTR2, 271 .cnt1_reg = MO_DMA22_CNT1, 272 .cnt2_reg = MO_DMA22_CNT2, 273 }, 274 [SRAM_CH23] = { 275 .name = "video v", 276 .cmds_start = 0x1800c0, 277 .ctrl_start = 0x180540, 278 .cdt = 0x180540 + 64, 279 .fifo_start = 0x183c00, 280 .fifo_size = 0x000800, 281 .ptr1_reg = MO_DMA23_PTR1, 282 .ptr2_reg = MO_DMA23_PTR2, 283 .cnt1_reg = MO_DMA23_CNT1, 284 .cnt2_reg = MO_DMA23_CNT2, 285 }, 286 [SRAM_CH24] = { 287 .name = "vbi", 288 .cmds_start = 0x180100, 289 .ctrl_start = 0x1805e0, 290 .cdt = 0x1805e0 + 64, 291 .fifo_start = 0x184400, 292 .fifo_size = 0x001000, 293 .ptr1_reg = MO_DMA24_PTR1, 294 .ptr2_reg = MO_DMA24_PTR2, 295 .cnt1_reg = MO_DMA24_CNT1, 296 .cnt2_reg = MO_DMA24_CNT2, 297 }, 298 [SRAM_CH25] = { 299 .name = "audio from", 300 .cmds_start = 0x180140, 301 .ctrl_start = 0x180680, 302 .cdt = 0x180680 + 64, 303 .fifo_start = 0x185400, 304 .fifo_size = 0x001000, 305 .ptr1_reg = MO_DMA25_PTR1, 306 .ptr2_reg = MO_DMA25_PTR2, 307 .cnt1_reg = MO_DMA25_CNT1, 308 .cnt2_reg = MO_DMA25_CNT2, 309 }, 310 [SRAM_CH26] = { 311 .name = "audio to", 312 .cmds_start = 0x180180, 313 .ctrl_start = 0x180720, 314 .cdt = 0x180680 + 64, /* same as audio IN */ 315 .fifo_start = 0x185400, /* same as audio IN */ 316 .fifo_size = 0x001000, /* same as audio IN */ 317 .ptr1_reg = MO_DMA26_PTR1, 318 .ptr2_reg = MO_DMA26_PTR2, 319 .cnt1_reg = MO_DMA26_CNT1, 320 .cnt2_reg = MO_DMA26_CNT2, 321 }, 322 [SRAM_CH28] = { 323 .name = "mpeg", 324 .cmds_start = 0x180200, 325 .ctrl_start = 0x1807C0, 326 .cdt = 0x1807C0 + 64, 327 .fifo_start = 0x186400, 328 .fifo_size = 0x001000, 329 .ptr1_reg = MO_DMA28_PTR1, 330 .ptr2_reg = MO_DMA28_PTR2, 331 .cnt1_reg = MO_DMA28_CNT1, 332 .cnt2_reg = MO_DMA28_CNT2, 333 }, 334 [SRAM_CH27] = { 335 .name = "audio rds", 336 .cmds_start = 0x1801C0, 337 .ctrl_start = 0x180860, 338 .cdt = 0x180860 + 64, 339 .fifo_start = 0x187400, 340 .fifo_size = 0x000C00, 341 .ptr1_reg = MO_DMA27_PTR1, 342 .ptr2_reg = MO_DMA27_PTR2, 343 .cnt1_reg = MO_DMA27_CNT1, 344 .cnt2_reg = MO_DMA27_CNT2, 345 }, 346 }; 347 EXPORT_SYMBOL(cx88_sram_channels); 348 349 int cx88_sram_channel_setup(struct cx88_core *core, 350 const struct sram_channel *ch, 351 unsigned int bpl, u32 risc) 352 { 353 unsigned int i, lines; 354 u32 cdt; 355 356 bpl = (bpl + 7) & ~7; /* alignment */ 357 cdt = ch->cdt; 358 lines = ch->fifo_size / bpl; 359 if (lines > 6) 360 lines = 6; 361 WARN_ON(lines < 2); 362 363 /* write CDT */ 364 for (i = 0; i < lines; i++) 365 cx_write(cdt + 16 * i, ch->fifo_start + bpl * i); 366 367 /* write CMDS */ 368 cx_write(ch->cmds_start + 0, risc); 369 cx_write(ch->cmds_start + 4, cdt); 370 cx_write(ch->cmds_start + 8, (lines * 16) >> 3); 371 cx_write(ch->cmds_start + 12, ch->ctrl_start); 372 cx_write(ch->cmds_start + 16, 64 >> 2); 373 for (i = 20; i < 64; i += 4) 374 cx_write(ch->cmds_start + i, 0); 375 376 /* fill registers */ 377 cx_write(ch->ptr1_reg, ch->fifo_start); 378 cx_write(ch->ptr2_reg, cdt); 379 cx_write(ch->cnt1_reg, (bpl >> 3) - 1); 380 cx_write(ch->cnt2_reg, (lines * 16) >> 3); 381 382 dprintk(2, "sram setup %s: bpl=%d lines=%d\n", ch->name, bpl, lines); 383 return 0; 384 } 385 EXPORT_SYMBOL(cx88_sram_channel_setup); 386 387 /* ------------------------------------------------------------------ */ 388 /* debug helper code */ 389 390 static int cx88_risc_decode(u32 risc) 391 { 392 static const char * const instr[16] = { 393 [RISC_SYNC >> 28] = "sync", 394 [RISC_WRITE >> 28] = "write", 395 [RISC_WRITEC >> 28] = "writec", 396 [RISC_READ >> 28] = "read", 397 [RISC_READC >> 28] = "readc", 398 [RISC_JUMP >> 28] = "jump", 399 [RISC_SKIP >> 28] = "skip", 400 [RISC_WRITERM >> 28] = "writerm", 401 [RISC_WRITECM >> 28] = "writecm", 402 [RISC_WRITECR >> 28] = "writecr", 403 }; 404 static int const incr[16] = { 405 [RISC_WRITE >> 28] = 2, 406 [RISC_JUMP >> 28] = 2, 407 [RISC_WRITERM >> 28] = 3, 408 [RISC_WRITECM >> 28] = 3, 409 [RISC_WRITECR >> 28] = 4, 410 }; 411 static const char * const bits[] = { 412 "12", "13", "14", "resync", 413 "cnt0", "cnt1", "18", "19", 414 "20", "21", "22", "23", 415 "irq1", "irq2", "eol", "sol", 416 }; 417 int i; 418 419 dprintk0("0x%08x [ %s", risc, 420 instr[risc >> 28] ? instr[risc >> 28] : "INVALID"); 421 for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--) 422 if (risc & (1 << (i + 12))) 423 pr_cont(" %s", bits[i]); 424 pr_cont(" count=%d ]\n", risc & 0xfff); 425 return incr[risc >> 28] ? incr[risc >> 28] : 1; 426 } 427 428 void cx88_sram_channel_dump(struct cx88_core *core, 429 const struct sram_channel *ch) 430 { 431 static const char * const name[] = { 432 "initial risc", 433 "cdt base", 434 "cdt size", 435 "iq base", 436 "iq size", 437 "risc pc", 438 "iq wr ptr", 439 "iq rd ptr", 440 "cdt current", 441 "pci target", 442 "line / byte", 443 }; 444 u32 risc; 445 unsigned int i, j, n; 446 447 dprintk0("%s - dma channel status dump\n", ch->name); 448 for (i = 0; i < ARRAY_SIZE(name); i++) 449 dprintk0(" cmds: %-12s: 0x%08x\n", 450 name[i], cx_read(ch->cmds_start + 4 * i)); 451 for (n = 1, i = 0; i < 4; i++) { 452 risc = cx_read(ch->cmds_start + 4 * (i + 11)); 453 pr_cont(" risc%d: ", i); 454 if (--n) 455 pr_cont("0x%08x [ arg #%d ]\n", risc, n); 456 else 457 n = cx88_risc_decode(risc); 458 } 459 for (i = 0; i < 16; i += n) { 460 risc = cx_read(ch->ctrl_start + 4 * i); 461 dprintk0(" iq %x: ", i); 462 n = cx88_risc_decode(risc); 463 for (j = 1; j < n; j++) { 464 risc = cx_read(ch->ctrl_start + 4 * (i + j)); 465 pr_cont(" iq %x: 0x%08x [ arg #%d ]\n", 466 i + j, risc, j); 467 } 468 } 469 470 dprintk0("fifo: 0x%08x -> 0x%x\n", 471 ch->fifo_start, ch->fifo_start + ch->fifo_size); 472 dprintk0("ctrl: 0x%08x -> 0x%x\n", 473 ch->ctrl_start, ch->ctrl_start + 6 * 16); 474 dprintk0(" ptr1_reg: 0x%08x\n", cx_read(ch->ptr1_reg)); 475 dprintk0(" ptr2_reg: 0x%08x\n", cx_read(ch->ptr2_reg)); 476 dprintk0(" cnt1_reg: 0x%08x\n", cx_read(ch->cnt1_reg)); 477 dprintk0(" cnt2_reg: 0x%08x\n", cx_read(ch->cnt2_reg)); 478 } 479 EXPORT_SYMBOL(cx88_sram_channel_dump); 480 481 static const char *cx88_pci_irqs[32] = { 482 "vid", "aud", "ts", "vip", "hst", "5", "6", "tm1", 483 "src_dma", "dst_dma", "risc_rd_err", "risc_wr_err", 484 "brdg_err", "src_dma_err", "dst_dma_err", "ipb_dma_err", 485 "i2c", "i2c_rack", "ir_smp", "gpio0", "gpio1" 486 }; 487 488 void cx88_print_irqbits(const char *tag, const char *strings[], 489 int len, u32 bits, u32 mask) 490 { 491 unsigned int i; 492 493 dprintk0("%s [0x%x]", tag, bits); 494 for (i = 0; i < len; i++) { 495 if (!(bits & (1 << i))) 496 continue; 497 if (strings[i]) 498 pr_cont(" %s", strings[i]); 499 else 500 pr_cont(" %d", i); 501 if (!(mask & (1 << i))) 502 continue; 503 pr_cont("*"); 504 } 505 pr_cont("\n"); 506 } 507 EXPORT_SYMBOL(cx88_print_irqbits); 508 509 /* ------------------------------------------------------------------ */ 510 511 int cx88_core_irq(struct cx88_core *core, u32 status) 512 { 513 int handled = 0; 514 515 if (status & PCI_INT_IR_SMPINT) { 516 cx88_ir_irq(core); 517 handled++; 518 } 519 if (!handled) 520 cx88_print_irqbits("irq pci", 521 cx88_pci_irqs, ARRAY_SIZE(cx88_pci_irqs), 522 status, core->pci_irqmask); 523 return handled; 524 } 525 EXPORT_SYMBOL(cx88_core_irq); 526 527 void cx88_wakeup(struct cx88_core *core, 528 struct cx88_dmaqueue *q, u32 count) 529 { 530 struct cx88_buffer *buf; 531 532 buf = list_entry(q->active.next, 533 struct cx88_buffer, list); 534 buf->vb.vb2_buf.timestamp = ktime_get_ns(); 535 buf->vb.field = core->field; 536 buf->vb.sequence = q->count++; 537 list_del(&buf->list); 538 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); 539 } 540 EXPORT_SYMBOL(cx88_wakeup); 541 542 void cx88_shutdown(struct cx88_core *core) 543 { 544 /* disable RISC controller + IRQs */ 545 cx_write(MO_DEV_CNTRL2, 0); 546 547 /* stop dma transfers */ 548 cx_write(MO_VID_DMACNTRL, 0x0); 549 cx_write(MO_AUD_DMACNTRL, 0x0); 550 cx_write(MO_TS_DMACNTRL, 0x0); 551 cx_write(MO_VIP_DMACNTRL, 0x0); 552 cx_write(MO_GPHST_DMACNTRL, 0x0); 553 554 /* stop interrupts */ 555 cx_write(MO_PCI_INTMSK, 0x0); 556 cx_write(MO_VID_INTMSK, 0x0); 557 cx_write(MO_AUD_INTMSK, 0x0); 558 cx_write(MO_TS_INTMSK, 0x0); 559 cx_write(MO_VIP_INTMSK, 0x0); 560 cx_write(MO_GPHST_INTMSK, 0x0); 561 562 /* stop capturing */ 563 cx_write(VID_CAPTURE_CONTROL, 0); 564 } 565 EXPORT_SYMBOL(cx88_shutdown); 566 567 int cx88_reset(struct cx88_core *core) 568 { 569 dprintk(1, ""); 570 cx88_shutdown(core); 571 572 /* clear irq status */ 573 cx_write(MO_VID_INTSTAT, 0xFFFFFFFF); // Clear PIV int 574 cx_write(MO_PCI_INTSTAT, 0xFFFFFFFF); // Clear PCI int 575 cx_write(MO_INT1_STAT, 0xFFFFFFFF); // Clear RISC int 576 577 /* wait a bit */ 578 msleep(100); 579 580 /* init sram */ 581 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH21], 582 720 * 4, 0); 583 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH22], 128, 0); 584 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH23], 128, 0); 585 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH24], 128, 0); 586 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0); 587 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0); 588 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28], 589 188 * 4, 0); 590 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27], 128, 0); 591 592 /* misc init ... */ 593 cx_write(MO_INPUT_FORMAT, ((1 << 13) | // agc enable 594 (1 << 12) | // agc gain 595 (1 << 11) | // adaptibe agc 596 (0 << 10) | // chroma agc 597 (0 << 9) | // ckillen 598 (7))); 599 600 /* setup image format */ 601 cx_andor(MO_COLOR_CTRL, 0x4000, 0x4000); 602 603 /* setup FIFO Thresholds */ 604 cx_write(MO_PDMA_STHRSH, 0x0807); 605 cx_write(MO_PDMA_DTHRSH, 0x0807); 606 607 /* fixes flashing of image */ 608 cx_write(MO_AGC_SYNC_TIP1, 0x0380000F); 609 cx_write(MO_AGC_BACK_VBI, 0x00E00555); 610 611 cx_write(MO_VID_INTSTAT, 0xFFFFFFFF); // Clear PIV int 612 cx_write(MO_PCI_INTSTAT, 0xFFFFFFFF); // Clear PCI int 613 cx_write(MO_INT1_STAT, 0xFFFFFFFF); // Clear RISC int 614 615 /* Reset on-board parts */ 616 cx_write(MO_SRST_IO, 0); 617 usleep_range(10000, 20000); 618 cx_write(MO_SRST_IO, 1); 619 620 return 0; 621 } 622 EXPORT_SYMBOL(cx88_reset); 623 624 /* ------------------------------------------------------------------ */ 625 626 static inline unsigned int norm_swidth(v4l2_std_id norm) 627 { 628 return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922; 629 } 630 631 static inline unsigned int norm_hdelay(v4l2_std_id norm) 632 { 633 return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186; 634 } 635 636 static inline unsigned int norm_vdelay(v4l2_std_id norm) 637 { 638 return (norm & V4L2_STD_625_50) ? 0x24 : 0x18; 639 } 640 641 static inline unsigned int norm_fsc8(v4l2_std_id norm) 642 { 643 if (norm & V4L2_STD_PAL_M) 644 return 28604892; // 3.575611 MHz 645 646 if (norm & (V4L2_STD_PAL_Nc)) 647 return 28656448; // 3.582056 MHz 648 649 if (norm & V4L2_STD_NTSC) // All NTSC/M and variants 650 return 28636360; // 3.57954545 MHz +/- 10 Hz 651 652 /* 653 * SECAM have also different sub carrier for chroma, 654 * but step_db and step_dr, at cx88_set_tvnorm already handles that. 655 * 656 * The same FSC applies to PAL/BGDKIH, PAL/60, NTSC/4.43 and PAL/N 657 */ 658 659 return 35468950; // 4.43361875 MHz +/- 5 Hz 660 } 661 662 static inline unsigned int norm_htotal(v4l2_std_id norm) 663 { 664 unsigned int fsc4 = norm_fsc8(norm) / 2; 665 666 /* returns 4*FSC / vtotal / frames per seconds */ 667 return (norm & V4L2_STD_625_50) ? 668 ((fsc4 + 312) / 625 + 12) / 25 : 669 ((fsc4 + 262) / 525 * 1001 + 15000) / 30000; 670 } 671 672 static inline unsigned int norm_vbipack(v4l2_std_id norm) 673 { 674 return (norm & V4L2_STD_625_50) ? 511 : 400; 675 } 676 677 int cx88_set_scale(struct cx88_core *core, unsigned int width, 678 unsigned int height, enum v4l2_field field) 679 { 680 unsigned int swidth = norm_swidth(core->tvnorm); 681 unsigned int sheight = norm_maxh(core->tvnorm); 682 u32 value; 683 684 dprintk(1, "set_scale: %dx%d [%s%s,%s]\n", width, height, 685 V4L2_FIELD_HAS_TOP(field) ? "T" : "", 686 V4L2_FIELD_HAS_BOTTOM(field) ? "B" : "", 687 v4l2_norm_to_name(core->tvnorm)); 688 if (!V4L2_FIELD_HAS_BOTH(field)) 689 height *= 2; 690 691 // recalc H delay and scale registers 692 value = (width * norm_hdelay(core->tvnorm)) / swidth; 693 value &= 0x3fe; 694 cx_write(MO_HDELAY_EVEN, value); 695 cx_write(MO_HDELAY_ODD, value); 696 dprintk(1, "set_scale: hdelay 0x%04x (width %d)\n", value, swidth); 697 698 value = (swidth * 4096 / width) - 4096; 699 cx_write(MO_HSCALE_EVEN, value); 700 cx_write(MO_HSCALE_ODD, value); 701 dprintk(1, "set_scale: hscale 0x%04x\n", value); 702 703 cx_write(MO_HACTIVE_EVEN, width); 704 cx_write(MO_HACTIVE_ODD, width); 705 dprintk(1, "set_scale: hactive 0x%04x\n", width); 706 707 // recalc V scale Register (delay is constant) 708 cx_write(MO_VDELAY_EVEN, norm_vdelay(core->tvnorm)); 709 cx_write(MO_VDELAY_ODD, norm_vdelay(core->tvnorm)); 710 dprintk(1, "set_scale: vdelay 0x%04x\n", norm_vdelay(core->tvnorm)); 711 712 value = (0x10000 - (sheight * 512 / height - 512)) & 0x1fff; 713 cx_write(MO_VSCALE_EVEN, value); 714 cx_write(MO_VSCALE_ODD, value); 715 dprintk(1, "set_scale: vscale 0x%04x\n", value); 716 717 cx_write(MO_VACTIVE_EVEN, sheight); 718 cx_write(MO_VACTIVE_ODD, sheight); 719 dprintk(1, "set_scale: vactive 0x%04x\n", sheight); 720 721 // setup filters 722 value = 0; 723 value |= (1 << 19); // CFILT (default) 724 if (core->tvnorm & V4L2_STD_SECAM) { 725 value |= (1 << 15); 726 value |= (1 << 16); 727 } 728 if (INPUT(core->input).type == CX88_VMUX_SVIDEO) 729 value |= (1 << 13) | (1 << 5); 730 if (field == V4L2_FIELD_INTERLACED) 731 value |= (1 << 3); // VINT (interlaced vertical scaling) 732 if (width < 385) 733 value |= (1 << 0); // 3-tap interpolation 734 if (width < 193) 735 value |= (1 << 1); // 5-tap interpolation 736 if (nocomb) 737 value |= (3 << 5); // disable comb filter 738 739 cx_andor(MO_FILTER_EVEN, 0x7ffc7f, value); /* preserve PEAKEN, PSEL */ 740 cx_andor(MO_FILTER_ODD, 0x7ffc7f, value); 741 dprintk(1, "set_scale: filter 0x%04x\n", value); 742 743 return 0; 744 } 745 EXPORT_SYMBOL(cx88_set_scale); 746 747 static const u32 xtal = 28636363; 748 749 static int set_pll(struct cx88_core *core, int prescale, u32 ofreq) 750 { 751 static const u32 pre[] = { 0, 0, 0, 3, 2, 1 }; 752 u64 pll; 753 u32 reg; 754 int i; 755 756 if (prescale < 2) 757 prescale = 2; 758 if (prescale > 5) 759 prescale = 5; 760 761 pll = ofreq * 8 * prescale * (u64)(1 << 20); 762 do_div(pll, xtal); 763 reg = (pll & 0x3ffffff) | (pre[prescale] << 26); 764 if (((reg >> 20) & 0x3f) < 14) { 765 pr_err("pll out of range\n"); 766 return -1; 767 } 768 769 dprintk(1, "set_pll: MO_PLL_REG 0x%08x [old=0x%08x,freq=%d]\n", 770 reg, cx_read(MO_PLL_REG), ofreq); 771 cx_write(MO_PLL_REG, reg); 772 for (i = 0; i < 100; i++) { 773 reg = cx_read(MO_DEVICE_STATUS); 774 if (reg & (1 << 2)) { 775 dprintk(1, "pll locked [pre=%d,ofreq=%d]\n", 776 prescale, ofreq); 777 return 0; 778 } 779 dprintk(1, "pll not locked yet, waiting ...\n"); 780 usleep_range(10000, 20000); 781 } 782 dprintk(1, "pll NOT locked [pre=%d,ofreq=%d]\n", prescale, ofreq); 783 return -1; 784 } 785 786 int cx88_start_audio_dma(struct cx88_core *core) 787 { 788 /* constant 128 made buzz in analog Nicam-stereo for bigger fifo_size */ 789 int bpl = cx88_sram_channels[SRAM_CH25].fifo_size / 4; 790 791 int rds_bpl = cx88_sram_channels[SRAM_CH27].fifo_size / AUD_RDS_LINES; 792 793 /* If downstream RISC is enabled, bail out; ALSA is managing DMA */ 794 if (cx_read(MO_AUD_DMACNTRL) & 0x10) 795 return 0; 796 797 /* setup fifo + format */ 798 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], bpl, 0); 799 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], bpl, 0); 800 cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27], 801 rds_bpl, 0); 802 803 cx_write(MO_AUDD_LNGTH, bpl); /* fifo bpl size */ 804 cx_write(MO_AUDR_LNGTH, rds_bpl); /* fifo bpl size */ 805 806 /* enable Up, Down and Audio RDS fifo */ 807 cx_write(MO_AUD_DMACNTRL, 0x0007); 808 809 return 0; 810 } 811 812 int cx88_stop_audio_dma(struct cx88_core *core) 813 { 814 /* If downstream RISC is enabled, bail out; ALSA is managing DMA */ 815 if (cx_read(MO_AUD_DMACNTRL) & 0x10) 816 return 0; 817 818 /* stop dma */ 819 cx_write(MO_AUD_DMACNTRL, 0x0000); 820 821 return 0; 822 } 823 824 static int set_tvaudio(struct cx88_core *core) 825 { 826 v4l2_std_id norm = core->tvnorm; 827 828 if (INPUT(core->input).type != CX88_VMUX_TELEVISION && 829 INPUT(core->input).type != CX88_VMUX_CABLE) 830 return 0; 831 832 if (V4L2_STD_PAL_BG & norm) { 833 core->tvaudio = WW_BG; 834 835 } else if (V4L2_STD_PAL_DK & norm) { 836 core->tvaudio = WW_DK; 837 838 } else if (V4L2_STD_PAL_I & norm) { 839 core->tvaudio = WW_I; 840 841 } else if (V4L2_STD_SECAM_L & norm) { 842 core->tvaudio = WW_L; 843 844 } else if ((V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H) & 845 norm) { 846 core->tvaudio = WW_BG; 847 848 } else if (V4L2_STD_SECAM_DK & norm) { 849 core->tvaudio = WW_DK; 850 851 } else if ((V4L2_STD_NTSC_M & norm) || 852 (V4L2_STD_PAL_M & norm)) { 853 core->tvaudio = WW_BTSC; 854 855 } else if (V4L2_STD_NTSC_M_JP & norm) { 856 core->tvaudio = WW_EIAJ; 857 858 } else { 859 pr_info("tvaudio support needs work for this tv norm [%s], sorry\n", 860 v4l2_norm_to_name(core->tvnorm)); 861 core->tvaudio = WW_NONE; 862 return 0; 863 } 864 865 cx_andor(MO_AFECFG_IO, 0x1f, 0x0); 866 cx88_set_tvaudio(core); 867 /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */ 868 869 /* 870 * This should be needed only on cx88-alsa. It seems that some cx88 chips have 871 * bugs and does require DMA enabled for it to work. 872 */ 873 cx88_start_audio_dma(core); 874 return 0; 875 } 876 877 int cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm) 878 { 879 u32 fsc8; 880 u32 adc_clock; 881 u32 vdec_clock; 882 u32 step_db, step_dr; 883 u64 tmp64; 884 u32 bdelay, agcdelay, htotal; 885 u32 cxiformat, cxoformat; 886 887 if (norm == core->tvnorm) 888 return 0; 889 if (core->v4ldev && (vb2_is_busy(&core->v4ldev->vb2_vidq) || 890 vb2_is_busy(&core->v4ldev->vb2_vbiq))) 891 return -EBUSY; 892 if (core->dvbdev && vb2_is_busy(&core->dvbdev->vb2_mpegq)) 893 return -EBUSY; 894 core->tvnorm = norm; 895 fsc8 = norm_fsc8(norm); 896 adc_clock = xtal; 897 vdec_clock = fsc8; 898 step_db = fsc8; 899 step_dr = fsc8; 900 901 if (norm & V4L2_STD_NTSC_M_JP) { 902 cxiformat = VideoFormatNTSCJapan; 903 cxoformat = 0x181f0008; 904 } else if (norm & V4L2_STD_NTSC_443) { 905 cxiformat = VideoFormatNTSC443; 906 cxoformat = 0x181f0008; 907 } else if (norm & V4L2_STD_PAL_M) { 908 cxiformat = VideoFormatPALM; 909 cxoformat = 0x1c1f0008; 910 } else if (norm & V4L2_STD_PAL_N) { 911 cxiformat = VideoFormatPALN; 912 cxoformat = 0x1c1f0008; 913 } else if (norm & V4L2_STD_PAL_Nc) { 914 cxiformat = VideoFormatPALNC; 915 cxoformat = 0x1c1f0008; 916 } else if (norm & V4L2_STD_PAL_60) { 917 cxiformat = VideoFormatPAL60; 918 cxoformat = 0x181f0008; 919 } else if (norm & V4L2_STD_NTSC) { 920 cxiformat = VideoFormatNTSC; 921 cxoformat = 0x181f0008; 922 } else if (norm & V4L2_STD_SECAM) { 923 step_db = 4250000 * 8; 924 step_dr = 4406250 * 8; 925 926 cxiformat = VideoFormatSECAM; 927 cxoformat = 0x181f0008; 928 } else { /* PAL */ 929 cxiformat = VideoFormatPAL; 930 cxoformat = 0x181f0008; 931 } 932 933 dprintk(1, "set_tvnorm: \"%s\" fsc8=%d adc=%d vdec=%d db/dr=%d/%d\n", 934 v4l2_norm_to_name(core->tvnorm), fsc8, adc_clock, vdec_clock, 935 step_db, step_dr); 936 set_pll(core, 2, vdec_clock); 937 938 dprintk(1, "set_tvnorm: MO_INPUT_FORMAT 0x%08x [old=0x%08x]\n", 939 cxiformat, cx_read(MO_INPUT_FORMAT) & 0x0f); 940 /* 941 * Chroma AGC must be disabled if SECAM is used, we enable it 942 * by default on PAL and NTSC 943 */ 944 cx_andor(MO_INPUT_FORMAT, 0x40f, 945 norm & V4L2_STD_SECAM ? cxiformat : cxiformat | 0x400); 946 947 // FIXME: as-is from DScaler 948 dprintk(1, "set_tvnorm: MO_OUTPUT_FORMAT 0x%08x [old=0x%08x]\n", 949 cxoformat, cx_read(MO_OUTPUT_FORMAT)); 950 cx_write(MO_OUTPUT_FORMAT, cxoformat); 951 952 // MO_SCONV_REG = adc clock / video dec clock * 2^17 953 tmp64 = adc_clock * (u64)(1 << 17); 954 do_div(tmp64, vdec_clock); 955 dprintk(1, "set_tvnorm: MO_SCONV_REG 0x%08x [old=0x%08x]\n", 956 (u32)tmp64, cx_read(MO_SCONV_REG)); 957 cx_write(MO_SCONV_REG, (u32)tmp64); 958 959 // MO_SUB_STEP = 8 * fsc / video dec clock * 2^22 960 tmp64 = step_db * (u64)(1 << 22); 961 do_div(tmp64, vdec_clock); 962 dprintk(1, "set_tvnorm: MO_SUB_STEP 0x%08x [old=0x%08x]\n", 963 (u32)tmp64, cx_read(MO_SUB_STEP)); 964 cx_write(MO_SUB_STEP, (u32)tmp64); 965 966 // MO_SUB_STEP_DR = 8 * 4406250 / video dec clock * 2^22 967 tmp64 = step_dr * (u64)(1 << 22); 968 do_div(tmp64, vdec_clock); 969 dprintk(1, "set_tvnorm: MO_SUB_STEP_DR 0x%08x [old=0x%08x]\n", 970 (u32)tmp64, cx_read(MO_SUB_STEP_DR)); 971 cx_write(MO_SUB_STEP_DR, (u32)tmp64); 972 973 // bdelay + agcdelay 974 bdelay = vdec_clock * 65 / 20000000 + 21; 975 agcdelay = vdec_clock * 68 / 20000000 + 15; 976 dprintk(1, 977 "set_tvnorm: MO_AGC_BURST 0x%08x [old=0x%08x,bdelay=%d,agcdelay=%d]\n", 978 (bdelay << 8) | agcdelay, cx_read(MO_AGC_BURST), 979 bdelay, agcdelay); 980 cx_write(MO_AGC_BURST, (bdelay << 8) | agcdelay); 981 982 // htotal 983 tmp64 = norm_htotal(norm) * (u64)vdec_clock; 984 do_div(tmp64, fsc8); 985 htotal = (u32)tmp64; 986 dprintk(1, 987 "set_tvnorm: MO_HTOTAL 0x%08x [old=0x%08x,htotal=%d]\n", 988 htotal, cx_read(MO_HTOTAL), (u32)tmp64); 989 cx_andor(MO_HTOTAL, 0x07ff, htotal); 990 991 // vbi stuff, set vbi offset to 10 (for 20 Clk*2 pixels), this makes 992 // the effective vbi offset ~244 samples, the same as the Bt8x8 993 cx_write(MO_VBI_PACKET, (10 << 11) | norm_vbipack(norm)); 994 995 // this is needed as well to set all tvnorm parameter 996 cx88_set_scale(core, 320, 240, V4L2_FIELD_INTERLACED); 997 998 // audio 999 set_tvaudio(core); 1000 1001 // tell i2c chips 1002 call_all(core, video, s_std, norm); 1003 1004 /* 1005 * The chroma_agc control should be inaccessible 1006 * if the video format is SECAM 1007 */ 1008 v4l2_ctrl_grab(core->chroma_agc, cxiformat == VideoFormatSECAM); 1009 1010 // done 1011 return 0; 1012 } 1013 EXPORT_SYMBOL(cx88_set_tvnorm); 1014 1015 /* ------------------------------------------------------------------ */ 1016 1017 void cx88_vdev_init(struct cx88_core *core, 1018 struct pci_dev *pci, 1019 struct video_device *vfd, 1020 const struct video_device *template_, 1021 const char *type) 1022 { 1023 *vfd = *template_; 1024 1025 /* 1026 * The dev pointer of v4l2_device is NULL, instead we set the 1027 * video_device dev_parent pointer to the correct PCI bus device. 1028 * This driver is a rare example where there is one v4l2_device, 1029 * but the video nodes have different parent (PCI) devices. 1030 */ 1031 vfd->v4l2_dev = &core->v4l2_dev; 1032 vfd->dev_parent = &pci->dev; 1033 vfd->release = video_device_release_empty; 1034 vfd->lock = &core->lock; 1035 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", 1036 core->name, type, core->board.name); 1037 } 1038 EXPORT_SYMBOL(cx88_vdev_init); 1039 1040 struct cx88_core *cx88_core_get(struct pci_dev *pci) 1041 { 1042 struct cx88_core *core; 1043 1044 mutex_lock(&devlist); 1045 list_for_each_entry(core, &cx88_devlist, devlist) { 1046 if (pci->bus->number != core->pci_bus) 1047 continue; 1048 if (PCI_SLOT(pci->devfn) != core->pci_slot) 1049 continue; 1050 1051 if (cx88_get_resources(core, pci) != 0) { 1052 mutex_unlock(&devlist); 1053 return NULL; 1054 } 1055 refcount_inc(&core->refcount); 1056 mutex_unlock(&devlist); 1057 return core; 1058 } 1059 1060 core = cx88_core_create(pci, cx88_devcount); 1061 if (core) { 1062 cx88_devcount++; 1063 list_add_tail(&core->devlist, &cx88_devlist); 1064 } 1065 1066 mutex_unlock(&devlist); 1067 return core; 1068 } 1069 EXPORT_SYMBOL(cx88_core_get); 1070 1071 void cx88_core_put(struct cx88_core *core, struct pci_dev *pci) 1072 { 1073 release_mem_region(pci_resource_start(pci, 0), 1074 pci_resource_len(pci, 0)); 1075 1076 if (!refcount_dec_and_test(&core->refcount)) 1077 return; 1078 1079 mutex_lock(&devlist); 1080 cx88_ir_fini(core); 1081 if (core->i2c_rc == 0) { 1082 if (core->i2c_rtc) 1083 i2c_unregister_device(core->i2c_rtc); 1084 i2c_del_adapter(&core->i2c_adap); 1085 } 1086 list_del(&core->devlist); 1087 iounmap(core->lmmio); 1088 cx88_devcount--; 1089 mutex_unlock(&devlist); 1090 v4l2_ctrl_handler_free(&core->video_hdl); 1091 v4l2_ctrl_handler_free(&core->audio_hdl); 1092 v4l2_device_unregister(&core->v4l2_dev); 1093 kfree(core); 1094 } 1095 EXPORT_SYMBOL(cx88_core_put); 1096