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