xref: /openbmc/linux/drivers/media/pci/cx88/cx88-core.c (revision e8f6f3b4)
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.v4l2_buf.timestamp);
522 	list_del(&buf->list);
523 	vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
524 }
525 
526 void cx88_shutdown(struct cx88_core *core)
527 {
528 	/* disable RISC controller + IRQs */
529 	cx_write(MO_DEV_CNTRL2, 0);
530 
531 	/* stop dma transfers */
532 	cx_write(MO_VID_DMACNTRL, 0x0);
533 	cx_write(MO_AUD_DMACNTRL, 0x0);
534 	cx_write(MO_TS_DMACNTRL, 0x0);
535 	cx_write(MO_VIP_DMACNTRL, 0x0);
536 	cx_write(MO_GPHST_DMACNTRL, 0x0);
537 
538 	/* stop interrupts */
539 	cx_write(MO_PCI_INTMSK, 0x0);
540 	cx_write(MO_VID_INTMSK, 0x0);
541 	cx_write(MO_AUD_INTMSK, 0x0);
542 	cx_write(MO_TS_INTMSK, 0x0);
543 	cx_write(MO_VIP_INTMSK, 0x0);
544 	cx_write(MO_GPHST_INTMSK, 0x0);
545 
546 	/* stop capturing */
547 	cx_write(VID_CAPTURE_CONTROL, 0);
548 }
549 
550 int cx88_reset(struct cx88_core *core)
551 {
552 	dprintk(1,"%s\n",__func__);
553 	cx88_shutdown(core);
554 
555 	/* clear irq status */
556 	cx_write(MO_VID_INTSTAT, 0xFFFFFFFF); // Clear PIV int
557 	cx_write(MO_PCI_INTSTAT, 0xFFFFFFFF); // Clear PCI int
558 	cx_write(MO_INT1_STAT,   0xFFFFFFFF); // Clear RISC int
559 
560 	/* wait a bit */
561 	msleep(100);
562 
563 	/* init sram */
564 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH21], 720*4, 0);
565 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH22], 128, 0);
566 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH23], 128, 0);
567 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH24], 128, 0);
568 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0);
569 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0);
570 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28], 188*4, 0);
571 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27], 128, 0);
572 
573 	/* misc init ... */
574 	cx_write(MO_INPUT_FORMAT, ((1 << 13) |   // agc enable
575 				   (1 << 12) |   // agc gain
576 				   (1 << 11) |   // adaptibe agc
577 				   (0 << 10) |   // chroma agc
578 				   (0 <<  9) |   // ckillen
579 				   (7)));
580 
581 	/* setup image format */
582 	cx_andor(MO_COLOR_CTRL, 0x4000, 0x4000);
583 
584 	/* setup FIFO Thresholds */
585 	cx_write(MO_PDMA_STHRSH,   0x0807);
586 	cx_write(MO_PDMA_DTHRSH,   0x0807);
587 
588 	/* fixes flashing of image */
589 	cx_write(MO_AGC_SYNC_TIP1, 0x0380000F);
590 	cx_write(MO_AGC_BACK_VBI,  0x00E00555);
591 
592 	cx_write(MO_VID_INTSTAT,   0xFFFFFFFF); // Clear PIV int
593 	cx_write(MO_PCI_INTSTAT,   0xFFFFFFFF); // Clear PCI int
594 	cx_write(MO_INT1_STAT,     0xFFFFFFFF); // Clear RISC int
595 
596 	/* Reset on-board parts */
597 	cx_write(MO_SRST_IO, 0);
598 	msleep(10);
599 	cx_write(MO_SRST_IO, 1);
600 
601 	return 0;
602 }
603 
604 /* ------------------------------------------------------------------ */
605 
606 static inline unsigned int norm_swidth(v4l2_std_id norm)
607 {
608 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922;
609 }
610 
611 static inline unsigned int norm_hdelay(v4l2_std_id norm)
612 {
613 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186;
614 }
615 
616 static inline unsigned int norm_vdelay(v4l2_std_id norm)
617 {
618 	return (norm & V4L2_STD_625_50) ? 0x24 : 0x18;
619 }
620 
621 static inline unsigned int norm_fsc8(v4l2_std_id norm)
622 {
623 	if (norm & V4L2_STD_PAL_M)
624 		return 28604892;      // 3.575611 MHz
625 
626 	if (norm & (V4L2_STD_PAL_Nc))
627 		return 28656448;      // 3.582056 MHz
628 
629 	if (norm & V4L2_STD_NTSC) // All NTSC/M and variants
630 		return 28636360;      // 3.57954545 MHz +/- 10 Hz
631 
632 	/* SECAM have also different sub carrier for chroma,
633 	   but step_db and step_dr, at cx88_set_tvnorm already handles that.
634 
635 	   The same FSC applies to PAL/BGDKIH, PAL/60, NTSC/4.43 and PAL/N
636 	 */
637 
638 	return 35468950;      // 4.43361875 MHz +/- 5 Hz
639 }
640 
641 static inline unsigned int norm_htotal(v4l2_std_id norm)
642 {
643 
644 	unsigned int fsc4=norm_fsc8(norm)/2;
645 
646 	/* returns 4*FSC / vtotal / frames per seconds */
647 	return (norm & V4L2_STD_625_50) ?
648 				((fsc4+312)/625+12)/25 :
649 				((fsc4+262)/525*1001+15000)/30000;
650 }
651 
652 static inline unsigned int norm_vbipack(v4l2_std_id norm)
653 {
654 	return (norm & V4L2_STD_625_50) ? 511 : 400;
655 }
656 
657 int cx88_set_scale(struct cx88_core *core, unsigned int width, unsigned int height,
658 		   enum v4l2_field field)
659 {
660 	unsigned int swidth  = norm_swidth(core->tvnorm);
661 	unsigned int sheight = norm_maxh(core->tvnorm);
662 	u32 value;
663 
664 	dprintk(1,"set_scale: %dx%d [%s%s,%s]\n", width, height,
665 		V4L2_FIELD_HAS_TOP(field)    ? "T" : "",
666 		V4L2_FIELD_HAS_BOTTOM(field) ? "B" : "",
667 		v4l2_norm_to_name(core->tvnorm));
668 	if (!V4L2_FIELD_HAS_BOTH(field))
669 		height *= 2;
670 
671 	// recalc H delay and scale registers
672 	value = (width * norm_hdelay(core->tvnorm)) / swidth;
673 	value &= 0x3fe;
674 	cx_write(MO_HDELAY_EVEN,  value);
675 	cx_write(MO_HDELAY_ODD,   value);
676 	dprintk(1,"set_scale: hdelay  0x%04x (width %d)\n", value,swidth);
677 
678 	value = (swidth * 4096 / width) - 4096;
679 	cx_write(MO_HSCALE_EVEN,  value);
680 	cx_write(MO_HSCALE_ODD,   value);
681 	dprintk(1,"set_scale: hscale  0x%04x\n", value);
682 
683 	cx_write(MO_HACTIVE_EVEN, width);
684 	cx_write(MO_HACTIVE_ODD,  width);
685 	dprintk(1,"set_scale: hactive 0x%04x\n", width);
686 
687 	// recalc V scale Register (delay is constant)
688 	cx_write(MO_VDELAY_EVEN, norm_vdelay(core->tvnorm));
689 	cx_write(MO_VDELAY_ODD,  norm_vdelay(core->tvnorm));
690 	dprintk(1,"set_scale: vdelay  0x%04x\n", norm_vdelay(core->tvnorm));
691 
692 	value = (0x10000 - (sheight * 512 / height - 512)) & 0x1fff;
693 	cx_write(MO_VSCALE_EVEN,  value);
694 	cx_write(MO_VSCALE_ODD,   value);
695 	dprintk(1,"set_scale: vscale  0x%04x\n", value);
696 
697 	cx_write(MO_VACTIVE_EVEN, sheight);
698 	cx_write(MO_VACTIVE_ODD,  sheight);
699 	dprintk(1,"set_scale: vactive 0x%04x\n", sheight);
700 
701 	// setup filters
702 	value = 0;
703 	value |= (1 << 19);        // CFILT (default)
704 	if (core->tvnorm & V4L2_STD_SECAM) {
705 		value |= (1 << 15);
706 		value |= (1 << 16);
707 	}
708 	if (INPUT(core->input).type == CX88_VMUX_SVIDEO)
709 		value |= (1 << 13) | (1 << 5);
710 	if (V4L2_FIELD_INTERLACED == field)
711 		value |= (1 << 3); // VINT (interlaced vertical scaling)
712 	if (width < 385)
713 		value |= (1 << 0); // 3-tap interpolation
714 	if (width < 193)
715 		value |= (1 << 1); // 5-tap interpolation
716 	if (nocomb)
717 		value |= (3 << 5); // disable comb filter
718 
719 	cx_andor(MO_FILTER_EVEN,  0x7ffc7f, value); /* preserve PEAKEN, PSEL */
720 	cx_andor(MO_FILTER_ODD,   0x7ffc7f, value);
721 	dprintk(1,"set_scale: filter  0x%04x\n", value);
722 
723 	return 0;
724 }
725 
726 static const u32 xtal = 28636363;
727 
728 static int set_pll(struct cx88_core *core, int prescale, u32 ofreq)
729 {
730 	static const u32 pre[] = { 0, 0, 0, 3, 2, 1 };
731 	u64 pll;
732 	u32 reg;
733 	int i;
734 
735 	if (prescale < 2)
736 		prescale = 2;
737 	if (prescale > 5)
738 		prescale = 5;
739 
740 	pll = ofreq * 8 * prescale * (u64)(1 << 20);
741 	do_div(pll,xtal);
742 	reg = (pll & 0x3ffffff) | (pre[prescale] << 26);
743 	if (((reg >> 20) & 0x3f) < 14) {
744 		printk("%s/0: pll out of range\n",core->name);
745 		return -1;
746 	}
747 
748 	dprintk(1,"set_pll:    MO_PLL_REG       0x%08x [old=0x%08x,freq=%d]\n",
749 		reg, cx_read(MO_PLL_REG), ofreq);
750 	cx_write(MO_PLL_REG, reg);
751 	for (i = 0; i < 100; i++) {
752 		reg = cx_read(MO_DEVICE_STATUS);
753 		if (reg & (1<<2)) {
754 			dprintk(1,"pll locked [pre=%d,ofreq=%d]\n",
755 				prescale,ofreq);
756 			return 0;
757 		}
758 		dprintk(1,"pll not locked yet, waiting ...\n");
759 		msleep(10);
760 	}
761 	dprintk(1,"pll NOT locked [pre=%d,ofreq=%d]\n",prescale,ofreq);
762 	return -1;
763 }
764 
765 int cx88_start_audio_dma(struct cx88_core *core)
766 {
767 	/* constant 128 made buzz in analog Nicam-stereo for bigger fifo_size */
768 	int bpl = cx88_sram_channels[SRAM_CH25].fifo_size/4;
769 
770 	int rds_bpl = cx88_sram_channels[SRAM_CH27].fifo_size/AUD_RDS_LINES;
771 
772 	/* If downstream RISC is enabled, bail out; ALSA is managing DMA */
773 	if (cx_read(MO_AUD_DMACNTRL) & 0x10)
774 		return 0;
775 
776 	/* setup fifo + format */
777 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], bpl, 0);
778 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], bpl, 0);
779 	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27],
780 				rds_bpl, 0);
781 
782 	cx_write(MO_AUDD_LNGTH, bpl); /* fifo bpl size */
783 	cx_write(MO_AUDR_LNGTH, rds_bpl); /* fifo bpl size */
784 
785 	/* enable Up, Down and Audio RDS fifo */
786 	cx_write(MO_AUD_DMACNTRL, 0x0007);
787 
788 	return 0;
789 }
790 
791 int cx88_stop_audio_dma(struct cx88_core *core)
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 	/* stop dma */
798 	cx_write(MO_AUD_DMACNTRL, 0x0000);
799 
800 	return 0;
801 }
802 
803 static int set_tvaudio(struct cx88_core *core)
804 {
805 	v4l2_std_id norm = core->tvnorm;
806 
807 	if (CX88_VMUX_TELEVISION != INPUT(core->input).type &&
808 	    CX88_VMUX_CABLE != INPUT(core->input).type)
809 		return 0;
810 
811 	if (V4L2_STD_PAL_BG & norm) {
812 		core->tvaudio = WW_BG;
813 
814 	} else if (V4L2_STD_PAL_DK & norm) {
815 		core->tvaudio = WW_DK;
816 
817 	} else if (V4L2_STD_PAL_I & norm) {
818 		core->tvaudio = WW_I;
819 
820 	} else if (V4L2_STD_SECAM_L & norm) {
821 		core->tvaudio = WW_L;
822 
823 	} else if ((V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H) & norm) {
824 		core->tvaudio = WW_BG;
825 
826 	} else if (V4L2_STD_SECAM_DK & norm) {
827 		core->tvaudio = WW_DK;
828 
829 	} else if ((V4L2_STD_NTSC_M & norm) ||
830 		   (V4L2_STD_PAL_M  & norm)) {
831 		core->tvaudio = WW_BTSC;
832 
833 	} else if (V4L2_STD_NTSC_M_JP & norm) {
834 		core->tvaudio = WW_EIAJ;
835 
836 	} else {
837 		printk("%s/0: tvaudio support needs work for this tv norm [%s], sorry\n",
838 		       core->name, v4l2_norm_to_name(core->tvnorm));
839 		core->tvaudio = WW_NONE;
840 		return 0;
841 	}
842 
843 	cx_andor(MO_AFECFG_IO, 0x1f, 0x0);
844 	cx88_set_tvaudio(core);
845 	/* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */
846 
847 /*
848    This should be needed only on cx88-alsa. It seems that some cx88 chips have
849    bugs and does require DMA enabled for it to work.
850  */
851 	cx88_start_audio_dma(core);
852 	return 0;
853 }
854 
855 
856 
857 int cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm)
858 {
859 	u32 fsc8;
860 	u32 adc_clock;
861 	u32 vdec_clock;
862 	u32 step_db,step_dr;
863 	u64 tmp64;
864 	u32 bdelay,agcdelay,htotal;
865 	u32 cxiformat, cxoformat;
866 
867 	if (norm == core->tvnorm)
868 		return 0;
869 	if (core->v4ldev && (vb2_is_busy(&core->v4ldev->vb2_vidq) ||
870 			     vb2_is_busy(&core->v4ldev->vb2_vbiq)))
871 		return -EBUSY;
872 	if (core->dvbdev && vb2_is_busy(&core->dvbdev->vb2_mpegq))
873 		return -EBUSY;
874 	core->tvnorm = norm;
875 	fsc8       = norm_fsc8(norm);
876 	adc_clock  = xtal;
877 	vdec_clock = fsc8;
878 	step_db    = fsc8;
879 	step_dr    = fsc8;
880 
881 	if (norm & V4L2_STD_NTSC_M_JP) {
882 		cxiformat = VideoFormatNTSCJapan;
883 		cxoformat = 0x181f0008;
884 	} else if (norm & V4L2_STD_NTSC_443) {
885 		cxiformat = VideoFormatNTSC443;
886 		cxoformat = 0x181f0008;
887 	} else if (norm & V4L2_STD_PAL_M) {
888 		cxiformat = VideoFormatPALM;
889 		cxoformat = 0x1c1f0008;
890 	} else if (norm & V4L2_STD_PAL_N) {
891 		cxiformat = VideoFormatPALN;
892 		cxoformat = 0x1c1f0008;
893 	} else if (norm & V4L2_STD_PAL_Nc) {
894 		cxiformat = VideoFormatPALNC;
895 		cxoformat = 0x1c1f0008;
896 	} else if (norm & V4L2_STD_PAL_60) {
897 		cxiformat = VideoFormatPAL60;
898 		cxoformat = 0x181f0008;
899 	} else if (norm & V4L2_STD_NTSC) {
900 		cxiformat = VideoFormatNTSC;
901 		cxoformat = 0x181f0008;
902 	} else if (norm & V4L2_STD_SECAM) {
903 		step_db = 4250000 * 8;
904 		step_dr = 4406250 * 8;
905 
906 		cxiformat = VideoFormatSECAM;
907 		cxoformat = 0x181f0008;
908 	} else { /* PAL */
909 		cxiformat = VideoFormatPAL;
910 		cxoformat = 0x181f0008;
911 	}
912 
913 	dprintk(1,"set_tvnorm: \"%s\" fsc8=%d adc=%d vdec=%d db/dr=%d/%d\n",
914 		v4l2_norm_to_name(core->tvnorm), fsc8, adc_clock, vdec_clock,
915 		step_db, step_dr);
916 	set_pll(core,2,vdec_clock);
917 
918 	dprintk(1,"set_tvnorm: MO_INPUT_FORMAT  0x%08x [old=0x%08x]\n",
919 		cxiformat, cx_read(MO_INPUT_FORMAT) & 0x0f);
920 	/* Chroma AGC must be disabled if SECAM is used, we enable it
921 	   by default on PAL and NTSC */
922 	cx_andor(MO_INPUT_FORMAT, 0x40f,
923 		 norm & V4L2_STD_SECAM ? cxiformat : cxiformat | 0x400);
924 
925 	// FIXME: as-is from DScaler
926 	dprintk(1,"set_tvnorm: MO_OUTPUT_FORMAT 0x%08x [old=0x%08x]\n",
927 		cxoformat, cx_read(MO_OUTPUT_FORMAT));
928 	cx_write(MO_OUTPUT_FORMAT, cxoformat);
929 
930 	// MO_SCONV_REG = adc clock / video dec clock * 2^17
931 	tmp64  = adc_clock * (u64)(1 << 17);
932 	do_div(tmp64, vdec_clock);
933 	dprintk(1,"set_tvnorm: MO_SCONV_REG     0x%08x [old=0x%08x]\n",
934 		(u32)tmp64, cx_read(MO_SCONV_REG));
935 	cx_write(MO_SCONV_REG, (u32)tmp64);
936 
937 	// MO_SUB_STEP = 8 * fsc / video dec clock * 2^22
938 	tmp64  = step_db * (u64)(1 << 22);
939 	do_div(tmp64, vdec_clock);
940 	dprintk(1,"set_tvnorm: MO_SUB_STEP      0x%08x [old=0x%08x]\n",
941 		(u32)tmp64, cx_read(MO_SUB_STEP));
942 	cx_write(MO_SUB_STEP, (u32)tmp64);
943 
944 	// MO_SUB_STEP_DR = 8 * 4406250 / video dec clock * 2^22
945 	tmp64  = step_dr * (u64)(1 << 22);
946 	do_div(tmp64, vdec_clock);
947 	dprintk(1,"set_tvnorm: MO_SUB_STEP_DR   0x%08x [old=0x%08x]\n",
948 		(u32)tmp64, cx_read(MO_SUB_STEP_DR));
949 	cx_write(MO_SUB_STEP_DR, (u32)tmp64);
950 
951 	// bdelay + agcdelay
952 	bdelay   = vdec_clock * 65 / 20000000 + 21;
953 	agcdelay = vdec_clock * 68 / 20000000 + 15;
954 	dprintk(1,"set_tvnorm: MO_AGC_BURST     0x%08x [old=0x%08x,bdelay=%d,agcdelay=%d]\n",
955 		(bdelay << 8) | agcdelay, cx_read(MO_AGC_BURST), bdelay, agcdelay);
956 	cx_write(MO_AGC_BURST, (bdelay << 8) | agcdelay);
957 
958 	// htotal
959 	tmp64 = norm_htotal(norm) * (u64)vdec_clock;
960 	do_div(tmp64, fsc8);
961 	htotal = (u32)tmp64;
962 	dprintk(1,"set_tvnorm: MO_HTOTAL        0x%08x [old=0x%08x,htotal=%d]\n",
963 		htotal, cx_read(MO_HTOTAL), (u32)tmp64);
964 	cx_andor(MO_HTOTAL, 0x07ff, htotal);
965 
966 	// vbi stuff, set vbi offset to 10 (for 20 Clk*2 pixels), this makes
967 	// the effective vbi offset ~244 samples, the same as the Bt8x8
968 	cx_write(MO_VBI_PACKET, (10<<11) | norm_vbipack(norm));
969 
970 	// this is needed as well to set all tvnorm parameter
971 	cx88_set_scale(core, 320, 240, V4L2_FIELD_INTERLACED);
972 
973 	// audio
974 	set_tvaudio(core);
975 
976 	// tell i2c chips
977 	call_all(core, video, s_std, norm);
978 
979 	/* The chroma_agc control should be inaccessible if the video format is SECAM */
980 	v4l2_ctrl_grab(core->chroma_agc, cxiformat == VideoFormatSECAM);
981 
982 	// done
983 	return 0;
984 }
985 
986 /* ------------------------------------------------------------------ */
987 
988 struct video_device *cx88_vdev_init(struct cx88_core *core,
989 				    struct pci_dev *pci,
990 				    const struct video_device *template_,
991 				    const char *type)
992 {
993 	struct video_device *vfd;
994 
995 	vfd = video_device_alloc();
996 	if (NULL == vfd)
997 		return NULL;
998 	*vfd = *template_;
999 	/*
1000 	 * The dev pointer of v4l2_device is NULL, instead we set the
1001 	 * video_device dev_parent pointer to the correct PCI bus device.
1002 	 * This driver is a rare example where there is one v4l2_device,
1003 	 * but the video nodes have different parent (PCI) devices.
1004 	 */
1005 	vfd->v4l2_dev = &core->v4l2_dev;
1006 	vfd->dev_parent = &pci->dev;
1007 	vfd->release = video_device_release;
1008 	vfd->lock = &core->lock;
1009 	snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
1010 		 core->name, type, core->board.name);
1011 	return vfd;
1012 }
1013 
1014 struct cx88_core* cx88_core_get(struct pci_dev *pci)
1015 {
1016 	struct cx88_core *core;
1017 
1018 	mutex_lock(&devlist);
1019 	list_for_each_entry(core, &cx88_devlist, devlist) {
1020 		if (pci->bus->number != core->pci_bus)
1021 			continue;
1022 		if (PCI_SLOT(pci->devfn) != core->pci_slot)
1023 			continue;
1024 
1025 		if (0 != cx88_get_resources(core, pci)) {
1026 			mutex_unlock(&devlist);
1027 			return NULL;
1028 		}
1029 		atomic_inc(&core->refcount);
1030 		mutex_unlock(&devlist);
1031 		return core;
1032 	}
1033 
1034 	core = cx88_core_create(pci, cx88_devcount);
1035 	if (NULL != core) {
1036 		cx88_devcount++;
1037 		list_add_tail(&core->devlist, &cx88_devlist);
1038 	}
1039 
1040 	mutex_unlock(&devlist);
1041 	return core;
1042 }
1043 
1044 void cx88_core_put(struct cx88_core *core, struct pci_dev *pci)
1045 {
1046 	release_mem_region(pci_resource_start(pci,0),
1047 			   pci_resource_len(pci,0));
1048 
1049 	if (!atomic_dec_and_test(&core->refcount))
1050 		return;
1051 
1052 	mutex_lock(&devlist);
1053 	cx88_ir_fini(core);
1054 	if (0 == core->i2c_rc) {
1055 		if (core->i2c_rtc)
1056 			i2c_unregister_device(core->i2c_rtc);
1057 		i2c_del_adapter(&core->i2c_adap);
1058 	}
1059 	list_del(&core->devlist);
1060 	iounmap(core->lmmio);
1061 	cx88_devcount--;
1062 	mutex_unlock(&devlist);
1063 	v4l2_ctrl_handler_free(&core->video_hdl);
1064 	v4l2_ctrl_handler_free(&core->audio_hdl);
1065 	v4l2_device_unregister(&core->v4l2_dev);
1066 	kfree(core);
1067 }
1068 
1069 /* ------------------------------------------------------------------ */
1070 
1071 EXPORT_SYMBOL(cx88_print_irqbits);
1072 
1073 EXPORT_SYMBOL(cx88_core_irq);
1074 EXPORT_SYMBOL(cx88_wakeup);
1075 EXPORT_SYMBOL(cx88_reset);
1076 EXPORT_SYMBOL(cx88_shutdown);
1077 
1078 EXPORT_SYMBOL(cx88_risc_buffer);
1079 EXPORT_SYMBOL(cx88_risc_databuffer);
1080 
1081 EXPORT_SYMBOL(cx88_sram_channels);
1082 EXPORT_SYMBOL(cx88_sram_channel_setup);
1083 EXPORT_SYMBOL(cx88_sram_channel_dump);
1084 
1085 EXPORT_SYMBOL(cx88_set_tvnorm);
1086 EXPORT_SYMBOL(cx88_set_scale);
1087 
1088 EXPORT_SYMBOL(cx88_vdev_init);
1089 EXPORT_SYMBOL(cx88_core_get);
1090 EXPORT_SYMBOL(cx88_core_put);
1091 
1092 EXPORT_SYMBOL(cx88_ir_start);
1093 EXPORT_SYMBOL(cx88_ir_stop);
1094 
1095 /*
1096  * Local variables:
1097  * c-basic-offset: 8
1098  * End:
1099  * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
1100  */
1101