[go: nahoru, domu]

1/*
2 *  Driver for the NXP SAA7164 PCIe bridge
3 *
4 *  Copyright (c) 2010 Steven Toth <stoth@kernellabs.com>
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#ifdef CONFIG_PROC_FS
34#include <linux/proc_fs.h>
35#endif
36#include "saa7164.h"
37
38MODULE_DESCRIPTION("Driver for NXP SAA7164 based TV cards");
39MODULE_AUTHOR("Steven Toth <stoth@kernellabs.com>");
40MODULE_LICENSE("GPL");
41
42/*
43 *  1 Basic
44 *  2
45 *  4 i2c
46 *  8 api
47 * 16 cmd
48 * 32 bus
49 */
50
51unsigned int saa_debug;
52module_param_named(debug, saa_debug, int, 0644);
53MODULE_PARM_DESC(debug, "enable debug messages");
54
55static unsigned int fw_debug;
56module_param(fw_debug, int, 0644);
57MODULE_PARM_DESC(fw_debug, "Firmware debug level def:2");
58
59unsigned int encoder_buffers = SAA7164_MAX_ENCODER_BUFFERS;
60module_param(encoder_buffers, int, 0644);
61MODULE_PARM_DESC(encoder_buffers, "Total buffers in read queue 16-512 def:64");
62
63unsigned int vbi_buffers = SAA7164_MAX_VBI_BUFFERS;
64module_param(vbi_buffers, int, 0644);
65MODULE_PARM_DESC(vbi_buffers, "Total buffers in read queue 16-512 def:64");
66
67unsigned int waitsecs = 10;
68module_param(waitsecs, int, 0644);
69MODULE_PARM_DESC(waitsecs, "timeout on firmware messages");
70
71static unsigned int card[]  = {[0 ... (SAA7164_MAXBOARDS - 1)] = UNSET };
72module_param_array(card,  int, NULL, 0444);
73MODULE_PARM_DESC(card, "card type");
74
75static unsigned int print_histogram = 64;
76module_param(print_histogram, int, 0644);
77MODULE_PARM_DESC(print_histogram, "print histogram values once");
78
79unsigned int crc_checking = 1;
80module_param(crc_checking, int, 0644);
81MODULE_PARM_DESC(crc_checking, "enable crc sanity checking on buffers");
82
83static unsigned int guard_checking = 1;
84module_param(guard_checking, int, 0644);
85MODULE_PARM_DESC(guard_checking,
86	"enable dma sanity checking for buffer overruns");
87
88static unsigned int saa7164_devcount;
89
90static DEFINE_MUTEX(devlist);
91LIST_HEAD(saa7164_devlist);
92
93#define INT_SIZE 16
94
95static void saa7164_pack_verifier(struct saa7164_buffer *buf)
96{
97	u8 *p = (u8 *)buf->cpu;
98	int i;
99
100	for (i = 0; i < buf->actual_size; i += 2048) {
101
102		if ((*(p + i + 0) != 0x00) || (*(p + i + 1) != 0x00) ||
103			(*(p + i + 2) != 0x01) || (*(p + i + 3) != 0xBA)) {
104			printk(KERN_ERR "No pack at 0x%x\n", i);
105#if 0
106			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
107				       p + 1, 32, false);
108#endif
109		}
110	}
111}
112
113#define FIXED_VIDEO_PID 0xf1
114#define FIXED_AUDIO_PID 0xf2
115
116static void saa7164_ts_verifier(struct saa7164_buffer *buf)
117{
118	struct saa7164_port *port = buf->port;
119	u32 i;
120	u8 cc, a;
121	u16 pid;
122	u8 __iomem *bufcpu = (u8 *)buf->cpu;
123
124	port->sync_errors = 0;
125	port->v_cc_errors = 0;
126	port->a_cc_errors = 0;
127
128	for (i = 0; i < buf->actual_size; i += 188) {
129		if (*(bufcpu + i) != 0x47)
130			port->sync_errors++;
131
132		/* TODO: Query pid lower 8 bits, ignoring upper bits intensionally */
133		pid = ((*(bufcpu + i + 1) & 0x1f) << 8) | *(bufcpu + i + 2);
134		cc = *(bufcpu + i + 3) & 0x0f;
135
136		if (pid == FIXED_VIDEO_PID) {
137			a = ((port->last_v_cc + 1) & 0x0f);
138			if (a != cc) {
139				printk(KERN_ERR "video cc last = %x current = %x i = %d\n",
140					port->last_v_cc, cc, i);
141				port->v_cc_errors++;
142			}
143
144			port->last_v_cc = cc;
145		} else
146		if (pid == FIXED_AUDIO_PID) {
147			a = ((port->last_a_cc + 1) & 0x0f);
148			if (a != cc) {
149				printk(KERN_ERR "audio cc last = %x current = %x i = %d\n",
150					port->last_a_cc, cc, i);
151				port->a_cc_errors++;
152			}
153
154			port->last_a_cc = cc;
155		}
156
157	}
158
159	/* Only report errors if we've been through this function atleast
160	 * once already and the cached cc values are primed. First time through
161	 * always generates errors.
162	 */
163	if (port->v_cc_errors && (port->done_first_interrupt > 1))
164		printk(KERN_ERR "video pid cc, %d errors\n", port->v_cc_errors);
165
166	if (port->a_cc_errors && (port->done_first_interrupt > 1))
167		printk(KERN_ERR "audio pid cc, %d errors\n", port->a_cc_errors);
168
169	if (port->sync_errors && (port->done_first_interrupt > 1))
170		printk(KERN_ERR "sync_errors = %d\n", port->sync_errors);
171
172	if (port->done_first_interrupt == 1)
173		port->done_first_interrupt++;
174}
175
176static void saa7164_histogram_reset(struct saa7164_histogram *hg, char *name)
177{
178	int i;
179
180	memset(hg, 0, sizeof(struct saa7164_histogram));
181	strcpy(hg->name, name);
182
183	/* First 30ms x 1ms */
184	for (i = 0; i < 30; i++)
185		hg->counter1[0 + i].val = i;
186
187	/* 30 - 200ms x 10ms  */
188	for (i = 0; i < 18; i++)
189		hg->counter1[30 + i].val = 30 + (i * 10);
190
191	/* 200 - 2000ms x 100ms  */
192	for (i = 0; i < 15; i++)
193		hg->counter1[48 + i].val = 200 + (i * 200);
194
195	/* Catch all massive value (2secs) */
196	hg->counter1[55].val = 2000;
197
198	/* Catch all massive value (4secs) */
199	hg->counter1[56].val = 4000;
200
201	/* Catch all massive value (8secs) */
202	hg->counter1[57].val = 8000;
203
204	/* Catch all massive value (15secs) */
205	hg->counter1[58].val = 15000;
206
207	/* Catch all massive value (30secs) */
208	hg->counter1[59].val = 30000;
209
210	/* Catch all massive value (60secs) */
211	hg->counter1[60].val = 60000;
212
213	/* Catch all massive value (5mins) */
214	hg->counter1[61].val = 300000;
215
216	/* Catch all massive value (15mins) */
217	hg->counter1[62].val = 900000;
218
219	/* Catch all massive values (1hr) */
220	hg->counter1[63].val = 3600000;
221}
222
223void saa7164_histogram_update(struct saa7164_histogram *hg, u32 val)
224{
225	int i;
226	for (i = 0; i < 64; i++) {
227		if (val <= hg->counter1[i].val) {
228			hg->counter1[i].count++;
229			hg->counter1[i].update_time = jiffies;
230			break;
231		}
232	}
233}
234
235static void saa7164_histogram_print(struct saa7164_port *port,
236	struct saa7164_histogram *hg)
237{
238	u32 entries = 0;
239	int i;
240
241	printk(KERN_ERR "Histogram named %s (ms, count, last_update_jiffy)\n", hg->name);
242	for (i = 0; i < 64; i++) {
243		if (hg->counter1[i].count == 0)
244			continue;
245
246		printk(KERN_ERR " %4d %12d %Ld\n",
247			hg->counter1[i].val,
248			hg->counter1[i].count,
249			hg->counter1[i].update_time);
250
251		entries++;
252	}
253	printk(KERN_ERR "Total: %d\n", entries);
254}
255
256static void saa7164_work_enchandler_helper(struct saa7164_port *port, int bufnr)
257{
258	struct saa7164_dev *dev = port->dev;
259	struct saa7164_buffer *buf = NULL;
260	struct saa7164_user_buffer *ubuf = NULL;
261	struct list_head *c, *n;
262	int i = 0;
263	u8 __iomem *p;
264
265	mutex_lock(&port->dmaqueue_lock);
266	list_for_each_safe(c, n, &port->dmaqueue.list) {
267
268		buf = list_entry(c, struct saa7164_buffer, list);
269		if (i++ > port->hwcfg.buffercount) {
270			printk(KERN_ERR "%s() illegal i count %d\n",
271				__func__, i);
272			break;
273		}
274
275		if (buf->idx == bufnr) {
276
277			/* Found the buffer, deal with it */
278			dprintk(DBGLVL_IRQ, "%s() bufnr: %d\n", __func__, bufnr);
279
280			if (crc_checking) {
281				/* Throw a new checksum on the dma buffer */
282				buf->crc = crc32(0, buf->cpu, buf->actual_size);
283			}
284
285			if (guard_checking) {
286				p = (u8 *)buf->cpu;
287				if ((*(p + buf->actual_size + 0) != 0xff) ||
288					(*(p + buf->actual_size + 1) != 0xff) ||
289					(*(p + buf->actual_size + 2) != 0xff) ||
290					(*(p + buf->actual_size + 3) != 0xff) ||
291					(*(p + buf->actual_size + 0x10) != 0xff) ||
292					(*(p + buf->actual_size + 0x11) != 0xff) ||
293					(*(p + buf->actual_size + 0x12) != 0xff) ||
294					(*(p + buf->actual_size + 0x13) != 0xff)) {
295						printk(KERN_ERR "%s() buf %p guard buffer breach\n",
296							__func__, buf);
297#if 0
298			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
299				       p + buf->actual_size - 32, 64, false);
300#endif
301				}
302			}
303
304			if ((port->nr != SAA7164_PORT_VBI1) && (port->nr != SAA7164_PORT_VBI2)) {
305				/* Validate the incoming buffer content */
306				if (port->encoder_params.stream_type == V4L2_MPEG_STREAM_TYPE_MPEG2_TS)
307					saa7164_ts_verifier(buf);
308				else if (port->encoder_params.stream_type == V4L2_MPEG_STREAM_TYPE_MPEG2_PS)
309					saa7164_pack_verifier(buf);
310			}
311
312			/* find a free user buffer and clone to it */
313			if (!list_empty(&port->list_buf_free.list)) {
314
315				/* Pull the first buffer from the used list */
316				ubuf = list_first_entry(&port->list_buf_free.list,
317					struct saa7164_user_buffer, list);
318
319				if (buf->actual_size <= ubuf->actual_size) {
320
321					memcpy_fromio(ubuf->data, buf->cpu,
322						ubuf->actual_size);
323
324					if (crc_checking) {
325						/* Throw a new checksum on the read buffer */
326						ubuf->crc = crc32(0, ubuf->data, ubuf->actual_size);
327					}
328
329					/* Requeue the buffer on the free list */
330					ubuf->pos = 0;
331
332					list_move_tail(&ubuf->list,
333						&port->list_buf_used.list);
334
335					/* Flag any userland waiters */
336					wake_up_interruptible(&port->wait_read);
337
338				} else {
339					printk(KERN_ERR "buf %p bufsize fails match\n", buf);
340				}
341
342			} else
343				printk(KERN_ERR "encirq no free buffers, increase param encoder_buffers\n");
344
345			/* Ensure offset into buffer remains 0, fill buffer
346			 * with known bad data. We check for this data at a later point
347			 * in time. */
348			saa7164_buffer_zero_offsets(port, bufnr);
349			memset_io(buf->cpu, 0xff, buf->pci_size);
350			if (crc_checking) {
351				/* Throw yet aanother new checksum on the dma buffer */
352				buf->crc = crc32(0, buf->cpu, buf->actual_size);
353			}
354
355			break;
356		}
357	}
358	mutex_unlock(&port->dmaqueue_lock);
359}
360
361static void saa7164_work_enchandler(struct work_struct *w)
362{
363	struct saa7164_port *port =
364		container_of(w, struct saa7164_port, workenc);
365	struct saa7164_dev *dev = port->dev;
366
367	u32 wp, mcb, rp, cnt = 0;
368
369	port->last_svc_msecs_diff = port->last_svc_msecs;
370	port->last_svc_msecs = jiffies_to_msecs(jiffies);
371
372	port->last_svc_msecs_diff = port->last_svc_msecs -
373		port->last_svc_msecs_diff;
374
375	saa7164_histogram_update(&port->svc_interval,
376		port->last_svc_msecs_diff);
377
378	port->last_irq_svc_msecs_diff = port->last_svc_msecs -
379		port->last_irq_msecs;
380
381	saa7164_histogram_update(&port->irq_svc_interval,
382		port->last_irq_svc_msecs_diff);
383
384	dprintk(DBGLVL_IRQ,
385		"%s() %Ldms elapsed irq->deferred %Ldms wp: %d rp: %d\n",
386		__func__,
387		port->last_svc_msecs_diff,
388		port->last_irq_svc_msecs_diff,
389		port->last_svc_wp,
390		port->last_svc_rp
391		);
392
393	/* Current write position */
394	wp = saa7164_readl(port->bufcounter);
395	if (wp > (port->hwcfg.buffercount - 1)) {
396		printk(KERN_ERR "%s() illegal buf count %d\n", __func__, wp);
397		return;
398	}
399
400	/* Most current complete buffer */
401	if (wp == 0)
402		mcb = (port->hwcfg.buffercount - 1);
403	else
404		mcb = wp - 1;
405
406	while (1) {
407		if (port->done_first_interrupt == 0) {
408			port->done_first_interrupt++;
409			rp = mcb;
410		} else
411			rp = (port->last_svc_rp + 1) % 8;
412
413		if (rp > (port->hwcfg.buffercount - 1)) {
414			printk(KERN_ERR "%s() illegal rp count %d\n", __func__, rp);
415			break;
416		}
417
418		saa7164_work_enchandler_helper(port, rp);
419		port->last_svc_rp = rp;
420		cnt++;
421
422		if (rp == mcb)
423			break;
424	}
425
426	/* TODO: Convert this into a /proc/saa7164 style readable file */
427	if (print_histogram == port->nr) {
428		saa7164_histogram_print(port, &port->irq_interval);
429		saa7164_histogram_print(port, &port->svc_interval);
430		saa7164_histogram_print(port, &port->irq_svc_interval);
431		saa7164_histogram_print(port, &port->read_interval);
432		saa7164_histogram_print(port, &port->poll_interval);
433		/* TODO: fix this to preserve any previous state */
434		print_histogram = 64 + port->nr;
435	}
436}
437
438static void saa7164_work_vbihandler(struct work_struct *w)
439{
440	struct saa7164_port *port =
441		container_of(w, struct saa7164_port, workenc);
442	struct saa7164_dev *dev = port->dev;
443
444	u32 wp, mcb, rp, cnt = 0;
445
446	port->last_svc_msecs_diff = port->last_svc_msecs;
447	port->last_svc_msecs = jiffies_to_msecs(jiffies);
448	port->last_svc_msecs_diff = port->last_svc_msecs -
449		port->last_svc_msecs_diff;
450
451	saa7164_histogram_update(&port->svc_interval,
452		port->last_svc_msecs_diff);
453
454	port->last_irq_svc_msecs_diff = port->last_svc_msecs -
455		port->last_irq_msecs;
456
457	saa7164_histogram_update(&port->irq_svc_interval,
458		port->last_irq_svc_msecs_diff);
459
460	dprintk(DBGLVL_IRQ,
461		"%s() %Ldms elapsed irq->deferred %Ldms wp: %d rp: %d\n",
462		__func__,
463		port->last_svc_msecs_diff,
464		port->last_irq_svc_msecs_diff,
465		port->last_svc_wp,
466		port->last_svc_rp
467		);
468
469	/* Current write position */
470	wp = saa7164_readl(port->bufcounter);
471	if (wp > (port->hwcfg.buffercount - 1)) {
472		printk(KERN_ERR "%s() illegal buf count %d\n", __func__, wp);
473		return;
474	}
475
476	/* Most current complete buffer */
477	if (wp == 0)
478		mcb = (port->hwcfg.buffercount - 1);
479	else
480		mcb = wp - 1;
481
482	while (1) {
483		if (port->done_first_interrupt == 0) {
484			port->done_first_interrupt++;
485			rp = mcb;
486		} else
487			rp = (port->last_svc_rp + 1) % 8;
488
489		if (rp > (port->hwcfg.buffercount - 1)) {
490			printk(KERN_ERR "%s() illegal rp count %d\n", __func__, rp);
491			break;
492		}
493
494		saa7164_work_enchandler_helper(port, rp);
495		port->last_svc_rp = rp;
496		cnt++;
497
498		if (rp == mcb)
499			break;
500	}
501
502	/* TODO: Convert this into a /proc/saa7164 style readable file */
503	if (print_histogram == port->nr) {
504		saa7164_histogram_print(port, &port->irq_interval);
505		saa7164_histogram_print(port, &port->svc_interval);
506		saa7164_histogram_print(port, &port->irq_svc_interval);
507		saa7164_histogram_print(port, &port->read_interval);
508		saa7164_histogram_print(port, &port->poll_interval);
509		/* TODO: fix this to preserve any previous state */
510		print_histogram = 64 + port->nr;
511	}
512}
513
514static void saa7164_work_cmdhandler(struct work_struct *w)
515{
516	struct saa7164_dev *dev = container_of(w, struct saa7164_dev, workcmd);
517
518	/* Wake up any complete commands */
519	saa7164_irq_dequeue(dev);
520}
521
522static void saa7164_buffer_deliver(struct saa7164_buffer *buf)
523{
524	struct saa7164_port *port = buf->port;
525
526	/* Feed the transport payload into the kernel demux */
527	dvb_dmx_swfilter_packets(&port->dvb.demux, (u8 *)buf->cpu,
528		SAA7164_TS_NUMBER_OF_LINES);
529
530}
531
532static irqreturn_t saa7164_irq_vbi(struct saa7164_port *port)
533{
534	struct saa7164_dev *dev = port->dev;
535
536	/* Store old time */
537	port->last_irq_msecs_diff = port->last_irq_msecs;
538
539	/* Collect new stats */
540	port->last_irq_msecs = jiffies_to_msecs(jiffies);
541
542	/* Calculate stats */
543	port->last_irq_msecs_diff = port->last_irq_msecs -
544		port->last_irq_msecs_diff;
545
546	saa7164_histogram_update(&port->irq_interval,
547		port->last_irq_msecs_diff);
548
549	dprintk(DBGLVL_IRQ, "%s() %Ldms elapsed\n", __func__,
550		port->last_irq_msecs_diff);
551
552	/* Tis calls the vbi irq handler */
553	schedule_work(&port->workenc);
554	return 0;
555}
556
557static irqreturn_t saa7164_irq_encoder(struct saa7164_port *port)
558{
559	struct saa7164_dev *dev = port->dev;
560
561	/* Store old time */
562	port->last_irq_msecs_diff = port->last_irq_msecs;
563
564	/* Collect new stats */
565	port->last_irq_msecs = jiffies_to_msecs(jiffies);
566
567	/* Calculate stats */
568	port->last_irq_msecs_diff = port->last_irq_msecs -
569		port->last_irq_msecs_diff;
570
571	saa7164_histogram_update(&port->irq_interval,
572		port->last_irq_msecs_diff);
573
574	dprintk(DBGLVL_IRQ, "%s() %Ldms elapsed\n", __func__,
575		port->last_irq_msecs_diff);
576
577	schedule_work(&port->workenc);
578	return 0;
579}
580
581static irqreturn_t saa7164_irq_ts(struct saa7164_port *port)
582{
583	struct saa7164_dev *dev = port->dev;
584	struct saa7164_buffer *buf;
585	struct list_head *c, *n;
586	int wp, i = 0, rp;
587
588	/* Find the current write point from the hardware */
589	wp = saa7164_readl(port->bufcounter);
590	if (wp > (port->hwcfg.buffercount - 1))
591		BUG();
592
593	/* Find the previous buffer to the current write point */
594	if (wp == 0)
595		rp = (port->hwcfg.buffercount - 1);
596	else
597		rp = wp - 1;
598
599	/* Lookup the WP in the buffer list */
600	/* TODO: turn this into a worker thread */
601	list_for_each_safe(c, n, &port->dmaqueue.list) {
602		buf = list_entry(c, struct saa7164_buffer, list);
603		if (i++ > port->hwcfg.buffercount)
604			BUG();
605
606		if (buf->idx == rp) {
607			/* Found the buffer, deal with it */
608			dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d\n",
609				__func__, wp, rp);
610			saa7164_buffer_deliver(buf);
611			break;
612		}
613
614	}
615	return 0;
616}
617
618/* Primary IRQ handler and dispatch mechanism */
619static irqreturn_t saa7164_irq(int irq, void *dev_id)
620{
621	struct saa7164_dev *dev = dev_id;
622	struct saa7164_port *porta = &dev->ports[SAA7164_PORT_TS1];
623	struct saa7164_port *portb = &dev->ports[SAA7164_PORT_TS2];
624	struct saa7164_port *portc = &dev->ports[SAA7164_PORT_ENC1];
625	struct saa7164_port *portd = &dev->ports[SAA7164_PORT_ENC2];
626	struct saa7164_port *porte = &dev->ports[SAA7164_PORT_VBI1];
627	struct saa7164_port *portf = &dev->ports[SAA7164_PORT_VBI2];
628
629	u32 intid, intstat[INT_SIZE/4];
630	int i, handled = 0, bit;
631
632	if (dev == NULL) {
633		printk(KERN_ERR "%s() No device specified\n", __func__);
634		handled = 0;
635		goto out;
636	}
637
638	/* Check that the hardware is accessible. If the status bytes are
639	 * 0xFF then the device is not accessible, the the IRQ belongs
640	 * to another driver.
641	 * 4 x u32 interrupt registers.
642	 */
643	for (i = 0; i < INT_SIZE/4; i++) {
644
645		/* TODO: Convert into saa7164_readl() */
646		/* Read the 4 hardware interrupt registers */
647		intstat[i] = saa7164_readl(dev->int_status + (i * 4));
648
649		if (intstat[i])
650			handled = 1;
651	}
652	if (handled == 0)
653		goto out;
654
655	/* For each of the HW interrupt registers */
656	for (i = 0; i < INT_SIZE/4; i++) {
657
658		if (intstat[i]) {
659			/* Each function of the board has it's own interruptid.
660			 * Find the function that triggered then call
661			 * it's handler.
662			 */
663			for (bit = 0; bit < 32; bit++) {
664
665				if (((intstat[i] >> bit) & 0x00000001) == 0)
666					continue;
667
668				/* Calculate the interrupt id (0x00 to 0x7f) */
669
670				intid = (i * 32) + bit;
671				if (intid == dev->intfdesc.bInterruptId) {
672					/* A response to an cmd/api call */
673					schedule_work(&dev->workcmd);
674				} else if (intid == porta->hwcfg.interruptid) {
675
676					/* Transport path 1 */
677					saa7164_irq_ts(porta);
678
679				} else if (intid == portb->hwcfg.interruptid) {
680
681					/* Transport path 2 */
682					saa7164_irq_ts(portb);
683
684				} else if (intid == portc->hwcfg.interruptid) {
685
686					/* Encoder path 1 */
687					saa7164_irq_encoder(portc);
688
689				} else if (intid == portd->hwcfg.interruptid) {
690
691					/* Encoder path 2 */
692					saa7164_irq_encoder(portd);
693
694				} else if (intid == porte->hwcfg.interruptid) {
695
696					/* VBI path 1 */
697					saa7164_irq_vbi(porte);
698
699				} else if (intid == portf->hwcfg.interruptid) {
700
701					/* VBI path 2 */
702					saa7164_irq_vbi(portf);
703
704				} else {
705					/* Find the function */
706					dprintk(DBGLVL_IRQ,
707						"%s() unhandled interrupt "
708						"reg 0x%x bit 0x%x "
709						"intid = 0x%x\n",
710						__func__, i, bit, intid);
711				}
712			}
713
714			/* Ack it */
715			saa7164_writel(dev->int_ack + (i * 4), intstat[i]);
716
717		}
718	}
719out:
720	return IRQ_RETVAL(handled);
721}
722
723void saa7164_getfirmwarestatus(struct saa7164_dev *dev)
724{
725	struct saa7164_fw_status *s = &dev->fw_status;
726
727	dev->fw_status.status = saa7164_readl(SAA_DEVICE_SYSINIT_STATUS);
728	dev->fw_status.mode = saa7164_readl(SAA_DEVICE_SYSINIT_MODE);
729	dev->fw_status.spec = saa7164_readl(SAA_DEVICE_SYSINIT_SPEC);
730	dev->fw_status.inst = saa7164_readl(SAA_DEVICE_SYSINIT_INST);
731	dev->fw_status.cpuload = saa7164_readl(SAA_DEVICE_SYSINIT_CPULOAD);
732	dev->fw_status.remainheap =
733		saa7164_readl(SAA_DEVICE_SYSINIT_REMAINHEAP);
734
735	dprintk(1, "Firmware status:\n");
736	dprintk(1, " .status     = 0x%08x\n", s->status);
737	dprintk(1, " .mode       = 0x%08x\n", s->mode);
738	dprintk(1, " .spec       = 0x%08x\n", s->spec);
739	dprintk(1, " .inst       = 0x%08x\n", s->inst);
740	dprintk(1, " .cpuload    = 0x%08x\n", s->cpuload);
741	dprintk(1, " .remainheap = 0x%08x\n", s->remainheap);
742}
743
744u32 saa7164_getcurrentfirmwareversion(struct saa7164_dev *dev)
745{
746	u32 reg;
747
748	reg = saa7164_readl(SAA_DEVICE_VERSION);
749	dprintk(1, "Device running firmware version %d.%d.%d.%d (0x%x)\n",
750		(reg & 0x0000fc00) >> 10,
751		(reg & 0x000003e0) >> 5,
752		(reg & 0x0000001f),
753		(reg & 0xffff0000) >> 16,
754		reg);
755
756	return reg;
757}
758
759/* TODO: Debugging func, remove */
760void saa7164_dumpregs(struct saa7164_dev *dev, u32 addr)
761{
762	int i;
763
764	dprintk(1, "--------------------> "
765		"00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
766
767	for (i = 0; i < 0x100; i += 16)
768		dprintk(1, "region0[0x%08x] = "
769			"%02x %02x %02x %02x %02x %02x %02x %02x"
770			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
771			(u8)saa7164_readb(addr + i + 0),
772			(u8)saa7164_readb(addr + i + 1),
773			(u8)saa7164_readb(addr + i + 2),
774			(u8)saa7164_readb(addr + i + 3),
775			(u8)saa7164_readb(addr + i + 4),
776			(u8)saa7164_readb(addr + i + 5),
777			(u8)saa7164_readb(addr + i + 6),
778			(u8)saa7164_readb(addr + i + 7),
779			(u8)saa7164_readb(addr + i + 8),
780			(u8)saa7164_readb(addr + i + 9),
781			(u8)saa7164_readb(addr + i + 10),
782			(u8)saa7164_readb(addr + i + 11),
783			(u8)saa7164_readb(addr + i + 12),
784			(u8)saa7164_readb(addr + i + 13),
785			(u8)saa7164_readb(addr + i + 14),
786			(u8)saa7164_readb(addr + i + 15)
787			);
788}
789
790static void saa7164_dump_hwdesc(struct saa7164_dev *dev)
791{
792	dprintk(1, "@0x%p hwdesc sizeof(struct tmComResHWDescr) = %d bytes\n",
793		&dev->hwdesc, (u32)sizeof(struct tmComResHWDescr));
794
795	dprintk(1, " .bLength = 0x%x\n", dev->hwdesc.bLength);
796	dprintk(1, " .bDescriptorType = 0x%x\n", dev->hwdesc.bDescriptorType);
797	dprintk(1, " .bDescriptorSubtype = 0x%x\n",
798		dev->hwdesc.bDescriptorSubtype);
799
800	dprintk(1, " .bcdSpecVersion = 0x%x\n", dev->hwdesc.bcdSpecVersion);
801	dprintk(1, " .dwClockFrequency = 0x%x\n", dev->hwdesc.dwClockFrequency);
802	dprintk(1, " .dwClockUpdateRes = 0x%x\n", dev->hwdesc.dwClockUpdateRes);
803	dprintk(1, " .bCapabilities = 0x%x\n", dev->hwdesc.bCapabilities);
804	dprintk(1, " .dwDeviceRegistersLocation = 0x%x\n",
805		dev->hwdesc.dwDeviceRegistersLocation);
806
807	dprintk(1, " .dwHostMemoryRegion = 0x%x\n",
808		dev->hwdesc.dwHostMemoryRegion);
809
810	dprintk(1, " .dwHostMemoryRegionSize = 0x%x\n",
811		dev->hwdesc.dwHostMemoryRegionSize);
812
813	dprintk(1, " .dwHostHibernatMemRegion = 0x%x\n",
814		dev->hwdesc.dwHostHibernatMemRegion);
815
816	dprintk(1, " .dwHostHibernatMemRegionSize = 0x%x\n",
817		dev->hwdesc.dwHostHibernatMemRegionSize);
818}
819
820static void saa7164_dump_intfdesc(struct saa7164_dev *dev)
821{
822	dprintk(1, "@0x%p intfdesc "
823		"sizeof(struct tmComResInterfaceDescr) = %d bytes\n",
824		&dev->intfdesc, (u32)sizeof(struct tmComResInterfaceDescr));
825
826	dprintk(1, " .bLength = 0x%x\n", dev->intfdesc.bLength);
827	dprintk(1, " .bDescriptorType = 0x%x\n", dev->intfdesc.bDescriptorType);
828	dprintk(1, " .bDescriptorSubtype = 0x%x\n",
829		dev->intfdesc.bDescriptorSubtype);
830
831	dprintk(1, " .bFlags = 0x%x\n", dev->intfdesc.bFlags);
832	dprintk(1, " .bInterfaceType = 0x%x\n", dev->intfdesc.bInterfaceType);
833	dprintk(1, " .bInterfaceId = 0x%x\n", dev->intfdesc.bInterfaceId);
834	dprintk(1, " .bBaseInterface = 0x%x\n", dev->intfdesc.bBaseInterface);
835	dprintk(1, " .bInterruptId = 0x%x\n", dev->intfdesc.bInterruptId);
836	dprintk(1, " .bDebugInterruptId = 0x%x\n",
837		dev->intfdesc.bDebugInterruptId);
838
839	dprintk(1, " .BARLocation = 0x%x\n", dev->intfdesc.BARLocation);
840}
841
842static void saa7164_dump_busdesc(struct saa7164_dev *dev)
843{
844	dprintk(1, "@0x%p busdesc sizeof(struct tmComResBusDescr) = %d bytes\n",
845		&dev->busdesc, (u32)sizeof(struct tmComResBusDescr));
846
847	dprintk(1, " .CommandRing   = 0x%016Lx\n", dev->busdesc.CommandRing);
848	dprintk(1, " .ResponseRing  = 0x%016Lx\n", dev->busdesc.ResponseRing);
849	dprintk(1, " .CommandWrite  = 0x%x\n", dev->busdesc.CommandWrite);
850	dprintk(1, " .CommandRead   = 0x%x\n", dev->busdesc.CommandRead);
851	dprintk(1, " .ResponseWrite = 0x%x\n", dev->busdesc.ResponseWrite);
852	dprintk(1, " .ResponseRead  = 0x%x\n", dev->busdesc.ResponseRead);
853}
854
855/* Much of the hardware configuration and PCI registers are configured
856 * dynamically depending on firmware. We have to cache some initial
857 * structures then use these to locate other important structures
858 * from PCI space.
859 */
860static void saa7164_get_descriptors(struct saa7164_dev *dev)
861{
862	memcpy_fromio(&dev->hwdesc, dev->bmmio, sizeof(struct tmComResHWDescr));
863	memcpy_fromio(&dev->intfdesc, dev->bmmio + sizeof(struct tmComResHWDescr),
864		sizeof(struct tmComResInterfaceDescr));
865	memcpy_fromio(&dev->busdesc, dev->bmmio + dev->intfdesc.BARLocation,
866		sizeof(struct tmComResBusDescr));
867
868	if (dev->hwdesc.bLength != sizeof(struct tmComResHWDescr)) {
869		printk(KERN_ERR "Structure struct tmComResHWDescr is mangled\n");
870		printk(KERN_ERR "Need %x got %d\n", dev->hwdesc.bLength,
871			(u32)sizeof(struct tmComResHWDescr));
872	} else
873		saa7164_dump_hwdesc(dev);
874
875	if (dev->intfdesc.bLength != sizeof(struct tmComResInterfaceDescr)) {
876		printk(KERN_ERR "struct struct tmComResInterfaceDescr is mangled\n");
877		printk(KERN_ERR "Need %x got %d\n", dev->intfdesc.bLength,
878			(u32)sizeof(struct tmComResInterfaceDescr));
879	} else
880		saa7164_dump_intfdesc(dev);
881
882	saa7164_dump_busdesc(dev);
883}
884
885static int saa7164_pci_quirks(struct saa7164_dev *dev)
886{
887	return 0;
888}
889
890static int get_resources(struct saa7164_dev *dev)
891{
892	if (request_mem_region(pci_resource_start(dev->pci, 0),
893		pci_resource_len(dev->pci, 0), dev->name)) {
894
895		if (request_mem_region(pci_resource_start(dev->pci, 2),
896			pci_resource_len(dev->pci, 2), dev->name))
897			return 0;
898	}
899
900	printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx or 0x%llx\n",
901		dev->name,
902		(u64)pci_resource_start(dev->pci, 0),
903		(u64)pci_resource_start(dev->pci, 2));
904
905	return -EBUSY;
906}
907
908static int saa7164_port_init(struct saa7164_dev *dev, int portnr)
909{
910	struct saa7164_port *port = NULL;
911
912	if ((portnr < 0) || (portnr >= SAA7164_MAX_PORTS))
913		BUG();
914
915	port = &dev->ports[portnr];
916
917	port->dev = dev;
918	port->nr = portnr;
919
920	if ((portnr == SAA7164_PORT_TS1) || (portnr == SAA7164_PORT_TS2))
921		port->type = SAA7164_MPEG_DVB;
922	else
923	if ((portnr == SAA7164_PORT_ENC1) || (portnr == SAA7164_PORT_ENC2)) {
924		port->type = SAA7164_MPEG_ENCODER;
925
926		/* We need a deferred interrupt handler for cmd handling */
927		INIT_WORK(&port->workenc, saa7164_work_enchandler);
928	} else if ((portnr == SAA7164_PORT_VBI1) || (portnr == SAA7164_PORT_VBI2)) {
929		port->type = SAA7164_MPEG_VBI;
930
931		/* We need a deferred interrupt handler for cmd handling */
932		INIT_WORK(&port->workenc, saa7164_work_vbihandler);
933	} else
934		BUG();
935
936	/* Init all the critical resources */
937	mutex_init(&port->dvb.lock);
938	INIT_LIST_HEAD(&port->dmaqueue.list);
939	mutex_init(&port->dmaqueue_lock);
940
941	INIT_LIST_HEAD(&port->list_buf_used.list);
942	INIT_LIST_HEAD(&port->list_buf_free.list);
943	init_waitqueue_head(&port->wait_read);
944
945
946	saa7164_histogram_reset(&port->irq_interval, "irq intervals");
947	saa7164_histogram_reset(&port->svc_interval, "deferred intervals");
948	saa7164_histogram_reset(&port->irq_svc_interval,
949		"irq to deferred intervals");
950	saa7164_histogram_reset(&port->read_interval,
951		"encoder/vbi read() intervals");
952	saa7164_histogram_reset(&port->poll_interval,
953		"encoder/vbi poll() intervals");
954
955	return 0;
956}
957
958static int saa7164_dev_setup(struct saa7164_dev *dev)
959{
960	int i;
961
962	mutex_init(&dev->lock);
963	atomic_inc(&dev->refcount);
964	dev->nr = saa7164_devcount++;
965
966	snprintf(dev->name, sizeof(dev->name), "saa7164[%d]", dev->nr);
967
968	mutex_lock(&devlist);
969	list_add_tail(&dev->devlist, &saa7164_devlist);
970	mutex_unlock(&devlist);
971
972	/* board config */
973	dev->board = UNSET;
974	if (card[dev->nr] < saa7164_bcount)
975		dev->board = card[dev->nr];
976
977	for (i = 0; UNSET == dev->board  &&  i < saa7164_idcount; i++)
978		if (dev->pci->subsystem_vendor == saa7164_subids[i].subvendor &&
979			dev->pci->subsystem_device ==
980				saa7164_subids[i].subdevice)
981				dev->board = saa7164_subids[i].card;
982
983	if (UNSET == dev->board) {
984		dev->board = SAA7164_BOARD_UNKNOWN;
985		saa7164_card_list(dev);
986	}
987
988	dev->pci_bus  = dev->pci->bus->number;
989	dev->pci_slot = PCI_SLOT(dev->pci->devfn);
990
991	/* I2C Defaults / setup */
992	dev->i2c_bus[0].dev = dev;
993	dev->i2c_bus[0].nr = 0;
994	dev->i2c_bus[1].dev = dev;
995	dev->i2c_bus[1].nr = 1;
996	dev->i2c_bus[2].dev = dev;
997	dev->i2c_bus[2].nr = 2;
998
999	/* Transport + Encoder ports 1, 2, 3, 4 - Defaults / setup */
1000	saa7164_port_init(dev, SAA7164_PORT_TS1);
1001	saa7164_port_init(dev, SAA7164_PORT_TS2);
1002	saa7164_port_init(dev, SAA7164_PORT_ENC1);
1003	saa7164_port_init(dev, SAA7164_PORT_ENC2);
1004	saa7164_port_init(dev, SAA7164_PORT_VBI1);
1005	saa7164_port_init(dev, SAA7164_PORT_VBI2);
1006
1007	if (get_resources(dev) < 0) {
1008		printk(KERN_ERR "CORE %s No more PCIe resources for "
1009		       "subsystem: %04x:%04x\n",
1010		       dev->name, dev->pci->subsystem_vendor,
1011		       dev->pci->subsystem_device);
1012
1013		saa7164_devcount--;
1014		return -ENODEV;
1015	}
1016
1017	/* PCI/e allocations */
1018	dev->lmmio = ioremap(pci_resource_start(dev->pci, 0),
1019			     pci_resource_len(dev->pci, 0));
1020
1021	dev->lmmio2 = ioremap(pci_resource_start(dev->pci, 2),
1022			     pci_resource_len(dev->pci, 2));
1023
1024	dev->bmmio = (u8 __iomem *)dev->lmmio;
1025	dev->bmmio2 = (u8 __iomem *)dev->lmmio2;
1026
1027	/* Inerrupt and ack register locations offset of bmmio */
1028	dev->int_status = 0x183000 + 0xf80;
1029	dev->int_ack = 0x183000 + 0xf90;
1030
1031	printk(KERN_INFO
1032		"CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
1033	       dev->name, dev->pci->subsystem_vendor,
1034	       dev->pci->subsystem_device, saa7164_boards[dev->board].name,
1035	       dev->board, card[dev->nr] == dev->board ?
1036	       "insmod option" : "autodetected");
1037
1038	saa7164_pci_quirks(dev);
1039
1040	return 0;
1041}
1042
1043static void saa7164_dev_unregister(struct saa7164_dev *dev)
1044{
1045	dprintk(1, "%s()\n", __func__);
1046
1047	release_mem_region(pci_resource_start(dev->pci, 0),
1048		pci_resource_len(dev->pci, 0));
1049
1050	release_mem_region(pci_resource_start(dev->pci, 2),
1051		pci_resource_len(dev->pci, 2));
1052
1053	if (!atomic_dec_and_test(&dev->refcount))
1054		return;
1055
1056	iounmap(dev->lmmio);
1057	iounmap(dev->lmmio2);
1058
1059	return;
1060}
1061
1062#ifdef CONFIG_PROC_FS
1063static int saa7164_proc_show(struct seq_file *m, void *v)
1064{
1065	struct saa7164_dev *dev;
1066	struct tmComResBusInfo *b;
1067	struct list_head *list;
1068	int i, c;
1069
1070	if (saa7164_devcount == 0)
1071		return 0;
1072
1073	list_for_each(list, &saa7164_devlist) {
1074		dev = list_entry(list, struct saa7164_dev, devlist);
1075		seq_printf(m, "%s = %p\n", dev->name, dev);
1076
1077		/* Lock the bus from any other access */
1078		b = &dev->bus;
1079		mutex_lock(&b->lock);
1080
1081		seq_printf(m, " .m_pdwSetWritePos = 0x%x (0x%08x)\n",
1082			b->m_dwSetReadPos, saa7164_readl(b->m_dwSetReadPos));
1083
1084		seq_printf(m, " .m_pdwSetReadPos  = 0x%x (0x%08x)\n",
1085			b->m_dwSetWritePos, saa7164_readl(b->m_dwSetWritePos));
1086
1087		seq_printf(m, " .m_pdwGetWritePos = 0x%x (0x%08x)\n",
1088			b->m_dwGetReadPos, saa7164_readl(b->m_dwGetReadPos));
1089
1090		seq_printf(m, " .m_pdwGetReadPos  = 0x%x (0x%08x)\n",
1091			b->m_dwGetWritePos, saa7164_readl(b->m_dwGetWritePos));
1092		c = 0;
1093		seq_printf(m, "\n  Set Ring:\n");
1094		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
1095		for (i = 0; i < b->m_dwSizeSetRing; i++) {
1096			if (c == 0)
1097				seq_printf(m, " %04x:", i);
1098
1099			seq_printf(m, " %02x", *(b->m_pdwSetRing + i));
1100
1101			if (++c == 16) {
1102				seq_printf(m, "\n");
1103				c = 0;
1104			}
1105		}
1106
1107		c = 0;
1108		seq_printf(m, "\n  Get Ring:\n");
1109		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
1110		for (i = 0; i < b->m_dwSizeGetRing; i++) {
1111			if (c == 0)
1112				seq_printf(m, " %04x:", i);
1113
1114			seq_printf(m, " %02x", *(b->m_pdwGetRing + i));
1115
1116			if (++c == 16) {
1117				seq_printf(m, "\n");
1118				c = 0;
1119			}
1120		}
1121
1122		mutex_unlock(&b->lock);
1123
1124	}
1125
1126	return 0;
1127}
1128
1129static int saa7164_proc_open(struct inode *inode, struct file *filp)
1130{
1131	return single_open(filp, saa7164_proc_show, NULL);
1132}
1133
1134static const struct file_operations saa7164_proc_fops = {
1135	.open		= saa7164_proc_open,
1136	.read		= seq_read,
1137	.llseek		= seq_lseek,
1138	.release	= single_release,
1139};
1140
1141static int saa7164_proc_create(void)
1142{
1143	struct proc_dir_entry *pe;
1144
1145	pe = proc_create("saa7164", S_IRUGO, NULL, &saa7164_proc_fops);
1146	if (!pe)
1147		return -ENOMEM;
1148
1149	return 0;
1150}
1151#endif
1152
1153static int saa7164_thread_function(void *data)
1154{
1155	struct saa7164_dev *dev = data;
1156	struct tmFwInfoStruct fwinfo;
1157	u64 last_poll_time = 0;
1158
1159	dprintk(DBGLVL_THR, "thread started\n");
1160
1161	set_freezable();
1162
1163	while (1) {
1164		msleep_interruptible(100);
1165		if (kthread_should_stop())
1166			break;
1167		try_to_freeze();
1168
1169		dprintk(DBGLVL_THR, "thread running\n");
1170
1171		/* Dump the firmware debug message to console */
1172		/* Polling this costs us 1-2% of the arm CPU */
1173		/* convert this into a respnde to interrupt 0x7a */
1174		saa7164_api_collect_debug(dev);
1175
1176		/* Monitor CPU load every 1 second */
1177		if ((last_poll_time + 1000 /* ms */) < jiffies_to_msecs(jiffies)) {
1178			saa7164_api_get_load_info(dev, &fwinfo);
1179			last_poll_time = jiffies_to_msecs(jiffies);
1180		}
1181
1182	}
1183
1184	dprintk(DBGLVL_THR, "thread exiting\n");
1185	return 0;
1186}
1187
1188static int saa7164_initdev(struct pci_dev *pci_dev,
1189			   const struct pci_device_id *pci_id)
1190{
1191	struct saa7164_dev *dev;
1192	int err, i;
1193	u32 version;
1194
1195	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1196	if (NULL == dev)
1197		return -ENOMEM;
1198
1199	err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
1200	if (err < 0) {
1201		dev_err(&pci_dev->dev, "v4l2_device_register failed\n");
1202		goto fail_free;
1203	}
1204
1205	/* pci init */
1206	dev->pci = pci_dev;
1207	if (pci_enable_device(pci_dev)) {
1208		err = -EIO;
1209		goto fail_free;
1210	}
1211
1212	if (saa7164_dev_setup(dev) < 0) {
1213		err = -EINVAL;
1214		goto fail_free;
1215	}
1216
1217	/* print pci info */
1218	dev->pci_rev = pci_dev->revision;
1219	pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER,  &dev->pci_lat);
1220	printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, "
1221	       "latency: %d, mmio: 0x%llx\n", dev->name,
1222	       pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
1223	       dev->pci_lat,
1224		(unsigned long long)pci_resource_start(pci_dev, 0));
1225
1226	pci_set_master(pci_dev);
1227	/* TODO */
1228	if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1229		printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1230		err = -EIO;
1231		goto fail_irq;
1232	}
1233
1234	err = request_irq(pci_dev->irq, saa7164_irq,
1235		IRQF_SHARED, dev->name, dev);
1236	if (err < 0) {
1237		printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name,
1238			pci_dev->irq);
1239		err = -EIO;
1240		goto fail_irq;
1241	}
1242
1243	pci_set_drvdata(pci_dev, dev);
1244
1245	/* Init the internal command list */
1246	for (i = 0; i < SAA_CMD_MAX_MSG_UNITS; i++) {
1247		dev->cmds[i].seqno = i;
1248		dev->cmds[i].inuse = 0;
1249		mutex_init(&dev->cmds[i].lock);
1250		init_waitqueue_head(&dev->cmds[i].wait);
1251	}
1252
1253	/* We need a deferred interrupt handler for cmd handling */
1254	INIT_WORK(&dev->workcmd, saa7164_work_cmdhandler);
1255
1256	/* Only load the firmware if we know the board */
1257	if (dev->board != SAA7164_BOARD_UNKNOWN) {
1258
1259		err = saa7164_downloadfirmware(dev);
1260		if (err < 0) {
1261			printk(KERN_ERR
1262				"Failed to boot firmware, no features "
1263				"registered\n");
1264			goto fail_fw;
1265		}
1266
1267		saa7164_get_descriptors(dev);
1268		saa7164_dumpregs(dev, 0);
1269		saa7164_getcurrentfirmwareversion(dev);
1270		saa7164_getfirmwarestatus(dev);
1271		err = saa7164_bus_setup(dev);
1272		if (err < 0)
1273			printk(KERN_ERR
1274				"Failed to setup the bus, will continue\n");
1275		saa7164_bus_dump(dev);
1276
1277		/* Ping the running firmware via the command bus and get the
1278		 * firmware version, this checks the bus is running OK.
1279		 */
1280		version = 0;
1281		if (saa7164_api_get_fw_version(dev, &version) == SAA_OK)
1282			dprintk(1, "Bus is operating correctly using "
1283				"version %d.%d.%d.%d (0x%x)\n",
1284				(version & 0x0000fc00) >> 10,
1285				(version & 0x000003e0) >> 5,
1286				(version & 0x0000001f),
1287				(version & 0xffff0000) >> 16,
1288				version);
1289		else
1290			printk(KERN_ERR
1291				"Failed to communicate with the firmware\n");
1292
1293		/* Bring up the I2C buses */
1294		saa7164_i2c_register(&dev->i2c_bus[0]);
1295		saa7164_i2c_register(&dev->i2c_bus[1]);
1296		saa7164_i2c_register(&dev->i2c_bus[2]);
1297		saa7164_gpio_setup(dev);
1298		saa7164_card_setup(dev);
1299
1300		/* Parse the dynamic device configuration, find various
1301		 * media endpoints (MPEG, WMV, PS, TS) and cache their
1302		 * configuration details into the driver, so we can
1303		 * reference them later during simething_register() func,
1304		 * interrupt handlers, deferred work handlers etc.
1305		 */
1306		saa7164_api_enum_subdevs(dev);
1307
1308		/* Begin to create the video sub-systems and register funcs */
1309		if (saa7164_boards[dev->board].porta == SAA7164_MPEG_DVB) {
1310			if (saa7164_dvb_register(&dev->ports[SAA7164_PORT_TS1]) < 0) {
1311				printk(KERN_ERR "%s() Failed to register "
1312					"dvb adapters on porta\n",
1313					__func__);
1314			}
1315		}
1316
1317		if (saa7164_boards[dev->board].portb == SAA7164_MPEG_DVB) {
1318			if (saa7164_dvb_register(&dev->ports[SAA7164_PORT_TS2]) < 0) {
1319				printk(KERN_ERR"%s() Failed to register "
1320					"dvb adapters on portb\n",
1321					__func__);
1322			}
1323		}
1324
1325		if (saa7164_boards[dev->board].portc == SAA7164_MPEG_ENCODER) {
1326			if (saa7164_encoder_register(&dev->ports[SAA7164_PORT_ENC1]) < 0) {
1327				printk(KERN_ERR"%s() Failed to register "
1328					"mpeg encoder\n", __func__);
1329			}
1330		}
1331
1332		if (saa7164_boards[dev->board].portd == SAA7164_MPEG_ENCODER) {
1333			if (saa7164_encoder_register(&dev->ports[SAA7164_PORT_ENC2]) < 0) {
1334				printk(KERN_ERR"%s() Failed to register "
1335					"mpeg encoder\n", __func__);
1336			}
1337		}
1338
1339		if (saa7164_boards[dev->board].porte == SAA7164_MPEG_VBI) {
1340			if (saa7164_vbi_register(&dev->ports[SAA7164_PORT_VBI1]) < 0) {
1341				printk(KERN_ERR"%s() Failed to register "
1342					"vbi device\n", __func__);
1343			}
1344		}
1345
1346		if (saa7164_boards[dev->board].portf == SAA7164_MPEG_VBI) {
1347			if (saa7164_vbi_register(&dev->ports[SAA7164_PORT_VBI2]) < 0) {
1348				printk(KERN_ERR"%s() Failed to register "
1349					"vbi device\n", __func__);
1350			}
1351		}
1352		saa7164_api_set_debug(dev, fw_debug);
1353
1354		if (fw_debug) {
1355			dev->kthread = kthread_run(saa7164_thread_function, dev,
1356				"saa7164 debug");
1357			if (IS_ERR(dev->kthread)) {
1358				dev->kthread = NULL;
1359				printk(KERN_ERR "%s() Failed to create "
1360					"debug kernel thread\n", __func__);
1361			}
1362		}
1363
1364	} /* != BOARD_UNKNOWN */
1365	else
1366		printk(KERN_ERR "%s() Unsupported board detected, "
1367			"registering without firmware\n", __func__);
1368
1369	dprintk(1, "%s() parameter debug = %d\n", __func__, saa_debug);
1370	dprintk(1, "%s() parameter waitsecs = %d\n", __func__, waitsecs);
1371
1372fail_fw:
1373	return 0;
1374
1375fail_irq:
1376	saa7164_dev_unregister(dev);
1377fail_free:
1378	v4l2_device_unregister(&dev->v4l2_dev);
1379	kfree(dev);
1380	return err;
1381}
1382
1383static void saa7164_shutdown(struct saa7164_dev *dev)
1384{
1385	dprintk(1, "%s()\n", __func__);
1386}
1387
1388static void saa7164_finidev(struct pci_dev *pci_dev)
1389{
1390	struct saa7164_dev *dev = pci_get_drvdata(pci_dev);
1391
1392	if (dev->board != SAA7164_BOARD_UNKNOWN) {
1393		if (fw_debug && dev->kthread) {
1394			kthread_stop(dev->kthread);
1395			dev->kthread = NULL;
1396		}
1397		if (dev->firmwareloaded)
1398			saa7164_api_set_debug(dev, 0x00);
1399	}
1400
1401	saa7164_histogram_print(&dev->ports[SAA7164_PORT_ENC1],
1402		&dev->ports[SAA7164_PORT_ENC1].irq_interval);
1403	saa7164_histogram_print(&dev->ports[SAA7164_PORT_ENC1],
1404		&dev->ports[SAA7164_PORT_ENC1].svc_interval);
1405	saa7164_histogram_print(&dev->ports[SAA7164_PORT_ENC1],
1406		&dev->ports[SAA7164_PORT_ENC1].irq_svc_interval);
1407	saa7164_histogram_print(&dev->ports[SAA7164_PORT_ENC1],
1408		&dev->ports[SAA7164_PORT_ENC1].read_interval);
1409	saa7164_histogram_print(&dev->ports[SAA7164_PORT_ENC1],
1410		&dev->ports[SAA7164_PORT_ENC1].poll_interval);
1411	saa7164_histogram_print(&dev->ports[SAA7164_PORT_VBI1],
1412		&dev->ports[SAA7164_PORT_VBI1].read_interval);
1413	saa7164_histogram_print(&dev->ports[SAA7164_PORT_VBI2],
1414		&dev->ports[SAA7164_PORT_VBI2].poll_interval);
1415
1416	saa7164_shutdown(dev);
1417
1418	if (saa7164_boards[dev->board].porta == SAA7164_MPEG_DVB)
1419		saa7164_dvb_unregister(&dev->ports[SAA7164_PORT_TS1]);
1420
1421	if (saa7164_boards[dev->board].portb == SAA7164_MPEG_DVB)
1422		saa7164_dvb_unregister(&dev->ports[SAA7164_PORT_TS2]);
1423
1424	if (saa7164_boards[dev->board].portc == SAA7164_MPEG_ENCODER)
1425		saa7164_encoder_unregister(&dev->ports[SAA7164_PORT_ENC1]);
1426
1427	if (saa7164_boards[dev->board].portd == SAA7164_MPEG_ENCODER)
1428		saa7164_encoder_unregister(&dev->ports[SAA7164_PORT_ENC2]);
1429
1430	if (saa7164_boards[dev->board].porte == SAA7164_MPEG_VBI)
1431		saa7164_vbi_unregister(&dev->ports[SAA7164_PORT_VBI1]);
1432
1433	if (saa7164_boards[dev->board].portf == SAA7164_MPEG_VBI)
1434		saa7164_vbi_unregister(&dev->ports[SAA7164_PORT_VBI2]);
1435
1436	saa7164_i2c_unregister(&dev->i2c_bus[0]);
1437	saa7164_i2c_unregister(&dev->i2c_bus[1]);
1438	saa7164_i2c_unregister(&dev->i2c_bus[2]);
1439
1440	pci_disable_device(pci_dev);
1441
1442	/* unregister stuff */
1443	free_irq(pci_dev->irq, dev);
1444
1445	mutex_lock(&devlist);
1446	list_del(&dev->devlist);
1447	mutex_unlock(&devlist);
1448
1449	saa7164_dev_unregister(dev);
1450	v4l2_device_unregister(&dev->v4l2_dev);
1451	kfree(dev);
1452}
1453
1454static struct pci_device_id saa7164_pci_tbl[] = {
1455	{
1456		/* SAA7164 */
1457		.vendor       = 0x1131,
1458		.device       = 0x7164,
1459		.subvendor    = PCI_ANY_ID,
1460		.subdevice    = PCI_ANY_ID,
1461	}, {
1462		/* --- end of list --- */
1463	}
1464};
1465MODULE_DEVICE_TABLE(pci, saa7164_pci_tbl);
1466
1467static struct pci_driver saa7164_pci_driver = {
1468	.name     = "saa7164",
1469	.id_table = saa7164_pci_tbl,
1470	.probe    = saa7164_initdev,
1471	.remove   = saa7164_finidev,
1472	/* TODO */
1473	.suspend  = NULL,
1474	.resume   = NULL,
1475};
1476
1477static int __init saa7164_init(void)
1478{
1479	printk(KERN_INFO "saa7164 driver loaded\n");
1480
1481#ifdef CONFIG_PROC_FS
1482	saa7164_proc_create();
1483#endif
1484	return pci_register_driver(&saa7164_pci_driver);
1485}
1486
1487static void __exit saa7164_fini(void)
1488{
1489#ifdef CONFIG_PROC_FS
1490	remove_proc_entry("saa7164", NULL);
1491#endif
1492	pci_unregister_driver(&saa7164_pci_driver);
1493}
1494
1495module_init(saa7164_init);
1496module_exit(saa7164_fini);
1497
1498