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