[go: nahoru, domu]

1/*
2 * Zoran zr36057/zr36067 PCI controller driver, for the
3 * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4 * Media Labs LML33/LML33R10.
5 *
6 * This part handles card-specific data and detection
7 *
8 * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
9 *
10 * Currently maintained by:
11 *   Ronald Bultje    <rbultje@ronald.bitfreak.net>
12 *   Laurent Pinchart <laurent.pinchart@skynet.be>
13 *   Mailinglist      <mjpeg-users@lists.sf.net>
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 */
29
30#include <linux/delay.h>
31
32#include <linux/types.h>
33#include <linux/kernel.h>
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/vmalloc.h>
37#include <linux/slab.h>
38
39#include <linux/proc_fs.h>
40#include <linux/i2c.h>
41#include <linux/i2c-algo-bit.h>
42#include <linux/videodev2.h>
43#include <linux/spinlock.h>
44#include <linux/sem.h>
45#include <linux/kmod.h>
46#include <linux/wait.h>
47
48#include <linux/pci.h>
49#include <linux/interrupt.h>
50#include <linux/mutex.h>
51#include <linux/io.h>
52#include <media/v4l2-common.h>
53#include <media/bt819.h>
54
55#include "videocodec.h"
56#include "zoran.h"
57#include "zoran_card.h"
58#include "zoran_device.h"
59#include "zoran_procfs.h"
60
61extern const struct zoran_format zoran_formats[];
62
63static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
64module_param_array(card, int, NULL, 0444);
65MODULE_PARM_DESC(card, "Card type");
66
67/*
68   The video mem address of the video card.
69   The driver has a little database for some videocards
70   to determine it from there. If your video card is not in there
71   you have either to give it to the driver as a parameter
72   or set in in a VIDIOCSFBUF ioctl
73 */
74
75static unsigned long vidmem;	/* default = 0 - Video memory base address */
76module_param(vidmem, ulong, 0444);
77MODULE_PARM_DESC(vidmem, "Default video memory base address");
78
79/*
80   Default input and video norm at startup of the driver.
81*/
82
83static unsigned int default_input;	/* default 0 = Composite, 1 = S-Video */
84module_param(default_input, uint, 0444);
85MODULE_PARM_DESC(default_input,
86		 "Default input (0=Composite, 1=S-Video, 2=Internal)");
87
88static int default_mux = 1;	/* 6 Eyes input selection */
89module_param(default_mux, int, 0644);
90MODULE_PARM_DESC(default_mux,
91		 "Default 6 Eyes mux setting (Input selection)");
92
93static int default_norm;	/* default 0 = PAL, 1 = NTSC 2 = SECAM */
94module_param(default_norm, int, 0444);
95MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
96
97/* /dev/videoN, -1 for autodetect */
98static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
99module_param_array(video_nr, int, NULL, 0444);
100MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
101
102int v4l_nbufs = 4;
103int v4l_bufsize = 864;		/* Everybody should be able to work with this setting */
104module_param(v4l_nbufs, int, 0644);
105MODULE_PARM_DESC(v4l_nbufs, "Maximum number of V4L buffers to use");
106module_param(v4l_bufsize, int, 0644);
107MODULE_PARM_DESC(v4l_bufsize, "Maximum size per V4L buffer (in kB)");
108
109int jpg_nbufs = 32;
110int jpg_bufsize = 512;		/* max size for 100% quality full-PAL frame */
111module_param(jpg_nbufs, int, 0644);
112MODULE_PARM_DESC(jpg_nbufs, "Maximum number of JPG buffers to use");
113module_param(jpg_bufsize, int, 0644);
114MODULE_PARM_DESC(jpg_bufsize, "Maximum size per JPG buffer (in kB)");
115
116int pass_through = 0;		/* 1=Pass through TV signal when device is not used */
117				/* 0=Show color bar when device is not used (LML33: only if lml33dpath=1) */
118module_param(pass_through, int, 0644);
119MODULE_PARM_DESC(pass_through,
120		 "Pass TV signal through to TV-out when idling");
121
122int zr36067_debug = 1;
123module_param_named(debug, zr36067_debug, int, 0644);
124MODULE_PARM_DESC(debug, "Debug level (0-5)");
125
126#define ZORAN_VERSION "0.10.1"
127
128MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
129MODULE_AUTHOR("Serguei Miridonov");
130MODULE_LICENSE("GPL");
131MODULE_VERSION(ZORAN_VERSION);
132
133#define ZR_DEVICE(subven, subdev, data)	{ \
134	.vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
135	.subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
136
137static struct pci_device_id zr36067_pci_tbl[] = {
138	ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
139	ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
140	ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
141	ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
142	ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
143	{0}
144};
145MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
146
147static unsigned int zoran_num;		/* number of cards found */
148
149/* videocodec bus functions ZR36060 */
150static u32
151zr36060_read (struct videocodec *codec,
152	      u16                reg)
153{
154	struct zoran *zr = (struct zoran *) codec->master_data->data;
155	__u32 data;
156
157	if (post_office_wait(zr)
158	    || post_office_write(zr, 0, 1, reg >> 8)
159	    || post_office_write(zr, 0, 2, reg & 0xff)) {
160		return -1;
161	}
162
163	data = post_office_read(zr, 0, 3) & 0xff;
164	return data;
165}
166
167static void
168zr36060_write (struct videocodec *codec,
169	       u16                reg,
170	       u32                val)
171{
172	struct zoran *zr = (struct zoran *) codec->master_data->data;
173
174	if (post_office_wait(zr)
175	    || post_office_write(zr, 0, 1, reg >> 8)
176	    || post_office_write(zr, 0, 2, reg & 0xff)) {
177		return;
178	}
179
180	post_office_write(zr, 0, 3, val & 0xff);
181}
182
183/* videocodec bus functions ZR36050 */
184static u32
185zr36050_read (struct videocodec *codec,
186	      u16                reg)
187{
188	struct zoran *zr = (struct zoran *) codec->master_data->data;
189	__u32 data;
190
191	if (post_office_wait(zr)
192	    || post_office_write(zr, 1, 0, reg >> 2)) {	// reg. HIGHBYTES
193		return -1;
194	}
195
196	data = post_office_read(zr, 0, reg & 0x03) & 0xff;	// reg. LOWBYTES + read
197	return data;
198}
199
200static void
201zr36050_write (struct videocodec *codec,
202	       u16                reg,
203	       u32                val)
204{
205	struct zoran *zr = (struct zoran *) codec->master_data->data;
206
207	if (post_office_wait(zr)
208	    || post_office_write(zr, 1, 0, reg >> 2)) {	// reg. HIGHBYTES
209		return;
210	}
211
212	post_office_write(zr, 0, reg & 0x03, val & 0xff);	// reg. LOWBYTES + wr. data
213}
214
215/* videocodec bus functions ZR36016 */
216static u32
217zr36016_read (struct videocodec *codec,
218	      u16                reg)
219{
220	struct zoran *zr = (struct zoran *) codec->master_data->data;
221	__u32 data;
222
223	if (post_office_wait(zr)) {
224		return -1;
225	}
226
227	data = post_office_read(zr, 2, reg & 0x03) & 0xff;	// read
228	return data;
229}
230
231/* hack for in zoran_device.c */
232void
233zr36016_write (struct videocodec *codec,
234	       u16                reg,
235	       u32                val)
236{
237	struct zoran *zr = (struct zoran *) codec->master_data->data;
238
239	if (post_office_wait(zr)) {
240		return;
241	}
242
243	post_office_write(zr, 2, reg & 0x03, val & 0x0ff);	// wr. data
244}
245
246/*
247 * Board specific information
248 */
249
250static void
251dc10_init (struct zoran *zr)
252{
253	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
254
255	/* Pixel clock selection */
256	GPIO(zr, 4, 0);
257	GPIO(zr, 5, 1);
258	/* Enable the video bus sync signals */
259	GPIO(zr, 7, 0);
260}
261
262static void
263dc10plus_init (struct zoran *zr)
264{
265	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
266}
267
268static void
269buz_init (struct zoran *zr)
270{
271	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
272
273	/* some stuff from Iomega */
274	pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
275	pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
276	pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
277}
278
279static void
280lml33_init (struct zoran *zr)
281{
282	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
283
284	GPIO(zr, 2, 1);		// Set Composite input/output
285}
286
287static void
288avs6eyes_init (struct zoran *zr)
289{
290	// AverMedia 6-Eyes original driver by Christer Weinigel
291
292	// Lifted straight from Christer's old driver and
293	// modified slightly by Martin Samuelsson.
294
295	int mux = default_mux; /* 1 = BT866, 7 = VID1 */
296
297	GPIO(zr, 4, 1); /* Bt866 SLEEP on */
298	udelay(2);
299
300	GPIO(zr, 0, 1); /* ZR36060 /RESET on */
301	GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
302	GPIO(zr, 2, mux & 1);   /* MUX S0 */
303	GPIO(zr, 3, 0); /* /FRAME on */
304	GPIO(zr, 4, 0); /* Bt866 SLEEP off */
305	GPIO(zr, 5, mux & 2);   /* MUX S1 */
306	GPIO(zr, 6, 0); /* ? */
307	GPIO(zr, 7, mux & 4);   /* MUX S2 */
308
309}
310
311static char *
312codecid_to_modulename (u16 codecid)
313{
314	char *name = NULL;
315
316	switch (codecid) {
317	case CODEC_TYPE_ZR36060:
318		name = "zr36060";
319		break;
320	case CODEC_TYPE_ZR36050:
321		name = "zr36050";
322		break;
323	case CODEC_TYPE_ZR36016:
324		name = "zr36016";
325		break;
326	}
327
328	return name;
329}
330
331// struct tvnorm {
332//      u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
333// };
334
335static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
336static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
337static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
338static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
339
340static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
341static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
342
343/* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
344static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
345static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
346
347/* FIXME: I cannot swap U and V in saa7114, so i do one
348 * pixel left shift in zoran (75 -> 74)
349 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
350static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
351static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
352
353/* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
354 * copy Maxim's left shift hack for the 6 Eyes.
355 *
356 * Christer's driver used the unshifted norms, though...
357 * /Sam  */
358static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
359static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
360
361static const unsigned short vpx3220_addrs[] = { 0x43, 0x47, I2C_CLIENT_END };
362static const unsigned short saa7110_addrs[] = { 0x4e, 0x4f, I2C_CLIENT_END };
363static const unsigned short saa7111_addrs[] = { 0x25, 0x24, I2C_CLIENT_END };
364static const unsigned short saa7114_addrs[] = { 0x21, 0x20, I2C_CLIENT_END };
365static const unsigned short adv717x_addrs[] = { 0x6a, 0x6b, 0x2a, 0x2b, I2C_CLIENT_END };
366static const unsigned short ks0127_addrs[] = { 0x6c, 0x6d, I2C_CLIENT_END };
367static const unsigned short saa7185_addrs[] = { 0x44, I2C_CLIENT_END };
368static const unsigned short bt819_addrs[] = { 0x45, I2C_CLIENT_END };
369static const unsigned short bt856_addrs[] = { 0x44, I2C_CLIENT_END };
370static const unsigned short bt866_addrs[] = { 0x44, I2C_CLIENT_END };
371
372static struct card_info zoran_cards[NUM_CARDS] = {
373	{
374		.type = DC10_old,
375		.name = "DC10(old)",
376		.i2c_decoder = "vpx3220a",
377		.addrs_decoder = vpx3220_addrs,
378		.video_codec = CODEC_TYPE_ZR36050,
379		.video_vfe = CODEC_TYPE_ZR36016,
380
381		.inputs = 3,
382		.input = {
383			{ 1, "Composite" },
384			{ 2, "S-Video" },
385			{ 0, "Internal/comp" }
386		},
387		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
388		.tvn = {
389			&f50sqpixel_dc10,
390			&f60sqpixel_dc10,
391			&f50sqpixel_dc10
392		},
393		.jpeg_int = 0,
394		.vsync_int = ZR36057_ISR_GIRQ1,
395		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
396		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
397		.gpcs = { -1, 0 },
398		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
399		.gws_not_connected = 0,
400		.input_mux = 0,
401		.init = &dc10_init,
402	}, {
403		.type = DC10_new,
404		.name = "DC10(new)",
405		.i2c_decoder = "saa7110",
406		.addrs_decoder = saa7110_addrs,
407		.i2c_encoder = "adv7175",
408		.addrs_encoder = adv717x_addrs,
409		.video_codec = CODEC_TYPE_ZR36060,
410
411		.inputs = 3,
412		.input = {
413				{ 0, "Composite" },
414				{ 7, "S-Video" },
415				{ 5, "Internal/comp" }
416			},
417		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
418		.tvn = {
419				&f50sqpixel,
420				&f60sqpixel,
421				&f50sqpixel},
422		.jpeg_int = ZR36057_ISR_GIRQ0,
423		.vsync_int = ZR36057_ISR_GIRQ1,
424		.gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
425		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
426		.gpcs = { -1, 1},
427		.vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
428		.gws_not_connected = 0,
429		.input_mux = 0,
430		.init = &dc10plus_init,
431	}, {
432		.type = DC10plus,
433		.name = "DC10plus",
434		.i2c_decoder = "saa7110",
435		.addrs_decoder = saa7110_addrs,
436		.i2c_encoder = "adv7175",
437		.addrs_encoder = adv717x_addrs,
438		.video_codec = CODEC_TYPE_ZR36060,
439
440		.inputs = 3,
441		.input = {
442			{ 0, "Composite" },
443			{ 7, "S-Video" },
444			{ 5, "Internal/comp" }
445		},
446		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
447		.tvn = {
448			&f50sqpixel,
449			&f60sqpixel,
450			&f50sqpixel
451		},
452		.jpeg_int = ZR36057_ISR_GIRQ0,
453		.vsync_int = ZR36057_ISR_GIRQ1,
454		.gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
455		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
456		.gpcs = { -1, 1 },
457		.vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
458		.gws_not_connected = 0,
459		.input_mux = 0,
460		.init = &dc10plus_init,
461	}, {
462		.type = DC30,
463		.name = "DC30",
464		.i2c_decoder = "vpx3220a",
465		.addrs_decoder = vpx3220_addrs,
466		.i2c_encoder = "adv7175",
467		.addrs_encoder = adv717x_addrs,
468		.video_codec = CODEC_TYPE_ZR36050,
469		.video_vfe = CODEC_TYPE_ZR36016,
470
471		.inputs = 3,
472		.input = {
473			{ 1, "Composite" },
474			{ 2, "S-Video" },
475			{ 0, "Internal/comp" }
476		},
477		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
478		.tvn = {
479			&f50sqpixel_dc10,
480			&f60sqpixel_dc10,
481			&f50sqpixel_dc10
482		},
483		.jpeg_int = 0,
484		.vsync_int = ZR36057_ISR_GIRQ1,
485		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
486		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
487		.gpcs = { -1, 0 },
488		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
489		.gws_not_connected = 0,
490		.input_mux = 0,
491		.init = &dc10_init,
492	}, {
493		.type = DC30plus,
494		.name = "DC30plus",
495		.i2c_decoder = "vpx3220a",
496		.addrs_decoder = vpx3220_addrs,
497		.i2c_encoder = "adv7175",
498		.addrs_encoder = adv717x_addrs,
499		.video_codec = CODEC_TYPE_ZR36050,
500		.video_vfe = CODEC_TYPE_ZR36016,
501
502		.inputs = 3,
503		.input = {
504			{ 1, "Composite" },
505			{ 2, "S-Video" },
506			{ 0, "Internal/comp" }
507		},
508		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
509		.tvn = {
510			&f50sqpixel_dc10,
511			&f60sqpixel_dc10,
512			&f50sqpixel_dc10
513		},
514		.jpeg_int = 0,
515		.vsync_int = ZR36057_ISR_GIRQ1,
516		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
517		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
518		.gpcs = { -1, 0 },
519		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
520		.gws_not_connected = 0,
521		.input_mux = 0,
522		.init = &dc10_init,
523	}, {
524		.type = LML33,
525		.name = "LML33",
526		.i2c_decoder = "bt819a",
527		.addrs_decoder = bt819_addrs,
528		.i2c_encoder = "bt856",
529		.addrs_encoder = bt856_addrs,
530		.video_codec = CODEC_TYPE_ZR36060,
531
532		.inputs = 2,
533		.input = {
534			{ 0, "Composite" },
535			{ 7, "S-Video" }
536		},
537		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
538		.tvn = {
539			&f50ccir601_lml33,
540			&f60ccir601_lml33,
541			NULL
542		},
543		.jpeg_int = ZR36057_ISR_GIRQ1,
544		.vsync_int = ZR36057_ISR_GIRQ0,
545		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
546		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
547		.gpcs = { 3, 1 },
548		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
549		.gws_not_connected = 1,
550		.input_mux = 0,
551		.init = &lml33_init,
552	}, {
553		.type = LML33R10,
554		.name = "LML33R10",
555		.i2c_decoder = "saa7114",
556		.addrs_decoder = saa7114_addrs,
557		.i2c_encoder = "adv7170",
558		.addrs_encoder = adv717x_addrs,
559		.video_codec = CODEC_TYPE_ZR36060,
560
561		.inputs = 2,
562		.input = {
563			{ 0, "Composite" },
564			{ 7, "S-Video" }
565		},
566		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
567		.tvn = {
568			&f50ccir601_lm33r10,
569			&f60ccir601_lm33r10,
570			NULL
571		},
572		.jpeg_int = ZR36057_ISR_GIRQ1,
573		.vsync_int = ZR36057_ISR_GIRQ0,
574		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
575		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
576		.gpcs = { 3, 1 },
577		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
578		.gws_not_connected = 1,
579		.input_mux = 0,
580		.init = &lml33_init,
581	}, {
582		.type = BUZ,
583		.name = "Buz",
584		.i2c_decoder = "saa7111",
585		.addrs_decoder = saa7111_addrs,
586		.i2c_encoder = "saa7185",
587		.addrs_encoder = saa7185_addrs,
588		.video_codec = CODEC_TYPE_ZR36060,
589
590		.inputs = 2,
591		.input = {
592			{ 3, "Composite" },
593			{ 7, "S-Video" }
594		},
595		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
596		.tvn = {
597			&f50ccir601,
598			&f60ccir601,
599			&f50ccir601
600		},
601		.jpeg_int = ZR36057_ISR_GIRQ1,
602		.vsync_int = ZR36057_ISR_GIRQ0,
603		.gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
604		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
605		.gpcs = { 3, 1 },
606		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
607		.gws_not_connected = 1,
608		.input_mux = 0,
609		.init = &buz_init,
610	}, {
611		.type = AVS6EYES,
612		.name = "6-Eyes",
613		/* AverMedia chose not to brand the 6-Eyes. Thus it
614		   can't be autodetected, and requires card=x. */
615		.i2c_decoder = "ks0127",
616		.addrs_decoder = ks0127_addrs,
617		.i2c_encoder = "bt866",
618		.addrs_encoder = bt866_addrs,
619		.video_codec = CODEC_TYPE_ZR36060,
620
621		.inputs = 10,
622		.input = {
623			{ 0, "Composite 1" },
624			{ 1, "Composite 2" },
625			{ 2, "Composite 3" },
626			{ 4, "Composite 4" },
627			{ 5, "Composite 5" },
628			{ 6, "Composite 6" },
629			{ 8, "S-Video 1" },
630			{ 9, "S-Video 2" },
631			{10, "S-Video 3" },
632			{15, "YCbCr" }
633		},
634		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
635		.tvn = {
636			&f50ccir601_avs6eyes,
637			&f60ccir601_avs6eyes,
638			NULL
639		},
640		.jpeg_int = ZR36057_ISR_GIRQ1,
641		.vsync_int = ZR36057_ISR_GIRQ0,
642		.gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
643		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
644		.gpcs = { 3, 1 },			// Validity unknown /Sam
645		.vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 },  // Validity unknown /Sam
646		.gws_not_connected = 1,
647		.input_mux = 1,
648		.init = &avs6eyes_init,
649	}
650
651};
652
653/*
654 * I2C functions
655 */
656/* software I2C functions */
657static int
658zoran_i2c_getsda (void *data)
659{
660	struct zoran *zr = (struct zoran *) data;
661
662	return (btread(ZR36057_I2CBR) >> 1) & 1;
663}
664
665static int
666zoran_i2c_getscl (void *data)
667{
668	struct zoran *zr = (struct zoran *) data;
669
670	return btread(ZR36057_I2CBR) & 1;
671}
672
673static void
674zoran_i2c_setsda (void *data,
675		  int   state)
676{
677	struct zoran *zr = (struct zoran *) data;
678
679	if (state)
680		zr->i2cbr |= 2;
681	else
682		zr->i2cbr &= ~2;
683	btwrite(zr->i2cbr, ZR36057_I2CBR);
684}
685
686static void
687zoran_i2c_setscl (void *data,
688		  int   state)
689{
690	struct zoran *zr = (struct zoran *) data;
691
692	if (state)
693		zr->i2cbr |= 1;
694	else
695		zr->i2cbr &= ~1;
696	btwrite(zr->i2cbr, ZR36057_I2CBR);
697}
698
699static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
700	.setsda = zoran_i2c_setsda,
701	.setscl = zoran_i2c_setscl,
702	.getsda = zoran_i2c_getsda,
703	.getscl = zoran_i2c_getscl,
704	.udelay = 10,
705	.timeout = 100,
706};
707
708static int
709zoran_register_i2c (struct zoran *zr)
710{
711	zr->i2c_algo = zoran_i2c_bit_data_template;
712	zr->i2c_algo.data = zr;
713	strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
714		sizeof(zr->i2c_adapter.name));
715	i2c_set_adapdata(&zr->i2c_adapter, &zr->v4l2_dev);
716	zr->i2c_adapter.algo_data = &zr->i2c_algo;
717	zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
718	return i2c_bit_add_bus(&zr->i2c_adapter);
719}
720
721static void
722zoran_unregister_i2c (struct zoran *zr)
723{
724	i2c_del_adapter(&zr->i2c_adapter);
725}
726
727/* Check a zoran_params struct for correctness, insert default params */
728
729int
730zoran_check_jpg_settings (struct zoran              *zr,
731			  struct zoran_jpg_settings *settings,
732			  int try)
733{
734	int err = 0, err0 = 0;
735
736	dprintk(4,
737		KERN_DEBUG
738		"%s: %s - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
739		ZR_DEVNAME(zr), __func__, settings->decimation, settings->HorDcm,
740		settings->VerDcm, settings->TmpDcm);
741	dprintk(4,
742		KERN_DEBUG
743		"%s: %s - x: %d, y: %d, w: %d, y: %d\n",
744		ZR_DEVNAME(zr), __func__, settings->img_x, settings->img_y,
745		settings->img_width, settings->img_height);
746	/* Check decimation, set default values for decimation = 1, 2, 4 */
747	switch (settings->decimation) {
748	case 1:
749
750		settings->HorDcm = 1;
751		settings->VerDcm = 1;
752		settings->TmpDcm = 1;
753		settings->field_per_buff = 2;
754		settings->img_x = 0;
755		settings->img_y = 0;
756		settings->img_width = BUZ_MAX_WIDTH;
757		settings->img_height = BUZ_MAX_HEIGHT / 2;
758		break;
759	case 2:
760
761		settings->HorDcm = 2;
762		settings->VerDcm = 1;
763		settings->TmpDcm = 2;
764		settings->field_per_buff = 1;
765		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
766		settings->img_y = 0;
767		settings->img_width =
768		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
769		settings->img_height = BUZ_MAX_HEIGHT / 2;
770		break;
771	case 4:
772
773		if (zr->card.type == DC10_new) {
774			dprintk(1,
775				KERN_DEBUG
776				"%s: %s - HDec by 4 is not supported on the DC10\n",
777				ZR_DEVNAME(zr), __func__);
778			err0++;
779			break;
780		}
781
782		settings->HorDcm = 4;
783		settings->VerDcm = 2;
784		settings->TmpDcm = 2;
785		settings->field_per_buff = 1;
786		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
787		settings->img_y = 0;
788		settings->img_width =
789		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
790		settings->img_height = BUZ_MAX_HEIGHT / 2;
791		break;
792	case 0:
793
794		/* We have to check the data the user has set */
795
796		if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
797		    (zr->card.type == DC10_new || settings->HorDcm != 4)) {
798			settings->HorDcm = clamp(settings->HorDcm, 1, 2);
799			err0++;
800		}
801		if (settings->VerDcm != 1 && settings->VerDcm != 2) {
802			settings->VerDcm = clamp(settings->VerDcm, 1, 2);
803			err0++;
804		}
805		if (settings->TmpDcm != 1 && settings->TmpDcm != 2) {
806			settings->TmpDcm = clamp(settings->TmpDcm, 1, 2);
807			err0++;
808		}
809		if (settings->field_per_buff != 1 &&
810		    settings->field_per_buff != 2) {
811			settings->field_per_buff = clamp(settings->field_per_buff, 1, 2);
812			err0++;
813		}
814		if (settings->img_x < 0) {
815			settings->img_x = 0;
816			err0++;
817		}
818		if (settings->img_y < 0) {
819			settings->img_y = 0;
820			err0++;
821		}
822		if (settings->img_width < 0 || settings->img_width > BUZ_MAX_WIDTH) {
823			settings->img_width = clamp(settings->img_width, 0, (int)BUZ_MAX_WIDTH);
824			err0++;
825		}
826		if (settings->img_height < 0 || settings->img_height > BUZ_MAX_HEIGHT / 2) {
827			settings->img_height = clamp(settings->img_height, 0, BUZ_MAX_HEIGHT / 2);
828			err0++;
829		}
830		if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH) {
831			settings->img_x = BUZ_MAX_WIDTH - settings->img_width;
832			err0++;
833		}
834		if (settings->img_y + settings->img_height > BUZ_MAX_HEIGHT / 2) {
835			settings->img_y = BUZ_MAX_HEIGHT / 2 - settings->img_height;
836			err0++;
837		}
838		if (settings->img_width % (16 * settings->HorDcm) != 0) {
839			settings->img_width -= settings->img_width % (16 * settings->HorDcm);
840			if (settings->img_width == 0)
841				settings->img_width = 16 * settings->HorDcm;
842			err0++;
843		}
844		if (settings->img_height % (8 * settings->VerDcm) != 0) {
845			settings->img_height -= settings->img_height % (8 * settings->VerDcm);
846			if (settings->img_height == 0)
847				settings->img_height = 8 * settings->VerDcm;
848			err0++;
849		}
850
851		if (!try && err0) {
852			dprintk(1,
853				KERN_ERR
854				"%s: %s - error in params for decimation = 0\n",
855				ZR_DEVNAME(zr), __func__);
856			err++;
857		}
858		break;
859	default:
860		dprintk(1,
861			KERN_ERR
862			"%s: %s - decimation = %d, must be 0, 1, 2 or 4\n",
863			ZR_DEVNAME(zr), __func__, settings->decimation);
864		err++;
865		break;
866	}
867
868	if (settings->jpg_comp.quality > 100)
869		settings->jpg_comp.quality = 100;
870	if (settings->jpg_comp.quality < 5)
871		settings->jpg_comp.quality = 5;
872	if (settings->jpg_comp.APPn < 0)
873		settings->jpg_comp.APPn = 0;
874	if (settings->jpg_comp.APPn > 15)
875		settings->jpg_comp.APPn = 15;
876	if (settings->jpg_comp.APP_len < 0)
877		settings->jpg_comp.APP_len = 0;
878	if (settings->jpg_comp.APP_len > 60)
879		settings->jpg_comp.APP_len = 60;
880	if (settings->jpg_comp.COM_len < 0)
881		settings->jpg_comp.COM_len = 0;
882	if (settings->jpg_comp.COM_len > 60)
883		settings->jpg_comp.COM_len = 60;
884	if (err)
885		return -EINVAL;
886	return 0;
887}
888
889void
890zoran_open_init_params (struct zoran *zr)
891{
892	int i;
893
894	/* User must explicitly set a window */
895	zr->overlay_settings.is_set = 0;
896	zr->overlay_mask = NULL;
897	zr->overlay_active = ZORAN_FREE;
898
899	zr->v4l_memgrab_active = 0;
900	zr->v4l_overlay_active = 0;
901	zr->v4l_grab_frame = NO_GRAB_ACTIVE;
902	zr->v4l_grab_seq = 0;
903	zr->v4l_settings.width = 192;
904	zr->v4l_settings.height = 144;
905	zr->v4l_settings.format = &zoran_formats[7];	/* YUY2 - YUV-4:2:2 packed */
906	zr->v4l_settings.bytesperline =
907	    zr->v4l_settings.width *
908	    ((zr->v4l_settings.format->depth + 7) / 8);
909
910	/* DMA ring stuff for V4L */
911	zr->v4l_pend_tail = 0;
912	zr->v4l_pend_head = 0;
913	zr->v4l_sync_tail = 0;
914	zr->v4l_buffers.active = ZORAN_FREE;
915	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
916		zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */
917	}
918	zr->v4l_buffers.allocated = 0;
919
920	for (i = 0; i < BUZ_MAX_FRAME; i++) {
921		zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */
922	}
923	zr->jpg_buffers.active = ZORAN_FREE;
924	zr->jpg_buffers.allocated = 0;
925	/* Set necessary params and call zoran_check_jpg_settings to set the defaults */
926	zr->jpg_settings.decimation = 1;
927	zr->jpg_settings.jpg_comp.quality = 50;	/* default compression factor 8 */
928	if (zr->card.type != BUZ)
929		zr->jpg_settings.odd_even = 1;
930	else
931		zr->jpg_settings.odd_even = 0;
932	zr->jpg_settings.jpg_comp.APPn = 0;
933	zr->jpg_settings.jpg_comp.APP_len = 0;	/* No APPn marker */
934	memset(zr->jpg_settings.jpg_comp.APP_data, 0,
935	       sizeof(zr->jpg_settings.jpg_comp.APP_data));
936	zr->jpg_settings.jpg_comp.COM_len = 0;	/* No COM marker */
937	memset(zr->jpg_settings.jpg_comp.COM_data, 0,
938	       sizeof(zr->jpg_settings.jpg_comp.COM_data));
939	zr->jpg_settings.jpg_comp.jpeg_markers =
940	    V4L2_JPEG_MARKER_DHT | V4L2_JPEG_MARKER_DQT;
941	i = zoran_check_jpg_settings(zr, &zr->jpg_settings, 0);
942	if (i)
943		dprintk(1, KERN_ERR "%s: %s internal error\n",
944			ZR_DEVNAME(zr), __func__);
945
946	clear_interrupt_counters(zr);
947	zr->testing = 0;
948}
949
950static void test_interrupts (struct zoran *zr)
951{
952	DEFINE_WAIT(wait);
953	int timeout, icr;
954
955	clear_interrupt_counters(zr);
956
957	zr->testing = 1;
958	icr = btread(ZR36057_ICR);
959	btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
960	prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
961	timeout = schedule_timeout(HZ);
962	finish_wait(&zr->test_q, &wait);
963	btwrite(0, ZR36057_ICR);
964	btwrite(0x78000000, ZR36057_ISR);
965	zr->testing = 0;
966	dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
967	if (timeout) {
968		dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
969	}
970	if (zr36067_debug > 1)
971		print_interrupts(zr);
972	btwrite(icr, ZR36057_ICR);
973}
974
975static int zr36057_init (struct zoran *zr)
976{
977	int j, err;
978
979	dprintk(1,
980		KERN_INFO
981		"%s: %s - initializing card[%d], zr=%p\n",
982		ZR_DEVNAME(zr), __func__, zr->id, zr);
983
984	/* default setup of all parameters which will persist between opens */
985	zr->user = 0;
986
987	init_waitqueue_head(&zr->v4l_capq);
988	init_waitqueue_head(&zr->jpg_capq);
989	init_waitqueue_head(&zr->test_q);
990	zr->jpg_buffers.allocated = 0;
991	zr->v4l_buffers.allocated = 0;
992
993	zr->vbuf_base = (void *) vidmem;
994	zr->vbuf_width = 0;
995	zr->vbuf_height = 0;
996	zr->vbuf_depth = 0;
997	zr->vbuf_bytesperline = 0;
998
999	/* Avoid nonsense settings from user for default input/norm */
1000	if (default_norm < 0 || default_norm > 2)
1001		default_norm = 0;
1002	if (default_norm == 0) {
1003		zr->norm = V4L2_STD_PAL;
1004		zr->timing = zr->card.tvn[0];
1005	} else if (default_norm == 1) {
1006		zr->norm = V4L2_STD_NTSC;
1007		zr->timing = zr->card.tvn[1];
1008	} else {
1009		zr->norm = V4L2_STD_SECAM;
1010		zr->timing = zr->card.tvn[2];
1011	}
1012	if (zr->timing == NULL) {
1013		dprintk(1,
1014			KERN_WARNING
1015			"%s: %s - default TV standard not supported by hardware. PAL will be used.\n",
1016			ZR_DEVNAME(zr), __func__);
1017		zr->norm = V4L2_STD_PAL;
1018		zr->timing = zr->card.tvn[0];
1019	}
1020
1021	if (default_input > zr->card.inputs-1) {
1022		dprintk(1,
1023			KERN_WARNING
1024			"%s: default_input value %d out of range (0-%d)\n",
1025			ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1026		default_input = 0;
1027	}
1028	zr->input = default_input;
1029
1030	/* default setup (will be repeated at every open) */
1031	zoran_open_init_params(zr);
1032
1033	/* allocate memory *before* doing anything to the hardware
1034	 * in case allocation fails */
1035	zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1036	zr->video_dev = video_device_alloc();
1037	if (!zr->stat_com || !zr->video_dev) {
1038		dprintk(1,
1039			KERN_ERR
1040			"%s: %s - kmalloc (STAT_COM) failed\n",
1041			ZR_DEVNAME(zr), __func__);
1042		err = -ENOMEM;
1043		goto exit_free;
1044	}
1045	for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1046		zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1047	}
1048
1049	/*
1050	 *   Now add the template and register the device unit.
1051	 */
1052	memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1053	zr->video_dev->v4l2_dev = &zr->v4l2_dev;
1054	strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1055	/* It's not a mem2mem device, but you can both capture and output from
1056	   one and the same device. This should really be split up into two
1057	   device nodes, but that's a job for another day. */
1058	zr->video_dev->vfl_dir = VFL_DIR_M2M;
1059	err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1060	if (err < 0)
1061		goto exit_free;
1062	video_set_drvdata(zr->video_dev, zr);
1063
1064	zoran_init_hardware(zr);
1065	if (zr36067_debug > 2)
1066		detect_guest_activity(zr);
1067	test_interrupts(zr);
1068	if (!pass_through) {
1069		decoder_call(zr, video, s_stream, 0);
1070		encoder_call(zr, video, s_routing, 2, 0, 0);
1071	}
1072
1073	zr->zoran_proc = NULL;
1074	zr->initialized = 1;
1075	return 0;
1076
1077exit_free:
1078	kfree(zr->stat_com);
1079	kfree(zr->video_dev);
1080	return err;
1081}
1082
1083static void zoran_remove(struct pci_dev *pdev)
1084{
1085	struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
1086	struct zoran *zr = to_zoran(v4l2_dev);
1087
1088	if (!zr->initialized)
1089		goto exit_free;
1090
1091	/* unregister videocodec bus */
1092	if (zr->codec) {
1093		struct videocodec_master *master = zr->codec->master_data;
1094
1095		videocodec_detach(zr->codec);
1096		kfree(master);
1097	}
1098	if (zr->vfe) {
1099		struct videocodec_master *master = zr->vfe->master_data;
1100
1101		videocodec_detach(zr->vfe);
1102		kfree(master);
1103	}
1104
1105	/* unregister i2c bus */
1106	zoran_unregister_i2c(zr);
1107	/* disable PCI bus-mastering */
1108	zoran_set_pci_master(zr, 0);
1109	/* put chip into reset */
1110	btwrite(0, ZR36057_SPGPPCR);
1111	free_irq(zr->pci_dev->irq, zr);
1112	/* unmap and free memory */
1113	kfree(zr->stat_com);
1114	zoran_proc_cleanup(zr);
1115	iounmap(zr->zr36057_mem);
1116	pci_disable_device(zr->pci_dev);
1117	video_unregister_device(zr->video_dev);
1118exit_free:
1119	v4l2_device_unregister(&zr->v4l2_dev);
1120	kfree(zr);
1121}
1122
1123void
1124zoran_vdev_release (struct video_device *vdev)
1125{
1126	kfree(vdev);
1127}
1128
1129static struct videocodec_master *zoran_setup_videocodec(struct zoran *zr,
1130							int type)
1131{
1132	struct videocodec_master *m = NULL;
1133
1134	m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1135	if (!m) {
1136		dprintk(1, KERN_ERR "%s: %s - no memory\n",
1137			ZR_DEVNAME(zr), __func__);
1138		return m;
1139	}
1140
1141	/* magic and type are unused for master struct. Makes sense only at
1142	   codec structs.
1143	   In the past, .type were initialized to the old V4L1 .hardware
1144	   value, as VID_HARDWARE_ZR36067
1145	 */
1146	m->magic = 0L;
1147	m->type = 0;
1148
1149	m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1150	strlcpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1151	m->data = zr;
1152
1153	switch (type)
1154	{
1155	case CODEC_TYPE_ZR36060:
1156		m->readreg = zr36060_read;
1157		m->writereg = zr36060_write;
1158		m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1159		break;
1160	case CODEC_TYPE_ZR36050:
1161		m->readreg = zr36050_read;
1162		m->writereg = zr36050_write;
1163		m->flags |= CODEC_FLAG_JPEG;
1164		break;
1165	case CODEC_TYPE_ZR36016:
1166		m->readreg = zr36016_read;
1167		m->writereg = zr36016_write;
1168		m->flags |= CODEC_FLAG_VFE;
1169		break;
1170	}
1171
1172	return m;
1173}
1174
1175static void zoran_subdev_notify(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
1176{
1177	struct zoran *zr = to_zoran(sd->v4l2_dev);
1178
1179	/* Bt819 needs to reset its FIFO buffer using #FRST pin and
1180	   LML33 card uses GPIO(7) for that. */
1181	if (cmd == BT819_FIFO_RESET_LOW)
1182		GPIO(zr, 7, 0);
1183	else if (cmd == BT819_FIFO_RESET_HIGH)
1184		GPIO(zr, 7, 1);
1185}
1186
1187/*
1188 *   Scan for a Buz card (actually for the PCI controller ZR36057),
1189 *   request the irq and map the io memory
1190 */
1191static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1192{
1193	unsigned char latency, need_latency;
1194	struct zoran *zr;
1195	int result;
1196	struct videocodec_master *master_vfe = NULL;
1197	struct videocodec_master *master_codec = NULL;
1198	int card_num;
1199	char *codec_name, *vfe_name;
1200	unsigned int nr;
1201
1202
1203	nr = zoran_num++;
1204	if (nr >= BUZ_MAX) {
1205		dprintk(1, KERN_ERR "%s: driver limited to %d card(s) maximum\n",
1206			ZORAN_NAME, BUZ_MAX);
1207		return -ENOENT;
1208	}
1209
1210	zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1211	if (!zr) {
1212		dprintk(1, KERN_ERR "%s: %s - kzalloc failed\n",
1213			ZORAN_NAME, __func__);
1214		return -ENOMEM;
1215	}
1216	zr->v4l2_dev.notify = zoran_subdev_notify;
1217	if (v4l2_device_register(&pdev->dev, &zr->v4l2_dev))
1218		goto zr_free_mem;
1219	zr->pci_dev = pdev;
1220	zr->id = nr;
1221	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1222	spin_lock_init(&zr->spinlock);
1223	mutex_init(&zr->resource_lock);
1224	mutex_init(&zr->other_lock);
1225	if (pci_enable_device(pdev))
1226		goto zr_unreg;
1227	zr->revision = zr->pci_dev->revision;
1228
1229	dprintk(1,
1230		KERN_INFO
1231		"%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
1232		ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
1233		zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
1234	if (zr->revision >= 2) {
1235		dprintk(1,
1236			KERN_INFO
1237			"%s: Subsystem vendor=0x%04x id=0x%04x\n",
1238			ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1239			zr->pci_dev->subsystem_device);
1240	}
1241
1242	/* Use auto-detected card type? */
1243	if (card[nr] == -1) {
1244		if (zr->revision < 2) {
1245			dprintk(1,
1246				KERN_ERR
1247				"%s: No card type specified, please use the card=X module parameter\n",
1248				ZR_DEVNAME(zr));
1249			dprintk(1,
1250				KERN_ERR
1251				"%s: It is not possible to auto-detect ZR36057 based cards\n",
1252				ZR_DEVNAME(zr));
1253			goto zr_unreg;
1254		}
1255
1256		card_num = ent->driver_data;
1257		if (card_num >= NUM_CARDS) {
1258			dprintk(1,
1259				KERN_ERR
1260				"%s: Unknown card, try specifying card=X module parameter\n",
1261				ZR_DEVNAME(zr));
1262			goto zr_unreg;
1263		}
1264		dprintk(3,
1265			KERN_DEBUG
1266			"%s: %s() - card %s detected\n",
1267			ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1268	} else {
1269		card_num = card[nr];
1270		if (card_num >= NUM_CARDS || card_num < 0) {
1271			dprintk(1,
1272				KERN_ERR
1273				"%s: User specified card type %d out of range (0 .. %d)\n",
1274				ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1275			goto zr_unreg;
1276		}
1277	}
1278
1279	/* even though we make this a non pointer and thus
1280	 * theoretically allow for making changes to this struct
1281	 * on a per-individual card basis at runtime, this is
1282	 * strongly discouraged. This structure is intended to
1283	 * keep general card information, no settings or anything */
1284	zr->card = zoran_cards[card_num];
1285	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1286		 "%s[%u]", zr->card.name, zr->id);
1287
1288	zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
1289	if (!zr->zr36057_mem) {
1290		dprintk(1, KERN_ERR "%s: %s() - ioremap failed\n",
1291			ZR_DEVNAME(zr), __func__);
1292		goto zr_unreg;
1293	}
1294
1295	result = request_irq(zr->pci_dev->irq, zoran_irq,
1296			     IRQF_SHARED, ZR_DEVNAME(zr), zr);
1297	if (result < 0) {
1298		if (result == -EINVAL) {
1299			dprintk(1,
1300				KERN_ERR
1301				"%s: %s - bad irq number or handler\n",
1302				ZR_DEVNAME(zr), __func__);
1303		} else if (result == -EBUSY) {
1304			dprintk(1,
1305				KERN_ERR
1306				"%s: %s - IRQ %d busy, change your PnP config in BIOS\n",
1307				ZR_DEVNAME(zr), __func__, zr->pci_dev->irq);
1308		} else {
1309			dprintk(1,
1310				KERN_ERR
1311				"%s: %s - can't assign irq, error code %d\n",
1312				ZR_DEVNAME(zr), __func__, result);
1313		}
1314		goto zr_unmap;
1315	}
1316
1317	/* set PCI latency timer */
1318	pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1319			     &latency);
1320	need_latency = zr->revision > 1 ? 32 : 48;
1321	if (latency != need_latency) {
1322		dprintk(2, KERN_INFO "%s: Changing PCI latency from %d to %d\n",
1323			ZR_DEVNAME(zr), latency, need_latency);
1324		pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1325				      need_latency);
1326	}
1327
1328	zr36057_restart(zr);
1329	/* i2c */
1330	dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1331		ZR_DEVNAME(zr));
1332
1333	if (zoran_register_i2c(zr) < 0) {
1334		dprintk(1, KERN_ERR "%s: %s - can't initialize i2c bus\n",
1335			ZR_DEVNAME(zr), __func__);
1336		goto zr_free_irq;
1337	}
1338
1339	zr->decoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1340		&zr->i2c_adapter, zr->card.i2c_decoder,
1341		0, zr->card.addrs_decoder);
1342
1343	if (zr->card.i2c_encoder)
1344		zr->encoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1345			&zr->i2c_adapter, zr->card.i2c_encoder,
1346			0, zr->card.addrs_encoder);
1347
1348	dprintk(2,
1349		KERN_INFO "%s: Initializing videocodec bus...\n",
1350		ZR_DEVNAME(zr));
1351
1352	if (zr->card.video_codec) {
1353		codec_name = codecid_to_modulename(zr->card.video_codec);
1354		if (codec_name) {
1355			result = request_module(codec_name);
1356			if (result) {
1357				dprintk(1,
1358					KERN_ERR
1359					"%s: failed to load modules %s: %d\n",
1360					ZR_DEVNAME(zr), codec_name, result);
1361			}
1362		}
1363	}
1364	if (zr->card.video_vfe) {
1365		vfe_name = codecid_to_modulename(zr->card.video_vfe);
1366		if (vfe_name) {
1367			result = request_module(vfe_name);
1368			if (result < 0) {
1369				dprintk(1,
1370					KERN_ERR
1371					"%s: failed to load modules %s: %d\n",
1372					ZR_DEVNAME(zr), vfe_name, result);
1373			}
1374		}
1375	}
1376
1377	/* reset JPEG codec */
1378	jpeg_codec_sleep(zr, 1);
1379	jpeg_codec_reset(zr);
1380	/* video bus enabled */
1381	/* display codec revision */
1382	if (zr->card.video_codec != 0) {
1383		master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1384		if (!master_codec)
1385			goto zr_unreg_i2c;
1386		zr->codec = videocodec_attach(master_codec);
1387		if (!zr->codec) {
1388			dprintk(1, KERN_ERR "%s: %s - no codec found\n",
1389				ZR_DEVNAME(zr), __func__);
1390			goto zr_free_codec;
1391		}
1392		if (zr->codec->type != zr->card.video_codec) {
1393			dprintk(1, KERN_ERR "%s: %s - wrong codec\n",
1394				ZR_DEVNAME(zr), __func__);
1395			goto zr_detach_codec;
1396		}
1397	}
1398	if (zr->card.video_vfe != 0) {
1399		master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1400		if (!master_vfe)
1401			goto zr_detach_codec;
1402		zr->vfe = videocodec_attach(master_vfe);
1403		if (!zr->vfe) {
1404			dprintk(1, KERN_ERR "%s: %s - no VFE found\n",
1405				ZR_DEVNAME(zr), __func__);
1406			goto zr_free_vfe;
1407		}
1408		if (zr->vfe->type != zr->card.video_vfe) {
1409			dprintk(1, KERN_ERR "%s: %s = wrong VFE\n",
1410				ZR_DEVNAME(zr), __func__);
1411			goto zr_detach_vfe;
1412		}
1413	}
1414
1415	/* take care of Natoma chipset and a revision 1 zr36057 */
1416	if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1417		zr->jpg_buffers.need_contiguous = 1;
1418		dprintk(1, KERN_INFO
1419			"%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1420			ZR_DEVNAME(zr));
1421	}
1422
1423	if (zr36057_init(zr) < 0)
1424		goto zr_detach_vfe;
1425
1426	zoran_proc_init(zr);
1427
1428	return 0;
1429
1430zr_detach_vfe:
1431	videocodec_detach(zr->vfe);
1432zr_free_vfe:
1433	kfree(master_vfe);
1434zr_detach_codec:
1435	videocodec_detach(zr->codec);
1436zr_free_codec:
1437	kfree(master_codec);
1438zr_unreg_i2c:
1439	zoran_unregister_i2c(zr);
1440zr_free_irq:
1441	btwrite(0, ZR36057_SPGPPCR);
1442	free_irq(zr->pci_dev->irq, zr);
1443zr_unmap:
1444	iounmap(zr->zr36057_mem);
1445zr_unreg:
1446	v4l2_device_unregister(&zr->v4l2_dev);
1447zr_free_mem:
1448	kfree(zr);
1449
1450	return -ENODEV;
1451}
1452
1453static struct pci_driver zoran_driver = {
1454	.name = "zr36067",
1455	.id_table = zr36067_pci_tbl,
1456	.probe = zoran_probe,
1457	.remove = zoran_remove,
1458};
1459
1460static int __init zoran_init(void)
1461{
1462	int res;
1463
1464	printk(KERN_INFO "Zoran MJPEG board driver version %s\n",
1465	       ZORAN_VERSION);
1466
1467	/* check the parameters we have been given, adjust if necessary */
1468	if (v4l_nbufs < 2)
1469		v4l_nbufs = 2;
1470	if (v4l_nbufs > VIDEO_MAX_FRAME)
1471		v4l_nbufs = VIDEO_MAX_FRAME;
1472	/* The user specfies the in KB, we want them in byte
1473	 * (and page aligned) */
1474	v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1475	if (v4l_bufsize < 32768)
1476		v4l_bufsize = 32768;
1477	/* 2 MB is arbitrary but sufficient for the maximum possible images */
1478	if (v4l_bufsize > 2048 * 1024)
1479		v4l_bufsize = 2048 * 1024;
1480	if (jpg_nbufs < 4)
1481		jpg_nbufs = 4;
1482	if (jpg_nbufs > BUZ_MAX_FRAME)
1483		jpg_nbufs = BUZ_MAX_FRAME;
1484	jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1485	if (jpg_bufsize < 8192)
1486		jpg_bufsize = 8192;
1487	if (jpg_bufsize > (512 * 1024))
1488		jpg_bufsize = 512 * 1024;
1489	/* Use parameter for vidmem or try to find a video card */
1490	if (vidmem) {
1491		dprintk(1,
1492			KERN_INFO
1493			"%s: Using supplied video memory base address @ 0x%lx\n",
1494			ZORAN_NAME, vidmem);
1495	}
1496
1497	/* some mainboards might not do PCI-PCI data transfer well */
1498	if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1499		dprintk(1,
1500			KERN_WARNING
1501			"%s: chipset does not support reliable PCI-PCI DMA\n",
1502			ZORAN_NAME);
1503	}
1504
1505	res = pci_register_driver(&zoran_driver);
1506	if (res) {
1507		dprintk(1,
1508			KERN_ERR
1509			"%s: Unable to register ZR36057 driver\n",
1510			ZORAN_NAME);
1511		return res;
1512	}
1513
1514	return 0;
1515}
1516
1517static void __exit zoran_exit(void)
1518{
1519	pci_unregister_driver(&zoran_driver);
1520}
1521
1522module_init(zoran_init);
1523module_exit(zoran_exit);
1524