xref: /openbmc/linux/drivers/media/pci/cx88/cx88-core.c (revision d2574c33)
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@kernel.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