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