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