]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - drivers/media/video/cx23885/cx23885-core.c
V4L/DVB (13099): ir-functions: Export ir_rc5_decode() for use by the cx23885 module
[mirror_ubuntu-focal-kernel.git] / drivers / media / video / cx23885 / cx23885-core.c
CommitLineData
d19770e5
ST
1/*
2 * Driver for the Conexant CX23885 PCIe bridge
3 *
6d897616 4 * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
d19770e5
ST
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"
5a23b076 34#include "cimax2.h"
29f8a0a5 35#include "cx23888-ir.h"
f59ad611 36#include "cx23885-ir.h"
d19770e5
ST
37
38MODULE_DESCRIPTION("Driver for cx23885 based TV cards");
6d897616 39MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
d19770e5
ST
40MODULE_LICENSE("GPL");
41
4513fc69 42static unsigned int debug;
9c8ced51
ST
43module_param(debug, int, 0644);
44MODULE_PARM_DESC(debug, "enable debug messages");
d19770e5
ST
45
46static unsigned int card[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
47module_param_array(card, int, NULL, 0444);
9c8ced51 48MODULE_PARM_DESC(card, "card type");
d19770e5 49
4513fc69
ST
50#define dprintk(level, fmt, arg...)\
51 do { if (debug >= level)\
52 printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
53 } while (0)
d19770e5
ST
54
55static unsigned int cx23885_devcount;
56
57static DEFINE_MUTEX(devlist);
7b888014 58LIST_HEAD(cx23885_devlist);
d19770e5
ST
59
60#define NO_SYNC_LINE (-1U)
61
d19770e5
ST
62/* FIXME, these allocations will change when
63 * analog arrives. The be reviewed.
64 * CX23887 Assumptions
65 * 1 line = 16 bytes of CDT
66 * cmds size = 80
67 * cdt size = 16 * linesize
68 * iqsize = 64
69 * maxlines = 6
70 *
71 * Address Space:
72 * 0x00000000 0x00008fff FIFO clusters
73 * 0x00010000 0x000104af Channel Management Data Structures
74 * 0x000104b0 0x000104ff Free
75 * 0x00010500 0x000108bf 15 channels * iqsize
76 * 0x000108c0 0x000108ff Free
77 * 0x00010900 0x00010e9f IQ's + Cluster Descriptor Tables
78 * 15 channels * (iqsize + (maxlines * linesize))
79 * 0x00010ea0 0x00010xxx Free
80 */
81
7e994302 82static struct sram_channel cx23885_sram_channels[] = {
d19770e5 83 [SRAM_CH01] = {
69ad6e56
ST
84 .name = "VID A",
85 .cmds_start = 0x10000,
d8d12b43
ST
86 .ctrl_start = 0x10380,
87 .cdt = 0x104c0,
69ad6e56
ST
88 .fifo_start = 0x40,
89 .fifo_size = 0x2800,
d19770e5
ST
90 .ptr1_reg = DMA1_PTR1,
91 .ptr2_reg = DMA1_PTR2,
92 .cnt1_reg = DMA1_CNT1,
93 .cnt2_reg = DMA1_CNT2,
94 },
95 [SRAM_CH02] = {
96 .name = "ch2",
97 .cmds_start = 0x0,
98 .ctrl_start = 0x0,
99 .cdt = 0x0,
100 .fifo_start = 0x0,
101 .fifo_size = 0x0,
102 .ptr1_reg = DMA2_PTR1,
103 .ptr2_reg = DMA2_PTR2,
104 .cnt1_reg = DMA2_CNT1,
105 .cnt2_reg = DMA2_CNT2,
106 },
107 [SRAM_CH03] = {
69ad6e56
ST
108 .name = "TS1 B",
109 .cmds_start = 0x100A0,
d8d12b43
ST
110 .ctrl_start = 0x10400,
111 .cdt = 0x10580,
69ad6e56
ST
112 .fifo_start = 0x5000,
113 .fifo_size = 0x1000,
d19770e5
ST
114 .ptr1_reg = DMA3_PTR1,
115 .ptr2_reg = DMA3_PTR2,
116 .cnt1_reg = DMA3_CNT1,
117 .cnt2_reg = DMA3_CNT2,
118 },
119 [SRAM_CH04] = {
120 .name = "ch4",
121 .cmds_start = 0x0,
122 .ctrl_start = 0x0,
123 .cdt = 0x0,
124 .fifo_start = 0x0,
125 .fifo_size = 0x0,
126 .ptr1_reg = DMA4_PTR1,
127 .ptr2_reg = DMA4_PTR2,
128 .cnt1_reg = DMA4_CNT1,
129 .cnt2_reg = DMA4_CNT2,
130 },
131 [SRAM_CH05] = {
132 .name = "ch5",
133 .cmds_start = 0x0,
134 .ctrl_start = 0x0,
135 .cdt = 0x0,
136 .fifo_start = 0x0,
137 .fifo_size = 0x0,
138 .ptr1_reg = DMA5_PTR1,
139 .ptr2_reg = DMA5_PTR2,
140 .cnt1_reg = DMA5_CNT1,
141 .cnt2_reg = DMA5_CNT2,
142 },
143 [SRAM_CH06] = {
144 .name = "TS2 C",
145 .cmds_start = 0x10140,
d8d12b43
ST
146 .ctrl_start = 0x10440,
147 .cdt = 0x105e0,
d19770e5
ST
148 .fifo_start = 0x6000,
149 .fifo_size = 0x1000,
150 .ptr1_reg = DMA5_PTR1,
151 .ptr2_reg = DMA5_PTR2,
152 .cnt1_reg = DMA5_CNT1,
153 .cnt2_reg = DMA5_CNT2,
154 },
155 [SRAM_CH07] = {
156 .name = "ch7",
157 .cmds_start = 0x0,
158 .ctrl_start = 0x0,
159 .cdt = 0x0,
160 .fifo_start = 0x0,
161 .fifo_size = 0x0,
162 .ptr1_reg = DMA6_PTR1,
163 .ptr2_reg = DMA6_PTR2,
164 .cnt1_reg = DMA6_CNT1,
165 .cnt2_reg = DMA6_CNT2,
166 },
167 [SRAM_CH08] = {
168 .name = "ch8",
169 .cmds_start = 0x0,
170 .ctrl_start = 0x0,
171 .cdt = 0x0,
172 .fifo_start = 0x0,
173 .fifo_size = 0x0,
174 .ptr1_reg = DMA7_PTR1,
175 .ptr2_reg = DMA7_PTR2,
176 .cnt1_reg = DMA7_CNT1,
177 .cnt2_reg = DMA7_CNT2,
178 },
179 [SRAM_CH09] = {
180 .name = "ch9",
181 .cmds_start = 0x0,
182 .ctrl_start = 0x0,
183 .cdt = 0x0,
184 .fifo_start = 0x0,
185 .fifo_size = 0x0,
186 .ptr1_reg = DMA8_PTR1,
187 .ptr2_reg = DMA8_PTR2,
188 .cnt1_reg = DMA8_CNT1,
189 .cnt2_reg = DMA8_CNT2,
190 },
191};
192
7e994302
ST
193static struct sram_channel cx23887_sram_channels[] = {
194 [SRAM_CH01] = {
195 .name = "VID A",
196 .cmds_start = 0x10000,
197 .ctrl_start = 0x105b0,
198 .cdt = 0x107b0,
199 .fifo_start = 0x40,
200 .fifo_size = 0x2800,
201 .ptr1_reg = DMA1_PTR1,
202 .ptr2_reg = DMA1_PTR2,
203 .cnt1_reg = DMA1_CNT1,
204 .cnt2_reg = DMA1_CNT2,
205 },
206 [SRAM_CH02] = {
207 .name = "ch2",
208 .cmds_start = 0x0,
209 .ctrl_start = 0x0,
210 .cdt = 0x0,
211 .fifo_start = 0x0,
212 .fifo_size = 0x0,
213 .ptr1_reg = DMA2_PTR1,
214 .ptr2_reg = DMA2_PTR2,
215 .cnt1_reg = DMA2_CNT1,
216 .cnt2_reg = DMA2_CNT2,
217 },
218 [SRAM_CH03] = {
219 .name = "TS1 B",
220 .cmds_start = 0x100A0,
221 .ctrl_start = 0x10630,
222 .cdt = 0x10870,
223 .fifo_start = 0x5000,
224 .fifo_size = 0x1000,
225 .ptr1_reg = DMA3_PTR1,
226 .ptr2_reg = DMA3_PTR2,
227 .cnt1_reg = DMA3_CNT1,
228 .cnt2_reg = DMA3_CNT2,
229 },
230 [SRAM_CH04] = {
231 .name = "ch4",
232 .cmds_start = 0x0,
233 .ctrl_start = 0x0,
234 .cdt = 0x0,
235 .fifo_start = 0x0,
236 .fifo_size = 0x0,
237 .ptr1_reg = DMA4_PTR1,
238 .ptr2_reg = DMA4_PTR2,
239 .cnt1_reg = DMA4_CNT1,
240 .cnt2_reg = DMA4_CNT2,
241 },
242 [SRAM_CH05] = {
243 .name = "ch5",
244 .cmds_start = 0x0,
245 .ctrl_start = 0x0,
246 .cdt = 0x0,
247 .fifo_start = 0x0,
248 .fifo_size = 0x0,
249 .ptr1_reg = DMA5_PTR1,
250 .ptr2_reg = DMA5_PTR2,
251 .cnt1_reg = DMA5_CNT1,
252 .cnt2_reg = DMA5_CNT2,
253 },
254 [SRAM_CH06] = {
255 .name = "TS2 C",
256 .cmds_start = 0x10140,
257 .ctrl_start = 0x10670,
258 .cdt = 0x108d0,
259 .fifo_start = 0x6000,
260 .fifo_size = 0x1000,
261 .ptr1_reg = DMA5_PTR1,
262 .ptr2_reg = DMA5_PTR2,
263 .cnt1_reg = DMA5_CNT1,
264 .cnt2_reg = DMA5_CNT2,
265 },
266 [SRAM_CH07] = {
267 .name = "ch7",
268 .cmds_start = 0x0,
269 .ctrl_start = 0x0,
270 .cdt = 0x0,
271 .fifo_start = 0x0,
272 .fifo_size = 0x0,
273 .ptr1_reg = DMA6_PTR1,
274 .ptr2_reg = DMA6_PTR2,
275 .cnt1_reg = DMA6_CNT1,
276 .cnt2_reg = DMA6_CNT2,
277 },
278 [SRAM_CH08] = {
279 .name = "ch8",
280 .cmds_start = 0x0,
281 .ctrl_start = 0x0,
282 .cdt = 0x0,
283 .fifo_start = 0x0,
284 .fifo_size = 0x0,
285 .ptr1_reg = DMA7_PTR1,
286 .ptr2_reg = DMA7_PTR2,
287 .cnt1_reg = DMA7_CNT1,
288 .cnt2_reg = DMA7_CNT2,
289 },
290 [SRAM_CH09] = {
291 .name = "ch9",
292 .cmds_start = 0x0,
293 .ctrl_start = 0x0,
294 .cdt = 0x0,
295 .fifo_start = 0x0,
296 .fifo_size = 0x0,
297 .ptr1_reg = DMA8_PTR1,
298 .ptr2_reg = DMA8_PTR2,
299 .cnt1_reg = DMA8_CNT1,
300 .cnt2_reg = DMA8_CNT2,
301 },
302};
303
d19770e5
ST
304static int cx23885_risc_decode(u32 risc)
305{
306 static char *instr[16] = {
b1b81f1d
ST
307 [RISC_SYNC >> 28] = "sync",
308 [RISC_WRITE >> 28] = "write",
309 [RISC_WRITEC >> 28] = "writec",
310 [RISC_READ >> 28] = "read",
311 [RISC_READC >> 28] = "readc",
312 [RISC_JUMP >> 28] = "jump",
313 [RISC_SKIP >> 28] = "skip",
314 [RISC_WRITERM >> 28] = "writerm",
315 [RISC_WRITECM >> 28] = "writecm",
316 [RISC_WRITECR >> 28] = "writecr",
d19770e5
ST
317 };
318 static int incr[16] = {
b1b81f1d
ST
319 [RISC_WRITE >> 28] = 3,
320 [RISC_JUMP >> 28] = 3,
321 [RISC_SKIP >> 28] = 1,
322 [RISC_SYNC >> 28] = 1,
323 [RISC_WRITERM >> 28] = 3,
324 [RISC_WRITECM >> 28] = 3,
325 [RISC_WRITECR >> 28] = 4,
d19770e5
ST
326 };
327 static char *bits[] = {
328 "12", "13", "14", "resync",
329 "cnt0", "cnt1", "18", "19",
330 "20", "21", "22", "23",
331 "irq1", "irq2", "eol", "sol",
332 };
333 int i;
334
335 printk("0x%08x [ %s", risc,
336 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
44a6481d 337 for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--)
d19770e5 338 if (risc & (1 << (i + 12)))
44a6481d 339 printk(" %s", bits[i]);
d19770e5
ST
340 printk(" count=%d ]\n", risc & 0xfff);
341 return incr[risc >> 28] ? incr[risc >> 28] : 1;
342}
343
7b888014 344void cx23885_wakeup(struct cx23885_tsport *port,
39e75cfe 345 struct cx23885_dmaqueue *q, u32 count)
d19770e5
ST
346{
347 struct cx23885_dev *dev = port->dev;
348 struct cx23885_buffer *buf;
349 int bc;
350
351 for (bc = 0;; bc++) {
352 if (list_empty(&q->active))
353 break;
354 buf = list_entry(q->active.next,
355 struct cx23885_buffer, vb.queue);
2e52f215 356
d19770e5
ST
357 /* count comes from the hw and is is 16bit wide --
358 * this trick handles wrap-arounds correctly for
359 * up to 32767 buffers in flight... */
360 if ((s16) (count - buf->count) < 0)
361 break;
2e52f215 362
d19770e5 363 do_gettimeofday(&buf->vb.ts);
44a6481d 364 dprintk(2, "[%p/%d] wakeup reg=%d buf=%d\n", buf, buf->vb.i,
d19770e5 365 count, buf->count);
0fc0686e 366 buf->vb.state = VIDEOBUF_DONE;
d19770e5
ST
367 list_del(&buf->vb.queue);
368 wake_up(&buf->vb.done);
369 }
9c8ced51 370 if (list_empty(&q->active))
d19770e5 371 del_timer(&q->timeout);
9c8ced51 372 else
44a6481d 373 mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
d19770e5 374 if (bc != 1)
9c8ced51 375 printk(KERN_WARNING "%s: %d buffers handled (should be 1)\n",
22b4e64f 376 __func__, bc);
d19770e5 377}
d19770e5 378
7b888014 379int cx23885_sram_channel_setup(struct cx23885_dev *dev,
39e75cfe
AB
380 struct sram_channel *ch,
381 unsigned int bpl, u32 risc)
d19770e5 382{
44a6481d 383 unsigned int i, lines;
d19770e5
ST
384 u32 cdt;
385
9c8ced51 386 if (ch->cmds_start == 0) {
22b4e64f 387 dprintk(1, "%s() Erasing channel [%s]\n", __func__,
44a6481d 388 ch->name);
d19770e5
ST
389 cx_write(ch->ptr1_reg, 0);
390 cx_write(ch->ptr2_reg, 0);
391 cx_write(ch->cnt2_reg, 0);
392 cx_write(ch->cnt1_reg, 0);
393 return 0;
394 } else {
22b4e64f 395 dprintk(1, "%s() Configuring channel [%s]\n", __func__,
44a6481d 396 ch->name);
d19770e5
ST
397 }
398
399 bpl = (bpl + 7) & ~7; /* alignment */
400 cdt = ch->cdt;
401 lines = ch->fifo_size / bpl;
402 if (lines > 6)
403 lines = 6;
404 BUG_ON(lines < 2);
405
86ecc027
AV
406 cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
407 cx_write(8 + 4, 8);
408 cx_write(8 + 8, 0);
d19770e5
ST
409
410 /* write CDT */
411 for (i = 0; i < lines; i++) {
22b4e64f 412 dprintk(2, "%s() 0x%08x <- 0x%08x\n", __func__, cdt + 16*i,
44a6481d 413 ch->fifo_start + bpl*i);
d19770e5
ST
414 cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
415 cx_write(cdt + 16*i + 4, 0);
416 cx_write(cdt + 16*i + 8, 0);
417 cx_write(cdt + 16*i + 12, 0);
418 }
419
420 /* write CMDS */
421 if (ch->jumponly)
9c8ced51 422 cx_write(ch->cmds_start + 0, 8);
d19770e5 423 else
9c8ced51 424 cx_write(ch->cmds_start + 0, risc);
d19770e5
ST
425 cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
426 cx_write(ch->cmds_start + 8, cdt);
427 cx_write(ch->cmds_start + 12, (lines*16) >> 3);
428 cx_write(ch->cmds_start + 16, ch->ctrl_start);
429 if (ch->jumponly)
9c8ced51 430 cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
d19770e5
ST
431 else
432 cx_write(ch->cmds_start + 20, 64 >> 2);
433 for (i = 24; i < 80; i += 4)
434 cx_write(ch->cmds_start + i, 0);
435
436 /* fill registers */
437 cx_write(ch->ptr1_reg, ch->fifo_start);
438 cx_write(ch->ptr2_reg, cdt);
439 cx_write(ch->cnt2_reg, (lines*16) >> 3);
9c8ced51 440 cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
d19770e5 441
9c8ced51 442 dprintk(2, "[bridge %d] sram setup %s: bpl=%d lines=%d\n",
e133be0f 443 dev->bridge,
d19770e5
ST
444 ch->name,
445 bpl,
446 lines);
447
448 return 0;
449}
450
7b888014 451void cx23885_sram_channel_dump(struct cx23885_dev *dev,
39e75cfe 452 struct sram_channel *ch)
d19770e5
ST
453{
454 static char *name[] = {
455 "init risc lo",
456 "init risc hi",
457 "cdt base",
458 "cdt size",
459 "iq base",
460 "iq size",
461 "risc pc lo",
462 "risc pc hi",
463 "iq wr ptr",
464 "iq rd ptr",
465 "cdt current",
466 "pci target lo",
467 "pci target hi",
468 "line / byte",
469 };
470 u32 risc;
44a6481d 471 unsigned int i, j, n;
d19770e5 472
9c8ced51 473 printk(KERN_WARNING "%s: %s - dma channel status dump\n",
d19770e5
ST
474 dev->name, ch->name);
475 for (i = 0; i < ARRAY_SIZE(name); i++)
9c8ced51 476 printk(KERN_WARNING "%s: cmds: %-15s: 0x%08x\n",
d19770e5
ST
477 dev->name, name[i],
478 cx_read(ch->cmds_start + 4*i));
479
480 for (i = 0; i < 4; i++) {
44a6481d 481 risc = cx_read(ch->cmds_start + 4 * (i + 14));
9c8ced51 482 printk(KERN_WARNING "%s: risc%d: ", dev->name, i);
d19770e5
ST
483 cx23885_risc_decode(risc);
484 }
485 for (i = 0; i < (64 >> 2); i += n) {
44a6481d
MK
486 risc = cx_read(ch->ctrl_start + 4 * i);
487 /* No consideration for bits 63-32 */
488
9c8ced51 489 printk(KERN_WARNING "%s: (0x%08x) iq %x: ", dev->name,
44a6481d 490 ch->ctrl_start + 4 * i, i);
d19770e5
ST
491 n = cx23885_risc_decode(risc);
492 for (j = 1; j < n; j++) {
44a6481d 493 risc = cx_read(ch->ctrl_start + 4 * (i + j));
9c8ced51 494 printk(KERN_WARNING "%s: iq %x: 0x%08x [ arg #%d ]\n",
d19770e5
ST
495 dev->name, i+j, risc, j);
496 }
497 }
498
9c8ced51 499 printk(KERN_WARNING "%s: fifo: 0x%08x -> 0x%x\n",
d19770e5 500 dev->name, ch->fifo_start, ch->fifo_start+ch->fifo_size);
9c8ced51 501 printk(KERN_WARNING "%s: ctrl: 0x%08x -> 0x%x\n",
44a6481d 502 dev->name, ch->ctrl_start, ch->ctrl_start + 6*16);
9c8ced51 503 printk(KERN_WARNING "%s: ptr1_reg: 0x%08x\n",
d19770e5 504 dev->name, cx_read(ch->ptr1_reg));
9c8ced51 505 printk(KERN_WARNING "%s: ptr2_reg: 0x%08x\n",
d19770e5 506 dev->name, cx_read(ch->ptr2_reg));
9c8ced51 507 printk(KERN_WARNING "%s: cnt1_reg: 0x%08x\n",
d19770e5 508 dev->name, cx_read(ch->cnt1_reg));
9c8ced51 509 printk(KERN_WARNING "%s: cnt2_reg: 0x%08x\n",
d19770e5
ST
510 dev->name, cx_read(ch->cnt2_reg));
511}
512
39e75cfe
AB
513static void cx23885_risc_disasm(struct cx23885_tsport *port,
514 struct btcx_riscmem *risc)
d19770e5
ST
515{
516 struct cx23885_dev *dev = port->dev;
44a6481d 517 unsigned int i, j, n;
d19770e5 518
9c8ced51 519 printk(KERN_INFO "%s: risc disasm: %p [dma=0x%08lx]\n",
d19770e5
ST
520 dev->name, risc->cpu, (unsigned long)risc->dma);
521 for (i = 0; i < (risc->size >> 2); i += n) {
9c8ced51 522 printk(KERN_INFO "%s: %04d: ", dev->name, i);
86ecc027 523 n = cx23885_risc_decode(le32_to_cpu(risc->cpu[i]));
d19770e5 524 for (j = 1; j < n; j++)
9c8ced51 525 printk(KERN_INFO "%s: %04d: 0x%08x [ arg #%d ]\n",
44a6481d 526 dev->name, i + j, risc->cpu[i + j], j);
86ecc027 527 if (risc->cpu[i] == cpu_to_le32(RISC_JUMP))
d19770e5
ST
528 break;
529 }
530}
531
39e75cfe 532static void cx23885_shutdown(struct cx23885_dev *dev)
d19770e5
ST
533{
534 /* disable RISC controller */
535 cx_write(DEV_CNTRL2, 0);
536
537 /* Disable all IR activity */
538 cx_write(IR_CNTRL_REG, 0);
539
540 /* Disable Video A/B activity */
541 cx_write(VID_A_DMA_CTL, 0);
542 cx_write(VID_B_DMA_CTL, 0);
543 cx_write(VID_C_DMA_CTL, 0);
544
545 /* Disable Audio activity */
546 cx_write(AUD_INT_DMA_CTL, 0);
547 cx_write(AUD_EXT_DMA_CTL, 0);
548
549 /* Disable Serial port */
550 cx_write(UART_CTL, 0);
551
552 /* Disable Interrupts */
553 cx_write(PCI_INT_MSK, 0);
554 cx_write(VID_A_INT_MSK, 0);
555 cx_write(VID_B_INT_MSK, 0);
556 cx_write(VID_C_INT_MSK, 0);
557 cx_write(AUDIO_INT_INT_MSK, 0);
558 cx_write(AUDIO_EXT_INT_MSK, 0);
559
560}
561
39e75cfe 562static void cx23885_reset(struct cx23885_dev *dev)
d19770e5 563{
22b4e64f 564 dprintk(1, "%s()\n", __func__);
d19770e5
ST
565
566 cx23885_shutdown(dev);
567
568 cx_write(PCI_INT_STAT, 0xffffffff);
569 cx_write(VID_A_INT_STAT, 0xffffffff);
570 cx_write(VID_B_INT_STAT, 0xffffffff);
571 cx_write(VID_C_INT_STAT, 0xffffffff);
572 cx_write(AUDIO_INT_INT_STAT, 0xffffffff);
573 cx_write(AUDIO_EXT_INT_STAT, 0xffffffff);
574 cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
ecda5966 575 cx_write(PAD_CTRL, 0x00500300);
d19770e5
ST
576
577 mdelay(100);
578
7b888014
ST
579 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH01],
580 720*4, 0);
581 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH02], 128, 0);
582 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH03],
583 188*4, 0);
584 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH04], 128, 0);
585 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH05], 128, 0);
586 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH06],
587 188*4, 0);
588 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH07], 128, 0);
589 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH08], 128, 0);
590 cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH09], 128, 0);
d19770e5 591
a6a3f140 592 cx23885_gpio_setup(dev);
d19770e5
ST
593}
594
595
596static int cx23885_pci_quirks(struct cx23885_dev *dev)
597{
22b4e64f 598 dprintk(1, "%s()\n", __func__);
d19770e5 599
2df9a4c2
ST
600 /* The cx23885 bridge has a weird bug which causes NMI to be asserted
601 * when DMA begins if RDR_TLCTL0 bit4 is not cleared. It does not
602 * occur on the cx23887 bridge.
603 */
9c8ced51 604 if (dev->bridge == CX23885_BRIDGE_885)
d19770e5 605 cx_clear(RDR_TLCTL0, 1 << 4);
4823e9ee 606
d19770e5
ST
607 return 0;
608}
609
610static int get_resources(struct cx23885_dev *dev)
611{
9c8ced51
ST
612 if (request_mem_region(pci_resource_start(dev->pci, 0),
613 pci_resource_len(dev->pci, 0),
44a6481d 614 dev->name))
d19770e5
ST
615 return 0;
616
617 printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n",
9c8ced51 618 dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
d19770e5
ST
619
620 return -EBUSY;
621}
622
623static void cx23885_timeout(unsigned long data);
7b888014 624int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
39e75cfe 625 u32 reg, u32 mask, u32 value);
d19770e5 626
9c8ced51
ST
627static int cx23885_init_tsport(struct cx23885_dev *dev,
628 struct cx23885_tsport *port, int portno)
d19770e5 629{
22b4e64f 630 dprintk(1, "%s(portno=%d)\n", __func__, portno);
a6a3f140
ST
631
632 /* Transport bus init dma queue - Common settings */
633 port->dma_ctl_val = 0x11; /* Enable RISC controller and Fifo */
634 port->ts_int_msk_val = 0x1111; /* TS port bits for RISC */
b1b81f1d
ST
635 port->vld_misc_val = 0x0;
636 port->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4);
a6a3f140
ST
637
638 spin_lock_init(&port->slock);
639 port->dev = dev;
640 port->nr = portno;
641
642 INIT_LIST_HEAD(&port->mpegq.active);
643 INIT_LIST_HEAD(&port->mpegq.queued);
644 port->mpegq.timeout.function = cx23885_timeout;
645 port->mpegq.timeout.data = (unsigned long)port;
646 init_timer(&port->mpegq.timeout);
647
d782ffa2 648 mutex_init(&port->frontends.lock);
7bdf84fc 649 INIT_LIST_HEAD(&port->frontends.felist);
d782ffa2
ST
650 port->frontends.active_fe_id = 0;
651
a739a7e4
ST
652 /* This should be hardcoded allow a single frontend
653 * attachment to this tsport, keeping the -dvb.c
654 * code clean and safe.
655 */
9c8ced51 656 if (!port->num_frontends)
a739a7e4
ST
657 port->num_frontends = 1;
658
9c8ced51 659 switch (portno) {
a6a3f140
ST
660 case 1:
661 port->reg_gpcnt = VID_B_GPCNT;
662 port->reg_gpcnt_ctl = VID_B_GPCNT_CTL;
663 port->reg_dma_ctl = VID_B_DMA_CTL;
664 port->reg_lngth = VID_B_LNGTH;
665 port->reg_hw_sop_ctrl = VID_B_HW_SOP_CTL;
666 port->reg_gen_ctrl = VID_B_GEN_CTL;
667 port->reg_bd_pkt_status = VID_B_BD_PKT_STATUS;
668 port->reg_sop_status = VID_B_SOP_STATUS;
669 port->reg_fifo_ovfl_stat = VID_B_FIFO_OVFL_STAT;
670 port->reg_vld_misc = VID_B_VLD_MISC;
671 port->reg_ts_clk_en = VID_B_TS_CLK_EN;
672 port->reg_src_sel = VID_B_SRC_SEL;
673 port->reg_ts_int_msk = VID_B_INT_MSK;
b1b81f1d 674 port->reg_ts_int_stat = VID_B_INT_STAT;
a6a3f140
ST
675 port->sram_chno = SRAM_CH03; /* VID_B */
676 port->pci_irqmask = 0x02; /* VID_B bit1 */
677 break;
678 case 2:
679 port->reg_gpcnt = VID_C_GPCNT;
680 port->reg_gpcnt_ctl = VID_C_GPCNT_CTL;
681 port->reg_dma_ctl = VID_C_DMA_CTL;
682 port->reg_lngth = VID_C_LNGTH;
683 port->reg_hw_sop_ctrl = VID_C_HW_SOP_CTL;
684 port->reg_gen_ctrl = VID_C_GEN_CTL;
685 port->reg_bd_pkt_status = VID_C_BD_PKT_STATUS;
686 port->reg_sop_status = VID_C_SOP_STATUS;
687 port->reg_fifo_ovfl_stat = VID_C_FIFO_OVFL_STAT;
688 port->reg_vld_misc = VID_C_VLD_MISC;
689 port->reg_ts_clk_en = VID_C_TS_CLK_EN;
690 port->reg_src_sel = 0;
691 port->reg_ts_int_msk = VID_C_INT_MSK;
692 port->reg_ts_int_stat = VID_C_INT_STAT;
693 port->sram_chno = SRAM_CH06; /* VID_C */
694 port->pci_irqmask = 0x04; /* VID_C bit2 */
d19770e5 695 break;
a6a3f140
ST
696 default:
697 BUG();
d19770e5
ST
698 }
699
a6a3f140
ST
700 cx23885_risc_stopper(dev->pci, &port->mpegq.stopper,
701 port->reg_dma_ctl, port->dma_ctl_val, 0x00);
702
d19770e5
ST
703 return 0;
704}
705
0ac5881a
ST
706static void cx23885_dev_checkrevision(struct cx23885_dev *dev)
707{
708 switch (cx_read(RDR_CFG2) & 0xff) {
709 case 0x00:
710 /* cx23885 */
711 dev->hwrevision = 0xa0;
712 break;
713 case 0x01:
714 /* CX23885-12Z */
715 dev->hwrevision = 0xa1;
716 break;
717 case 0x02:
25ea66e2 718 /* CX23885-13Z/14Z */
0ac5881a
ST
719 dev->hwrevision = 0xb0;
720 break;
721 case 0x03:
25ea66e2
ST
722 if (dev->pci->device == 0x8880) {
723 /* CX23888-21Z/22Z */
724 dev->hwrevision = 0xc0;
725 } else {
726 /* CX23885-14Z */
727 dev->hwrevision = 0xa4;
728 }
729 break;
730 case 0x04:
731 if (dev->pci->device == 0x8880) {
732 /* CX23888-31Z */
733 dev->hwrevision = 0xd0;
734 } else {
735 /* CX23885-15Z, CX23888-31Z */
736 dev->hwrevision = 0xa5;
737 }
0ac5881a
ST
738 break;
739 case 0x0e:
740 /* CX23887-15Z */
741 dev->hwrevision = 0xc0;
742 case 0x0f:
743 /* CX23887-14Z */
744 dev->hwrevision = 0xb1;
745 break;
746 default:
747 printk(KERN_ERR "%s() New hardware revision found 0x%x\n",
22b4e64f 748 __func__, dev->hwrevision);
0ac5881a
ST
749 }
750 if (dev->hwrevision)
751 printk(KERN_INFO "%s() Hardware revision = 0x%02x\n",
22b4e64f 752 __func__, dev->hwrevision);
0ac5881a
ST
753 else
754 printk(KERN_ERR "%s() Hardware revision unknown 0x%x\n",
22b4e64f 755 __func__, dev->hwrevision);
0ac5881a
ST
756}
757
29f8a0a5
AW
758/* Find the first v4l2_subdev member of the group id in hw */
759struct v4l2_subdev *cx23885_find_hw(struct cx23885_dev *dev, u32 hw)
760{
761 struct v4l2_subdev *result = NULL;
762 struct v4l2_subdev *sd;
763
764 spin_lock(&dev->v4l2_dev.lock);
765 v4l2_device_for_each_subdev(sd, &dev->v4l2_dev) {
766 if (sd->grp_id == hw) {
767 result = sd;
768 break;
769 }
770 }
771 spin_unlock(&dev->v4l2_dev.lock);
772 return result;
773}
774
d19770e5
ST
775static int cx23885_dev_setup(struct cx23885_dev *dev)
776{
777 int i;
778
779 mutex_init(&dev->lock);
8386c27f 780 mutex_init(&dev->gpio_lock);
d19770e5
ST
781
782 atomic_inc(&dev->refcount);
783
784 dev->nr = cx23885_devcount++;
579f1163
ST
785 sprintf(dev->name, "cx23885[%d]", dev->nr);
786
787 mutex_lock(&devlist);
788 list_add_tail(&dev->devlist, &cx23885_devlist);
789 mutex_unlock(&devlist);
790
791 /* Configure the internal memory */
9c8ced51 792 if (dev->pci->device == 0x8880) {
25ea66e2 793 /* Could be 887 or 888, assume a default */
579f1163 794 dev->bridge = CX23885_BRIDGE_887;
c7712613
ST
795 /* Apply a sensible clock frequency for the PCIe bridge */
796 dev->clk_freq = 25000000;
7e994302 797 dev->sram_channels = cx23887_sram_channels;
579f1163 798 } else
9c8ced51 799 if (dev->pci->device == 0x8852) {
579f1163 800 dev->bridge = CX23885_BRIDGE_885;
c7712613
ST
801 /* Apply a sensible clock frequency for the PCIe bridge */
802 dev->clk_freq = 28000000;
7e994302 803 dev->sram_channels = cx23885_sram_channels;
579f1163
ST
804 } else
805 BUG();
806
807 dprintk(1, "%s() Memory configured for PCIe bridge type %d\n",
22b4e64f 808 __func__, dev->bridge);
579f1163
ST
809
810 /* board config */
811 dev->board = UNSET;
812 if (card[dev->nr] < cx23885_bcount)
813 dev->board = card[dev->nr];
814 for (i = 0; UNSET == dev->board && i < cx23885_idcount; i++)
815 if (dev->pci->subsystem_vendor == cx23885_subids[i].subvendor &&
816 dev->pci->subsystem_device == cx23885_subids[i].subdevice)
817 dev->board = cx23885_subids[i].card;
818 if (UNSET == dev->board) {
819 dev->board = CX23885_BOARD_UNKNOWN;
820 cx23885_card_list(dev);
821 }
822
c7712613
ST
823 /* If the user specific a clk freq override, apply it */
824 if (cx23885_boards[dev->board].clk_freq > 0)
825 dev->clk_freq = cx23885_boards[dev->board].clk_freq;
826
d19770e5
ST
827 dev->pci_bus = dev->pci->bus->number;
828 dev->pci_slot = PCI_SLOT(dev->pci->devfn);
829 dev->pci_irqmask = 0x001f00;
5a23b076
IL
830 if (cx23885_boards[dev->board].cimax > 0)
831 dev->pci_irqmask |= 0x01800000; /* for CiMaxes */
d19770e5
ST
832
833 /* External Master 1 Bus */
834 dev->i2c_bus[0].nr = 0;
835 dev->i2c_bus[0].dev = dev;
836 dev->i2c_bus[0].reg_stat = I2C1_STAT;
837 dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
838 dev->i2c_bus[0].reg_addr = I2C1_ADDR;
839 dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
840 dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
841 dev->i2c_bus[0].i2c_period = (0x9d << 24); /* 100kHz */
842
843 /* External Master 2 Bus */
844 dev->i2c_bus[1].nr = 1;
845 dev->i2c_bus[1].dev = dev;
846 dev->i2c_bus[1].reg_stat = I2C2_STAT;
847 dev->i2c_bus[1].reg_ctrl = I2C2_CTRL;
848 dev->i2c_bus[1].reg_addr = I2C2_ADDR;
849 dev->i2c_bus[1].reg_rdata = I2C2_RDATA;
850 dev->i2c_bus[1].reg_wdata = I2C2_WDATA;
851 dev->i2c_bus[1].i2c_period = (0x9d << 24); /* 100kHz */
852
853 /* Internal Master 3 Bus */
854 dev->i2c_bus[2].nr = 2;
855 dev->i2c_bus[2].dev = dev;
856 dev->i2c_bus[2].reg_stat = I2C3_STAT;
857 dev->i2c_bus[2].reg_ctrl = I2C3_CTRL;
a2129af5 858 dev->i2c_bus[2].reg_addr = I2C3_ADDR;
d19770e5
ST
859 dev->i2c_bus[2].reg_rdata = I2C3_RDATA;
860 dev->i2c_bus[2].reg_wdata = I2C3_WDATA;
861 dev->i2c_bus[2].i2c_period = (0x07 << 24); /* 1.95MHz */
862
b1b81f1d
ST
863 if ((cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) ||
864 (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER))
a6a3f140 865 cx23885_init_tsport(dev, &dev->ts1, 1);
579f1163 866
b1b81f1d
ST
867 if ((cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) ||
868 (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER))
a6a3f140 869 cx23885_init_tsport(dev, &dev->ts2, 2);
d19770e5 870
d19770e5
ST
871 if (get_resources(dev) < 0) {
872 printk(KERN_ERR "CORE %s No more PCIe resources for "
44a6481d
MK
873 "subsystem: %04x:%04x\n",
874 dev->name, dev->pci->subsystem_vendor,
875 dev->pci->subsystem_device);
d19770e5
ST
876
877 cx23885_devcount--;
fcf94c89 878 return -ENODEV;
d19770e5
ST
879 }
880
d19770e5 881 /* PCIe stuff */
9c8ced51
ST
882 dev->lmmio = ioremap(pci_resource_start(dev->pci, 0),
883 pci_resource_len(dev->pci, 0));
d19770e5
ST
884
885 dev->bmmio = (u8 __iomem *)dev->lmmio;
886
d19770e5 887 printk(KERN_INFO "CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
44a6481d
MK
888 dev->name, dev->pci->subsystem_vendor,
889 dev->pci->subsystem_device, cx23885_boards[dev->board].name,
890 dev->board, card[dev->nr] == dev->board ?
891 "insmod option" : "autodetected");
d19770e5 892
4823e9ee
ST
893 cx23885_pci_quirks(dev);
894
7b888014
ST
895 /* Assume some sensible defaults */
896 dev->tuner_type = cx23885_boards[dev->board].tuner_type;
897 dev->tuner_addr = cx23885_boards[dev->board].tuner_addr;
898 dev->radio_type = cx23885_boards[dev->board].radio_type;
899 dev->radio_addr = cx23885_boards[dev->board].radio_addr;
900
901 dprintk(1, "%s() tuner_type = 0x%x tuner_addr = 0x%x\n",
22b4e64f 902 __func__, dev->tuner_type, dev->tuner_addr);
7b888014 903 dprintk(1, "%s() radio_type = 0x%x radio_addr = 0x%x\n",
22b4e64f 904 __func__, dev->radio_type, dev->radio_addr);
7b888014 905
f659c513
ST
906 /* The cx23417 encoder has GPIO's that need to be initialised
907 * before DVB, so that demodulators and tuners are out of
908 * reset before DVB uses them.
909 */
910 if ((cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) ||
911 (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER))
912 cx23885_mc417_init(dev);
913
d19770e5
ST
914 /* init hardware */
915 cx23885_reset(dev);
916
917 cx23885_i2c_register(&dev->i2c_bus[0]);
918 cx23885_i2c_register(&dev->i2c_bus[1]);
919 cx23885_i2c_register(&dev->i2c_bus[2]);
d19770e5 920 cx23885_card_setup(dev);
7c9fc9d5 921 call_all(dev, tuner, s_standby);
d19770e5
ST
922 cx23885_ir_init(dev);
923
7b888014
ST
924 if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO) {
925 if (cx23885_video_register(dev) < 0) {
926 printk(KERN_ERR "%s() Failed to register analog "
22b4e64f 927 "video adapters on VID_A\n", __func__);
7b888014
ST
928 }
929 }
930
931 if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
a6a3f140
ST
932 if (cx23885_dvb_register(&dev->ts1) < 0) {
933 printk(KERN_ERR "%s() Failed to register dvb adapters on VID_B\n",
22b4e64f 934 __func__);
a6a3f140 935 }
b1b81f1d
ST
936 } else
937 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
938 if (cx23885_417_register(dev) < 0) {
939 printk(KERN_ERR
940 "%s() Failed to register 417 on VID_B\n",
941 __func__);
942 }
579f1163
ST
943 }
944
7b888014 945 if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
a6a3f140 946 if (cx23885_dvb_register(&dev->ts2) < 0) {
b1b81f1d
ST
947 printk(KERN_ERR
948 "%s() Failed to register dvb on VID_C\n",
949 __func__);
950 }
951 } else
952 if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER) {
953 if (cx23885_417_register(dev) < 0) {
954 printk(KERN_ERR
955 "%s() Failed to register 417 on VID_C\n",
22b4e64f 956 __func__);
a6a3f140 957 }
d19770e5
ST
958 }
959
0ac5881a
ST
960 cx23885_dev_checkrevision(dev);
961
d19770e5 962 return 0;
d19770e5
ST
963}
964
39e75cfe 965static void cx23885_dev_unregister(struct cx23885_dev *dev)
d19770e5 966{
9c8ced51
ST
967 release_mem_region(pci_resource_start(dev->pci, 0),
968 pci_resource_len(dev->pci, 0));
d19770e5
ST
969
970 if (!atomic_dec_and_test(&dev->refcount))
971 return;
972
7b888014
ST
973 if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO)
974 cx23885_video_unregister(dev);
975
b1b81f1d 976 if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
a6a3f140
ST
977 cx23885_dvb_unregister(&dev->ts1);
978
b1b81f1d
ST
979 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
980 cx23885_417_unregister(dev);
981
982 if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
a6a3f140
ST
983 cx23885_dvb_unregister(&dev->ts2);
984
b1b81f1d
ST
985 if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
986 cx23885_417_unregister(dev);
987
d19770e5
ST
988 cx23885_i2c_unregister(&dev->i2c_bus[2]);
989 cx23885_i2c_unregister(&dev->i2c_bus[1]);
990 cx23885_i2c_unregister(&dev->i2c_bus[0]);
991
992 iounmap(dev->lmmio);
993}
994
9c8ced51 995static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist,
44a6481d
MK
996 unsigned int offset, u32 sync_line,
997 unsigned int bpl, unsigned int padding,
998 unsigned int lines)
d19770e5
ST
999{
1000 struct scatterlist *sg;
44a6481d 1001 unsigned int line, todo;
d19770e5
ST
1002
1003 /* sync instruction */
1004 if (sync_line != NO_SYNC_LINE)
1005 *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1006
1007 /* scan lines */
1008 sg = sglist;
1009 for (line = 0; line < lines; line++) {
1010 while (offset && offset >= sg_dma_len(sg)) {
1011 offset -= sg_dma_len(sg);
1012 sg++;
1013 }
1014 if (bpl <= sg_dma_len(sg)-offset) {
1015 /* fits into current chunk */
9c8ced51
ST
1016 *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|RISC_EOL|bpl);
1017 *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
1018 *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1019 offset += bpl;
d19770e5
ST
1020 } else {
1021 /* scanline needs to be split */
1022 todo = bpl;
9c8ced51 1023 *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|
d19770e5 1024 (sg_dma_len(sg)-offset));
9c8ced51
ST
1025 *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
1026 *(rp++) = cpu_to_le32(0); /* bits 63-32 */
d19770e5
ST
1027 todo -= (sg_dma_len(sg)-offset);
1028 offset = 0;
1029 sg++;
1030 while (todo > sg_dma_len(sg)) {
9c8ced51 1031 *(rp++) = cpu_to_le32(RISC_WRITE|
d19770e5 1032 sg_dma_len(sg));
9c8ced51
ST
1033 *(rp++) = cpu_to_le32(sg_dma_address(sg));
1034 *(rp++) = cpu_to_le32(0); /* bits 63-32 */
d19770e5
ST
1035 todo -= sg_dma_len(sg);
1036 sg++;
1037 }
9c8ced51
ST
1038 *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
1039 *(rp++) = cpu_to_le32(sg_dma_address(sg));
1040 *(rp++) = cpu_to_le32(0); /* bits 63-32 */
d19770e5
ST
1041 offset += todo;
1042 }
1043 offset += padding;
1044 }
1045
1046 return rp;
1047}
1048
7b888014
ST
1049int cx23885_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
1050 struct scatterlist *sglist, unsigned int top_offset,
1051 unsigned int bottom_offset, unsigned int bpl,
1052 unsigned int padding, unsigned int lines)
1053{
1054 u32 instructions, fields;
d8eaa58b 1055 __le32 *rp;
7b888014
ST
1056 int rc;
1057
1058 fields = 0;
1059 if (UNSET != top_offset)
1060 fields++;
1061 if (UNSET != bottom_offset)
1062 fields++;
1063
1064 /* estimate risc mem: worst case is one write per page border +
1065 one write per scan line + syncs + jump (all 2 dwords). Padding
1066 can cause next bpl to start close to a page border. First DMA
1067 region may be smaller than PAGE_SIZE */
1068 /* write and jump need and extra dword */
9c8ced51
ST
1069 instructions = fields * (1 + ((bpl + padding) * lines)
1070 / PAGE_SIZE + lines);
7b888014 1071 instructions += 2;
9c8ced51
ST
1072 rc = btcx_riscmem_alloc(pci, risc, instructions*12);
1073 if (rc < 0)
7b888014
ST
1074 return rc;
1075
1076 /* write risc instructions */
1077 rp = risc->cpu;
1078 if (UNSET != top_offset)
1079 rp = cx23885_risc_field(rp, sglist, top_offset, 0,
1080 bpl, padding, lines);
1081 if (UNSET != bottom_offset)
1082 rp = cx23885_risc_field(rp, sglist, bottom_offset, 0x200,
1083 bpl, padding, lines);
1084
1085 /* save pointer to jmp instruction address */
1086 risc->jmp = rp;
9c8ced51 1087 BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
7b888014
ST
1088 return 0;
1089}
d19770e5 1090
39e75cfe
AB
1091static int cx23885_risc_databuffer(struct pci_dev *pci,
1092 struct btcx_riscmem *risc,
1093 struct scatterlist *sglist,
1094 unsigned int bpl,
1095 unsigned int lines)
d19770e5
ST
1096{
1097 u32 instructions;
d8eaa58b 1098 __le32 *rp;
d19770e5
ST
1099 int rc;
1100
1101 /* estimate risc mem: worst case is one write per page border +
1102 one write per scan line + syncs + jump (all 2 dwords). Here
1103 there is no padding and no sync. First DMA region may be smaller
1104 than PAGE_SIZE */
1105 /* Jump and write need an extra dword */
1106 instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
1107 instructions += 1;
1108
9c8ced51
ST
1109 rc = btcx_riscmem_alloc(pci, risc, instructions*12);
1110 if (rc < 0)
d19770e5
ST
1111 return rc;
1112
1113 /* write risc instructions */
1114 rp = risc->cpu;
1115 rp = cx23885_risc_field(rp, sglist, 0, NO_SYNC_LINE, bpl, 0, lines);
1116
1117 /* save pointer to jmp instruction address */
1118 risc->jmp = rp;
9c8ced51 1119 BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
d19770e5
ST
1120 return 0;
1121}
1122
7b888014 1123int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
39e75cfe 1124 u32 reg, u32 mask, u32 value)
d19770e5 1125{
d8eaa58b 1126 __le32 *rp;
d19770e5
ST
1127 int rc;
1128
9c8ced51
ST
1129 rc = btcx_riscmem_alloc(pci, risc, 4*16);
1130 if (rc < 0)
d19770e5
ST
1131 return rc;
1132
1133 /* write risc instructions */
1134 rp = risc->cpu;
d19770e5
ST
1135 *(rp++) = cpu_to_le32(RISC_WRITECR | RISC_IRQ2);
1136 *(rp++) = cpu_to_le32(reg);
1137 *(rp++) = cpu_to_le32(value);
1138 *(rp++) = cpu_to_le32(mask);
1139 *(rp++) = cpu_to_le32(RISC_JUMP);
1140 *(rp++) = cpu_to_le32(risc->dma);
1141 *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1142 return 0;
1143}
1144
1145void cx23885_free_buffer(struct videobuf_queue *q, struct cx23885_buffer *buf)
1146{
409d84f8
TP
1147 struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
1148
d19770e5 1149 BUG_ON(in_interrupt());
44a6481d 1150 videobuf_waiton(&buf->vb, 0, 0);
409d84f8
TP
1151 videobuf_dma_unmap(q, dma);
1152 videobuf_dma_free(dma);
a920e42f 1153 btcx_riscmem_free(to_pci_dev(q->dev), &buf->risc);
0fc0686e 1154 buf->vb.state = VIDEOBUF_NEEDS_INIT;
d19770e5
ST
1155}
1156
7b888014
ST
1157static void cx23885_tsport_reg_dump(struct cx23885_tsport *port)
1158{
1159 struct cx23885_dev *dev = port->dev;
1160
22b4e64f
HH
1161 dprintk(1, "%s() Register Dump\n", __func__);
1162 dprintk(1, "%s() DEV_CNTRL2 0x%08X\n", __func__,
7b888014 1163 cx_read(DEV_CNTRL2));
22b4e64f 1164 dprintk(1, "%s() PCI_INT_MSK 0x%08X\n", __func__,
7b888014 1165 cx_read(PCI_INT_MSK));
22b4e64f 1166 dprintk(1, "%s() AUD_INT_INT_MSK 0x%08X\n", __func__,
7b888014 1167 cx_read(AUDIO_INT_INT_MSK));
22b4e64f 1168 dprintk(1, "%s() AUD_INT_DMA_CTL 0x%08X\n", __func__,
7b888014 1169 cx_read(AUD_INT_DMA_CTL));
22b4e64f 1170 dprintk(1, "%s() AUD_EXT_INT_MSK 0x%08X\n", __func__,
7b888014 1171 cx_read(AUDIO_EXT_INT_MSK));
22b4e64f 1172 dprintk(1, "%s() AUD_EXT_DMA_CTL 0x%08X\n", __func__,
7b888014 1173 cx_read(AUD_EXT_DMA_CTL));
22b4e64f 1174 dprintk(1, "%s() PAD_CTRL 0x%08X\n", __func__,
7b888014 1175 cx_read(PAD_CTRL));
22b4e64f 1176 dprintk(1, "%s() ALT_PIN_OUT_SEL 0x%08X\n", __func__,
7b888014 1177 cx_read(ALT_PIN_OUT_SEL));
22b4e64f 1178 dprintk(1, "%s() GPIO2 0x%08X\n", __func__,
7b888014 1179 cx_read(GPIO2));
22b4e64f 1180 dprintk(1, "%s() gpcnt(0x%08X) 0x%08X\n", __func__,
7b888014 1181 port->reg_gpcnt, cx_read(port->reg_gpcnt));
22b4e64f 1182 dprintk(1, "%s() gpcnt_ctl(0x%08X) 0x%08x\n", __func__,
7b888014 1183 port->reg_gpcnt_ctl, cx_read(port->reg_gpcnt_ctl));
22b4e64f 1184 dprintk(1, "%s() dma_ctl(0x%08X) 0x%08x\n", __func__,
7b888014 1185 port->reg_dma_ctl, cx_read(port->reg_dma_ctl));
7b913908
ST
1186 if (port->reg_src_sel)
1187 dprintk(1, "%s() src_sel(0x%08X) 0x%08x\n", __func__,
1188 port->reg_src_sel, cx_read(port->reg_src_sel));
22b4e64f 1189 dprintk(1, "%s() lngth(0x%08X) 0x%08x\n", __func__,
7b888014 1190 port->reg_lngth, cx_read(port->reg_lngth));
22b4e64f 1191 dprintk(1, "%s() hw_sop_ctrl(0x%08X) 0x%08x\n", __func__,
7b888014 1192 port->reg_hw_sop_ctrl, cx_read(port->reg_hw_sop_ctrl));
22b4e64f 1193 dprintk(1, "%s() gen_ctrl(0x%08X) 0x%08x\n", __func__,
7b888014 1194 port->reg_gen_ctrl, cx_read(port->reg_gen_ctrl));
22b4e64f 1195 dprintk(1, "%s() bd_pkt_status(0x%08X) 0x%08x\n", __func__,
7b888014 1196 port->reg_bd_pkt_status, cx_read(port->reg_bd_pkt_status));
22b4e64f 1197 dprintk(1, "%s() sop_status(0x%08X) 0x%08x\n", __func__,
7b888014 1198 port->reg_sop_status, cx_read(port->reg_sop_status));
22b4e64f 1199 dprintk(1, "%s() fifo_ovfl_stat(0x%08X) 0x%08x\n", __func__,
7b888014 1200 port->reg_fifo_ovfl_stat, cx_read(port->reg_fifo_ovfl_stat));
22b4e64f 1201 dprintk(1, "%s() vld_misc(0x%08X) 0x%08x\n", __func__,
7b888014 1202 port->reg_vld_misc, cx_read(port->reg_vld_misc));
22b4e64f 1203 dprintk(1, "%s() ts_clk_en(0x%08X) 0x%08x\n", __func__,
7b888014 1204 port->reg_ts_clk_en, cx_read(port->reg_ts_clk_en));
22b4e64f 1205 dprintk(1, "%s() ts_int_msk(0x%08X) 0x%08x\n", __func__,
7b888014
ST
1206 port->reg_ts_int_msk, cx_read(port->reg_ts_int_msk));
1207}
1208
d19770e5 1209static int cx23885_start_dma(struct cx23885_tsport *port,
44a6481d
MK
1210 struct cx23885_dmaqueue *q,
1211 struct cx23885_buffer *buf)
d19770e5
ST
1212{
1213 struct cx23885_dev *dev = port->dev;
a589b665 1214 u32 reg;
d19770e5 1215
22b4e64f 1216 dprintk(1, "%s() w: %d, h: %d, f: %d\n", __func__,
44a6481d 1217 buf->vb.width, buf->vb.height, buf->vb.field);
d19770e5 1218
d8d12b43
ST
1219 /* Stop the fifo and risc engine for this port */
1220 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1221
d19770e5
ST
1222 /* setup fifo + format */
1223 cx23885_sram_channel_setup(dev,
9c8ced51 1224 &dev->sram_channels[port->sram_chno],
44a6481d 1225 port->ts_packet_size, buf->risc.dma);
9c8ced51
ST
1226 if (debug > 5) {
1227 cx23885_sram_channel_dump(dev,
1228 &dev->sram_channels[port->sram_chno]);
d19770e5 1229 cx23885_risc_disasm(port, &buf->risc);
3328e4fb 1230 }
d19770e5
ST
1231
1232 /* write TS length to chip */
1233 cx_write(port->reg_lngth, buf->vb.width);
1234
9c8ced51
ST
1235 if ((!(cx23885_boards[dev->board].portb & CX23885_MPEG_DVB)) &&
1236 (!(cx23885_boards[dev->board].portc & CX23885_MPEG_DVB))) {
1237 printk("%s() Unsupported .portb/c (0x%08x)/(0x%08x)\n",
22b4e64f 1238 __func__,
661c7e44 1239 cx23885_boards[dev->board].portb,
9c8ced51 1240 cx23885_boards[dev->board].portc);
d19770e5
ST
1241 return -EINVAL;
1242 }
1243
a589b665
ST
1244 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1245 cx23885_av_clk(dev, 0);
1246
d19770e5
ST
1247 udelay(100);
1248
579f1163 1249 /* If the port supports SRC SELECT, configure it */
9c8ced51 1250 if (port->reg_src_sel)
579f1163
ST
1251 cx_write(port->reg_src_sel, port->src_sel_val);
1252
b1b81f1d 1253 cx_write(port->reg_hw_sop_ctrl, port->hw_sop_ctrl_val);
d19770e5 1254 cx_write(port->reg_ts_clk_en, port->ts_clk_en_val);
b1b81f1d 1255 cx_write(port->reg_vld_misc, port->vld_misc_val);
d19770e5
ST
1256 cx_write(port->reg_gen_ctrl, port->gen_ctrl_val);
1257 udelay(100);
1258
9c8ced51 1259 /* NOTE: this is 2 (reserved) for portb, does it matter? */
d19770e5
ST
1260 /* reset counter to zero */
1261 cx_write(port->reg_gpcnt_ctl, 3);
1262 q->count = 1;
1263
52ce27bf
ST
1264 /* Set VIDB pins to input */
1265 if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
1266 reg = cx_read(PAD_CTRL);
1267 reg &= ~0x3; /* Clear TS1_OE & TS1_SOP_OE */
1268 cx_write(PAD_CTRL, reg);
1269 }
1270
1271 /* Set VIDC pins to input */
1272 if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
1273 reg = cx_read(PAD_CTRL);
1274 reg &= ~0x4; /* Clear TS2_SOP_OE */
1275 cx_write(PAD_CTRL, reg);
1276 }
1277
1278 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
a589b665
ST
1279
1280 reg = cx_read(PAD_CTRL);
1281 reg = reg & ~0x1; /* Clear TS1_OE */
1282
1283 /* FIXME, bit 2 writing here is questionable */
1284 /* set TS1_SOP_OE and TS1_OE_HI */
1285 reg = reg | 0xa;
1286 cx_write(PAD_CTRL, reg);
1287
1288 /* FIXME and these two registers should be documented. */
1289 cx_write(CLK_DELAY, cx_read(CLK_DELAY) | 0x80000011);
1290 cx_write(ALT_PIN_OUT_SEL, 0x10100045);
1291 }
1292
9c8ced51 1293 switch (dev->bridge) {
d19770e5 1294 case CX23885_BRIDGE_885:
3bd40659 1295 case CX23885_BRIDGE_887:
25ea66e2 1296 case CX23885_BRIDGE_888:
d19770e5 1297 /* enable irqs */
9c8ced51 1298 dprintk(1, "%s() enabling TS int's and DMA\n", __func__);
d19770e5
ST
1299 cx_set(port->reg_ts_int_msk, port->ts_int_msk_val);
1300 cx_set(port->reg_dma_ctl, port->dma_ctl_val);
1301 cx_set(PCI_INT_MSK, dev->pci_irqmask | port->pci_irqmask);
1302 break;
d19770e5 1303 default:
579f1163 1304 BUG();
d19770e5
ST
1305 }
1306
d19770e5
ST
1307 cx_set(DEV_CNTRL2, (1<<5)); /* Enable RISC controller */
1308
a589b665
ST
1309 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1310 cx23885_av_clk(dev, 1);
1311
7b888014
ST
1312 if (debug > 4)
1313 cx23885_tsport_reg_dump(port);
1314
d19770e5
ST
1315 return 0;
1316}
1317
1318static int cx23885_stop_dma(struct cx23885_tsport *port)
1319{
1320 struct cx23885_dev *dev = port->dev;
a589b665
ST
1321 u32 reg;
1322
22b4e64f 1323 dprintk(1, "%s()\n", __func__);
d19770e5
ST
1324
1325 /* Stop interrupts and DMA */
1326 cx_clear(port->reg_ts_int_msk, port->ts_int_msk_val);
1327 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1328
52ce27bf 1329 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
a589b665
ST
1330
1331 reg = cx_read(PAD_CTRL);
1332
1333 /* Set TS1_OE */
1334 reg = reg | 0x1;
1335
1336 /* clear TS1_SOP_OE and TS1_OE_HI */
1337 reg = reg & ~0xa;
1338 cx_write(PAD_CTRL, reg);
1339 cx_write(port->reg_src_sel, 0);
1340 cx_write(port->reg_gen_ctrl, 8);
1341
1342 }
1343
1344 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1345 cx23885_av_clk(dev, 0);
1346
d19770e5
ST
1347 return 0;
1348}
1349
7b888014 1350int cx23885_restart_queue(struct cx23885_tsport *port,
d19770e5
ST
1351 struct cx23885_dmaqueue *q)
1352{
1353 struct cx23885_dev *dev = port->dev;
1354 struct cx23885_buffer *buf;
d19770e5 1355
22b4e64f 1356 dprintk(5, "%s()\n", __func__);
9c8ced51 1357 if (list_empty(&q->active)) {
44a6481d
MK
1358 struct cx23885_buffer *prev;
1359 prev = NULL;
d19770e5 1360
22b4e64f 1361 dprintk(5, "%s() queue is empty\n", __func__);
d19770e5 1362
44a6481d
MK
1363 for (;;) {
1364 if (list_empty(&q->queued))
1365 return 0;
1366 buf = list_entry(q->queued.next, struct cx23885_buffer,
1367 vb.queue);
1368 if (NULL == prev) {
1369 list_del(&buf->vb.queue);
1370 list_add_tail(&buf->vb.queue, &q->active);
1371 cx23885_start_dma(port, q, buf);
0fc0686e 1372 buf->vb.state = VIDEOBUF_ACTIVE;
44a6481d
MK
1373 buf->count = q->count++;
1374 mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
9c8ced51 1375 dprintk(5, "[%p/%d] restart_queue - f/active\n",
44a6481d
MK
1376 buf, buf->vb.i);
1377
1378 } else if (prev->vb.width == buf->vb.width &&
1379 prev->vb.height == buf->vb.height &&
1380 prev->fmt == buf->fmt) {
1381 list_del(&buf->vb.queue);
1382 list_add_tail(&buf->vb.queue, &q->active);
0fc0686e 1383 buf->vb.state = VIDEOBUF_ACTIVE;
44a6481d
MK
1384 buf->count = q->count++;
1385 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
9c8ced51
ST
1386 /* 64 bit bits 63-32 */
1387 prev->risc.jmp[2] = cpu_to_le32(0);
1388 dprintk(5, "[%p/%d] restart_queue - m/active\n",
44a6481d
MK
1389 buf, buf->vb.i);
1390 } else {
1391 return 0;
1392 }
1393 prev = buf;
1394 }
d19770e5
ST
1395 return 0;
1396 }
1397
1398 buf = list_entry(q->active.next, struct cx23885_buffer, vb.queue);
44a6481d 1399 dprintk(2, "restart_queue [%p/%d]: restart dma\n",
d19770e5
ST
1400 buf, buf->vb.i);
1401 cx23885_start_dma(port, q, buf);
a991f44b 1402 list_for_each_entry(buf, &q->active, vb.queue)
d19770e5 1403 buf->count = q->count++;
44a6481d 1404 mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
d19770e5
ST
1405 return 0;
1406}
1407
1408/* ------------------------------------------------------------------ */
1409
1410int cx23885_buf_prepare(struct videobuf_queue *q, struct cx23885_tsport *port,
1411 struct cx23885_buffer *buf, enum v4l2_field field)
1412{
1413 struct cx23885_dev *dev = port->dev;
1414 int size = port->ts_packet_size * port->ts_packet_count;
1415 int rc;
1416
22b4e64f 1417 dprintk(1, "%s: %p\n", __func__, buf);
d19770e5
ST
1418 if (0 != buf->vb.baddr && buf->vb.bsize < size)
1419 return -EINVAL;
1420
0fc0686e 1421 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
d19770e5
ST
1422 buf->vb.width = port->ts_packet_size;
1423 buf->vb.height = port->ts_packet_count;
1424 buf->vb.size = size;
1425 buf->vb.field = field /*V4L2_FIELD_TOP*/;
1426
9c8ced51
ST
1427 rc = videobuf_iolock(q, &buf->vb, NULL);
1428 if (0 != rc)
d19770e5
ST
1429 goto fail;
1430 cx23885_risc_databuffer(dev->pci, &buf->risc,
409d84f8
TP
1431 videobuf_to_dma(&buf->vb)->sglist,
1432 buf->vb.width, buf->vb.height);
d19770e5 1433 }
0fc0686e 1434 buf->vb.state = VIDEOBUF_PREPARED;
d19770e5
ST
1435 return 0;
1436
1437 fail:
44a6481d 1438 cx23885_free_buffer(q, buf);
d19770e5
ST
1439 return rc;
1440}
1441
1442void cx23885_buf_queue(struct cx23885_tsport *port, struct cx23885_buffer *buf)
1443{
1444 struct cx23885_buffer *prev;
1445 struct cx23885_dev *dev = port->dev;
1446 struct cx23885_dmaqueue *cx88q = &port->mpegq;
1447
1448 /* add jump to stopper */
1449 buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
1450 buf->risc.jmp[1] = cpu_to_le32(cx88q->stopper.dma);
1451 buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
1452
1453 if (list_empty(&cx88q->active)) {
9c8ced51 1454 dprintk(1, "queue is empty - first active\n");
44a6481d 1455 list_add_tail(&buf->vb.queue, &cx88q->active);
d19770e5 1456 cx23885_start_dma(port, cx88q, buf);
0fc0686e 1457 buf->vb.state = VIDEOBUF_ACTIVE;
d19770e5 1458 buf->count = cx88q->count++;
44a6481d
MK
1459 mod_timer(&cx88q->timeout, jiffies + BUFFER_TIMEOUT);
1460 dprintk(1, "[%p/%d] %s - first active\n",
22b4e64f 1461 buf, buf->vb.i, __func__);
d19770e5 1462 } else {
9c8ced51 1463 dprintk(1, "queue is not empty - append to active\n");
44a6481d
MK
1464 prev = list_entry(cx88q->active.prev, struct cx23885_buffer,
1465 vb.queue);
1466 list_add_tail(&buf->vb.queue, &cx88q->active);
0fc0686e 1467 buf->vb.state = VIDEOBUF_ACTIVE;
d19770e5
ST
1468 buf->count = cx88q->count++;
1469 prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
1470 prev->risc.jmp[2] = cpu_to_le32(0); /* 64 bit bits 63-32 */
9c8ced51 1471 dprintk(1, "[%p/%d] %s - append to active\n",
22b4e64f 1472 buf, buf->vb.i, __func__);
d19770e5
ST
1473 }
1474}
1475
1476/* ----------------------------------------------------------- */
1477
44a6481d
MK
1478static void do_cancel_buffers(struct cx23885_tsport *port, char *reason,
1479 int restart)
d19770e5
ST
1480{
1481 struct cx23885_dev *dev = port->dev;
1482 struct cx23885_dmaqueue *q = &port->mpegq;
1483 struct cx23885_buffer *buf;
1484 unsigned long flags;
1485
44a6481d 1486 spin_lock_irqsave(&port->slock, flags);
d19770e5 1487 while (!list_empty(&q->active)) {
44a6481d
MK
1488 buf = list_entry(q->active.next, struct cx23885_buffer,
1489 vb.queue);
d19770e5 1490 list_del(&buf->vb.queue);
0fc0686e 1491 buf->vb.state = VIDEOBUF_ERROR;
d19770e5 1492 wake_up(&buf->vb.done);
44a6481d 1493 dprintk(1, "[%p/%d] %s - dma=0x%08lx\n",
d19770e5
ST
1494 buf, buf->vb.i, reason, (unsigned long)buf->risc.dma);
1495 }
44a6481d 1496 if (restart) {
9c8ced51 1497 dprintk(1, "restarting queue\n");
d19770e5
ST
1498 cx23885_restart_queue(port, q);
1499 }
44a6481d 1500 spin_unlock_irqrestore(&port->slock, flags);
d19770e5
ST
1501}
1502
b1b81f1d
ST
1503void cx23885_cancel_buffers(struct cx23885_tsport *port)
1504{
1505 struct cx23885_dev *dev = port->dev;
1506 struct cx23885_dmaqueue *q = &port->mpegq;
1507
26d2e854 1508 dprintk(1, "%s()\n", __func__);
b1b81f1d
ST
1509 del_timer_sync(&q->timeout);
1510 cx23885_stop_dma(port);
1511 do_cancel_buffers(port, "cancel", 0);
1512}
d19770e5
ST
1513
1514static void cx23885_timeout(unsigned long data)
1515{
1516 struct cx23885_tsport *port = (struct cx23885_tsport *)data;
1517 struct cx23885_dev *dev = port->dev;
1518
9c8ced51 1519 dprintk(1, "%s()\n", __func__);
d19770e5
ST
1520
1521 if (debug > 5)
9c8ced51
ST
1522 cx23885_sram_channel_dump(dev,
1523 &dev->sram_channels[port->sram_chno]);
3328e4fb 1524
d19770e5
ST
1525 cx23885_stop_dma(port);
1526 do_cancel_buffers(port, "timeout", 1);
1527}
1528
b1b81f1d
ST
1529int cx23885_irq_417(struct cx23885_dev *dev, u32 status)
1530{
1531 /* FIXME: port1 assumption here. */
1532 struct cx23885_tsport *port = &dev->ts1;
1533 int count = 0;
1534 int handled = 0;
1535
1536 if (status == 0)
1537 return handled;
1538
1539 count = cx_read(port->reg_gpcnt);
1540 dprintk(7, "status: 0x%08x mask: 0x%08x count: 0x%x\n",
1541 status, cx_read(port->reg_ts_int_msk), count);
1542
1543 if ((status & VID_B_MSK_BAD_PKT) ||
1544 (status & VID_B_MSK_OPC_ERR) ||
1545 (status & VID_B_MSK_VBI_OPC_ERR) ||
1546 (status & VID_B_MSK_SYNC) ||
1547 (status & VID_B_MSK_VBI_SYNC) ||
1548 (status & VID_B_MSK_OF) ||
1549 (status & VID_B_MSK_VBI_OF)) {
1550 printk(KERN_ERR "%s: V4L mpeg risc op code error, status "
1551 "= 0x%x\n", dev->name, status);
1552 if (status & VID_B_MSK_BAD_PKT)
1553 dprintk(1, " VID_B_MSK_BAD_PKT\n");
1554 if (status & VID_B_MSK_OPC_ERR)
1555 dprintk(1, " VID_B_MSK_OPC_ERR\n");
1556 if (status & VID_B_MSK_VBI_OPC_ERR)
1557 dprintk(1, " VID_B_MSK_VBI_OPC_ERR\n");
1558 if (status & VID_B_MSK_SYNC)
1559 dprintk(1, " VID_B_MSK_SYNC\n");
1560 if (status & VID_B_MSK_VBI_SYNC)
1561 dprintk(1, " VID_B_MSK_VBI_SYNC\n");
1562 if (status & VID_B_MSK_OF)
1563 dprintk(1, " VID_B_MSK_OF\n");
1564 if (status & VID_B_MSK_VBI_OF)
1565 dprintk(1, " VID_B_MSK_VBI_OF\n");
1566
1567 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
1568 cx23885_sram_channel_dump(dev,
1569 &dev->sram_channels[port->sram_chno]);
1570 cx23885_417_check_encoder(dev);
1571 } else if (status & VID_B_MSK_RISCI1) {
1572 dprintk(7, " VID_B_MSK_RISCI1\n");
1573 spin_lock(&port->slock);
1574 cx23885_wakeup(port, &port->mpegq, count);
1575 spin_unlock(&port->slock);
1576 } else if (status & VID_B_MSK_RISCI2) {
1577 dprintk(7, " VID_B_MSK_RISCI2\n");
1578 spin_lock(&port->slock);
1579 cx23885_restart_queue(port, &port->mpegq);
1580 spin_unlock(&port->slock);
1581 }
1582 if (status) {
1583 cx_write(port->reg_ts_int_stat, status);
1584 handled = 1;
1585 }
1586
1587 return handled;
1588}
1589
a6a3f140
ST
1590static int cx23885_irq_ts(struct cx23885_tsport *port, u32 status)
1591{
1592 struct cx23885_dev *dev = port->dev;
1593 int handled = 0;
1594 u32 count;
1595
b1b81f1d
ST
1596 if ((status & VID_BC_MSK_OPC_ERR) ||
1597 (status & VID_BC_MSK_BAD_PKT) ||
1598 (status & VID_BC_MSK_SYNC) ||
9c8ced51
ST
1599 (status & VID_BC_MSK_OF)) {
1600
a6a3f140 1601 if (status & VID_BC_MSK_OPC_ERR)
9c8ced51
ST
1602 dprintk(7, " (VID_BC_MSK_OPC_ERR 0x%08x)\n",
1603 VID_BC_MSK_OPC_ERR);
1604
a6a3f140 1605 if (status & VID_BC_MSK_BAD_PKT)
9c8ced51
ST
1606 dprintk(7, " (VID_BC_MSK_BAD_PKT 0x%08x)\n",
1607 VID_BC_MSK_BAD_PKT);
1608
a6a3f140 1609 if (status & VID_BC_MSK_SYNC)
9c8ced51
ST
1610 dprintk(7, " (VID_BC_MSK_SYNC 0x%08x)\n",
1611 VID_BC_MSK_SYNC);
1612
a6a3f140 1613 if (status & VID_BC_MSK_OF)
9c8ced51
ST
1614 dprintk(7, " (VID_BC_MSK_OF 0x%08x)\n",
1615 VID_BC_MSK_OF);
a6a3f140
ST
1616
1617 printk(KERN_ERR "%s: mpeg risc op code error\n", dev->name);
1618
1619 cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
b1b81f1d
ST
1620 cx23885_sram_channel_dump(dev,
1621 &dev->sram_channels[port->sram_chno]);
a6a3f140
ST
1622
1623 } else if (status & VID_BC_MSK_RISCI1) {
1624
1625 dprintk(7, " (RISCI1 0x%08x)\n", VID_BC_MSK_RISCI1);
1626
1627 spin_lock(&port->slock);
1628 count = cx_read(port->reg_gpcnt);
1629 cx23885_wakeup(port, &port->mpegq, count);
1630 spin_unlock(&port->slock);
1631
1632 } else if (status & VID_BC_MSK_RISCI2) {
1633
1634 dprintk(7, " (RISCI2 0x%08x)\n", VID_BC_MSK_RISCI2);
1635
1636 spin_lock(&port->slock);
1637 cx23885_restart_queue(port, &port->mpegq);
1638 spin_unlock(&port->slock);
1639
1640 }
1641 if (status) {
1642 cx_write(port->reg_ts_int_stat, status);
1643 handled = 1;
1644 }
1645
1646 return handled;
1647}
1648
03121f05 1649static irqreturn_t cx23885_irq(int irq, void *dev_id)
d19770e5
ST
1650{
1651 struct cx23885_dev *dev = dev_id;
a6a3f140
ST
1652 struct cx23885_tsport *ts1 = &dev->ts1;
1653 struct cx23885_tsport *ts2 = &dev->ts2;
d19770e5 1654 u32 pci_status, pci_mask;
7b888014 1655 u32 vida_status, vida_mask;
6f074abb 1656 u32 ts1_status, ts1_mask;
d19770e5 1657 u32 ts2_status, ts2_mask;
7b888014 1658 int vida_count = 0, ts1_count = 0, ts2_count = 0, handled = 0;
f59ad611 1659 bool ir_handled = false;
d19770e5
ST
1660
1661 pci_status = cx_read(PCI_INT_STAT);
1662 pci_mask = cx_read(PCI_INT_MSK);
7b888014
ST
1663 vida_status = cx_read(VID_A_INT_STAT);
1664 vida_mask = cx_read(VID_A_INT_MSK);
6f074abb
ST
1665 ts1_status = cx_read(VID_B_INT_STAT);
1666 ts1_mask = cx_read(VID_B_INT_MSK);
d19770e5
ST
1667 ts2_status = cx_read(VID_C_INT_STAT);
1668 ts2_mask = cx_read(VID_C_INT_MSK);
1669
9c8ced51 1670 if ((pci_status == 0) && (ts2_status == 0) && (ts1_status == 0))
d19770e5
ST
1671 goto out;
1672
7b888014 1673 vida_count = cx_read(VID_A_GPCNT);
a6a3f140
ST
1674 ts1_count = cx_read(ts1->reg_gpcnt);
1675 ts2_count = cx_read(ts2->reg_gpcnt);
7b888014
ST
1676 dprintk(7, "pci_status: 0x%08x pci_mask: 0x%08x\n",
1677 pci_status, pci_mask);
1678 dprintk(7, "vida_status: 0x%08x vida_mask: 0x%08x count: 0x%x\n",
1679 vida_status, vida_mask, vida_count);
1680 dprintk(7, "ts1_status: 0x%08x ts1_mask: 0x%08x count: 0x%x\n",
1681 ts1_status, ts1_mask, ts1_count);
1682 dprintk(7, "ts2_status: 0x%08x ts2_mask: 0x%08x count: 0x%x\n",
1683 ts2_status, ts2_mask, ts2_count);
d19770e5 1684
f59ad611
AW
1685 if (pci_status & (PCI_MSK_RISC_RD | PCI_MSK_RISC_WR |
1686 PCI_MSK_AL_RD | PCI_MSK_AL_WR | PCI_MSK_APB_DMA |
1687 PCI_MSK_VID_C | PCI_MSK_VID_B | PCI_MSK_VID_A |
1688 PCI_MSK_AUD_INT | PCI_MSK_AUD_EXT |
1689 PCI_MSK_GPIO0 | PCI_MSK_GPIO1 |
1690 PCI_MSK_IR)) {
d19770e5
ST
1691
1692 if (pci_status & PCI_MSK_RISC_RD)
9c8ced51
ST
1693 dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n",
1694 PCI_MSK_RISC_RD);
1695
d19770e5 1696 if (pci_status & PCI_MSK_RISC_WR)
9c8ced51
ST
1697 dprintk(7, " (PCI_MSK_RISC_WR 0x%08x)\n",
1698 PCI_MSK_RISC_WR);
1699
d19770e5 1700 if (pci_status & PCI_MSK_AL_RD)
9c8ced51
ST
1701 dprintk(7, " (PCI_MSK_AL_RD 0x%08x)\n",
1702 PCI_MSK_AL_RD);
1703
d19770e5 1704 if (pci_status & PCI_MSK_AL_WR)
9c8ced51
ST
1705 dprintk(7, " (PCI_MSK_AL_WR 0x%08x)\n",
1706 PCI_MSK_AL_WR);
1707
d19770e5 1708 if (pci_status & PCI_MSK_APB_DMA)
9c8ced51
ST
1709 dprintk(7, " (PCI_MSK_APB_DMA 0x%08x)\n",
1710 PCI_MSK_APB_DMA);
1711
d19770e5 1712 if (pci_status & PCI_MSK_VID_C)
9c8ced51
ST
1713 dprintk(7, " (PCI_MSK_VID_C 0x%08x)\n",
1714 PCI_MSK_VID_C);
1715
d19770e5 1716 if (pci_status & PCI_MSK_VID_B)
9c8ced51
ST
1717 dprintk(7, " (PCI_MSK_VID_B 0x%08x)\n",
1718 PCI_MSK_VID_B);
1719
d19770e5 1720 if (pci_status & PCI_MSK_VID_A)
9c8ced51
ST
1721 dprintk(7, " (PCI_MSK_VID_A 0x%08x)\n",
1722 PCI_MSK_VID_A);
1723
d19770e5 1724 if (pci_status & PCI_MSK_AUD_INT)
9c8ced51
ST
1725 dprintk(7, " (PCI_MSK_AUD_INT 0x%08x)\n",
1726 PCI_MSK_AUD_INT);
1727
d19770e5 1728 if (pci_status & PCI_MSK_AUD_EXT)
9c8ced51
ST
1729 dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n",
1730 PCI_MSK_AUD_EXT);
d19770e5 1731
5a23b076
IL
1732 if (pci_status & PCI_MSK_GPIO0)
1733 dprintk(7, " (PCI_MSK_GPIO0 0x%08x)\n",
1734 PCI_MSK_GPIO0);
1735
1736 if (pci_status & PCI_MSK_GPIO1)
1737 dprintk(7, " (PCI_MSK_GPIO1 0x%08x)\n",
1738 PCI_MSK_GPIO1);
f59ad611
AW
1739
1740 if (pci_status & PCI_MSK_IR)
1741 dprintk(7, " (PCI_MSK_IR 0x%08x)\n",
1742 PCI_MSK_IR);
d19770e5
ST
1743 }
1744
afd96668 1745 if (cx23885_boards[dev->board].cimax > 0 &&
a26ccc9d
ST
1746 ((pci_status & PCI_MSK_GPIO0) ||
1747 (pci_status & PCI_MSK_GPIO1))) {
1748
1749 if (cx23885_boards[dev->board].cimax > 0)
1750 handled += netup_ci_slot_status(dev, pci_status);
1751
1752 }
5a23b076 1753
7b888014
ST
1754 if (ts1_status) {
1755 if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
1756 handled += cx23885_irq_ts(ts1, ts1_status);
b1b81f1d
ST
1757 else
1758 if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
1759 handled += cx23885_irq_417(dev, ts1_status);
7b888014
ST
1760 }
1761
1762 if (ts2_status) {
1763 if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
1764 handled += cx23885_irq_ts(ts2, ts2_status);
b1b81f1d
ST
1765 else
1766 if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
1767 handled += cx23885_irq_417(dev, ts2_status);
7b888014 1768 }
6f074abb 1769
7b888014
ST
1770 if (vida_status)
1771 handled += cx23885_video_irq(dev, vida_status);
6f074abb 1772
f59ad611
AW
1773 if (pci_status & PCI_MSK_IR) {
1774 v4l2_subdev_call(dev->sd_ir, ir, interrupt_service_routine,
1775 pci_status, &ir_handled);
1776 if (ir_handled)
1777 handled++;
1778 }
1779
6f074abb
ST
1780 if (handled)
1781 cx_write(PCI_INT_STAT, pci_status);
d19770e5
ST
1782out:
1783 return IRQ_RETVAL(handled);
1784}
1785
f59ad611
AW
1786static void cx23885_v4l2_dev_notify(struct v4l2_subdev *sd,
1787 unsigned int notification, void *arg)
1788{
1789 struct cx23885_dev *dev;
1790
1791 if (sd == NULL)
1792 return;
1793
1794 dev = to_cx23885(sd->v4l2_dev);
1795
1796 switch (notification) {
1797 case V4L2_SUBDEV_IR_RX_NOTIFY: /* Called in an IRQ context */
1798 if (sd == dev->sd_ir)
1799 cx23885_ir_rx_v4l2_dev_notify(sd, *(u32 *)arg);
1800 break;
1801 case V4L2_SUBDEV_IR_TX_NOTIFY: /* Called in an IRQ context */
1802 if (sd == dev->sd_ir)
1803 cx23885_ir_tx_v4l2_dev_notify(sd, *(u32 *)arg);
1804 break;
1805 }
1806}
1807
1808static void cx23885_v4l2_dev_notify_init(struct cx23885_dev *dev)
1809{
1810 INIT_WORK(&dev->ir_rx_work, cx23885_ir_rx_work_handler);
1811 INIT_WORK(&dev->ir_tx_work, cx23885_ir_tx_work_handler);
1812 dev->v4l2_dev.notify = cx23885_v4l2_dev_notify;
1813}
1814
6de72bd6 1815static inline int encoder_on_portb(struct cx23885_dev *dev)
6f8bee9b
ST
1816{
1817 return cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER;
1818}
1819
6de72bd6 1820static inline int encoder_on_portc(struct cx23885_dev *dev)
6f8bee9b
ST
1821{
1822 return cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER;
1823}
1824
1825/* Mask represents 32 different GPIOs, GPIO's are split into multiple
1826 * registers depending on the board configuration (and whether the
1827 * 417 encoder (wi it's own GPIO's) are present. Each GPIO bit will
1828 * be pushed into the correct hardware register, regardless of the
1829 * physical location. Certain registers are shared so we sanity check
1830 * and report errors if we think we're tampering with a GPIo that might
1831 * be assigned to the encoder (and used for the host bus).
1832 *
1833 * GPIO 2 thru 0 - On the cx23885 bridge
1834 * GPIO 18 thru 3 - On the cx23417 host bus interface
1835 * GPIO 23 thru 19 - On the cx25840 a/v core
1836 */
1837void cx23885_gpio_set(struct cx23885_dev *dev, u32 mask)
1838{
1839 if (mask & 0x7)
1840 cx_set(GP0_IO, mask & 0x7);
1841
1842 if (mask & 0x0007fff8) {
1843 if (encoder_on_portb(dev) || encoder_on_portc(dev))
1844 printk(KERN_ERR
1845 "%s: Setting GPIO on encoder ports\n",
1846 dev->name);
1847 cx_set(MC417_RWD, (mask & 0x0007fff8) >> 3);
1848 }
1849
1850 /* TODO: 23-19 */
1851 if (mask & 0x00f80000)
1852 printk(KERN_INFO "%s: Unsupported\n", dev->name);
1853}
1854
1855void cx23885_gpio_clear(struct cx23885_dev *dev, u32 mask)
1856{
1857 if (mask & 0x00000007)
1858 cx_clear(GP0_IO, mask & 0x7);
1859
1860 if (mask & 0x0007fff8) {
1861 if (encoder_on_portb(dev) || encoder_on_portc(dev))
1862 printk(KERN_ERR
1863 "%s: Clearing GPIO moving on encoder ports\n",
1864 dev->name);
1865 cx_clear(MC417_RWD, (mask & 0x7fff8) >> 3);
1866 }
1867
1868 /* TODO: 23-19 */
1869 if (mask & 0x00f80000)
1870 printk(KERN_INFO "%s: Unsupported\n", dev->name);
1871}
1872
1873void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput)
1874{
1875 if ((mask & 0x00000007) && asoutput)
1876 cx_set(GP0_IO, (mask & 0x7) << 16);
1877 else if ((mask & 0x00000007) && !asoutput)
1878 cx_clear(GP0_IO, (mask & 0x7) << 16);
1879
1880 if (mask & 0x0007fff8) {
1881 if (encoder_on_portb(dev) || encoder_on_portc(dev))
1882 printk(KERN_ERR
1883 "%s: Enabling GPIO on encoder ports\n",
1884 dev->name);
1885 }
1886
1887 /* MC417_OEN is active low for output, write 1 for an input */
1888 if ((mask & 0x0007fff8) && asoutput)
1889 cx_clear(MC417_OEN, (mask & 0x7fff8) >> 3);
1890
1891 else if ((mask & 0x0007fff8) && !asoutput)
1892 cx_set(MC417_OEN, (mask & 0x7fff8) >> 3);
1893
1894 /* TODO: 23-19 */
1895}
1896
d19770e5 1897static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
44a6481d 1898 const struct pci_device_id *pci_id)
d19770e5
ST
1899{
1900 struct cx23885_dev *dev;
1901 int err;
1902
44a6481d 1903 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
d19770e5
ST
1904 if (NULL == dev)
1905 return -ENOMEM;
1906
c0714f6c
HV
1907 err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
1908 if (err < 0)
1909 goto fail_free;
1910
f59ad611
AW
1911 /* Prepare to handle notifications from subdevices */
1912 cx23885_v4l2_dev_notify_init(dev);
1913
d19770e5
ST
1914 /* pci init */
1915 dev->pci = pci_dev;
1916 if (pci_enable_device(pci_dev)) {
1917 err = -EIO;
c0714f6c 1918 goto fail_unreg;
d19770e5
ST
1919 }
1920
1921 if (cx23885_dev_setup(dev) < 0) {
1922 err = -EINVAL;
c0714f6c 1923 goto fail_unreg;
d19770e5
ST
1924 }
1925
1926 /* print pci info */
1927 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
1928 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
1929 printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, "
1930 "latency: %d, mmio: 0x%llx\n", dev->name,
1931 pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
a589b665
ST
1932 dev->pci_lat,
1933 (unsigned long long)pci_resource_start(pci_dev, 0));
d19770e5
ST
1934
1935 pci_set_master(pci_dev);
1936 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1937 printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1938 err = -EIO;
1939 goto fail_irq;
1940 }
1941
44a6481d
MK
1942 err = request_irq(pci_dev->irq, cx23885_irq,
1943 IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
d19770e5
ST
1944 if (err < 0) {
1945 printk(KERN_ERR "%s: can't get IRQ %d\n",
1946 dev->name, pci_dev->irq);
1947 goto fail_irq;
1948 }
1949
afd96668
HV
1950 switch (dev->board) {
1951 case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1952 cx_set(PCI_INT_MSK, 0x01800000); /* for NetUP */
1953 break;
1954 }
5a23b076 1955
f59ad611
AW
1956 /*
1957 * The CX2388[58] IR controller can start firing interrupts when
1958 * enabled, so these have to take place after the cx23885_irq() handler
1959 * is hooked up by the call to request_irq() above.
1960 */
1961 cx23885_ir_pci_int_enable(dev);
1962
d19770e5
ST
1963 return 0;
1964
1965fail_irq:
1966 cx23885_dev_unregister(dev);
c0714f6c
HV
1967fail_unreg:
1968 v4l2_device_unregister(&dev->v4l2_dev);
d19770e5
ST
1969fail_free:
1970 kfree(dev);
1971 return err;
1972}
1973
1974static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
1975{
c0714f6c
HV
1976 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1977 struct cx23885_dev *dev = to_cx23885(v4l2_dev);
d19770e5 1978
f59ad611 1979 cx23885_ir_fini(dev);
d19770e5 1980
f59ad611 1981 cx23885_shutdown(dev);
29f8a0a5 1982
d19770e5
ST
1983 pci_disable_device(pci_dev);
1984
1985 /* unregister stuff */
1986 free_irq(pci_dev->irq, dev);
d19770e5
ST
1987
1988 mutex_lock(&devlist);
1989 list_del(&dev->devlist);
1990 mutex_unlock(&devlist);
1991
1992 cx23885_dev_unregister(dev);
c0714f6c 1993 v4l2_device_unregister(v4l2_dev);
d19770e5
ST
1994 kfree(dev);
1995}
1996
1997static struct pci_device_id cx23885_pci_tbl[] = {
1998 {
1999 /* CX23885 */
2000 .vendor = 0x14f1,
2001 .device = 0x8852,
2002 .subvendor = PCI_ANY_ID,
2003 .subdevice = PCI_ANY_ID,
9c8ced51 2004 }, {
d19770e5
ST
2005 /* CX23887 Rev 2 */
2006 .vendor = 0x14f1,
2007 .device = 0x8880,
2008 .subvendor = PCI_ANY_ID,
2009 .subdevice = PCI_ANY_ID,
9c8ced51 2010 }, {
d19770e5
ST
2011 /* --- end of list --- */
2012 }
2013};
2014MODULE_DEVICE_TABLE(pci, cx23885_pci_tbl);
2015
2016static struct pci_driver cx23885_pci_driver = {
2017 .name = "cx23885",
2018 .id_table = cx23885_pci_tbl,
2019 .probe = cx23885_initdev,
2020 .remove = __devexit_p(cx23885_finidev),
2021 /* TODO */
2022 .suspend = NULL,
2023 .resume = NULL,
2024};
2025
2026static int cx23885_init(void)
2027{
2028 printk(KERN_INFO "cx23885 driver version %d.%d.%d loaded\n",
047646bf
ST
2029 (CX23885_VERSION_CODE >> 16) & 0xff,
2030 (CX23885_VERSION_CODE >> 8) & 0xff,
2031 CX23885_VERSION_CODE & 0xff);
d19770e5
ST
2032#ifdef SNAPSHOT
2033 printk(KERN_INFO "cx23885: snapshot date %04d-%02d-%02d\n",
2034 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
2035#endif
2036 return pci_register_driver(&cx23885_pci_driver);
2037}
2038
2039static void cx23885_fini(void)
2040{
2041 pci_unregister_driver(&cx23885_pci_driver);
2042}
2043
2044module_init(cx23885_init);
2045module_exit(cx23885_fini);
2046
2047/* ----------------------------------------------------------- */