2 * Zoran zr36057/zr36067 PCI controller driver, for the
3 * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4 * Media Labs LML33/LML33R10.
6 * This part handles card-specific data and detection
8 * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
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>
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.
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.
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.
30 #include <linux/delay.h>
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>
38 #include <linux/proc_fs.h>
39 #include <linux/i2c.h>
40 #include <linux/i2c-algo-bit.h>
41 #include <linux/videodev.h>
42 #include <media/v4l2-common.h>
43 #include <linux/spinlock.h>
44 #include <linux/sem.h>
45 #include <linux/kmod.h>
46 #include <linux/wait.h>
48 #include <linux/pci.h>
49 #include <linux/interrupt.h>
50 #include <linux/video_decoder.h>
51 #include <linux/video_encoder.h>
52 #include <linux/mutex.h>
56 #include "videocodec.h"
58 #include "zoran_card.h"
59 #include "zoran_device.h"
60 #include "zoran_procfs.h"
62 #define I2C_NAME(x) (x)->name
64 extern const struct zoran_format zoran_formats
[];
66 static int card
[BUZ_MAX
] = { -1, -1, -1, -1 };
67 module_param_array(card
, int, NULL
, 0444);
68 MODULE_PARM_DESC(card
, "The type of card");
70 static int encoder
[BUZ_MAX
] = { -1, -1, -1, -1 };
71 module_param_array(encoder
, int, NULL
, 0444);
72 MODULE_PARM_DESC(encoder
, "i2c TV encoder");
74 static int decoder
[BUZ_MAX
] = { -1, -1, -1, -1 };
75 module_param_array(decoder
, int, NULL
, 0444);
76 MODULE_PARM_DESC(decoder
, "i2c TV decoder");
79 The video mem address of the video card.
80 The driver has a little database for some videocards
81 to determine it from there. If your video card is not in there
82 you have either to give it to the driver as a parameter
83 or set in in a VIDIOCSFBUF ioctl
86 static unsigned long vidmem
= 0; /* Video memory base address */
87 module_param(vidmem
, ulong
, 0444);
88 MODULE_PARM_DESC(vidmem
, "Default video memory base address");
91 Default input and video norm at startup of the driver.
94 static unsigned int default_input
= 0; /* 0=Composite, 1=S-Video */
95 module_param(default_input
, uint
, 0444);
96 MODULE_PARM_DESC(default_input
,
97 "Default input (0=Composite, 1=S-Video, 2=Internal)");
99 static int default_mux
= 1; /* 6 Eyes input selection */
100 module_param(default_mux
, int, 0644);
101 MODULE_PARM_DESC(default_mux
,
102 "Default 6 Eyes mux setting (Input selection)");
104 static int default_norm
= 0; /* 0=PAL, 1=NTSC 2=SECAM */
105 module_param(default_norm
, int, 0444);
106 MODULE_PARM_DESC(default_norm
, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
108 /* /dev/videoN, -1 for autodetect */
109 static int video_nr
[BUZ_MAX
] = {-1, -1, -1, -1};
110 module_param_array(video_nr
, int, NULL
, 0444);
111 MODULE_PARM_DESC(video_nr
, "video device number (-1=Auto)");
114 Number and size of grab buffers for Video 4 Linux
115 The vast majority of applications should not need more than 2,
116 the very popular BTTV driver actually does ONLY have 2.
117 Time sensitive applications might need more, the maximum
118 is VIDEO_MAX_FRAME (defined in <linux/videodev.h>).
120 The size is set so that the maximum possible request
121 can be satisfied. Decrease it, if bigphys_area alloc'd
122 memory is low. If you don't have the bigphys_area patch,
123 set it to 128 KB. Will you allow only to grab small
124 images with V4L, but that's better than nothing.
126 v4l_bufsize has to be given in KB !
131 int v4l_bufsize
= 128; /* Everybody should be able to work with this setting */
132 module_param(v4l_nbufs
, int, 0644);
133 MODULE_PARM_DESC(v4l_nbufs
, "Maximum number of V4L buffers to use");
134 module_param(v4l_bufsize
, int, 0644);
135 MODULE_PARM_DESC(v4l_bufsize
, "Maximum size per V4L buffer (in kB)");
138 int jpg_bufsize
= 512; /* max size for 100% quality full-PAL frame */
139 module_param(jpg_nbufs
, int, 0644);
140 MODULE_PARM_DESC(jpg_nbufs
, "Maximum number of JPG buffers to use");
141 module_param(jpg_bufsize
, int, 0644);
142 MODULE_PARM_DESC(jpg_bufsize
, "Maximum size per JPG buffer (in kB)");
144 int pass_through
= 0; /* 1=Pass through TV signal when device is not used */
145 /* 0=Show color bar when device is not used (LML33: only if lml33dpath=1) */
146 module_param(pass_through
, int, 0644);
147 MODULE_PARM_DESC(pass_through
,
148 "Pass TV signal through to TV-out when idling");
150 int zr36067_debug
= 1;
151 module_param_named(debug
, zr36067_debug
, int, 0644);
152 MODULE_PARM_DESC(debug
, "Debug level (0-5)");
154 MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
155 MODULE_AUTHOR("Serguei Miridonov");
156 MODULE_LICENSE("GPL");
158 static struct pci_device_id zr36067_pci_tbl
[] = {
159 {PCI_VENDOR_ID_ZORAN
, PCI_DEVICE_ID_ZORAN_36057
,
160 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
163 MODULE_DEVICE_TABLE(pci
, zr36067_pci_tbl
);
165 int zoran_num
; /* number of Buzs in use */
166 struct zoran zoran
[BUZ_MAX
];
168 /* videocodec bus functions ZR36060 */
170 zr36060_read (struct videocodec
*codec
,
173 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
176 if (post_office_wait(zr
)
177 || post_office_write(zr
, 0, 1, reg
>> 8)
178 || post_office_write(zr
, 0, 2, reg
& 0xff)) {
182 data
= post_office_read(zr
, 0, 3) & 0xff;
187 zr36060_write (struct videocodec
*codec
,
191 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
193 if (post_office_wait(zr
)
194 || post_office_write(zr
, 0, 1, reg
>> 8)
195 || post_office_write(zr
, 0, 2, reg
& 0xff)) {
199 post_office_write(zr
, 0, 3, val
& 0xff);
202 /* videocodec bus functions ZR36050 */
204 zr36050_read (struct videocodec
*codec
,
207 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
210 if (post_office_wait(zr
)
211 || post_office_write(zr
, 1, 0, reg
>> 2)) { // reg. HIGHBYTES
215 data
= post_office_read(zr
, 0, reg
& 0x03) & 0xff; // reg. LOWBYTES + read
220 zr36050_write (struct videocodec
*codec
,
224 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
226 if (post_office_wait(zr
)
227 || post_office_write(zr
, 1, 0, reg
>> 2)) { // reg. HIGHBYTES
231 post_office_write(zr
, 0, reg
& 0x03, val
& 0xff); // reg. LOWBYTES + wr. data
234 /* videocodec bus functions ZR36016 */
236 zr36016_read (struct videocodec
*codec
,
239 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
242 if (post_office_wait(zr
)) {
246 data
= post_office_read(zr
, 2, reg
& 0x03) & 0xff; // read
250 /* hack for in zoran_device.c */
252 zr36016_write (struct videocodec
*codec
,
256 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
258 if (post_office_wait(zr
)) {
262 post_office_write(zr
, 2, reg
& 0x03, val
& 0x0ff); // wr. data
266 * Board specific information
270 dc10_init (struct zoran
*zr
)
272 dprintk(3, KERN_DEBUG
"%s: dc10_init()\n", ZR_DEVNAME(zr
));
274 /* Pixel clock selection */
277 /* Enable the video bus sync signals */
282 dc10plus_init (struct zoran
*zr
)
284 dprintk(3, KERN_DEBUG
"%s: dc10plus_init()\n", ZR_DEVNAME(zr
));
288 buz_init (struct zoran
*zr
)
290 dprintk(3, KERN_DEBUG
"%s: buz_init()\n", ZR_DEVNAME(zr
));
292 /* some stuff from Iomega */
293 pci_write_config_dword(zr
->pci_dev
, 0xfc, 0x90680f15);
294 pci_write_config_dword(zr
->pci_dev
, 0x0c, 0x00012020);
295 pci_write_config_dword(zr
->pci_dev
, 0xe8, 0xc0200000);
299 lml33_init (struct zoran
*zr
)
301 dprintk(3, KERN_DEBUG
"%s: lml33_init()\n", ZR_DEVNAME(zr
));
303 GPIO(zr
, 2, 1); // Set Composite input/output
307 avs6eyes_init (struct zoran
*zr
)
309 // AverMedia 6-Eyes original driver by Christer Weinigel
311 // Lifted straight from Christer's old driver and
312 // modified slightly by Martin Samuelsson.
314 int mux
= default_mux
; /* 1 = BT866, 7 = VID1 */
316 GPIO(zr
, 4, 1); /* Bt866 SLEEP on */
319 GPIO(zr
, 0, 1); /* ZR36060 /RESET on */
320 GPIO(zr
, 1, 0); /* ZR36060 /SLEEP on */
321 GPIO(zr
, 2, mux
& 1); /* MUX S0 */
322 GPIO(zr
, 3, 0); /* /FRAME on */
323 GPIO(zr
, 4, 0); /* Bt866 SLEEP off */
324 GPIO(zr
, 5, mux
& 2); /* MUX S1 */
325 GPIO(zr
, 6, 0); /* ? */
326 GPIO(zr
, 7, mux
& 4); /* MUX S2 */
331 i2cid_to_modulename (u16 i2c_id
)
336 case I2C_DRIVERID_SAA7110
:
339 case I2C_DRIVERID_SAA7111A
:
342 case I2C_DRIVERID_SAA7114
:
345 case I2C_DRIVERID_SAA7185B
:
348 case I2C_DRIVERID_ADV7170
:
351 case I2C_DRIVERID_ADV7175
:
354 case I2C_DRIVERID_BT819
:
357 case I2C_DRIVERID_BT856
:
360 case I2C_DRIVERID_VPX3220
:
363 /* case I2C_DRIVERID_VPX3224:
366 case I2C_DRIVERID_MSE3000:
377 codecid_to_modulename (u16 codecid
)
382 case CODEC_TYPE_ZR36060
:
385 case CODEC_TYPE_ZR36050
:
388 case CODEC_TYPE_ZR36016
:
399 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
402 static struct tvnorm f50sqpixel
= { 944, 768, 83, 880, 625, 576, 16 };
403 static struct tvnorm f60sqpixel
= { 780, 640, 51, 716, 525, 480, 12 };
404 static struct tvnorm f50ccir601
= { 864, 720, 75, 804, 625, 576, 18 };
405 static struct tvnorm f60ccir601
= { 858, 720, 57, 788, 525, 480, 16 };
407 static struct tvnorm f50ccir601_lml33
= { 864, 720, 75+34, 804, 625, 576, 18 };
408 static struct tvnorm f60ccir601_lml33
= { 858, 720, 57+34, 788, 525, 480, 16 };
410 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
411 static struct tvnorm f50sqpixel_dc10
= { 944, 768, 0, 880, 625, 576, 0 };
412 static struct tvnorm f60sqpixel_dc10
= { 780, 640, 0, 716, 525, 480, 12 };
414 /* FIXME: I cannot swap U and V in saa7114, so i do one
415 * pixel left shift in zoran (75 -> 74)
416 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
417 static struct tvnorm f50ccir601_lm33r10
= { 864, 720, 74+54, 804, 625, 576, 18 };
418 static struct tvnorm f60ccir601_lm33r10
= { 858, 720, 56+54, 788, 525, 480, 16 };
420 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
421 * copy Maxim's left shift hack for the 6 Eyes.
423 * Christer's driver used the unshifted norms, though...
425 static struct tvnorm f50ccir601_avs6eyes
= { 864, 720, 74, 804, 625, 576, 18 };
426 static struct tvnorm f60ccir601_avs6eyes
= { 858, 720, 56, 788, 525, 480, 16 };
428 static struct card_info zoran_cards
[NUM_CARDS
] __devinitdata
= {
432 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
433 /*.i2c_encoder = I2C_DRIVERID_MSE3000,*/
434 .video_codec
= CODEC_TYPE_ZR36050
,
435 .video_vfe
= CODEC_TYPE_ZR36016
,
441 { 0, "Internal/comp" }
450 .vsync_int
= ZR36057_ISR_GIRQ1
,
451 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
452 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
454 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
455 .gws_not_connected
= 0,
461 .i2c_decoder
= I2C_DRIVERID_SAA7110
,
462 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
463 .video_codec
= CODEC_TYPE_ZR36060
,
469 { 5, "Internal/comp" }
476 .jpeg_int
= ZR36057_ISR_GIRQ0
,
477 .vsync_int
= ZR36057_ISR_GIRQ1
,
478 .gpio
= { 3, 0, 6, 1, 2, -1, 4, 5 },
479 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
481 .vfe_pol
= { 1, 1, 1, 1, 0, 0, 0, 0 },
482 .gws_not_connected
= 0,
484 .init
= &dc10plus_init
,
488 .vendor_id
= PCI_VENDOR_ID_MIRO
,
489 .device_id
= PCI_DEVICE_ID_MIRO_DC10PLUS
,
490 .i2c_decoder
= I2C_DRIVERID_SAA7110
,
491 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
492 .video_codec
= CODEC_TYPE_ZR36060
,
498 { 5, "Internal/comp" }
506 .jpeg_int
= ZR36057_ISR_GIRQ0
,
507 .vsync_int
= ZR36057_ISR_GIRQ1
,
508 .gpio
= { 3, 0, 6, 1, 2, -1, 4, 5 },
509 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
511 .vfe_pol
= { 1, 1, 1, 1, 0, 0, 0, 0 },
512 .gws_not_connected
= 0,
514 .init
= &dc10plus_init
,
518 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
519 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
520 .video_codec
= CODEC_TYPE_ZR36050
,
521 .video_vfe
= CODEC_TYPE_ZR36016
,
527 { 0, "Internal/comp" }
536 .vsync_int
= ZR36057_ISR_GIRQ1
,
537 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
538 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
540 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
541 .gws_not_connected
= 0,
547 .vendor_id
= PCI_VENDOR_ID_MIRO
,
548 .device_id
= PCI_DEVICE_ID_MIRO_DC30PLUS
,
549 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
550 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
551 .video_codec
= CODEC_TYPE_ZR36050
,
552 .video_vfe
= CODEC_TYPE_ZR36016
,
558 { 0, "Internal/comp" }
567 .vsync_int
= ZR36057_ISR_GIRQ1
,
568 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
569 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
571 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
572 .gws_not_connected
= 0,
578 .i2c_decoder
= I2C_DRIVERID_BT819
,
579 .i2c_encoder
= I2C_DRIVERID_BT856
,
580 .video_codec
= CODEC_TYPE_ZR36060
,
593 .jpeg_int
= ZR36057_ISR_GIRQ1
,
594 .vsync_int
= ZR36057_ISR_GIRQ0
,
595 .gpio
= { 1, -1, 3, 5, 7, -1, -1, -1 },
596 .gpio_pol
= { 0, 0, 0, 0, 1, 0, 0, 0 },
598 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
599 .gws_not_connected
= 1,
605 .vendor_id
= PCI_VENDOR_ID_ELECTRONICDESIGNGMBH
,
606 .device_id
= PCI_DEVICE_ID_LML_33R10
,
607 .i2c_decoder
= I2C_DRIVERID_SAA7114
,
608 .i2c_encoder
= I2C_DRIVERID_ADV7170
,
609 .video_codec
= CODEC_TYPE_ZR36060
,
622 .jpeg_int
= ZR36057_ISR_GIRQ1
,
623 .vsync_int
= ZR36057_ISR_GIRQ0
,
624 .gpio
= { 1, -1, 3, 5, 7, -1, -1, -1 },
625 .gpio_pol
= { 0, 0, 0, 0, 1, 0, 0, 0 },
627 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
628 .gws_not_connected
= 1,
634 .vendor_id
= PCI_VENDOR_ID_IOMEGA
,
635 .device_id
= PCI_DEVICE_ID_IOMEGA_BUZ
,
636 .i2c_decoder
= I2C_DRIVERID_SAA7111A
,
637 .i2c_encoder
= I2C_DRIVERID_SAA7185B
,
638 .video_codec
= CODEC_TYPE_ZR36060
,
651 .jpeg_int
= ZR36057_ISR_GIRQ1
,
652 .vsync_int
= ZR36057_ISR_GIRQ0
,
653 .gpio
= { 1, -1, 3, -1, -1, -1, -1, -1 },
654 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
656 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
657 .gws_not_connected
= 1,
663 /* AverMedia chose not to brand the 6-Eyes. Thus it
664 can't be autodetected, and requires card=x. */
667 .i2c_decoder
= I2C_DRIVERID_KS0127
,
668 .i2c_encoder
= I2C_DRIVERID_BT866
,
669 .video_codec
= CODEC_TYPE_ZR36060
,
673 { 0, "Composite 1" },
674 { 1, "Composite 2" },
675 { 2, "Composite 3" },
676 { 4, "Composite 4" },
677 { 5, "Composite 5" },
678 { 6, "Composite 6" },
686 &f50ccir601_avs6eyes
,
687 &f60ccir601_avs6eyes
,
690 .jpeg_int
= ZR36057_ISR_GIRQ1
,
691 .vsync_int
= ZR36057_ISR_GIRQ0
,
692 .gpio
= { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
693 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
694 .gpcs
= { 3, 1 }, // Validity unknown /Sam
695 .vfe_pol
= { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
696 .gws_not_connected
= 1,
698 .init
= &avs6eyes_init
,
706 /* software I2C functions */
708 zoran_i2c_getsda (void *data
)
710 struct zoran
*zr
= (struct zoran
*) data
;
712 return (btread(ZR36057_I2CBR
) >> 1) & 1;
716 zoran_i2c_getscl (void *data
)
718 struct zoran
*zr
= (struct zoran
*) data
;
720 return btread(ZR36057_I2CBR
) & 1;
724 zoran_i2c_setsda (void *data
,
727 struct zoran
*zr
= (struct zoran
*) data
;
733 btwrite(zr
->i2cbr
, ZR36057_I2CBR
);
737 zoran_i2c_setscl (void *data
,
740 struct zoran
*zr
= (struct zoran
*) data
;
746 btwrite(zr
->i2cbr
, ZR36057_I2CBR
);
750 zoran_i2c_client_register (struct i2c_client
*client
)
752 struct zoran
*zr
= (struct zoran
*) i2c_get_adapdata(client
->adapter
);
756 KERN_DEBUG
"%s: i2c_client_register() - driver id = %d\n",
757 ZR_DEVNAME(zr
), client
->driver
->id
);
759 mutex_lock(&zr
->resource_lock
);
762 /* we're already busy, so we keep a reference to
763 * them... Could do a lot of stuff here, but this
764 * is easiest. (Did I ever mention I'm a lazy ass?)
767 goto clientreg_unlock_and_return
;
770 if (client
->driver
->id
== zr
->card
.i2c_decoder
)
771 zr
->decoder
= client
;
772 else if (client
->driver
->id
== zr
->card
.i2c_encoder
)
773 zr
->encoder
= client
;
776 goto clientreg_unlock_and_return
;
779 clientreg_unlock_and_return
:
780 mutex_unlock(&zr
->resource_lock
);
786 zoran_i2c_client_unregister (struct i2c_client
*client
)
788 struct zoran
*zr
= (struct zoran
*) i2c_get_adapdata(client
->adapter
);
791 dprintk(2, KERN_DEBUG
"%s: i2c_client_unregister()\n", ZR_DEVNAME(zr
));
793 mutex_lock(&zr
->resource_lock
);
797 goto clientunreg_unlock_and_return
;
800 /* try to locate it */
801 if (client
== zr
->encoder
) {
803 } else if (client
== zr
->decoder
) {
805 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)), "MJPEG[%d]", zr
->id
);
807 clientunreg_unlock_and_return
:
808 mutex_unlock(&zr
->resource_lock
);
812 static struct i2c_algo_bit_data zoran_i2c_bit_data_template
= {
813 .setsda
= zoran_i2c_setsda
,
814 .setscl
= zoran_i2c_setscl
,
815 .getsda
= zoran_i2c_getsda
,
816 .getscl
= zoran_i2c_getscl
,
821 static struct i2c_adapter zoran_i2c_adapter_template
= {
823 .id
= I2C_HW_B_ZR36067
,
825 .client_register
= zoran_i2c_client_register
,
826 .client_unregister
= zoran_i2c_client_unregister
,
830 zoran_register_i2c (struct zoran
*zr
)
832 memcpy(&zr
->i2c_algo
, &zoran_i2c_bit_data_template
,
833 sizeof(struct i2c_algo_bit_data
));
834 zr
->i2c_algo
.data
= zr
;
835 memcpy(&zr
->i2c_adapter
, &zoran_i2c_adapter_template
,
836 sizeof(struct i2c_adapter
));
837 strncpy(I2C_NAME(&zr
->i2c_adapter
), ZR_DEVNAME(zr
),
838 sizeof(I2C_NAME(&zr
->i2c_adapter
)) - 1);
839 i2c_set_adapdata(&zr
->i2c_adapter
, zr
);
840 zr
->i2c_adapter
.algo_data
= &zr
->i2c_algo
;
841 zr
->i2c_adapter
.dev
.parent
= &zr
->pci_dev
->dev
;
842 return i2c_bit_add_bus(&zr
->i2c_adapter
);
846 zoran_unregister_i2c (struct zoran
*zr
)
848 i2c_del_adapter(&zr
->i2c_adapter
);
851 /* Check a zoran_params struct for correctness, insert default params */
854 zoran_check_jpg_settings (struct zoran
*zr
,
855 struct zoran_jpg_settings
*settings
)
857 int err
= 0, err0
= 0;
861 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
862 ZR_DEVNAME(zr
), settings
->decimation
, settings
->HorDcm
,
863 settings
->VerDcm
, settings
->TmpDcm
);
866 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
867 ZR_DEVNAME(zr
), settings
->img_x
, settings
->img_y
,
868 settings
->img_width
, settings
->img_height
);
869 /* Check decimation, set default values for decimation = 1, 2, 4 */
870 switch (settings
->decimation
) {
873 settings
->HorDcm
= 1;
874 settings
->VerDcm
= 1;
875 settings
->TmpDcm
= 1;
876 settings
->field_per_buff
= 2;
879 settings
->img_width
= BUZ_MAX_WIDTH
;
880 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
884 settings
->HorDcm
= 2;
885 settings
->VerDcm
= 1;
886 settings
->TmpDcm
= 2;
887 settings
->field_per_buff
= 1;
888 settings
->img_x
= (BUZ_MAX_WIDTH
== 720) ? 8 : 0;
890 settings
->img_width
=
891 (BUZ_MAX_WIDTH
== 720) ? 704 : BUZ_MAX_WIDTH
;
892 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
896 if (zr
->card
.type
== DC10_new
) {
899 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
905 settings
->HorDcm
= 4;
906 settings
->VerDcm
= 2;
907 settings
->TmpDcm
= 2;
908 settings
->field_per_buff
= 1;
909 settings
->img_x
= (BUZ_MAX_WIDTH
== 720) ? 8 : 0;
911 settings
->img_width
=
912 (BUZ_MAX_WIDTH
== 720) ? 704 : BUZ_MAX_WIDTH
;
913 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
917 /* We have to check the data the user has set */
919 if (settings
->HorDcm
!= 1 && settings
->HorDcm
!= 2 &&
920 (zr
->card
.type
== DC10_new
|| settings
->HorDcm
!= 4))
922 if (settings
->VerDcm
!= 1 && settings
->VerDcm
!= 2)
924 if (settings
->TmpDcm
!= 1 && settings
->TmpDcm
!= 2)
926 if (settings
->field_per_buff
!= 1 &&
927 settings
->field_per_buff
!= 2)
929 if (settings
->img_x
< 0)
931 if (settings
->img_y
< 0)
933 if (settings
->img_width
< 0)
935 if (settings
->img_height
< 0)
937 if (settings
->img_x
+ settings
->img_width
> BUZ_MAX_WIDTH
)
939 if (settings
->img_y
+ settings
->img_height
>
942 if (settings
->HorDcm
&& settings
->VerDcm
) {
943 if (settings
->img_width
%
944 (16 * settings
->HorDcm
) != 0)
946 if (settings
->img_height
%
947 (8 * settings
->VerDcm
) != 0)
954 "%s: check_jpg_settings() - error in params for decimation = 0\n",
962 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
963 ZR_DEVNAME(zr
), settings
->decimation
);
968 if (settings
->jpg_comp
.quality
> 100)
969 settings
->jpg_comp
.quality
= 100;
970 if (settings
->jpg_comp
.quality
< 5)
971 settings
->jpg_comp
.quality
= 5;
972 if (settings
->jpg_comp
.APPn
< 0)
973 settings
->jpg_comp
.APPn
= 0;
974 if (settings
->jpg_comp
.APPn
> 15)
975 settings
->jpg_comp
.APPn
= 15;
976 if (settings
->jpg_comp
.APP_len
< 0)
977 settings
->jpg_comp
.APP_len
= 0;
978 if (settings
->jpg_comp
.APP_len
> 60)
979 settings
->jpg_comp
.APP_len
= 60;
980 if (settings
->jpg_comp
.COM_len
< 0)
981 settings
->jpg_comp
.COM_len
= 0;
982 if (settings
->jpg_comp
.COM_len
> 60)
983 settings
->jpg_comp
.COM_len
= 60;
990 zoran_open_init_params (struct zoran
*zr
)
994 /* User must explicitly set a window */
995 zr
->overlay_settings
.is_set
= 0;
996 zr
->overlay_mask
= NULL
;
997 zr
->overlay_active
= ZORAN_FREE
;
999 zr
->v4l_memgrab_active
= 0;
1000 zr
->v4l_overlay_active
= 0;
1001 zr
->v4l_grab_frame
= NO_GRAB_ACTIVE
;
1002 zr
->v4l_grab_seq
= 0;
1003 zr
->v4l_settings
.width
= 192;
1004 zr
->v4l_settings
.height
= 144;
1005 zr
->v4l_settings
.format
= &zoran_formats
[4]; /* YUY2 - YUV-4:2:2 packed */
1006 zr
->v4l_settings
.bytesperline
=
1007 zr
->v4l_settings
.width
*
1008 ((zr
->v4l_settings
.format
->depth
+ 7) / 8);
1010 /* DMA ring stuff for V4L */
1011 zr
->v4l_pend_tail
= 0;
1012 zr
->v4l_pend_head
= 0;
1013 zr
->v4l_sync_tail
= 0;
1014 zr
->v4l_buffers
.active
= ZORAN_FREE
;
1015 for (i
= 0; i
< VIDEO_MAX_FRAME
; i
++) {
1016 zr
->v4l_buffers
.buffer
[i
].state
= BUZ_STATE_USER
; /* nothing going on */
1018 zr
->v4l_buffers
.allocated
= 0;
1020 for (i
= 0; i
< BUZ_MAX_FRAME
; i
++) {
1021 zr
->jpg_buffers
.buffer
[i
].state
= BUZ_STATE_USER
; /* nothing going on */
1023 zr
->jpg_buffers
.active
= ZORAN_FREE
;
1024 zr
->jpg_buffers
.allocated
= 0;
1025 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1026 zr
->jpg_settings
.decimation
= 1;
1027 zr
->jpg_settings
.jpg_comp
.quality
= 50; /* default compression factor 8 */
1028 if (zr
->card
.type
!= BUZ
)
1029 zr
->jpg_settings
.odd_even
= 1;
1031 zr
->jpg_settings
.odd_even
= 0;
1032 zr
->jpg_settings
.jpg_comp
.APPn
= 0;
1033 zr
->jpg_settings
.jpg_comp
.APP_len
= 0; /* No APPn marker */
1034 memset(zr
->jpg_settings
.jpg_comp
.APP_data
, 0,
1035 sizeof(zr
->jpg_settings
.jpg_comp
.APP_data
));
1036 zr
->jpg_settings
.jpg_comp
.COM_len
= 0; /* No COM marker */
1037 memset(zr
->jpg_settings
.jpg_comp
.COM_data
, 0,
1038 sizeof(zr
->jpg_settings
.jpg_comp
.COM_data
));
1039 zr
->jpg_settings
.jpg_comp
.jpeg_markers
=
1040 JPEG_MARKER_DHT
| JPEG_MARKER_DQT
;
1041 i
= zoran_check_jpg_settings(zr
, &zr
->jpg_settings
);
1045 "%s: zoran_open_init_params() internal error\n",
1048 clear_interrupt_counters(zr
);
1052 static void __devinit
1053 test_interrupts (struct zoran
*zr
)
1058 clear_interrupt_counters(zr
);
1061 icr
= btread(ZR36057_ICR
);
1062 btwrite(0x78000000 | ZR36057_ICR_IntPinEn
, ZR36057_ICR
);
1063 prepare_to_wait(&zr
->test_q
, &wait
, TASK_INTERRUPTIBLE
);
1064 timeout
= schedule_timeout(HZ
);
1065 finish_wait(&zr
->test_q
, &wait
);
1066 btwrite(0, ZR36057_ICR
);
1067 btwrite(0x78000000, ZR36057_ISR
);
1069 dprintk(5, KERN_INFO
"%s: Testing interrupts...\n", ZR_DEVNAME(zr
));
1071 dprintk(1, ": time spent: %d\n", 1 * HZ
- timeout
);
1073 if (zr36067_debug
> 1)
1074 print_interrupts(zr
);
1075 btwrite(icr
, ZR36057_ICR
);
1078 static int __devinit
1079 zr36057_init (struct zoran
*zr
)
1087 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1088 ZR_DEVNAME(zr
), zr
->id
, zr
);
1090 /* default setup of all parameters which will persist between opens */
1093 init_waitqueue_head(&zr
->v4l_capq
);
1094 init_waitqueue_head(&zr
->jpg_capq
);
1095 init_waitqueue_head(&zr
->test_q
);
1096 zr
->jpg_buffers
.allocated
= 0;
1097 zr
->v4l_buffers
.allocated
= 0;
1099 zr
->buffer
.base
= (void *) vidmem
;
1100 zr
->buffer
.width
= 0;
1101 zr
->buffer
.height
= 0;
1102 zr
->buffer
.depth
= 0;
1103 zr
->buffer
.bytesperline
= 0;
1105 /* Avoid nonsense settings from user for default input/norm */
1106 if (default_norm
< VIDEO_MODE_PAL
&&
1107 default_norm
> VIDEO_MODE_SECAM
)
1108 default_norm
= VIDEO_MODE_PAL
;
1109 zr
->norm
= default_norm
;
1110 if (!(zr
->timing
= zr
->card
.tvn
[zr
->norm
])) {
1113 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1115 zr
->norm
= VIDEO_MODE_PAL
;
1116 zr
->timing
= zr
->card
.tvn
[zr
->norm
];
1119 if (default_input
> zr
->card
.inputs
-1) {
1122 "%s: default_input value %d out of range (0-%d)\n",
1123 ZR_DEVNAME(zr
), default_input
, zr
->card
.inputs
-1);
1126 zr
->input
= default_input
;
1128 /* Should the following be reset at every open ? */
1130 zr
->contrast
= 32768;
1131 zr
->saturation
= 32768;
1132 zr
->brightness
= 32768;
1134 /* default setup (will be repeated at every open) */
1135 zoran_open_init_params(zr
);
1137 /* allocate memory *before* doing anything to the hardware
1138 * in case allocation fails */
1139 zr
->stat_com
= kzalloc(BUZ_NUM_STAT_COM
* 4, GFP_KERNEL
);
1140 zr
->video_dev
= kmalloc(sizeof(struct video_device
), GFP_KERNEL
);
1141 if (!zr
->stat_com
|| !zr
->video_dev
) {
1144 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1149 for (j
= 0; j
< BUZ_NUM_STAT_COM
; j
++) {
1150 zr
->stat_com
[j
] = 1; /* mark as unavailable to zr36057 */
1154 * Now add the template and register the device unit.
1156 memcpy(zr
->video_dev
, &zoran_template
, sizeof(zoran_template
));
1157 strcpy(zr
->video_dev
->name
, ZR_DEVNAME(zr
));
1158 err
= video_register_device(zr
->video_dev
, VFL_TYPE_GRABBER
, video_nr
[zr
->id
]);
1160 goto exit_unregister
;
1162 zoran_init_hardware(zr
);
1163 if (zr36067_debug
> 2)
1164 detect_guest_activity(zr
);
1165 test_interrupts(zr
);
1166 if (!pass_through
) {
1167 decoder_command(zr
, DECODER_ENABLE_OUTPUT
, &zero
);
1168 encoder_command(zr
, ENCODER_SET_INPUT
, &two
);
1171 zr
->zoran_proc
= NULL
;
1172 zr
->initialized
= 1;
1176 zoran_unregister_i2c(zr
);
1178 kfree(zr
->stat_com
);
1179 kfree(zr
->video_dev
);
1184 zoran_release (struct zoran
*zr
)
1186 if (!zr
->initialized
)
1188 /* unregister videocodec bus */
1190 struct videocodec_master
*master
= zr
->codec
->master_data
;
1192 videocodec_detach(zr
->codec
);
1196 struct videocodec_master
*master
= zr
->vfe
->master_data
;
1198 videocodec_detach(zr
->vfe
);
1202 /* unregister i2c bus */
1203 zoran_unregister_i2c(zr
);
1204 /* disable PCI bus-mastering */
1205 zoran_set_pci_master(zr
, 0);
1206 /* put chip into reset */
1207 btwrite(0, ZR36057_SPGPPCR
);
1208 free_irq(zr
->pci_dev
->irq
, zr
);
1209 /* unmap and free memory */
1210 kfree(zr
->stat_com
);
1211 zoran_proc_cleanup(zr
);
1212 iounmap(zr
->zr36057_mem
);
1213 pci_disable_device(zr
->pci_dev
);
1214 video_unregister_device(zr
->video_dev
);
1218 zoran_vdev_release (struct video_device
*vdev
)
1223 static struct videocodec_master
* __devinit
1224 zoran_setup_videocodec (struct zoran
*zr
,
1227 struct videocodec_master
*m
= NULL
;
1229 m
= kmalloc(sizeof(struct videocodec_master
), GFP_KERNEL
);
1233 "%s: zoran_setup_videocodec() - no memory\n",
1238 /* magic and type are unused for master struct. Makes sense only at
1240 In the past, .type were initialized to the old V4L1 .hardware
1241 value, as VID_HARDWARE_ZR36067
1246 m
->flags
= CODEC_FLAG_ENCODER
| CODEC_FLAG_DECODER
;
1247 strncpy(m
->name
, ZR_DEVNAME(zr
), sizeof(m
->name
));
1252 case CODEC_TYPE_ZR36060
:
1253 m
->readreg
= zr36060_read
;
1254 m
->writereg
= zr36060_write
;
1255 m
->flags
|= CODEC_FLAG_JPEG
| CODEC_FLAG_VFE
;
1257 case CODEC_TYPE_ZR36050
:
1258 m
->readreg
= zr36050_read
;
1259 m
->writereg
= zr36050_write
;
1260 m
->flags
|= CODEC_FLAG_JPEG
;
1262 case CODEC_TYPE_ZR36016
:
1263 m
->readreg
= zr36016_read
;
1264 m
->writereg
= zr36016_write
;
1265 m
->flags
|= CODEC_FLAG_VFE
;
1273 * Scan for a Buz card (actually for the PCI contoler ZR36057),
1274 * request the irq and map the io memory
1276 static int __devinit
1279 unsigned char latency
, need_latency
;
1281 struct pci_dev
*dev
= NULL
;
1283 struct videocodec_master
*master_vfe
= NULL
;
1284 struct videocodec_master
*master_codec
= NULL
;
1286 char *i2c_enc_name
, *i2c_dec_name
, *codec_name
, *vfe_name
;
1289 while (zoran_num
< BUZ_MAX
&&
1290 (dev
= pci_get_device(PCI_VENDOR_ID_ZORAN
, PCI_DEVICE_ID_ZORAN_36057
, dev
)) != NULL
) {
1291 card_num
= card
[zoran_num
];
1292 zr
= &zoran
[zoran_num
];
1293 memset(zr
, 0, sizeof(struct zoran
)); // Just in case if previous cycle failed
1295 //zr->zr36057_mem = NULL;
1297 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)), "MJPEG[%u]", zr
->id
);
1298 spin_lock_init(&zr
->spinlock
);
1299 mutex_init(&zr
->resource_lock
);
1300 if (pci_enable_device(dev
))
1302 zr
->zr36057_adr
= pci_resource_start(zr
->pci_dev
, 0);
1303 pci_read_config_byte(zr
->pci_dev
, PCI_CLASS_REVISION
,
1305 if (zr
->revision
< 2) {
1308 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1309 ZR_DEVNAME(zr
), zr
->revision
, zr
->pci_dev
->irq
,
1312 if (card_num
== -1) {
1315 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1321 unsigned short ss_vendor
, ss_device
;
1323 ss_vendor
= zr
->pci_dev
->subsystem_vendor
;
1324 ss_device
= zr
->pci_dev
->subsystem_device
;
1327 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1328 ZR_DEVNAME(zr
), zr
->revision
, zr
->pci_dev
->irq
,
1332 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1333 ZR_DEVNAME(zr
), ss_vendor
, ss_device
);
1334 if (card_num
== -1) {
1337 "%s: find_zr36057() - trying to autodetect card type\n",
1339 for (i
=0;i
<NUM_CARDS
;i
++) {
1340 if (ss_vendor
== zoran_cards
[i
].vendor_id
&&
1341 ss_device
== zoran_cards
[i
].device_id
) {
1344 "%s: find_zr36057() - card %s detected\n",
1346 zoran_cards
[i
].name
);
1351 if (i
== NUM_CARDS
) {
1354 "%s: find_zr36057() - unknown card\n",
1361 if (card_num
< 0 || card_num
>= NUM_CARDS
) {
1364 "%s: find_zr36057() - invalid cardnum %d\n",
1365 ZR_DEVNAME(zr
), card_num
);
1369 /* even though we make this a non pointer and thus
1370 * theoretically allow for making changes to this struct
1371 * on a per-individual card basis at runtime, this is
1372 * strongly discouraged. This structure is intended to
1373 * keep general card information, no settings or anything */
1374 zr
->card
= zoran_cards
[card_num
];
1375 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)),
1376 "%s[%u]", zr
->card
.name
, zr
->id
);
1378 zr
->zr36057_mem
= ioremap_nocache(zr
->zr36057_adr
, 0x1000);
1379 if (!zr
->zr36057_mem
) {
1382 "%s: find_zr36057() - ioremap failed\n",
1387 result
= request_irq(zr
->pci_dev
->irq
,
1389 IRQF_SHARED
| IRQF_DISABLED
,
1393 if (result
== -EINVAL
) {
1396 "%s: find_zr36057() - bad irq number or handler\n",
1398 } else if (result
== -EBUSY
) {
1401 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1402 ZR_DEVNAME(zr
), zr
->pci_dev
->irq
);
1406 "%s: find_zr36057() - can't assign irq, error code %d\n",
1407 ZR_DEVNAME(zr
), result
);
1412 /* set PCI latency timer */
1413 pci_read_config_byte(zr
->pci_dev
, PCI_LATENCY_TIMER
,
1415 need_latency
= zr
->revision
> 1 ? 32 : 48;
1416 if (latency
!= need_latency
) {
1419 "%s: Changing PCI latency from %d to %d.\n",
1420 ZR_DEVNAME(zr
), latency
, need_latency
);
1421 pci_write_config_byte(zr
->pci_dev
,
1426 zr36057_restart(zr
);
1428 dprintk(2, KERN_INFO
"%s: Initializing i2c bus...\n",
1432 if (decoder
[zr
->id
] != -1) {
1433 i2c_dec_name
= i2cid_to_modulename(decoder
[zr
->id
]);
1434 zr
->card
.i2c_decoder
= decoder
[zr
->id
];
1435 } else if (zr
->card
.i2c_decoder
!= 0) {
1437 i2cid_to_modulename(zr
->card
.i2c_decoder
);
1439 i2c_dec_name
= NULL
;
1443 if ((result
= request_module(i2c_dec_name
)) < 0) {
1446 "%s: failed to load module %s: %d\n",
1447 ZR_DEVNAME(zr
), i2c_dec_name
, result
);
1452 if (encoder
[zr
->id
] != -1) {
1453 i2c_enc_name
= i2cid_to_modulename(encoder
[zr
->id
]);
1454 zr
->card
.i2c_encoder
= encoder
[zr
->id
];
1455 } else if (zr
->card
.i2c_encoder
!= 0) {
1457 i2cid_to_modulename(zr
->card
.i2c_encoder
);
1459 i2c_enc_name
= NULL
;
1463 if ((result
= request_module(i2c_enc_name
)) < 0) {
1466 "%s: failed to load module %s: %d\n",
1467 ZR_DEVNAME(zr
), i2c_enc_name
, result
);
1471 if (zoran_register_i2c(zr
) < 0) {
1474 "%s: find_zr36057() - can't initialize i2c bus\n",
1480 KERN_INFO
"%s: Initializing videocodec bus...\n",
1483 if (zr
->card
.video_codec
!= 0 &&
1485 codecid_to_modulename(zr
->card
.video_codec
)) != NULL
) {
1486 if ((result
= request_module(codec_name
)) < 0) {
1489 "%s: failed to load modules %s: %d\n",
1490 ZR_DEVNAME(zr
), codec_name
, result
);
1493 if (zr
->card
.video_vfe
!= 0 &&
1495 codecid_to_modulename(zr
->card
.video_vfe
)) != NULL
) {
1496 if ((result
= request_module(vfe_name
)) < 0) {
1499 "%s: failed to load modules %s: %d\n",
1500 ZR_DEVNAME(zr
), vfe_name
, result
);
1504 /* reset JPEG codec */
1505 jpeg_codec_sleep(zr
, 1);
1506 jpeg_codec_reset(zr
);
1507 /* video bus enabled */
1508 /* display codec revision */
1509 if (zr
->card
.video_codec
!= 0) {
1510 master_codec
= zoran_setup_videocodec(zr
,
1511 zr
->card
.video_codec
);
1514 zr
->codec
= videocodec_attach(master_codec
);
1518 "%s: find_zr36057() - no codec found\n",
1522 if (zr
->codec
->type
!= zr
->card
.video_codec
) {
1525 "%s: find_zr36057() - wrong codec\n",
1527 goto zr_detach_codec
;
1530 if (zr
->card
.video_vfe
!= 0) {
1531 master_vfe
= zoran_setup_videocodec(zr
,
1532 zr
->card
.video_vfe
);
1534 goto zr_detach_codec
;
1535 zr
->vfe
= videocodec_attach(master_vfe
);
1539 "%s: find_zr36057() - no VFE found\n",
1543 if (zr
->vfe
->type
!= zr
->card
.video_vfe
) {
1546 "%s: find_zr36057() = wrong VFE\n",
1551 /* Success so keep the pci_dev referenced */
1552 pci_dev_get(zr
->pci_dev
);
1558 videocodec_detach(zr
->vfe
);
1562 videocodec_detach(zr
->codec
);
1564 kfree(master_codec
);
1566 zoran_unregister_i2c(zr
);
1568 btwrite(0, ZR36057_SPGPPCR
);
1569 free_irq(zr
->pci_dev
->irq
, zr
);
1571 iounmap(zr
->zr36057_mem
);
1574 if (dev
) /* Clean up ref count on early exit */
1577 if (zoran_num
== 0) {
1578 dprintk(1, KERN_INFO
"No known MJPEG cards found.\n");
1584 init_dc10_cards (void)
1588 memset(zoran
, 0, sizeof(zoran
));
1589 printk(KERN_INFO
"Zoran MJPEG board driver version %d.%d.%d\n",
1590 MAJOR_VERSION
, MINOR_VERSION
, RELEASE_VERSION
);
1592 /* Look for cards */
1593 if (find_zr36057() < 0) {
1598 dprintk(1, KERN_INFO
"%s: %d card(s) found\n", ZORAN_NAME
,
1600 /* check the parameters we have been given, adjust if necessary */
1603 if (v4l_nbufs
> VIDEO_MAX_FRAME
)
1604 v4l_nbufs
= VIDEO_MAX_FRAME
;
1605 /* The user specfies the in KB, we want them in byte
1606 * (and page aligned) */
1607 v4l_bufsize
= PAGE_ALIGN(v4l_bufsize
* 1024);
1608 if (v4l_bufsize
< 32768)
1609 v4l_bufsize
= 32768;
1610 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1611 if (v4l_bufsize
> 2048 * 1024)
1612 v4l_bufsize
= 2048 * 1024;
1615 if (jpg_nbufs
> BUZ_MAX_FRAME
)
1616 jpg_nbufs
= BUZ_MAX_FRAME
;
1617 jpg_bufsize
= PAGE_ALIGN(jpg_bufsize
* 1024);
1618 if (jpg_bufsize
< 8192)
1620 if (jpg_bufsize
> (512 * 1024))
1621 jpg_bufsize
= 512 * 1024;
1622 /* Use parameter for vidmem or try to find a video card */
1626 "%s: Using supplied video memory base address @ 0x%lx\n",
1627 ZORAN_NAME
, vidmem
);
1630 /* random nonsense */
1631 dprintk(6, KERN_DEBUG
"Jotti is een held!\n");
1633 /* some mainboards might not do PCI-PCI data transfer well */
1634 if (pci_pci_problems
& (PCIPCI_FAIL
|PCIAGP_FAIL
|PCIPCI_ALIMAGIK
)) {
1637 "%s: chipset does not support reliable PCI-PCI DMA\n",
1641 /* take care of Natoma chipset and a revision 1 zr36057 */
1642 for (i
= 0; i
< zoran_num
; i
++) {
1643 struct zoran
*zr
= &zoran
[i
];
1645 if ((pci_pci_problems
& PCIPCI_NATOMA
) && zr
->revision
<= 1) {
1646 zr
->jpg_buffers
.need_contiguous
= 1;
1649 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1653 if (zr36057_init(zr
) < 0) {
1654 for (i
= 0; i
< zoran_num
; i
++)
1655 zoran_release(&zoran
[i
]);
1658 zoran_proc_init(zr
);
1665 unload_dc10_cards (void)
1669 for (i
= 0; i
< zoran_num
; i
++)
1670 zoran_release(&zoran
[i
]);
1673 module_init(init_dc10_cards
);
1674 module_exit(unload_dc10_cards
);