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