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