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