Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
[sfrench/cifs-2.6.git] / drivers / media / video / cx23885 / cx23885-core.c
1 /*
2  *  Driver for the Conexant CX23885 PCIe bridge
3  *
4  *  Copyright (c) 2006 Steven Toth <stoth@hauppauge.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 #include <linux/init.h>
23 #include <linux/list.h>
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/kmod.h>
27 #include <linux/kernel.h>
28 #include <linux/slab.h>
29 #include <linux/interrupt.h>
30 #include <linux/delay.h>
31 #include <asm/div64.h>
32
33 #include "cx23885.h"
34
35 MODULE_DESCRIPTION("Driver for cx23885 based TV cards");
36 MODULE_AUTHOR("Steven Toth <stoth@hauppauge.com>");
37 MODULE_LICENSE("GPL");
38
39 static unsigned int debug;
40 module_param(debug,int,0644);
41 MODULE_PARM_DESC(debug,"enable debug messages");
42
43 static unsigned int card[]  = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
44 module_param_array(card,  int, NULL, 0444);
45 MODULE_PARM_DESC(card,"card type");
46
47 #define dprintk(level, fmt, arg...)\
48         do { if (debug >= level)\
49                 printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
50         } while (0)
51
52 static unsigned int cx23885_devcount;
53
54 static DEFINE_MUTEX(devlist);
55 LIST_HEAD(cx23885_devlist);
56
57 #define NO_SYNC_LINE (-1U)
58
59 /* FIXME, these allocations will change when
60  * analog arrives. The be reviewed.
61  * CX23887 Assumptions
62  * 1 line = 16 bytes of CDT
63  * cmds size = 80
64  * cdt size = 16 * linesize
65  * iqsize = 64
66  * maxlines = 6
67  *
68  * Address Space:
69  * 0x00000000 0x00008fff FIFO clusters
70  * 0x00010000 0x000104af Channel Management Data Structures
71  * 0x000104b0 0x000104ff Free
72  * 0x00010500 0x000108bf 15 channels * iqsize
73  * 0x000108c0 0x000108ff Free
74  * 0x00010900 0x00010e9f IQ's + Cluster Descriptor Tables
75  *                       15 channels * (iqsize + (maxlines * linesize))
76  * 0x00010ea0 0x00010xxx Free
77  */
78
79 static struct sram_channel cx23887_sram_channels[] = {
80         [SRAM_CH01] = {
81                 .name           = "VID A",
82                 .cmds_start     = 0x10000,
83                 .ctrl_start     = 0x105b0,
84                 .cdt            = 0x107b0,
85                 .fifo_start     = 0x40,
86                 .fifo_size      = 0x2800,
87                 .ptr1_reg       = DMA1_PTR1,
88                 .ptr2_reg       = DMA1_PTR2,
89                 .cnt1_reg       = DMA1_CNT1,
90                 .cnt2_reg       = DMA1_CNT2,
91         },
92         [SRAM_CH02] = {
93                 .name           = "ch2",
94                 .cmds_start     = 0x0,
95                 .ctrl_start     = 0x0,
96                 .cdt            = 0x0,
97                 .fifo_start     = 0x0,
98                 .fifo_size      = 0x0,
99                 .ptr1_reg       = DMA2_PTR1,
100                 .ptr2_reg       = DMA2_PTR2,
101                 .cnt1_reg       = DMA2_CNT1,
102                 .cnt2_reg       = DMA2_CNT2,
103         },
104         [SRAM_CH03] = {
105                 .name           = "TS1 B",
106                 .cmds_start     = 0x100A0,
107                 .ctrl_start     = 0x10780,
108                 .cdt            = 0x10400,
109                 .fifo_start     = 0x5000,
110                 .fifo_size      = 0x1000,
111                 .ptr1_reg       = DMA3_PTR1,
112                 .ptr2_reg       = DMA3_PTR2,
113                 .cnt1_reg       = DMA3_CNT1,
114                 .cnt2_reg       = DMA3_CNT2,
115         },
116         [SRAM_CH04] = {
117                 .name           = "ch4",
118                 .cmds_start     = 0x0,
119                 .ctrl_start     = 0x0,
120                 .cdt            = 0x0,
121                 .fifo_start     = 0x0,
122                 .fifo_size      = 0x0,
123                 .ptr1_reg       = DMA4_PTR1,
124                 .ptr2_reg       = DMA4_PTR2,
125                 .cnt1_reg       = DMA4_CNT1,
126                 .cnt2_reg       = DMA4_CNT2,
127         },
128         [SRAM_CH05] = {
129                 .name           = "ch5",
130                 .cmds_start     = 0x0,
131                 .ctrl_start     = 0x0,
132                 .cdt            = 0x0,
133                 .fifo_start     = 0x0,
134                 .fifo_size      = 0x0,
135                 .ptr1_reg       = DMA5_PTR1,
136                 .ptr2_reg       = DMA5_PTR2,
137                 .cnt1_reg       = DMA5_CNT1,
138                 .cnt2_reg       = DMA5_CNT2,
139         },
140         [SRAM_CH06] = {
141                 .name           = "TS2 C",
142                 .cmds_start     = 0x10140,
143                 .ctrl_start     = 0x10680,
144                 .cdt            = 0x108d0,
145                 .fifo_start     = 0x6000,
146                 .fifo_size      = 0x1000,
147                 .ptr1_reg       = DMA5_PTR1,
148                 .ptr2_reg       = DMA5_PTR2,
149                 .cnt1_reg       = DMA5_CNT1,
150                 .cnt2_reg       = DMA5_CNT2,
151         },
152         [SRAM_CH07] = {
153                 .name           = "ch7",
154                 .cmds_start     = 0x0,
155                 .ctrl_start     = 0x0,
156                 .cdt            = 0x0,
157                 .fifo_start     = 0x0,
158                 .fifo_size      = 0x0,
159                 .ptr1_reg       = DMA6_PTR1,
160                 .ptr2_reg       = DMA6_PTR2,
161                 .cnt1_reg       = DMA6_CNT1,
162                 .cnt2_reg       = DMA6_CNT2,
163         },
164         [SRAM_CH08] = {
165                 .name           = "ch8",
166                 .cmds_start     = 0x0,
167                 .ctrl_start     = 0x0,
168                 .cdt            = 0x0,
169                 .fifo_start     = 0x0,
170                 .fifo_size      = 0x0,
171                 .ptr1_reg       = DMA7_PTR1,
172                 .ptr2_reg       = DMA7_PTR2,
173                 .cnt1_reg       = DMA7_CNT1,
174                 .cnt2_reg       = DMA7_CNT2,
175         },
176         [SRAM_CH09] = {
177                 .name           = "ch9",
178                 .cmds_start     = 0x0,
179                 .ctrl_start     = 0x0,
180                 .cdt            = 0x0,
181                 .fifo_start     = 0x0,
182                 .fifo_size      = 0x0,
183                 .ptr1_reg       = DMA8_PTR1,
184                 .ptr2_reg       = DMA8_PTR2,
185                 .cnt1_reg       = DMA8_CNT1,
186                 .cnt2_reg       = DMA8_CNT2,
187         },
188 };
189
190 static int cx23885_risc_decode(u32 risc)
191 {
192         static char *instr[16] = {
193                 [RISC_SYNC    >> 28] = "sync",
194                 [RISC_WRITE   >> 28] = "write",
195                 [RISC_WRITEC  >> 28] = "writec",
196                 [RISC_READ    >> 28] = "read",
197                 [RISC_READC   >> 28] = "readc",
198                 [RISC_JUMP    >> 28] = "jump",
199                 [RISC_SKIP    >> 28] = "skip",
200                 [RISC_WRITERM >> 28] = "writerm",
201                 [RISC_WRITECM >> 28] = "writecm",
202                 [RISC_WRITECR >> 28] = "writecr",
203         };
204         static int incr[16] = {
205                 [RISC_WRITE   >> 28] = 3,
206                 [RISC_JUMP    >> 28] = 3,
207                 [RISC_SKIP    >> 28] = 1,
208                 [RISC_SYNC    >> 28] = 1,
209                 [RISC_WRITERM >> 28] = 3,
210                 [RISC_WRITECM >> 28] = 3,
211                 [RISC_WRITECR >> 28] = 4,
212         };
213         static char *bits[] = {
214                 "12",   "13",   "14",   "resync",
215                 "cnt0", "cnt1", "18",   "19",
216                 "20",   "21",   "22",   "23",
217                 "irq1", "irq2", "eol",  "sol",
218         };
219         int i;
220
221         printk("0x%08x [ %s", risc,
222                instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
223         for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--)
224                 if (risc & (1 << (i + 12)))
225                         printk(" %s", bits[i]);
226         printk(" count=%d ]\n", risc & 0xfff);
227         return incr[risc >> 28] ? incr[risc >> 28] : 1;
228 }
229
230 void cx23885_wakeup(struct cx23885_tsport *port,
231                            struct cx23885_dmaqueue *q, u32 count)
232 {
233         struct cx23885_dev *dev = port->dev;
234         struct cx23885_buffer *buf;
235         int bc;
236
237         for (bc = 0;; bc++) {
238                 if (list_empty(&q->active))
239                         break;
240                 buf = list_entry(q->active.next,
241                                  struct cx23885_buffer, vb.queue);
242
243                 /* count comes from the hw and is is 16bit wide --
244                  * this trick handles wrap-arounds correctly for
245                  * up to 32767 buffers in flight... */
246                 if ((s16) (count - buf->count) < 0)
247                         break;
248
249                 do_gettimeofday(&buf->vb.ts);
250                 dprintk(2, "[%p/%d] wakeup reg=%d buf=%d\n", buf, buf->vb.i,
251                         count, buf->count);
252                 buf->vb.state = VIDEOBUF_DONE;
253                 list_del(&buf->vb.queue);
254                 wake_up(&buf->vb.done);
255         }
256         if (list_empty(&q->active)) {
257                 del_timer(&q->timeout);
258         } else {
259                 mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
260         }
261         if (bc != 1)
262                 printk("%s: %d buffers handled (should be 1)\n",
263                        __func__, bc);
264 }
265
266 int cx23885_sram_channel_setup(struct cx23885_dev *dev,
267                                       struct sram_channel *ch,
268                                       unsigned int bpl, u32 risc)
269 {
270         unsigned int i, lines;
271         u32 cdt;
272
273         if (ch->cmds_start == 0)
274         {
275                 dprintk(1, "%s() Erasing channel [%s]\n", __func__,
276                         ch->name);
277                 cx_write(ch->ptr1_reg, 0);
278                 cx_write(ch->ptr2_reg, 0);
279                 cx_write(ch->cnt2_reg, 0);
280                 cx_write(ch->cnt1_reg, 0);
281                 return 0;
282         } else {
283                 dprintk(1, "%s() Configuring channel [%s]\n", __func__,
284                         ch->name);
285         }
286
287         bpl   = (bpl + 7) & ~7; /* alignment */
288         cdt   = ch->cdt;
289         lines = ch->fifo_size / bpl;
290         if (lines > 6)
291                 lines = 6;
292         BUG_ON(lines < 2);
293
294         cx_write(8 + 0, cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC) );
295         cx_write(8 + 4, cpu_to_le32(8) );
296         cx_write(8 + 8, cpu_to_le32(0) );
297
298         /* write CDT */
299         for (i = 0; i < lines; i++) {
300                 dprintk(2, "%s() 0x%08x <- 0x%08x\n", __func__, cdt + 16*i,
301                         ch->fifo_start + bpl*i);
302                 cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
303                 cx_write(cdt + 16*i +  4, 0);
304                 cx_write(cdt + 16*i +  8, 0);
305                 cx_write(cdt + 16*i + 12, 0);
306         }
307
308         /* write CMDS */
309         if (ch->jumponly)
310                 cx_write(ch->cmds_start +  0, 8);
311         else
312                 cx_write(ch->cmds_start +  0, risc);
313         cx_write(ch->cmds_start +  4, 0); /* 64 bits 63-32 */
314         cx_write(ch->cmds_start +  8, cdt);
315         cx_write(ch->cmds_start + 12, (lines*16) >> 3);
316         cx_write(ch->cmds_start + 16, ch->ctrl_start);
317         if (ch->jumponly)
318                 cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2) );
319         else
320                 cx_write(ch->cmds_start + 20, 64 >> 2);
321         for (i = 24; i < 80; i += 4)
322                 cx_write(ch->cmds_start + i, 0);
323
324         /* fill registers */
325         cx_write(ch->ptr1_reg, ch->fifo_start);
326         cx_write(ch->ptr2_reg, cdt);
327         cx_write(ch->cnt2_reg, (lines*16) >> 3);
328         cx_write(ch->cnt1_reg, (bpl >> 3) -1);
329
330         dprintk(2,"[bridge %d] sram setup %s: bpl=%d lines=%d\n",
331                 dev->bridge,
332                 ch->name,
333                 bpl,
334                 lines);
335
336         return 0;
337 }
338
339 void cx23885_sram_channel_dump(struct cx23885_dev *dev,
340                                       struct sram_channel *ch)
341 {
342         static char *name[] = {
343                 "init risc lo",
344                 "init risc hi",
345                 "cdt base",
346                 "cdt size",
347                 "iq base",
348                 "iq size",
349                 "risc pc lo",
350                 "risc pc hi",
351                 "iq wr ptr",
352                 "iq rd ptr",
353                 "cdt current",
354                 "pci target lo",
355                 "pci target hi",
356                 "line / byte",
357         };
358         u32 risc;
359         unsigned int i, j, n;
360
361         printk("%s: %s - dma channel status dump\n",
362                dev->name, ch->name);
363         for (i = 0; i < ARRAY_SIZE(name); i++)
364                 printk("%s:   cmds: %-15s: 0x%08x\n",
365                        dev->name, name[i],
366                        cx_read(ch->cmds_start + 4*i));
367
368         for (i = 0; i < 4; i++) {
369                 risc = cx_read(ch->cmds_start + 4 * (i + 14));
370                 printk("%s:   risc%d: ", dev->name, i);
371                 cx23885_risc_decode(risc);
372         }
373         for (i = 0; i < (64 >> 2); i += n) {
374                 risc = cx_read(ch->ctrl_start + 4 * i);
375                 /* No consideration for bits 63-32 */
376
377                 printk("%s:   (0x%08x) iq %x: ", dev->name,
378                        ch->ctrl_start + 4 * i, i);
379                 n = cx23885_risc_decode(risc);
380                 for (j = 1; j < n; j++) {
381                         risc = cx_read(ch->ctrl_start + 4 * (i + j));
382                         printk("%s:   iq %x: 0x%08x [ arg #%d ]\n",
383                                dev->name, i+j, risc, j);
384                 }
385         }
386
387         printk("%s: fifo: 0x%08x -> 0x%x\n",
388                dev->name, ch->fifo_start, ch->fifo_start+ch->fifo_size);
389         printk("%s: ctrl: 0x%08x -> 0x%x\n",
390                dev->name, ch->ctrl_start, ch->ctrl_start + 6*16);
391         printk("%s:   ptr1_reg: 0x%08x\n",
392                dev->name, cx_read(ch->ptr1_reg));
393         printk("%s:   ptr2_reg: 0x%08x\n",
394                dev->name, cx_read(ch->ptr2_reg));
395         printk("%s:   cnt1_reg: 0x%08x\n",
396                dev->name, cx_read(ch->cnt1_reg));
397         printk("%s:   cnt2_reg: 0x%08x\n",
398                dev->name, cx_read(ch->cnt2_reg));
399 }
400
401 static void cx23885_risc_disasm(struct cx23885_tsport *port,
402                                 struct btcx_riscmem *risc)
403 {
404         struct cx23885_dev *dev = port->dev;
405         unsigned int i, j, n;
406
407         printk("%s: risc disasm: %p [dma=0x%08lx]\n",
408                dev->name, risc->cpu, (unsigned long)risc->dma);
409         for (i = 0; i < (risc->size >> 2); i += n) {
410                 printk("%s:   %04d: ", dev->name, i);
411                 n = cx23885_risc_decode(risc->cpu[i]);
412                 for (j = 1; j < n; j++)
413                         printk("%s:   %04d: 0x%08x [ arg #%d ]\n",
414                                dev->name, i + j, risc->cpu[i + j], j);
415                 if (risc->cpu[i] == RISC_JUMP)
416                         break;
417         }
418 }
419
420 static void cx23885_shutdown(struct cx23885_dev *dev)
421 {
422         /* disable RISC controller */
423         cx_write(DEV_CNTRL2, 0);
424
425         /* Disable all IR activity */
426         cx_write(IR_CNTRL_REG, 0);
427
428         /* Disable Video A/B activity */
429         cx_write(VID_A_DMA_CTL, 0);
430         cx_write(VID_B_DMA_CTL, 0);
431         cx_write(VID_C_DMA_CTL, 0);
432
433         /* Disable Audio activity */
434         cx_write(AUD_INT_DMA_CTL, 0);
435         cx_write(AUD_EXT_DMA_CTL, 0);
436
437         /* Disable Serial port */
438         cx_write(UART_CTL, 0);
439
440         /* Disable Interrupts */
441         cx_write(PCI_INT_MSK, 0);
442         cx_write(VID_A_INT_MSK, 0);
443         cx_write(VID_B_INT_MSK, 0);
444         cx_write(VID_C_INT_MSK, 0);
445         cx_write(AUDIO_INT_INT_MSK, 0);
446         cx_write(AUDIO_EXT_INT_MSK, 0);
447
448 }
449
450 static void cx23885_reset(struct cx23885_dev *dev)
451 {
452         dprintk(1, "%s()\n", __func__);
453
454         cx23885_shutdown(dev);
455
456         cx_write(PCI_INT_STAT, 0xffffffff);
457         cx_write(VID_A_INT_STAT, 0xffffffff);
458         cx_write(VID_B_INT_STAT, 0xffffffff);
459         cx_write(VID_C_INT_STAT, 0xffffffff);
460         cx_write(AUDIO_INT_INT_STAT, 0xffffffff);
461         cx_write(AUDIO_EXT_INT_STAT, 0xffffffff);
462         cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
463
464         mdelay(100);
465
466         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH01],
467                 720*4, 0);
468         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH02], 128, 0);
469         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH03],
470                 188*4, 0);
471         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH04], 128, 0);
472         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH05], 128, 0);
473         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH06],
474                 188*4, 0);
475         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH07], 128, 0);
476         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH08], 128, 0);
477         cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH09], 128, 0);
478
479         cx23885_gpio_setup(dev);
480 }
481
482
483 static int cx23885_pci_quirks(struct cx23885_dev *dev)
484 {
485         dprintk(1, "%s()\n", __func__);
486
487         /* The cx23885 bridge has a weird bug which causes NMI to be asserted
488          * when DMA begins if RDR_TLCTL0 bit4 is not cleared. It does not
489          * occur on the cx23887 bridge.
490          */
491         if(dev->bridge == CX23885_BRIDGE_885)
492                 cx_clear(RDR_TLCTL0, 1 << 4);
493
494         return 0;
495 }
496
497 static int get_resources(struct cx23885_dev *dev)
498 {
499         if (request_mem_region(pci_resource_start(dev->pci,0),
500                                pci_resource_len(dev->pci,0),
501                                dev->name))
502                 return 0;
503
504         printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n",
505                 dev->name, (unsigned long long)pci_resource_start(dev->pci,0));
506
507         return -EBUSY;
508 }
509
510 static void cx23885_timeout(unsigned long data);
511 int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
512                                 u32 reg, u32 mask, u32 value);
513
514 static int cx23885_init_tsport(struct cx23885_dev *dev, struct cx23885_tsport *port, int portno)
515 {
516         dprintk(1, "%s(portno=%d)\n", __func__, portno);
517
518         /* Transport bus init dma queue  - Common settings */
519         port->dma_ctl_val        = 0x11; /* Enable RISC controller and Fifo */
520         port->ts_int_msk_val     = 0x1111; /* TS port bits for RISC */
521         port->vld_misc_val       = 0x0;
522         port->hw_sop_ctrl_val    = (0x47 << 16 | 188 << 4);
523
524         spin_lock_init(&port->slock);
525         port->dev = dev;
526         port->nr = portno;
527
528         INIT_LIST_HEAD(&port->mpegq.active);
529         INIT_LIST_HEAD(&port->mpegq.queued);
530         port->mpegq.timeout.function = cx23885_timeout;
531         port->mpegq.timeout.data = (unsigned long)port;
532         init_timer(&port->mpegq.timeout);
533
534         switch(portno) {
535         case 1:
536                 port->reg_gpcnt          = VID_B_GPCNT;
537                 port->reg_gpcnt_ctl      = VID_B_GPCNT_CTL;
538                 port->reg_dma_ctl        = VID_B_DMA_CTL;
539                 port->reg_lngth          = VID_B_LNGTH;
540                 port->reg_hw_sop_ctrl    = VID_B_HW_SOP_CTL;
541                 port->reg_gen_ctrl       = VID_B_GEN_CTL;
542                 port->reg_bd_pkt_status  = VID_B_BD_PKT_STATUS;
543                 port->reg_sop_status     = VID_B_SOP_STATUS;
544                 port->reg_fifo_ovfl_stat = VID_B_FIFO_OVFL_STAT;
545                 port->reg_vld_misc       = VID_B_VLD_MISC;
546                 port->reg_ts_clk_en      = VID_B_TS_CLK_EN;
547                 port->reg_src_sel        = VID_B_SRC_SEL;
548                 port->reg_ts_int_msk     = VID_B_INT_MSK;
549                 port->reg_ts_int_stat    = VID_B_INT_STAT;
550                 port->sram_chno          = SRAM_CH03; /* VID_B */
551                 port->pci_irqmask        = 0x02; /* VID_B bit1 */
552                 break;
553         case 2:
554                 port->reg_gpcnt          = VID_C_GPCNT;
555                 port->reg_gpcnt_ctl      = VID_C_GPCNT_CTL;
556                 port->reg_dma_ctl        = VID_C_DMA_CTL;
557                 port->reg_lngth          = VID_C_LNGTH;
558                 port->reg_hw_sop_ctrl    = VID_C_HW_SOP_CTL;
559                 port->reg_gen_ctrl       = VID_C_GEN_CTL;
560                 port->reg_bd_pkt_status  = VID_C_BD_PKT_STATUS;
561                 port->reg_sop_status     = VID_C_SOP_STATUS;
562                 port->reg_fifo_ovfl_stat = VID_C_FIFO_OVFL_STAT;
563                 port->reg_vld_misc       = VID_C_VLD_MISC;
564                 port->reg_ts_clk_en      = VID_C_TS_CLK_EN;
565                 port->reg_src_sel        = 0;
566                 port->reg_ts_int_msk     = VID_C_INT_MSK;
567                 port->reg_ts_int_stat    = VID_C_INT_STAT;
568                 port->sram_chno          = SRAM_CH06; /* VID_C */
569                 port->pci_irqmask        = 0x04; /* VID_C bit2 */
570                 break;
571         default:
572                 BUG();
573         }
574
575         cx23885_risc_stopper(dev->pci, &port->mpegq.stopper,
576                      port->reg_dma_ctl, port->dma_ctl_val, 0x00);
577
578         return 0;
579 }
580
581 static void cx23885_dev_checkrevision(struct cx23885_dev *dev)
582 {
583         switch (cx_read(RDR_CFG2) & 0xff) {
584         case 0x00:
585                 /* cx23885 */
586                 dev->hwrevision = 0xa0;
587                 break;
588         case 0x01:
589                 /* CX23885-12Z */
590                 dev->hwrevision = 0xa1;
591                 break;
592         case 0x02:
593                 /* CX23885-13Z */
594                 dev->hwrevision = 0xb0;
595                 break;
596         case 0x03:
597                 /* CX23888-22Z */
598                 dev->hwrevision = 0xc0;
599                 break;
600         case 0x0e:
601                 /* CX23887-15Z */
602                 dev->hwrevision = 0xc0;
603         case 0x0f:
604                 /* CX23887-14Z */
605                 dev->hwrevision = 0xb1;
606                 break;
607         default:
608                 printk(KERN_ERR "%s() New hardware revision found 0x%x\n",
609                         __func__, dev->hwrevision);
610         }
611         if (dev->hwrevision)
612                 printk(KERN_INFO "%s() Hardware revision = 0x%02x\n",
613                         __func__, dev->hwrevision);
614         else
615                 printk(KERN_ERR "%s() Hardware revision unknown 0x%x\n",
616                         __func__, dev->hwrevision);
617 }
618
619 static int cx23885_dev_setup(struct cx23885_dev *dev)
620 {
621         int i;
622
623         mutex_init(&dev->lock);
624
625         atomic_inc(&dev->refcount);
626
627         dev->nr = cx23885_devcount++;
628         dev->sram_channels = cx23887_sram_channels;
629         sprintf(dev->name, "cx23885[%d]", dev->nr);
630
631         mutex_lock(&devlist);
632         list_add_tail(&dev->devlist, &cx23885_devlist);
633         mutex_unlock(&devlist);
634
635         /* Configure the internal memory */
636         if(dev->pci->device == 0x8880) {
637                 dev->bridge = CX23885_BRIDGE_887;
638                 /* Apply a sensible clock frequency for the PCIe bridge */
639                 dev->clk_freq = 25000000;
640         } else
641         if(dev->pci->device == 0x8852) {
642                 dev->bridge = CX23885_BRIDGE_885;
643                 /* Apply a sensible clock frequency for the PCIe bridge */
644                 dev->clk_freq = 28000000;
645         } else
646                 BUG();
647
648         dprintk(1, "%s() Memory configured for PCIe bridge type %d\n",
649                 __func__, dev->bridge);
650
651         /* board config */
652         dev->board = UNSET;
653         if (card[dev->nr] < cx23885_bcount)
654                 dev->board = card[dev->nr];
655         for (i = 0; UNSET == dev->board  &&  i < cx23885_idcount; i++)
656                 if (dev->pci->subsystem_vendor == cx23885_subids[i].subvendor &&
657                     dev->pci->subsystem_device == cx23885_subids[i].subdevice)
658                         dev->board = cx23885_subids[i].card;
659         if (UNSET == dev->board) {
660                 dev->board = CX23885_BOARD_UNKNOWN;
661                 cx23885_card_list(dev);
662         }
663
664         /* If the user specific a clk freq override, apply it */
665         if (cx23885_boards[dev->board].clk_freq > 0)
666                 dev->clk_freq = cx23885_boards[dev->board].clk_freq;
667
668         dev->pci_bus  = dev->pci->bus->number;
669         dev->pci_slot = PCI_SLOT(dev->pci->devfn);
670         dev->pci_irqmask = 0x001f00;
671
672         /* External Master 1 Bus */
673         dev->i2c_bus[0].nr = 0;
674         dev->i2c_bus[0].dev = dev;
675         dev->i2c_bus[0].reg_stat  = I2C1_STAT;
676         dev->i2c_bus[0].reg_ctrl  = I2C1_CTRL;
677         dev->i2c_bus[0].reg_addr  = I2C1_ADDR;
678         dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
679         dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
680         dev->i2c_bus[0].i2c_period = (0x9d << 24); /* 100kHz */
681
682         /* External Master 2 Bus */
683         dev->i2c_bus[1].nr = 1;
684         dev->i2c_bus[1].dev = dev;
685         dev->i2c_bus[1].reg_stat  = I2C2_STAT;
686         dev->i2c_bus[1].reg_ctrl  = I2C2_CTRL;
687         dev->i2c_bus[1].reg_addr  = I2C2_ADDR;
688         dev->i2c_bus[1].reg_rdata = I2C2_RDATA;
689         dev->i2c_bus[1].reg_wdata = I2C2_WDATA;
690         dev->i2c_bus[1].i2c_period = (0x9d << 24); /* 100kHz */
691
692         /* Internal Master 3 Bus */
693         dev->i2c_bus[2].nr = 2;
694         dev->i2c_bus[2].dev = dev;
695         dev->i2c_bus[2].reg_stat  = I2C3_STAT;
696         dev->i2c_bus[2].reg_ctrl  = I2C3_CTRL;
697         dev->i2c_bus[2].reg_addr  = I2C3_ADDR;
698         dev->i2c_bus[2].reg_rdata = I2C3_RDATA;
699         dev->i2c_bus[2].reg_wdata = I2C3_WDATA;
700         dev->i2c_bus[2].i2c_period = (0x07 << 24); /* 1.95MHz */
701
702         if ((cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) ||
703                 (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER))
704                 cx23885_init_tsport(dev, &dev->ts1, 1);
705
706         if ((cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) ||
707                 (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER))
708                 cx23885_init_tsport(dev, &dev->ts2, 2);
709
710         if (get_resources(dev) < 0) {
711                 printk(KERN_ERR "CORE %s No more PCIe resources for "
712                        "subsystem: %04x:%04x\n",
713                        dev->name, dev->pci->subsystem_vendor,
714                        dev->pci->subsystem_device);
715
716                 cx23885_devcount--;
717                 return -ENODEV;
718         }
719
720         /* PCIe stuff */
721         dev->lmmio = ioremap(pci_resource_start(dev->pci,0),
722                              pci_resource_len(dev->pci,0));
723
724         dev->bmmio = (u8 __iomem *)dev->lmmio;
725
726         printk(KERN_INFO "CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
727                dev->name, dev->pci->subsystem_vendor,
728                dev->pci->subsystem_device, cx23885_boards[dev->board].name,
729                dev->board, card[dev->nr] == dev->board ?
730                "insmod option" : "autodetected");
731
732         cx23885_pci_quirks(dev);
733
734         /* Assume some sensible defaults */
735         dev->tuner_type = cx23885_boards[dev->board].tuner_type;
736         dev->tuner_addr = cx23885_boards[dev->board].tuner_addr;
737         dev->radio_type = cx23885_boards[dev->board].radio_type;
738         dev->radio_addr = cx23885_boards[dev->board].radio_addr;
739
740         dprintk(1, "%s() tuner_type = 0x%x tuner_addr = 0x%x\n",
741                 __func__, dev->tuner_type, dev->tuner_addr);
742         dprintk(1, "%s() radio_type = 0x%x radio_addr = 0x%x\n",
743                 __func__, dev->radio_type, dev->radio_addr);
744
745         /* init hardware */
746         cx23885_reset(dev);
747
748         cx23885_i2c_register(&dev->i2c_bus[0]);
749         cx23885_i2c_register(&dev->i2c_bus[1]);
750         cx23885_i2c_register(&dev->i2c_bus[2]);
751         cx23885_card_setup(dev);
752         cx23885_call_i2c_clients (&dev->i2c_bus[0], TUNER_SET_STANDBY, NULL);
753         cx23885_ir_init(dev);
754
755         if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO) {
756                 if (cx23885_video_register(dev) < 0) {
757                         printk(KERN_ERR "%s() Failed to register analog "
758                                 "video adapters on VID_A\n", __func__);
759                 }
760         }
761
762         if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
763                 if (cx23885_dvb_register(&dev->ts1) < 0) {
764                         printk(KERN_ERR "%s() Failed to register dvb adapters on VID_B\n",
765                                __func__);
766                 }
767         } else
768         if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
769                 if (cx23885_417_register(dev) < 0) {
770                         printk(KERN_ERR
771                                 "%s() Failed to register 417 on VID_B\n",
772                                __func__);
773                 }
774         }
775
776         if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
777                 if (cx23885_dvb_register(&dev->ts2) < 0) {
778                         printk(KERN_ERR
779                                 "%s() Failed to register dvb on VID_C\n",
780                                __func__);
781                 }
782         } else
783         if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER) {
784                 if (cx23885_417_register(dev) < 0) {
785                         printk(KERN_ERR
786                                 "%s() Failed to register 417 on VID_C\n",
787                                __func__);
788                 }
789         }
790
791         cx23885_dev_checkrevision(dev);
792
793         return 0;
794 }
795
796 static void cx23885_dev_unregister(struct cx23885_dev *dev)
797 {
798         release_mem_region(pci_resource_start(dev->pci,0),
799                            pci_resource_len(dev->pci,0));
800
801         if (!atomic_dec_and_test(&dev->refcount))
802                 return;
803
804         if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO)
805                 cx23885_video_unregister(dev);
806
807         if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
808                 cx23885_dvb_unregister(&dev->ts1);
809
810         if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
811                 cx23885_417_unregister(dev);
812
813         if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
814                 cx23885_dvb_unregister(&dev->ts2);
815
816         if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
817                 cx23885_417_unregister(dev);
818
819         cx23885_i2c_unregister(&dev->i2c_bus[2]);
820         cx23885_i2c_unregister(&dev->i2c_bus[1]);
821         cx23885_i2c_unregister(&dev->i2c_bus[0]);
822
823         iounmap(dev->lmmio);
824 }
825
826 static u32* cx23885_risc_field(u32 *rp, struct scatterlist *sglist,
827                                unsigned int offset, u32 sync_line,
828                                unsigned int bpl, unsigned int padding,
829                                unsigned int lines)
830 {
831         struct scatterlist *sg;
832         unsigned int line, todo;
833
834         /* sync instruction */
835         if (sync_line != NO_SYNC_LINE)
836                 *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
837
838         /* scan lines */
839         sg = sglist;
840         for (line = 0; line < lines; line++) {
841                 while (offset && offset >= sg_dma_len(sg)) {
842                         offset -= sg_dma_len(sg);
843                         sg++;
844                 }
845                 if (bpl <= sg_dma_len(sg)-offset) {
846                         /* fits into current chunk */
847                         *(rp++)=cpu_to_le32(RISC_WRITE|RISC_SOL|RISC_EOL|bpl);
848                         *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
849                         *(rp++)=cpu_to_le32(0); /* bits 63-32 */
850                         offset+=bpl;
851                 } else {
852                         /* scanline needs to be split */
853                         todo = bpl;
854                         *(rp++)=cpu_to_le32(RISC_WRITE|RISC_SOL|
855                                             (sg_dma_len(sg)-offset));
856                         *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
857                         *(rp++)=cpu_to_le32(0); /* bits 63-32 */
858                         todo -= (sg_dma_len(sg)-offset);
859                         offset = 0;
860                         sg++;
861                         while (todo > sg_dma_len(sg)) {
862                                 *(rp++)=cpu_to_le32(RISC_WRITE|
863                                                     sg_dma_len(sg));
864                                 *(rp++)=cpu_to_le32(sg_dma_address(sg));
865                                 *(rp++)=cpu_to_le32(0); /* bits 63-32 */
866                                 todo -= sg_dma_len(sg);
867                                 sg++;
868                         }
869                         *(rp++)=cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
870                         *(rp++)=cpu_to_le32(sg_dma_address(sg));
871                         *(rp++)=cpu_to_le32(0); /* bits 63-32 */
872                         offset += todo;
873                 }
874                 offset += padding;
875         }
876
877         return rp;
878 }
879
880 int cx23885_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
881                         struct scatterlist *sglist, unsigned int top_offset,
882                         unsigned int bottom_offset, unsigned int bpl,
883                         unsigned int padding, unsigned int lines)
884 {
885         u32 instructions, fields;
886         u32 *rp;
887         int rc;
888
889         fields = 0;
890         if (UNSET != top_offset)
891                 fields++;
892         if (UNSET != bottom_offset)
893                 fields++;
894
895         /* estimate risc mem: worst case is one write per page border +
896            one write per scan line + syncs + jump (all 2 dwords).  Padding
897            can cause next bpl to start close to a page border.  First DMA
898            region may be smaller than PAGE_SIZE */
899         /* write and jump need and extra dword */
900         instructions  = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE + lines);
901         instructions += 2;
902         if ((rc = btcx_riscmem_alloc(pci,risc,instructions*12)) < 0)
903                 return rc;
904
905         /* write risc instructions */
906         rp = risc->cpu;
907         if (UNSET != top_offset)
908                 rp = cx23885_risc_field(rp, sglist, top_offset, 0,
909                                         bpl, padding, lines);
910         if (UNSET != bottom_offset)
911                 rp = cx23885_risc_field(rp, sglist, bottom_offset, 0x200,
912                                         bpl, padding, lines);
913
914         /* save pointer to jmp instruction address */
915         risc->jmp = rp;
916         BUG_ON((risc->jmp - risc->cpu + 2) * sizeof (*risc->cpu) > risc->size);
917         return 0;
918 }
919
920 static int cx23885_risc_databuffer(struct pci_dev *pci,
921                                    struct btcx_riscmem *risc,
922                                    struct scatterlist *sglist,
923                                    unsigned int bpl,
924                                    unsigned int lines)
925 {
926         u32 instructions;
927         u32 *rp;
928         int rc;
929
930         /* estimate risc mem: worst case is one write per page border +
931            one write per scan line + syncs + jump (all 2 dwords).  Here
932            there is no padding and no sync.  First DMA region may be smaller
933            than PAGE_SIZE */
934         /* Jump and write need an extra dword */
935         instructions  = 1 + (bpl * lines) / PAGE_SIZE + lines;
936         instructions += 1;
937
938         if ((rc = btcx_riscmem_alloc(pci,risc,instructions*12)) < 0)
939                 return rc;
940
941         /* write risc instructions */
942         rp = risc->cpu;
943         rp = cx23885_risc_field(rp, sglist, 0, NO_SYNC_LINE, bpl, 0, lines);
944
945         /* save pointer to jmp instruction address */
946         risc->jmp = rp;
947         BUG_ON((risc->jmp - risc->cpu + 2) * sizeof (*risc->cpu) > risc->size);
948         return 0;
949 }
950
951 int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
952                                 u32 reg, u32 mask, u32 value)
953 {
954         u32 *rp;
955         int rc;
956
957         if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0)
958                 return rc;
959
960         /* write risc instructions */
961         rp = risc->cpu;
962         *(rp++) = cpu_to_le32(RISC_WRITECR  | RISC_IRQ2);
963         *(rp++) = cpu_to_le32(reg);
964         *(rp++) = cpu_to_le32(value);
965         *(rp++) = cpu_to_le32(mask);
966         *(rp++) = cpu_to_le32(RISC_JUMP);
967         *(rp++) = cpu_to_le32(risc->dma);
968         *(rp++) = cpu_to_le32(0); /* bits 63-32 */
969         return 0;
970 }
971
972 void cx23885_free_buffer(struct videobuf_queue *q, struct cx23885_buffer *buf)
973 {
974         struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
975
976         BUG_ON(in_interrupt());
977         videobuf_waiton(&buf->vb, 0, 0);
978         videobuf_dma_unmap(q, dma);
979         videobuf_dma_free(dma);
980         btcx_riscmem_free(to_pci_dev(q->dev), &buf->risc);
981         buf->vb.state = VIDEOBUF_NEEDS_INIT;
982 }
983
984 static void cx23885_tsport_reg_dump(struct cx23885_tsport *port)
985 {
986         struct cx23885_dev *dev = port->dev;
987
988         dprintk(1, "%s() Register Dump\n", __func__);
989         dprintk(1, "%s() DEV_CNTRL2               0x%08X\n", __func__,
990                 cx_read(DEV_CNTRL2));
991         dprintk(1, "%s() PCI_INT_MSK              0x%08X\n", __func__,
992                 cx_read(PCI_INT_MSK));
993         dprintk(1, "%s() AUD_INT_INT_MSK          0x%08X\n", __func__,
994                 cx_read(AUDIO_INT_INT_MSK));
995         dprintk(1, "%s() AUD_INT_DMA_CTL          0x%08X\n", __func__,
996                 cx_read(AUD_INT_DMA_CTL));
997         dprintk(1, "%s() AUD_EXT_INT_MSK          0x%08X\n", __func__,
998                 cx_read(AUDIO_EXT_INT_MSK));
999         dprintk(1, "%s() AUD_EXT_DMA_CTL          0x%08X\n", __func__,
1000                 cx_read(AUD_EXT_DMA_CTL));
1001         dprintk(1, "%s() PAD_CTRL                 0x%08X\n", __func__,
1002                 cx_read(PAD_CTRL));
1003         dprintk(1, "%s() ALT_PIN_OUT_SEL          0x%08X\n", __func__,
1004                 cx_read(ALT_PIN_OUT_SEL));
1005         dprintk(1, "%s() GPIO2                    0x%08X\n", __func__,
1006                 cx_read(GPIO2));
1007         dprintk(1, "%s() gpcnt(0x%08X)          0x%08X\n", __func__,
1008                 port->reg_gpcnt, cx_read(port->reg_gpcnt));
1009         dprintk(1, "%s() gpcnt_ctl(0x%08X)      0x%08x\n", __func__,
1010                 port->reg_gpcnt_ctl, cx_read(port->reg_gpcnt_ctl));
1011         dprintk(1, "%s() dma_ctl(0x%08X)        0x%08x\n", __func__,
1012                 port->reg_dma_ctl, cx_read(port->reg_dma_ctl));
1013         dprintk(1, "%s() src_sel(0x%08X)        0x%08x\n", __func__,
1014                 port->reg_src_sel, cx_read(port->reg_src_sel));
1015         dprintk(1, "%s() lngth(0x%08X)          0x%08x\n", __func__,
1016                 port->reg_lngth, cx_read(port->reg_lngth));
1017         dprintk(1, "%s() hw_sop_ctrl(0x%08X)    0x%08x\n", __func__,
1018                 port->reg_hw_sop_ctrl, cx_read(port->reg_hw_sop_ctrl));
1019         dprintk(1, "%s() gen_ctrl(0x%08X)       0x%08x\n", __func__,
1020                 port->reg_gen_ctrl, cx_read(port->reg_gen_ctrl));
1021         dprintk(1, "%s() bd_pkt_status(0x%08X)  0x%08x\n", __func__,
1022                 port->reg_bd_pkt_status, cx_read(port->reg_bd_pkt_status));
1023         dprintk(1, "%s() sop_status(0x%08X)     0x%08x\n", __func__,
1024                 port->reg_sop_status, cx_read(port->reg_sop_status));
1025         dprintk(1, "%s() fifo_ovfl_stat(0x%08X) 0x%08x\n", __func__,
1026                 port->reg_fifo_ovfl_stat, cx_read(port->reg_fifo_ovfl_stat));
1027         dprintk(1, "%s() vld_misc(0x%08X)       0x%08x\n", __func__,
1028                 port->reg_vld_misc, cx_read(port->reg_vld_misc));
1029         dprintk(1, "%s() ts_clk_en(0x%08X)      0x%08x\n", __func__,
1030                 port->reg_ts_clk_en, cx_read(port->reg_ts_clk_en));
1031         dprintk(1, "%s() ts_int_msk(0x%08X)     0x%08x\n", __func__,
1032                 port->reg_ts_int_msk, cx_read(port->reg_ts_int_msk));
1033 }
1034
1035 static int cx23885_start_dma(struct cx23885_tsport *port,
1036                              struct cx23885_dmaqueue *q,
1037                              struct cx23885_buffer   *buf)
1038 {
1039         struct cx23885_dev *dev = port->dev;
1040         u32 reg;
1041
1042         dprintk(1, "%s() w: %d, h: %d, f: %d\n", __func__,
1043                 buf->vb.width, buf->vb.height, buf->vb.field);
1044
1045         /* setup fifo + format */
1046         cx23885_sram_channel_setup(dev,
1047                                    &dev->sram_channels[ port->sram_chno ],
1048                                    port->ts_packet_size, buf->risc.dma);
1049         if(debug > 5) {
1050                 cx23885_sram_channel_dump(dev, &dev->sram_channels[ port->sram_chno ] );
1051                 cx23885_risc_disasm(port, &buf->risc);
1052         }
1053
1054         /* write TS length to chip */
1055         cx_write(port->reg_lngth, buf->vb.width);
1056
1057         if ( (!(cx23885_boards[dev->board].portb & CX23885_MPEG_DVB)) &&
1058                 (!(cx23885_boards[dev->board].portc & CX23885_MPEG_DVB)) ) {
1059                 printk( "%s() Failed. Unsupported value in .portb/c (0x%08x)/(0x%08x)\n",
1060                         __func__,
1061                         cx23885_boards[dev->board].portb,
1062                         cx23885_boards[dev->board].portc );
1063                 return -EINVAL;
1064         }
1065
1066         if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1067                 cx23885_av_clk(dev, 0);
1068
1069         udelay(100);
1070
1071         /* If the port supports SRC SELECT, configure it */
1072         if(port->reg_src_sel)
1073                 cx_write(port->reg_src_sel, port->src_sel_val);
1074
1075         cx_write(port->reg_hw_sop_ctrl, port->hw_sop_ctrl_val);
1076         cx_write(port->reg_ts_clk_en, port->ts_clk_en_val);
1077         cx_write(port->reg_vld_misc, port->vld_misc_val);
1078         cx_write(port->reg_gen_ctrl, port->gen_ctrl_val);
1079         udelay(100);
1080
1081         // NOTE: this is 2 (reserved) for portb, does it matter?
1082         /* reset counter to zero */
1083         cx_write(port->reg_gpcnt_ctl, 3);
1084         q->count = 1;
1085
1086         if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
1087
1088                 reg = cx_read(PAD_CTRL);
1089                 reg = reg & ~0x1;    /* Clear TS1_OE */
1090
1091                 /* FIXME, bit 2 writing here is questionable */
1092                 /* set TS1_SOP_OE and TS1_OE_HI */
1093                 reg = reg | 0xa;
1094                 cx_write(PAD_CTRL, reg);
1095
1096                 /* FIXME and these two registers should be documented. */
1097                 cx_write(CLK_DELAY, cx_read(CLK_DELAY) | 0x80000011);
1098                 cx_write(ALT_PIN_OUT_SEL, 0x10100045);
1099         }
1100
1101         switch(dev->bridge) {
1102         case CX23885_BRIDGE_885:
1103         case CX23885_BRIDGE_887:
1104                 /* enable irqs */
1105                 dprintk(1, "%s() enabling TS int's and DMA\n", __func__ );
1106                 cx_set(port->reg_ts_int_msk,  port->ts_int_msk_val);
1107                 cx_set(port->reg_dma_ctl, port->dma_ctl_val);
1108                 cx_set(PCI_INT_MSK, dev->pci_irqmask | port->pci_irqmask);
1109                 break;
1110         default:
1111                 BUG();
1112         }
1113
1114         cx_set(DEV_CNTRL2, (1<<5)); /* Enable RISC controller */
1115
1116         if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1117                 cx23885_av_clk(dev, 1);
1118
1119         if (debug > 4)
1120                 cx23885_tsport_reg_dump(port);
1121
1122         return 0;
1123 }
1124
1125 static int cx23885_stop_dma(struct cx23885_tsport *port)
1126 {
1127         struct cx23885_dev *dev = port->dev;
1128         u32 reg;
1129
1130         dprintk(1, "%s()\n", __func__);
1131
1132         /* Stop interrupts and DMA */
1133         cx_clear(port->reg_ts_int_msk, port->ts_int_msk_val);
1134         cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1135
1136         if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
1137
1138                 reg = cx_read(PAD_CTRL);
1139
1140                 /* Set TS1_OE */
1141                 reg = reg | 0x1;
1142
1143                 /* clear TS1_SOP_OE and TS1_OE_HI */
1144                 reg = reg & ~0xa;
1145                 cx_write(PAD_CTRL, reg);
1146                 cx_write(port->reg_src_sel, 0);
1147                 cx_write(port->reg_gen_ctrl, 8);
1148
1149         }
1150
1151         if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1152                 cx23885_av_clk(dev, 0);
1153
1154         return 0;
1155 }
1156
1157 int cx23885_restart_queue(struct cx23885_tsport *port,
1158                                 struct cx23885_dmaqueue *q)
1159 {
1160         struct cx23885_dev *dev = port->dev;
1161         struct cx23885_buffer *buf;
1162
1163         dprintk(5, "%s()\n", __func__);
1164         if (list_empty(&q->active))
1165         {
1166                 struct cx23885_buffer *prev;
1167                 prev = NULL;
1168
1169                 dprintk(5, "%s() queue is empty\n", __func__);
1170
1171                 for (;;) {
1172                         if (list_empty(&q->queued))
1173                                 return 0;
1174                         buf = list_entry(q->queued.next, struct cx23885_buffer,
1175                                          vb.queue);
1176                         if (NULL == prev) {
1177                                 list_del(&buf->vb.queue);
1178                                 list_add_tail(&buf->vb.queue, &q->active);
1179                                 cx23885_start_dma(port, q, buf);
1180                                 buf->vb.state = VIDEOBUF_ACTIVE;
1181                                 buf->count    = q->count++;
1182                                 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
1183                                 dprintk(5, "[%p/%d] restart_queue - first active\n",
1184                                         buf, buf->vb.i);
1185
1186                         } else if (prev->vb.width  == buf->vb.width  &&
1187                                    prev->vb.height == buf->vb.height &&
1188                                    prev->fmt       == buf->fmt) {
1189                                 list_del(&buf->vb.queue);
1190                                 list_add_tail(&buf->vb.queue, &q->active);
1191                                 buf->vb.state = VIDEOBUF_ACTIVE;
1192                                 buf->count    = q->count++;
1193                                 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
1194                                 prev->risc.jmp[2] = cpu_to_le32(0); /* 64 bit bits 63-32 */
1195                                 dprintk(5,"[%p/%d] restart_queue - move to active\n",
1196                                         buf, buf->vb.i);
1197                         } else {
1198                                 return 0;
1199                         }
1200                         prev = buf;
1201                 }
1202                 return 0;
1203         }
1204
1205         buf = list_entry(q->active.next, struct cx23885_buffer, vb.queue);
1206         dprintk(2, "restart_queue [%p/%d]: restart dma\n",
1207                 buf, buf->vb.i);
1208         cx23885_start_dma(port, q, buf);
1209         list_for_each_entry(buf, &q->active, vb.queue)
1210                 buf->count = q->count++;
1211         mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
1212         return 0;
1213 }
1214
1215 /* ------------------------------------------------------------------ */
1216
1217 int cx23885_buf_prepare(struct videobuf_queue *q, struct cx23885_tsport *port,
1218                         struct cx23885_buffer *buf, enum v4l2_field field)
1219 {
1220         struct cx23885_dev *dev = port->dev;
1221         int size = port->ts_packet_size * port->ts_packet_count;
1222         int rc;
1223
1224         dprintk(1, "%s: %p\n", __func__, buf);
1225         if (0 != buf->vb.baddr  &&  buf->vb.bsize < size)
1226                 return -EINVAL;
1227
1228         if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1229                 buf->vb.width  = port->ts_packet_size;
1230                 buf->vb.height = port->ts_packet_count;
1231                 buf->vb.size   = size;
1232                 buf->vb.field  = field /*V4L2_FIELD_TOP*/;
1233
1234                 if (0 != (rc = videobuf_iolock(q, &buf->vb, NULL)))
1235                         goto fail;
1236                 cx23885_risc_databuffer(dev->pci, &buf->risc,
1237                                         videobuf_to_dma(&buf->vb)->sglist,
1238                                         buf->vb.width, buf->vb.height);
1239         }
1240         buf->vb.state = VIDEOBUF_PREPARED;
1241         return 0;
1242
1243  fail:
1244         cx23885_free_buffer(q, buf);
1245         return rc;
1246 }
1247
1248 void cx23885_buf_queue(struct cx23885_tsport *port, struct cx23885_buffer *buf)
1249 {
1250         struct cx23885_buffer    *prev;
1251         struct cx23885_dev *dev = port->dev;
1252         struct cx23885_dmaqueue  *cx88q = &port->mpegq;
1253
1254         /* add jump to stopper */
1255         buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
1256         buf->risc.jmp[1] = cpu_to_le32(cx88q->stopper.dma);
1257         buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
1258
1259         if (list_empty(&cx88q->active)) {
1260                 dprintk( 1, "queue is empty - first active\n" );
1261                 list_add_tail(&buf->vb.queue, &cx88q->active);
1262                 cx23885_start_dma(port, cx88q, buf);
1263                 buf->vb.state = VIDEOBUF_ACTIVE;
1264                 buf->count    = cx88q->count++;
1265                 mod_timer(&cx88q->timeout, jiffies + BUFFER_TIMEOUT);
1266                 dprintk(1, "[%p/%d] %s - first active\n",
1267                         buf, buf->vb.i, __func__);
1268         } else {
1269                 dprintk( 1, "queue is not empty - append to active\n" );
1270                 prev = list_entry(cx88q->active.prev, struct cx23885_buffer,
1271                                   vb.queue);
1272                 list_add_tail(&buf->vb.queue, &cx88q->active);
1273                 buf->vb.state = VIDEOBUF_ACTIVE;
1274                 buf->count    = cx88q->count++;
1275                 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
1276                 prev->risc.jmp[2] = cpu_to_le32(0); /* 64 bit bits 63-32 */
1277                 dprintk( 1, "[%p/%d] %s - append to active\n",
1278                          buf, buf->vb.i, __func__);
1279         }
1280 }
1281
1282 /* ----------------------------------------------------------- */
1283
1284 static void do_cancel_buffers(struct cx23885_tsport *port, char *reason,
1285                               int restart)
1286 {
1287         struct cx23885_dev *dev = port->dev;
1288         struct cx23885_dmaqueue *q = &port->mpegq;
1289         struct cx23885_buffer *buf;
1290         unsigned long flags;
1291
1292         spin_lock_irqsave(&port->slock, flags);
1293         while (!list_empty(&q->active)) {
1294                 buf = list_entry(q->active.next, struct cx23885_buffer,
1295                                  vb.queue);
1296                 list_del(&buf->vb.queue);
1297                 buf->vb.state = VIDEOBUF_ERROR;
1298                 wake_up(&buf->vb.done);
1299                 dprintk(1, "[%p/%d] %s - dma=0x%08lx\n",
1300                         buf, buf->vb.i, reason, (unsigned long)buf->risc.dma);
1301         }
1302         if (restart) {
1303                 dprintk(1, "restarting queue\n" );
1304                 cx23885_restart_queue(port, q);
1305         }
1306         spin_unlock_irqrestore(&port->slock, flags);
1307 }
1308
1309 void cx23885_cancel_buffers(struct cx23885_tsport *port)
1310 {
1311         struct cx23885_dev *dev = port->dev;
1312         struct cx23885_dmaqueue *q = &port->mpegq;
1313
1314         dprintk(1, "%s()\n", __FUNCTION__);
1315         del_timer_sync(&q->timeout);
1316         cx23885_stop_dma(port);
1317         do_cancel_buffers(port, "cancel", 0);
1318 }
1319
1320 static void cx23885_timeout(unsigned long data)
1321 {
1322         struct cx23885_tsport *port = (struct cx23885_tsport *)data;
1323         struct cx23885_dev *dev = port->dev;
1324
1325         dprintk(1, "%s()\n",__func__);
1326
1327         if (debug > 5)
1328                 cx23885_sram_channel_dump(dev, &dev->sram_channels[ port->sram_chno ]);
1329
1330         cx23885_stop_dma(port);
1331         do_cancel_buffers(port, "timeout", 1);
1332 }
1333
1334 int cx23885_irq_417(struct cx23885_dev *dev, u32 status)
1335 {
1336         /* FIXME: port1 assumption here. */
1337         struct cx23885_tsport *port = &dev->ts1;
1338         int count = 0;
1339         int handled = 0;
1340
1341         if (status == 0)
1342                 return handled;
1343
1344         count = cx_read(port->reg_gpcnt);
1345         dprintk(7, "status: 0x%08x  mask: 0x%08x count: 0x%x\n",
1346                 status, cx_read(port->reg_ts_int_msk), count);
1347
1348         if ((status & VID_B_MSK_BAD_PKT)         ||
1349                 (status & VID_B_MSK_OPC_ERR)     ||
1350                 (status & VID_B_MSK_VBI_OPC_ERR) ||
1351                 (status & VID_B_MSK_SYNC)        ||
1352                 (status & VID_B_MSK_VBI_SYNC)    ||
1353                 (status & VID_B_MSK_OF)          ||
1354                 (status & VID_B_MSK_VBI_OF)) {
1355                 printk(KERN_ERR "%s: V4L mpeg risc op code error, status "
1356                         "= 0x%x\n", dev->name, status);
1357                 if (status & VID_B_MSK_BAD_PKT)
1358                         dprintk(1, "        VID_B_MSK_BAD_PKT\n");
1359                 if (status & VID_B_MSK_OPC_ERR)
1360                         dprintk(1, "        VID_B_MSK_OPC_ERR\n");
1361                 if (status & VID_B_MSK_VBI_OPC_ERR)
1362                         dprintk(1, "        VID_B_MSK_VBI_OPC_ERR\n");
1363                 if (status & VID_B_MSK_SYNC)
1364                         dprintk(1, "        VID_B_MSK_SYNC\n");
1365                 if (status & VID_B_MSK_VBI_SYNC)
1366                         dprintk(1, "        VID_B_MSK_VBI_SYNC\n");
1367                 if (status & VID_B_MSK_OF)
1368                         dprintk(1, "        VID_B_MSK_OF\n");
1369                 if (status & VID_B_MSK_VBI_OF)
1370                         dprintk(1, "        VID_B_MSK_VBI_OF\n");
1371
1372                 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1373                 cx23885_sram_channel_dump(dev,
1374                         &dev->sram_channels[port->sram_chno]);
1375                 cx23885_417_check_encoder(dev);
1376         } else if (status & VID_B_MSK_RISCI1) {
1377                 dprintk(7, "        VID_B_MSK_RISCI1\n");
1378                 spin_lock(&port->slock);
1379                 cx23885_wakeup(port, &port->mpegq, count);
1380                 spin_unlock(&port->slock);
1381         } else if (status & VID_B_MSK_RISCI2) {
1382                 dprintk(7, "        VID_B_MSK_RISCI2\n");
1383                 spin_lock(&port->slock);
1384                 cx23885_restart_queue(port, &port->mpegq);
1385                 spin_unlock(&port->slock);
1386         }
1387         if (status) {
1388                 cx_write(port->reg_ts_int_stat, status);
1389                 handled = 1;
1390         }
1391
1392         return handled;
1393 }
1394
1395 static int cx23885_irq_ts(struct cx23885_tsport *port, u32 status)
1396 {
1397         struct cx23885_dev *dev = port->dev;
1398         int handled = 0;
1399         u32 count;
1400
1401         if ((status & VID_BC_MSK_OPC_ERR) ||
1402                 (status & VID_BC_MSK_BAD_PKT) ||
1403                 (status & VID_BC_MSK_SYNC) ||
1404                 (status & VID_BC_MSK_OF))
1405         {
1406                 if (status & VID_BC_MSK_OPC_ERR)
1407                         dprintk(7, " (VID_BC_MSK_OPC_ERR 0x%08x)\n", VID_BC_MSK_OPC_ERR);
1408                 if (status & VID_BC_MSK_BAD_PKT)
1409                         dprintk(7, " (VID_BC_MSK_BAD_PKT 0x%08x)\n", VID_BC_MSK_BAD_PKT);
1410                 if (status & VID_BC_MSK_SYNC)
1411                         dprintk(7, " (VID_BC_MSK_SYNC    0x%08x)\n", VID_BC_MSK_SYNC);
1412                 if (status & VID_BC_MSK_OF)
1413                         dprintk(7, " (VID_BC_MSK_OF      0x%08x)\n", VID_BC_MSK_OF);
1414
1415                 printk(KERN_ERR "%s: mpeg risc op code error\n", dev->name);
1416
1417                 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1418                 cx23885_sram_channel_dump(dev,
1419                         &dev->sram_channels[port->sram_chno]);
1420
1421         } else if (status & VID_BC_MSK_RISCI1) {
1422
1423                 dprintk(7, " (RISCI1            0x%08x)\n", VID_BC_MSK_RISCI1);
1424
1425                 spin_lock(&port->slock);
1426                 count = cx_read(port->reg_gpcnt);
1427                 cx23885_wakeup(port, &port->mpegq, count);
1428                 spin_unlock(&port->slock);
1429
1430         } else if (status & VID_BC_MSK_RISCI2) {
1431
1432                 dprintk(7, " (RISCI2            0x%08x)\n", VID_BC_MSK_RISCI2);
1433
1434                 spin_lock(&port->slock);
1435                 cx23885_restart_queue(port, &port->mpegq);
1436                 spin_unlock(&port->slock);
1437
1438         }
1439         if (status) {
1440                 cx_write(port->reg_ts_int_stat, status);
1441                 handled = 1;
1442         }
1443
1444         return handled;
1445 }
1446
1447 static irqreturn_t cx23885_irq(int irq, void *dev_id)
1448 {
1449         struct cx23885_dev *dev = dev_id;
1450         struct cx23885_tsport *ts1 = &dev->ts1;
1451         struct cx23885_tsport *ts2 = &dev->ts2;
1452         u32 pci_status, pci_mask;
1453         u32 vida_status, vida_mask;
1454         u32 ts1_status, ts1_mask;
1455         u32 ts2_status, ts2_mask;
1456         int vida_count = 0, ts1_count = 0, ts2_count = 0, handled = 0;
1457
1458         pci_status = cx_read(PCI_INT_STAT);
1459         pci_mask = cx_read(PCI_INT_MSK);
1460         vida_status = cx_read(VID_A_INT_STAT);
1461         vida_mask = cx_read(VID_A_INT_MSK);
1462         ts1_status = cx_read(VID_B_INT_STAT);
1463         ts1_mask = cx_read(VID_B_INT_MSK);
1464         ts2_status = cx_read(VID_C_INT_STAT);
1465         ts2_mask = cx_read(VID_C_INT_MSK);
1466
1467         if ( (pci_status == 0) && (ts2_status == 0) && (ts1_status == 0) )
1468                 goto out;
1469
1470         vida_count = cx_read(VID_A_GPCNT);
1471         ts1_count = cx_read(ts1->reg_gpcnt);
1472         ts2_count = cx_read(ts2->reg_gpcnt);
1473         dprintk(7, "pci_status: 0x%08x  pci_mask: 0x%08x\n",
1474                 pci_status, pci_mask);
1475         dprintk(7, "vida_status: 0x%08x vida_mask: 0x%08x count: 0x%x\n",
1476                 vida_status, vida_mask, vida_count);
1477         dprintk(7, "ts1_status: 0x%08x  ts1_mask: 0x%08x count: 0x%x\n",
1478                 ts1_status, ts1_mask, ts1_count);
1479         dprintk(7, "ts2_status: 0x%08x  ts2_mask: 0x%08x count: 0x%x\n",
1480                 ts2_status, ts2_mask, ts2_count);
1481
1482         if ( (pci_status & PCI_MSK_RISC_RD) ||
1483              (pci_status & PCI_MSK_RISC_WR) ||
1484              (pci_status & PCI_MSK_AL_RD) ||
1485              (pci_status & PCI_MSK_AL_WR) ||
1486              (pci_status & PCI_MSK_APB_DMA) ||
1487              (pci_status & PCI_MSK_VID_C) ||
1488              (pci_status & PCI_MSK_VID_B) ||
1489              (pci_status & PCI_MSK_VID_A) ||
1490              (pci_status & PCI_MSK_AUD_INT) ||
1491              (pci_status & PCI_MSK_AUD_EXT) )
1492         {
1493
1494                 if (pci_status & PCI_MSK_RISC_RD)
1495                         dprintk(7, " (PCI_MSK_RISC_RD   0x%08x)\n", PCI_MSK_RISC_RD);
1496                 if (pci_status & PCI_MSK_RISC_WR)
1497                         dprintk(7, " (PCI_MSK_RISC_WR   0x%08x)\n", PCI_MSK_RISC_WR);
1498                 if (pci_status & PCI_MSK_AL_RD)
1499                         dprintk(7, " (PCI_MSK_AL_RD     0x%08x)\n", PCI_MSK_AL_RD);
1500                 if (pci_status & PCI_MSK_AL_WR)
1501                         dprintk(7, " (PCI_MSK_AL_WR     0x%08x)\n", PCI_MSK_AL_WR);
1502                 if (pci_status & PCI_MSK_APB_DMA)
1503                         dprintk(7, " (PCI_MSK_APB_DMA   0x%08x)\n", PCI_MSK_APB_DMA);
1504                 if (pci_status & PCI_MSK_VID_C)
1505                         dprintk(7, " (PCI_MSK_VID_C     0x%08x)\n", PCI_MSK_VID_C);
1506                 if (pci_status & PCI_MSK_VID_B)
1507                         dprintk(7, " (PCI_MSK_VID_B     0x%08x)\n", PCI_MSK_VID_B);
1508                 if (pci_status & PCI_MSK_VID_A)
1509                         dprintk(7, " (PCI_MSK_VID_A     0x%08x)\n", PCI_MSK_VID_A);
1510                 if (pci_status & PCI_MSK_AUD_INT)
1511                         dprintk(7, " (PCI_MSK_AUD_INT   0x%08x)\n", PCI_MSK_AUD_INT);
1512                 if (pci_status & PCI_MSK_AUD_EXT)
1513                         dprintk(7, " (PCI_MSK_AUD_EXT   0x%08x)\n", PCI_MSK_AUD_EXT);
1514
1515         }
1516
1517         if (ts1_status) {
1518                 if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
1519                         handled += cx23885_irq_ts(ts1, ts1_status);
1520                 else
1521                 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1522                         handled += cx23885_irq_417(dev, ts1_status);
1523         }
1524
1525         if (ts2_status) {
1526                 if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
1527                         handled += cx23885_irq_ts(ts2, ts2_status);
1528                 else
1529                 if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
1530                         handled += cx23885_irq_417(dev, ts2_status);
1531         }
1532
1533         if (vida_status)
1534                 handled += cx23885_video_irq(dev, vida_status);
1535
1536         if (handled)
1537                 cx_write(PCI_INT_STAT, pci_status);
1538 out:
1539         return IRQ_RETVAL(handled);
1540 }
1541
1542 static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
1543                                      const struct pci_device_id *pci_id)
1544 {
1545         struct cx23885_dev *dev;
1546         int err;
1547
1548         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1549         if (NULL == dev)
1550                 return -ENOMEM;
1551
1552         /* pci init */
1553         dev->pci = pci_dev;
1554         if (pci_enable_device(pci_dev)) {
1555                 err = -EIO;
1556                 goto fail_free;
1557         }
1558
1559         if (cx23885_dev_setup(dev) < 0) {
1560                 err = -EINVAL;
1561                 goto fail_free;
1562         }
1563
1564         /* print pci info */
1565         pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
1566         pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER,  &dev->pci_lat);
1567         printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, "
1568                "latency: %d, mmio: 0x%llx\n", dev->name,
1569                pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
1570                dev->pci_lat,
1571                 (unsigned long long)pci_resource_start(pci_dev, 0));
1572
1573         pci_set_master(pci_dev);
1574         if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1575                 printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1576                 err = -EIO;
1577                 goto fail_irq;
1578         }
1579
1580         err = request_irq(pci_dev->irq, cx23885_irq,
1581                           IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
1582         if (err < 0) {
1583                 printk(KERN_ERR "%s: can't get IRQ %d\n",
1584                        dev->name, pci_dev->irq);
1585                 goto fail_irq;
1586         }
1587
1588         pci_set_drvdata(pci_dev, dev);
1589         return 0;
1590
1591 fail_irq:
1592         cx23885_dev_unregister(dev);
1593 fail_free:
1594         kfree(dev);
1595         return err;
1596 }
1597
1598 static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
1599 {
1600         struct cx23885_dev *dev = pci_get_drvdata(pci_dev);
1601
1602         cx23885_shutdown(dev);
1603
1604         pci_disable_device(pci_dev);
1605
1606         /* unregister stuff */
1607         free_irq(pci_dev->irq, dev);
1608         pci_set_drvdata(pci_dev, NULL);
1609
1610         mutex_lock(&devlist);
1611         list_del(&dev->devlist);
1612         mutex_unlock(&devlist);
1613
1614         cx23885_dev_unregister(dev);
1615         kfree(dev);
1616 }
1617
1618 static struct pci_device_id cx23885_pci_tbl[] = {
1619         {
1620                 /* CX23885 */
1621                 .vendor       = 0x14f1,
1622                 .device       = 0x8852,
1623                 .subvendor    = PCI_ANY_ID,
1624                 .subdevice    = PCI_ANY_ID,
1625         },{
1626                 /* CX23887 Rev 2 */
1627                 .vendor       = 0x14f1,
1628                 .device       = 0x8880,
1629                 .subvendor    = PCI_ANY_ID,
1630                 .subdevice    = PCI_ANY_ID,
1631         },{
1632                 /* --- end of list --- */
1633         }
1634 };
1635 MODULE_DEVICE_TABLE(pci, cx23885_pci_tbl);
1636
1637 static struct pci_driver cx23885_pci_driver = {
1638         .name     = "cx23885",
1639         .id_table = cx23885_pci_tbl,
1640         .probe    = cx23885_initdev,
1641         .remove   = __devexit_p(cx23885_finidev),
1642         /* TODO */
1643         .suspend  = NULL,
1644         .resume   = NULL,
1645 };
1646
1647 static int cx23885_init(void)
1648 {
1649         printk(KERN_INFO "cx23885 driver version %d.%d.%d loaded\n",
1650                (CX23885_VERSION_CODE >> 16) & 0xff,
1651                (CX23885_VERSION_CODE >>  8) & 0xff,
1652                CX23885_VERSION_CODE & 0xff);
1653 #ifdef SNAPSHOT
1654         printk(KERN_INFO "cx23885: snapshot date %04d-%02d-%02d\n",
1655                SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
1656 #endif
1657         return pci_register_driver(&cx23885_pci_driver);
1658 }
1659
1660 static void cx23885_fini(void)
1661 {
1662         pci_unregister_driver(&cx23885_pci_driver);
1663 }
1664
1665 module_init(cx23885_init);
1666 module_exit(cx23885_fini);
1667
1668 /* ----------------------------------------------------------- */
1669 /*
1670  * Local variables:
1671  * c-basic-offset: 8
1672  * End:
1673  * 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
1674  */