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 extern const struct zoran_format zoran_formats
[];
64 static int card
[BUZ_MAX
] = { [0 ... (BUZ_MAX
-1)] = -1 };
65 module_param_array(card
, int, NULL
, 0444);
66 MODULE_PARM_DESC(card
, "Card type");
68 static int encoder
[BUZ_MAX
] = { [0 ... (BUZ_MAX
-1)] = -1 };
69 module_param_array(encoder
, int, NULL
, 0444);
70 MODULE_PARM_DESC(encoder
, "Video encoder chip");
72 static int decoder
[BUZ_MAX
] = { [0 ... (BUZ_MAX
-1)] = -1 };
73 module_param_array(decoder
, int, NULL
, 0444);
74 MODULE_PARM_DESC(decoder
, "Video decoder chip");
77 The video mem address of the video card.
78 The driver has a little database for some videocards
79 to determine it from there. If your video card is not in there
80 you have either to give it to the driver as a parameter
81 or set in in a VIDIOCSFBUF ioctl
84 static unsigned long vidmem
; /* default = 0 - Video memory base address */
85 module_param(vidmem
, ulong
, 0444);
86 MODULE_PARM_DESC(vidmem
, "Default video memory base address");
89 Default input and video norm at startup of the driver.
92 static unsigned int default_input
; /* default 0 = Composite, 1 = S-Video */
93 module_param(default_input
, uint
, 0444);
94 MODULE_PARM_DESC(default_input
,
95 "Default input (0=Composite, 1=S-Video, 2=Internal)");
97 static int default_mux
= 1; /* 6 Eyes input selection */
98 module_param(default_mux
, int, 0644);
99 MODULE_PARM_DESC(default_mux
,
100 "Default 6 Eyes mux setting (Input selection)");
102 static int default_norm
; /* default 0 = PAL, 1 = NTSC 2 = SECAM */
103 module_param(default_norm
, int, 0444);
104 MODULE_PARM_DESC(default_norm
, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
106 /* /dev/videoN, -1 for autodetect */
107 static int video_nr
[BUZ_MAX
] = { [0 ... (BUZ_MAX
-1)] = -1 };
108 module_param_array(video_nr
, int, NULL
, 0444);
109 MODULE_PARM_DESC(video_nr
, "Video device number (-1=Auto)");
112 Number and size of grab buffers for Video 4 Linux
113 The vast majority of applications should not need more than 2,
114 the very popular BTTV driver actually does ONLY have 2.
115 Time sensitive applications might need more, the maximum
116 is VIDEO_MAX_FRAME (defined in <linux/videodev.h>).
118 The size is set so that the maximum possible request
119 can be satisfied. Decrease it, if bigphys_area alloc'd
120 memory is low. If you don't have the bigphys_area patch,
121 set it to 128 KB. Will you allow only to grab small
122 images with V4L, but that's better than nothing.
124 v4l_bufsize has to be given in KB !
129 int v4l_bufsize
= 810; /* Everybody should be able to work with this setting */
130 module_param(v4l_nbufs
, int, 0644);
131 MODULE_PARM_DESC(v4l_nbufs
, "Maximum number of V4L buffers to use");
132 module_param(v4l_bufsize
, int, 0644);
133 MODULE_PARM_DESC(v4l_bufsize
, "Maximum size per V4L buffer (in kB)");
136 int jpg_bufsize
= 512; /* max size for 100% quality full-PAL frame */
137 module_param(jpg_nbufs
, int, 0644);
138 MODULE_PARM_DESC(jpg_nbufs
, "Maximum number of JPG buffers to use");
139 module_param(jpg_bufsize
, int, 0644);
140 MODULE_PARM_DESC(jpg_bufsize
, "Maximum size per JPG buffer (in kB)");
142 int pass_through
= 0; /* 1=Pass through TV signal when device is not used */
143 /* 0=Show color bar when device is not used (LML33: only if lml33dpath=1) */
144 module_param(pass_through
, int, 0644);
145 MODULE_PARM_DESC(pass_through
,
146 "Pass TV signal through to TV-out when idling");
148 int zr36067_debug
= 1;
149 module_param_named(debug
, zr36067_debug
, int, 0644);
150 MODULE_PARM_DESC(debug
, "Debug level (0-5)");
152 MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
153 MODULE_AUTHOR("Serguei Miridonov");
154 MODULE_LICENSE("GPL");
156 #define ZR_DEVICE(subven, subdev, data) { \
157 .vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
158 .subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
160 static struct pci_device_id zr36067_pci_tbl
[] = {
161 ZR_DEVICE(PCI_VENDOR_ID_MIRO
, PCI_DEVICE_ID_MIRO_DC10PLUS
, DC10plus
),
162 ZR_DEVICE(PCI_VENDOR_ID_MIRO
, PCI_DEVICE_ID_MIRO_DC30PLUS
, DC30plus
),
163 ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH
, PCI_DEVICE_ID_LML_33R10
, LML33R10
),
164 ZR_DEVICE(PCI_VENDOR_ID_IOMEGA
, PCI_DEVICE_ID_IOMEGA_BUZ
, BUZ
),
165 ZR_DEVICE(PCI_ANY_ID
, PCI_ANY_ID
, NUM_CARDS
),
168 MODULE_DEVICE_TABLE(pci
, zr36067_pci_tbl
);
170 static unsigned int zoran_num
; /* number of cards found */
172 /* videocodec bus functions ZR36060 */
174 zr36060_read (struct videocodec
*codec
,
177 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
180 if (post_office_wait(zr
)
181 || post_office_write(zr
, 0, 1, reg
>> 8)
182 || post_office_write(zr
, 0, 2, reg
& 0xff)) {
186 data
= post_office_read(zr
, 0, 3) & 0xff;
191 zr36060_write (struct videocodec
*codec
,
195 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
197 if (post_office_wait(zr
)
198 || post_office_write(zr
, 0, 1, reg
>> 8)
199 || post_office_write(zr
, 0, 2, reg
& 0xff)) {
203 post_office_write(zr
, 0, 3, val
& 0xff);
206 /* videocodec bus functions ZR36050 */
208 zr36050_read (struct videocodec
*codec
,
211 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
214 if (post_office_wait(zr
)
215 || post_office_write(zr
, 1, 0, reg
>> 2)) { // reg. HIGHBYTES
219 data
= post_office_read(zr
, 0, reg
& 0x03) & 0xff; // reg. LOWBYTES + read
224 zr36050_write (struct videocodec
*codec
,
228 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
230 if (post_office_wait(zr
)
231 || post_office_write(zr
, 1, 0, reg
>> 2)) { // reg. HIGHBYTES
235 post_office_write(zr
, 0, reg
& 0x03, val
& 0xff); // reg. LOWBYTES + wr. data
238 /* videocodec bus functions ZR36016 */
240 zr36016_read (struct videocodec
*codec
,
243 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
246 if (post_office_wait(zr
)) {
250 data
= post_office_read(zr
, 2, reg
& 0x03) & 0xff; // read
254 /* hack for in zoran_device.c */
256 zr36016_write (struct videocodec
*codec
,
260 struct zoran
*zr
= (struct zoran
*) codec
->master_data
->data
;
262 if (post_office_wait(zr
)) {
266 post_office_write(zr
, 2, reg
& 0x03, val
& 0x0ff); // wr. data
270 * Board specific information
274 dc10_init (struct zoran
*zr
)
276 dprintk(3, KERN_DEBUG
"%s: dc10_init()\n", ZR_DEVNAME(zr
));
278 /* Pixel clock selection */
281 /* Enable the video bus sync signals */
286 dc10plus_init (struct zoran
*zr
)
288 dprintk(3, KERN_DEBUG
"%s: dc10plus_init()\n", ZR_DEVNAME(zr
));
292 buz_init (struct zoran
*zr
)
294 dprintk(3, KERN_DEBUG
"%s: buz_init()\n", ZR_DEVNAME(zr
));
296 /* some stuff from Iomega */
297 pci_write_config_dword(zr
->pci_dev
, 0xfc, 0x90680f15);
298 pci_write_config_dword(zr
->pci_dev
, 0x0c, 0x00012020);
299 pci_write_config_dword(zr
->pci_dev
, 0xe8, 0xc0200000);
303 lml33_init (struct zoran
*zr
)
305 dprintk(3, KERN_DEBUG
"%s: lml33_init()\n", ZR_DEVNAME(zr
));
307 GPIO(zr
, 2, 1); // Set Composite input/output
311 avs6eyes_init (struct zoran
*zr
)
313 // AverMedia 6-Eyes original driver by Christer Weinigel
315 // Lifted straight from Christer's old driver and
316 // modified slightly by Martin Samuelsson.
318 int mux
= default_mux
; /* 1 = BT866, 7 = VID1 */
320 GPIO(zr
, 4, 1); /* Bt866 SLEEP on */
323 GPIO(zr
, 0, 1); /* ZR36060 /RESET on */
324 GPIO(zr
, 1, 0); /* ZR36060 /SLEEP on */
325 GPIO(zr
, 2, mux
& 1); /* MUX S0 */
326 GPIO(zr
, 3, 0); /* /FRAME on */
327 GPIO(zr
, 4, 0); /* Bt866 SLEEP off */
328 GPIO(zr
, 5, mux
& 2); /* MUX S1 */
329 GPIO(zr
, 6, 0); /* ? */
330 GPIO(zr
, 7, mux
& 4); /* MUX S2 */
335 i2cid_to_modulename (u16 i2c_id
)
340 case I2C_DRIVERID_SAA7110
:
343 case I2C_DRIVERID_SAA711X
:
346 case I2C_DRIVERID_SAA7185B
:
349 case I2C_DRIVERID_ADV7170
:
352 case I2C_DRIVERID_ADV7175
:
355 case I2C_DRIVERID_BT819
:
358 case I2C_DRIVERID_BT856
:
361 case I2C_DRIVERID_BT866
:
364 case I2C_DRIVERID_VPX3220
:
367 case I2C_DRIVERID_KS0127
:
376 codecid_to_modulename (u16 codecid
)
381 case CODEC_TYPE_ZR36060
:
384 case CODEC_TYPE_ZR36050
:
387 case CODEC_TYPE_ZR36016
:
396 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
399 static struct tvnorm f50sqpixel
= { 944, 768, 83, 880, 625, 576, 16 };
400 static struct tvnorm f60sqpixel
= { 780, 640, 51, 716, 525, 480, 12 };
401 static struct tvnorm f50ccir601
= { 864, 720, 75, 804, 625, 576, 18 };
402 static struct tvnorm f60ccir601
= { 858, 720, 57, 788, 525, 480, 16 };
404 static struct tvnorm f50ccir601_lml33
= { 864, 720, 75+34, 804, 625, 576, 18 };
405 static struct tvnorm f60ccir601_lml33
= { 858, 720, 57+34, 788, 525, 480, 16 };
407 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
408 static struct tvnorm f50sqpixel_dc10
= { 944, 768, 0, 880, 625, 576, 0 };
409 static struct tvnorm f60sqpixel_dc10
= { 780, 640, 0, 716, 525, 480, 12 };
411 /* FIXME: I cannot swap U and V in saa7114, so i do one
412 * pixel left shift in zoran (75 -> 74)
413 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
414 static struct tvnorm f50ccir601_lm33r10
= { 864, 720, 74+54, 804, 625, 576, 18 };
415 static struct tvnorm f60ccir601_lm33r10
= { 858, 720, 56+54, 788, 525, 480, 16 };
417 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
418 * copy Maxim's left shift hack for the 6 Eyes.
420 * Christer's driver used the unshifted norms, though...
422 static struct tvnorm f50ccir601_avs6eyes
= { 864, 720, 74, 804, 625, 576, 18 };
423 static struct tvnorm f60ccir601_avs6eyes
= { 858, 720, 56, 788, 525, 480, 16 };
425 static struct card_info zoran_cards
[NUM_CARDS
] __devinitdata
= {
429 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
430 .video_codec
= CODEC_TYPE_ZR36050
,
431 .video_vfe
= CODEC_TYPE_ZR36016
,
437 { 0, "Internal/comp" }
439 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
446 .vsync_int
= ZR36057_ISR_GIRQ1
,
447 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
448 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
450 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
451 .gws_not_connected
= 0,
457 .i2c_decoder
= I2C_DRIVERID_SAA7110
,
458 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
459 .video_codec
= CODEC_TYPE_ZR36060
,
465 { 5, "Internal/comp" }
467 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
472 .jpeg_int
= ZR36057_ISR_GIRQ0
,
473 .vsync_int
= ZR36057_ISR_GIRQ1
,
474 .gpio
= { 3, 0, 6, 1, 2, -1, 4, 5 },
475 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
477 .vfe_pol
= { 1, 1, 1, 1, 0, 0, 0, 0 },
478 .gws_not_connected
= 0,
480 .init
= &dc10plus_init
,
484 .i2c_decoder
= I2C_DRIVERID_SAA7110
,
485 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
486 .video_codec
= CODEC_TYPE_ZR36060
,
492 { 5, "Internal/comp" }
494 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
500 .jpeg_int
= ZR36057_ISR_GIRQ0
,
501 .vsync_int
= ZR36057_ISR_GIRQ1
,
502 .gpio
= { 3, 0, 6, 1, 2, -1, 4, 5 },
503 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
505 .vfe_pol
= { 1, 1, 1, 1, 0, 0, 0, 0 },
506 .gws_not_connected
= 0,
508 .init
= &dc10plus_init
,
512 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
513 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
514 .video_codec
= CODEC_TYPE_ZR36050
,
515 .video_vfe
= CODEC_TYPE_ZR36016
,
521 { 0, "Internal/comp" }
523 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
530 .vsync_int
= ZR36057_ISR_GIRQ1
,
531 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
532 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
534 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
535 .gws_not_connected
= 0,
541 .i2c_decoder
= I2C_DRIVERID_VPX3220
,
542 .i2c_encoder
= I2C_DRIVERID_ADV7175
,
543 .video_codec
= CODEC_TYPE_ZR36050
,
544 .video_vfe
= CODEC_TYPE_ZR36016
,
550 { 0, "Internal/comp" }
552 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
559 .vsync_int
= ZR36057_ISR_GIRQ1
,
560 .gpio
= { 2, 1, -1, 3, 7, 0, 4, 5 },
561 .gpio_pol
= { 0, 0, 0, 1, 0, 0, 0, 0 },
563 .vfe_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
564 .gws_not_connected
= 0,
570 .i2c_decoder
= I2C_DRIVERID_BT819
,
571 .i2c_encoder
= I2C_DRIVERID_BT856
,
572 .video_codec
= CODEC_TYPE_ZR36060
,
579 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
,
585 .jpeg_int
= ZR36057_ISR_GIRQ1
,
586 .vsync_int
= ZR36057_ISR_GIRQ0
,
587 .gpio
= { 1, -1, 3, 5, 7, -1, -1, -1 },
588 .gpio_pol
= { 0, 0, 0, 0, 1, 0, 0, 0 },
590 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
591 .gws_not_connected
= 1,
597 .i2c_decoder
= I2C_DRIVERID_SAA711X
,
598 .i2c_encoder
= I2C_DRIVERID_ADV7170
,
599 .video_codec
= CODEC_TYPE_ZR36060
,
606 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
,
612 .jpeg_int
= ZR36057_ISR_GIRQ1
,
613 .vsync_int
= ZR36057_ISR_GIRQ0
,
614 .gpio
= { 1, -1, 3, 5, 7, -1, -1, -1 },
615 .gpio_pol
= { 0, 0, 0, 0, 1, 0, 0, 0 },
617 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
618 .gws_not_connected
= 1,
624 .i2c_decoder
= I2C_DRIVERID_SAA711X
,
625 .i2c_encoder
= I2C_DRIVERID_SAA7185B
,
626 .video_codec
= CODEC_TYPE_ZR36060
,
633 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
|V4L2_STD_SECAM
,
639 .jpeg_int
= ZR36057_ISR_GIRQ1
,
640 .vsync_int
= ZR36057_ISR_GIRQ0
,
641 .gpio
= { 1, -1, 3, -1, -1, -1, -1, -1 },
642 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 },
644 .vfe_pol
= { 1, 1, 0, 0, 0, 1, 0, 0 },
645 .gws_not_connected
= 1,
651 /* AverMedia chose not to brand the 6-Eyes. Thus it
652 can't be autodetected, and requires card=x. */
653 .i2c_decoder
= I2C_DRIVERID_KS0127
,
654 .i2c_encoder
= I2C_DRIVERID_BT866
,
655 .video_codec
= CODEC_TYPE_ZR36060
,
659 { 0, "Composite 1" },
660 { 1, "Composite 2" },
661 { 2, "Composite 3" },
662 { 4, "Composite 4" },
663 { 5, "Composite 5" },
664 { 6, "Composite 6" },
670 .norms
= V4L2_STD_NTSC
|V4L2_STD_PAL
,
672 &f50ccir601_avs6eyes
,
673 &f60ccir601_avs6eyes
,
676 .jpeg_int
= ZR36057_ISR_GIRQ1
,
677 .vsync_int
= ZR36057_ISR_GIRQ0
,
678 .gpio
= { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
679 .gpio_pol
= { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
680 .gpcs
= { 3, 1 }, // Validity unknown /Sam
681 .vfe_pol
= { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
682 .gws_not_connected
= 1,
684 .init
= &avs6eyes_init
,
692 /* software I2C functions */
694 zoran_i2c_getsda (void *data
)
696 struct zoran
*zr
= (struct zoran
*) data
;
698 return (btread(ZR36057_I2CBR
) >> 1) & 1;
702 zoran_i2c_getscl (void *data
)
704 struct zoran
*zr
= (struct zoran
*) data
;
706 return btread(ZR36057_I2CBR
) & 1;
710 zoran_i2c_setsda (void *data
,
713 struct zoran
*zr
= (struct zoran
*) data
;
719 btwrite(zr
->i2cbr
, ZR36057_I2CBR
);
723 zoran_i2c_setscl (void *data
,
726 struct zoran
*zr
= (struct zoran
*) data
;
732 btwrite(zr
->i2cbr
, ZR36057_I2CBR
);
736 zoran_i2c_client_register (struct i2c_client
*client
)
738 struct zoran
*zr
= (struct zoran
*) i2c_get_adapdata(client
->adapter
);
742 KERN_DEBUG
"%s: i2c_client_register() - driver id = %d\n",
743 ZR_DEVNAME(zr
), client
->driver
->id
);
745 mutex_lock(&zr
->resource_lock
);
748 /* we're already busy, so we keep a reference to
749 * them... Could do a lot of stuff here, but this
750 * is easiest. (Did I ever mention I'm a lazy ass?)
753 goto clientreg_unlock_and_return
;
756 if (client
->driver
->id
== zr
->card
.i2c_decoder
)
757 zr
->decoder
= client
;
758 else if (client
->driver
->id
== zr
->card
.i2c_encoder
)
759 zr
->encoder
= client
;
762 goto clientreg_unlock_and_return
;
765 clientreg_unlock_and_return
:
766 mutex_unlock(&zr
->resource_lock
);
772 zoran_i2c_client_unregister (struct i2c_client
*client
)
774 struct zoran
*zr
= (struct zoran
*) i2c_get_adapdata(client
->adapter
);
777 dprintk(2, KERN_DEBUG
"%s: i2c_client_unregister()\n", ZR_DEVNAME(zr
));
779 mutex_lock(&zr
->resource_lock
);
783 goto clientunreg_unlock_and_return
;
786 /* try to locate it */
787 if (client
== zr
->encoder
) {
789 } else if (client
== zr
->decoder
) {
791 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)), "MJPEG[%d]", zr
->id
);
793 clientunreg_unlock_and_return
:
794 mutex_unlock(&zr
->resource_lock
);
798 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template
= {
799 .setsda
= zoran_i2c_setsda
,
800 .setscl
= zoran_i2c_setscl
,
801 .getsda
= zoran_i2c_getsda
,
802 .getscl
= zoran_i2c_getscl
,
808 zoran_register_i2c (struct zoran
*zr
)
810 memcpy(&zr
->i2c_algo
, &zoran_i2c_bit_data_template
,
811 sizeof(struct i2c_algo_bit_data
));
812 zr
->i2c_algo
.data
= zr
;
813 zr
->i2c_adapter
.class = I2C_CLASS_TV_ANALOG
;
814 zr
->i2c_adapter
.id
= I2C_HW_B_ZR36067
;
815 zr
->i2c_adapter
.client_register
= zoran_i2c_client_register
;
816 zr
->i2c_adapter
.client_unregister
= zoran_i2c_client_unregister
;
817 strlcpy(zr
->i2c_adapter
.name
, ZR_DEVNAME(zr
),
818 sizeof(zr
->i2c_adapter
.name
));
819 i2c_set_adapdata(&zr
->i2c_adapter
, zr
);
820 zr
->i2c_adapter
.algo_data
= &zr
->i2c_algo
;
821 zr
->i2c_adapter
.dev
.parent
= &zr
->pci_dev
->dev
;
822 return i2c_bit_add_bus(&zr
->i2c_adapter
);
826 zoran_unregister_i2c (struct zoran
*zr
)
828 i2c_del_adapter(&zr
->i2c_adapter
);
831 /* Check a zoran_params struct for correctness, insert default params */
834 zoran_check_jpg_settings (struct zoran
*zr
,
835 struct zoran_jpg_settings
*settings
,
838 int err
= 0, err0
= 0;
842 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
843 ZR_DEVNAME(zr
), settings
->decimation
, settings
->HorDcm
,
844 settings
->VerDcm
, settings
->TmpDcm
);
847 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
848 ZR_DEVNAME(zr
), settings
->img_x
, settings
->img_y
,
849 settings
->img_width
, settings
->img_height
);
850 /* Check decimation, set default values for decimation = 1, 2, 4 */
851 switch (settings
->decimation
) {
854 settings
->HorDcm
= 1;
855 settings
->VerDcm
= 1;
856 settings
->TmpDcm
= 1;
857 settings
->field_per_buff
= 2;
860 settings
->img_width
= BUZ_MAX_WIDTH
;
861 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
865 settings
->HorDcm
= 2;
866 settings
->VerDcm
= 1;
867 settings
->TmpDcm
= 2;
868 settings
->field_per_buff
= 1;
869 settings
->img_x
= (BUZ_MAX_WIDTH
== 720) ? 8 : 0;
871 settings
->img_width
=
872 (BUZ_MAX_WIDTH
== 720) ? 704 : BUZ_MAX_WIDTH
;
873 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
877 if (zr
->card
.type
== DC10_new
) {
880 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
886 settings
->HorDcm
= 4;
887 settings
->VerDcm
= 2;
888 settings
->TmpDcm
= 2;
889 settings
->field_per_buff
= 1;
890 settings
->img_x
= (BUZ_MAX_WIDTH
== 720) ? 8 : 0;
892 settings
->img_width
=
893 (BUZ_MAX_WIDTH
== 720) ? 704 : BUZ_MAX_WIDTH
;
894 settings
->img_height
= BUZ_MAX_HEIGHT
/ 2;
898 /* We have to check the data the user has set */
900 if (settings
->HorDcm
!= 1 && settings
->HorDcm
!= 2 &&
901 (zr
->card
.type
== DC10_new
|| settings
->HorDcm
!= 4)) {
902 settings
->HorDcm
= clamp(settings
->HorDcm
, 1, 2);
905 if (settings
->VerDcm
!= 1 && settings
->VerDcm
!= 2) {
906 settings
->VerDcm
= clamp(settings
->VerDcm
, 1, 2);
909 if (settings
->TmpDcm
!= 1 && settings
->TmpDcm
!= 2) {
910 settings
->TmpDcm
= clamp(settings
->TmpDcm
, 1, 2);
913 if (settings
->field_per_buff
!= 1 &&
914 settings
->field_per_buff
!= 2) {
915 settings
->field_per_buff
= clamp(settings
->field_per_buff
, 1, 2);
918 if (settings
->img_x
< 0) {
922 if (settings
->img_y
< 0) {
926 if (settings
->img_width
< 0 || settings
->img_width
> BUZ_MAX_WIDTH
) {
927 settings
->img_width
= clamp(settings
->img_width
, 0, (int)BUZ_MAX_WIDTH
);
930 if (settings
->img_height
< 0 || settings
->img_height
> BUZ_MAX_HEIGHT
/ 2) {
931 settings
->img_height
= clamp(settings
->img_height
, 0, BUZ_MAX_HEIGHT
/ 2);
934 if (settings
->img_x
+ settings
->img_width
> BUZ_MAX_WIDTH
) {
935 settings
->img_x
= BUZ_MAX_WIDTH
- settings
->img_width
;
938 if (settings
->img_y
+ settings
->img_height
> BUZ_MAX_HEIGHT
/ 2) {
939 settings
->img_y
= BUZ_MAX_HEIGHT
/ 2 - settings
->img_height
;
942 if (settings
->img_width
% (16 * settings
->HorDcm
) != 0) {
943 settings
->img_width
-= settings
->img_width
% (16 * settings
->HorDcm
);
944 if (settings
->img_width
== 0)
945 settings
->img_width
= 16 * settings
->HorDcm
;
948 if (settings
->img_height
% (8 * settings
->VerDcm
) != 0) {
949 settings
->img_height
-= settings
->img_height
% (8 * settings
->VerDcm
);
950 if (settings
->img_height
== 0)
951 settings
->img_height
= 8 * settings
->VerDcm
;
958 "%s: check_jpg_settings() - error in params for decimation = 0\n",
966 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
967 ZR_DEVNAME(zr
), settings
->decimation
);
972 if (settings
->jpg_comp
.quality
> 100)
973 settings
->jpg_comp
.quality
= 100;
974 if (settings
->jpg_comp
.quality
< 5)
975 settings
->jpg_comp
.quality
= 5;
976 if (settings
->jpg_comp
.APPn
< 0)
977 settings
->jpg_comp
.APPn
= 0;
978 if (settings
->jpg_comp
.APPn
> 15)
979 settings
->jpg_comp
.APPn
= 15;
980 if (settings
->jpg_comp
.APP_len
< 0)
981 settings
->jpg_comp
.APP_len
= 0;
982 if (settings
->jpg_comp
.APP_len
> 60)
983 settings
->jpg_comp
.APP_len
= 60;
984 if (settings
->jpg_comp
.COM_len
< 0)
985 settings
->jpg_comp
.COM_len
= 0;
986 if (settings
->jpg_comp
.COM_len
> 60)
987 settings
->jpg_comp
.COM_len
= 60;
994 zoran_open_init_params (struct zoran
*zr
)
998 /* User must explicitly set a window */
999 zr
->overlay_settings
.is_set
= 0;
1000 zr
->overlay_mask
= NULL
;
1001 zr
->overlay_active
= ZORAN_FREE
;
1003 zr
->v4l_memgrab_active
= 0;
1004 zr
->v4l_overlay_active
= 0;
1005 zr
->v4l_grab_frame
= NO_GRAB_ACTIVE
;
1006 zr
->v4l_grab_seq
= 0;
1007 zr
->v4l_settings
.width
= 192;
1008 zr
->v4l_settings
.height
= 144;
1009 zr
->v4l_settings
.format
= &zoran_formats
[7]; /* YUY2 - YUV-4:2:2 packed */
1010 zr
->v4l_settings
.bytesperline
=
1011 zr
->v4l_settings
.width
*
1012 ((zr
->v4l_settings
.format
->depth
+ 7) / 8);
1014 /* DMA ring stuff for V4L */
1015 zr
->v4l_pend_tail
= 0;
1016 zr
->v4l_pend_head
= 0;
1017 zr
->v4l_sync_tail
= 0;
1018 zr
->v4l_buffers
.active
= ZORAN_FREE
;
1019 for (i
= 0; i
< VIDEO_MAX_FRAME
; i
++) {
1020 zr
->v4l_buffers
.buffer
[i
].state
= BUZ_STATE_USER
; /* nothing going on */
1022 zr
->v4l_buffers
.allocated
= 0;
1024 for (i
= 0; i
< BUZ_MAX_FRAME
; i
++) {
1025 zr
->jpg_buffers
.buffer
[i
].state
= BUZ_STATE_USER
; /* nothing going on */
1027 zr
->jpg_buffers
.active
= ZORAN_FREE
;
1028 zr
->jpg_buffers
.allocated
= 0;
1029 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1030 zr
->jpg_settings
.decimation
= 1;
1031 zr
->jpg_settings
.jpg_comp
.quality
= 50; /* default compression factor 8 */
1032 if (zr
->card
.type
!= BUZ
)
1033 zr
->jpg_settings
.odd_even
= 1;
1035 zr
->jpg_settings
.odd_even
= 0;
1036 zr
->jpg_settings
.jpg_comp
.APPn
= 0;
1037 zr
->jpg_settings
.jpg_comp
.APP_len
= 0; /* No APPn marker */
1038 memset(zr
->jpg_settings
.jpg_comp
.APP_data
, 0,
1039 sizeof(zr
->jpg_settings
.jpg_comp
.APP_data
));
1040 zr
->jpg_settings
.jpg_comp
.COM_len
= 0; /* No COM marker */
1041 memset(zr
->jpg_settings
.jpg_comp
.COM_data
, 0,
1042 sizeof(zr
->jpg_settings
.jpg_comp
.COM_data
));
1043 zr
->jpg_settings
.jpg_comp
.jpeg_markers
=
1044 JPEG_MARKER_DHT
| JPEG_MARKER_DQT
;
1045 i
= zoran_check_jpg_settings(zr
, &zr
->jpg_settings
, 0);
1049 "%s: zoran_open_init_params() internal error\n",
1052 clear_interrupt_counters(zr
);
1056 static void __devinit
1057 test_interrupts (struct zoran
*zr
)
1062 clear_interrupt_counters(zr
);
1065 icr
= btread(ZR36057_ICR
);
1066 btwrite(0x78000000 | ZR36057_ICR_IntPinEn
, ZR36057_ICR
);
1067 prepare_to_wait(&zr
->test_q
, &wait
, TASK_INTERRUPTIBLE
);
1068 timeout
= schedule_timeout(HZ
);
1069 finish_wait(&zr
->test_q
, &wait
);
1070 btwrite(0, ZR36057_ICR
);
1071 btwrite(0x78000000, ZR36057_ISR
);
1073 dprintk(5, KERN_INFO
"%s: Testing interrupts...\n", ZR_DEVNAME(zr
));
1075 dprintk(1, ": time spent: %d\n", 1 * HZ
- timeout
);
1077 if (zr36067_debug
> 1)
1078 print_interrupts(zr
);
1079 btwrite(icr
, ZR36057_ICR
);
1082 static int __devinit
1083 zr36057_init (struct zoran
*zr
)
1089 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1090 ZR_DEVNAME(zr
), zr
->id
, zr
);
1092 /* default setup of all parameters which will persist between opens */
1095 init_waitqueue_head(&zr
->v4l_capq
);
1096 init_waitqueue_head(&zr
->jpg_capq
);
1097 init_waitqueue_head(&zr
->test_q
);
1098 zr
->jpg_buffers
.allocated
= 0;
1099 zr
->v4l_buffers
.allocated
= 0;
1101 zr
->buffer
.base
= (void *) vidmem
;
1102 zr
->buffer
.width
= 0;
1103 zr
->buffer
.height
= 0;
1104 zr
->buffer
.depth
= 0;
1105 zr
->buffer
.bytesperline
= 0;
1107 /* Avoid nonsense settings from user for default input/norm */
1108 if (default_norm
< VIDEO_MODE_PAL
&&
1109 default_norm
> VIDEO_MODE_SECAM
)
1110 default_norm
= VIDEO_MODE_PAL
;
1111 if (default_norm
== VIDEO_MODE_PAL
) {
1112 zr
->norm
= V4L2_STD_PAL
;
1113 zr
->timing
= zr
->card
.tvn
[0];
1114 } else if (default_norm
== VIDEO_MODE_NTSC
) {
1115 zr
->norm
= V4L2_STD_NTSC
;
1116 zr
->timing
= zr
->card
.tvn
[1];
1118 zr
->norm
= V4L2_STD_SECAM
;
1119 zr
->timing
= zr
->card
.tvn
[2];
1121 if (zr
->timing
== NULL
) {
1124 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1126 zr
->norm
= V4L2_STD_PAL
;
1127 zr
->timing
= zr
->card
.tvn
[0];
1130 if (default_input
> zr
->card
.inputs
-1) {
1133 "%s: default_input value %d out of range (0-%d)\n",
1134 ZR_DEVNAME(zr
), default_input
, zr
->card
.inputs
-1);
1137 zr
->input
= default_input
;
1139 /* default setup (will be repeated at every open) */
1140 zoran_open_init_params(zr
);
1142 /* allocate memory *before* doing anything to the hardware
1143 * in case allocation fails */
1144 zr
->stat_com
= kzalloc(BUZ_NUM_STAT_COM
* 4, GFP_KERNEL
);
1145 zr
->video_dev
= kmalloc(sizeof(struct video_device
), GFP_KERNEL
);
1146 if (!zr
->stat_com
|| !zr
->video_dev
) {
1149 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1154 for (j
= 0; j
< BUZ_NUM_STAT_COM
; j
++) {
1155 zr
->stat_com
[j
] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1159 * Now add the template and register the device unit.
1161 memcpy(zr
->video_dev
, &zoran_template
, sizeof(zoran_template
));
1162 zr
->video_dev
->parent
= &zr
->pci_dev
->dev
;
1163 strcpy(zr
->video_dev
->name
, ZR_DEVNAME(zr
));
1164 err
= video_register_device(zr
->video_dev
, VFL_TYPE_GRABBER
, video_nr
[zr
->id
]);
1167 video_set_drvdata(zr
->video_dev
, zr
);
1169 zoran_init_hardware(zr
);
1170 if (zr36067_debug
> 2)
1171 detect_guest_activity(zr
);
1172 test_interrupts(zr
);
1173 if (!pass_through
) {
1174 struct v4l2_routing route
= { 2, 0 };
1176 decoder_command(zr
, VIDIOC_STREAMOFF
, 0);
1177 encoder_command(zr
, VIDIOC_INT_S_VIDEO_ROUTING
, &route
);
1180 zr
->zoran_proc
= NULL
;
1181 zr
->initialized
= 1;
1185 kfree(zr
->stat_com
);
1186 kfree(zr
->video_dev
);
1190 static void __devexit
zoran_remove(struct pci_dev
*pdev
)
1192 struct zoran
*zr
= pci_get_drvdata(pdev
);
1194 if (!zr
->initialized
)
1197 /* unregister videocodec bus */
1199 struct videocodec_master
*master
= zr
->codec
->master_data
;
1201 videocodec_detach(zr
->codec
);
1205 struct videocodec_master
*master
= zr
->vfe
->master_data
;
1207 videocodec_detach(zr
->vfe
);
1211 /* unregister i2c bus */
1212 zoran_unregister_i2c(zr
);
1213 /* disable PCI bus-mastering */
1214 zoran_set_pci_master(zr
, 0);
1215 /* put chip into reset */
1216 btwrite(0, ZR36057_SPGPPCR
);
1217 free_irq(zr
->pci_dev
->irq
, zr
);
1218 /* unmap and free memory */
1219 kfree(zr
->stat_com
);
1220 zoran_proc_cleanup(zr
);
1221 iounmap(zr
->zr36057_mem
);
1222 pci_disable_device(zr
->pci_dev
);
1223 video_unregister_device(zr
->video_dev
);
1225 pci_set_drvdata(pdev
, NULL
);
1230 zoran_vdev_release (struct video_device
*vdev
)
1235 static struct videocodec_master
* __devinit
1236 zoran_setup_videocodec (struct zoran
*zr
,
1239 struct videocodec_master
*m
= NULL
;
1241 m
= kmalloc(sizeof(struct videocodec_master
), GFP_KERNEL
);
1245 "%s: zoran_setup_videocodec() - no memory\n",
1250 /* magic and type are unused for master struct. Makes sense only at
1252 In the past, .type were initialized to the old V4L1 .hardware
1253 value, as VID_HARDWARE_ZR36067
1258 m
->flags
= CODEC_FLAG_ENCODER
| CODEC_FLAG_DECODER
;
1259 strncpy(m
->name
, ZR_DEVNAME(zr
), sizeof(m
->name
));
1264 case CODEC_TYPE_ZR36060
:
1265 m
->readreg
= zr36060_read
;
1266 m
->writereg
= zr36060_write
;
1267 m
->flags
|= CODEC_FLAG_JPEG
| CODEC_FLAG_VFE
;
1269 case CODEC_TYPE_ZR36050
:
1270 m
->readreg
= zr36050_read
;
1271 m
->writereg
= zr36050_write
;
1272 m
->flags
|= CODEC_FLAG_JPEG
;
1274 case CODEC_TYPE_ZR36016
:
1275 m
->readreg
= zr36016_read
;
1276 m
->writereg
= zr36016_write
;
1277 m
->flags
|= CODEC_FLAG_VFE
;
1285 * Scan for a Buz card (actually for the PCI controller ZR36057),
1286 * request the irq and map the io memory
1288 static int __devinit
zoran_probe(struct pci_dev
*pdev
,
1289 const struct pci_device_id
*ent
)
1291 unsigned char latency
, need_latency
;
1294 struct videocodec_master
*master_vfe
= NULL
;
1295 struct videocodec_master
*master_codec
= NULL
;
1297 char *i2c_enc_name
, *i2c_dec_name
, *codec_name
, *vfe_name
;
1302 if (nr
>= BUZ_MAX
) {
1305 "%s: driver limited to %d card(s) maximum\n",
1306 ZORAN_NAME
, BUZ_MAX
);
1310 zr
= kzalloc(sizeof(struct zoran
), GFP_KERNEL
);
1314 "%s: find_zr36057() - kzalloc failed\n",
1320 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)), "MJPEG[%u]", zr
->id
);
1321 spin_lock_init(&zr
->spinlock
);
1322 mutex_init(&zr
->resource_lock
);
1323 if (pci_enable_device(pdev
))
1325 pci_read_config_byte(zr
->pci_dev
, PCI_CLASS_REVISION
, &zr
->revision
);
1329 "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
1330 ZR_DEVNAME(zr
), zr
->revision
< 2 ? '5' : '6', zr
->revision
,
1331 zr
->pci_dev
->irq
, (uint64_t)pci_resource_start(zr
->pci_dev
, 0));
1332 if (zr
->revision
>= 2) {
1335 "%s: Subsystem vendor=0x%04x id=0x%04x\n",
1336 ZR_DEVNAME(zr
), zr
->pci_dev
->subsystem_vendor
,
1337 zr
->pci_dev
->subsystem_device
);
1340 /* Use auto-detected card type? */
1341 if (card
[nr
] == -1) {
1342 if (zr
->revision
< 2) {
1345 "%s: No card type specified, please use the card=X module parameter\n",
1349 "%s: It is not possible to auto-detect ZR36057 based cards\n",
1354 card_num
= ent
->driver_data
;
1355 if (card_num
>= NUM_CARDS
) {
1358 "%s: Unknown card, try specifying card=X module parameter\n",
1364 "%s: %s() - card %s detected\n",
1365 ZR_DEVNAME(zr
), __func__
, zoran_cards
[card_num
].name
);
1367 card_num
= card
[nr
];
1368 if (card_num
>= NUM_CARDS
|| card_num
< 0) {
1371 "%s: User specified card type %d out of range (0 .. %d)\n",
1372 ZR_DEVNAME(zr
), card_num
, NUM_CARDS
- 1);
1377 /* even though we make this a non pointer and thus
1378 * theoretically allow for making changes to this struct
1379 * on a per-individual card basis at runtime, this is
1380 * strongly discouraged. This structure is intended to
1381 * keep general card information, no settings or anything */
1382 zr
->card
= zoran_cards
[card_num
];
1383 snprintf(ZR_DEVNAME(zr
), sizeof(ZR_DEVNAME(zr
)),
1384 "%s[%u]", zr
->card
.name
, zr
->id
);
1386 zr
->zr36057_mem
= pci_ioremap_bar(zr
->pci_dev
, 0);
1387 if (!zr
->zr36057_mem
) {
1390 "%s: %s() - ioremap failed\n",
1391 ZR_DEVNAME(zr
), __func__
);
1395 result
= request_irq(zr
->pci_dev
->irq
, zoran_irq
,
1396 IRQF_SHARED
| IRQF_DISABLED
, ZR_DEVNAME(zr
), zr
);
1398 if (result
== -EINVAL
) {
1401 "%s: find_zr36057() - bad irq number or handler\n",
1403 } else if (result
== -EBUSY
) {
1406 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1407 ZR_DEVNAME(zr
), zr
->pci_dev
->irq
);
1411 "%s: find_zr36057() - can't assign irq, error code %d\n",
1412 ZR_DEVNAME(zr
), result
);
1417 /* set PCI latency timer */
1418 pci_read_config_byte(zr
->pci_dev
, PCI_LATENCY_TIMER
,
1420 need_latency
= zr
->revision
> 1 ? 32 : 48;
1421 if (latency
!= need_latency
) {
1424 "%s: Changing PCI latency from %d to %d\n",
1425 ZR_DEVNAME(zr
), latency
, need_latency
);
1426 pci_write_config_byte(zr
->pci_dev
, PCI_LATENCY_TIMER
,
1430 zr36057_restart(zr
);
1432 dprintk(2, KERN_INFO
"%s: Initializing i2c bus...\n",
1436 if (decoder
[zr
->id
] != -1) {
1437 i2c_dec_name
= i2cid_to_modulename(decoder
[zr
->id
]);
1438 zr
->card
.i2c_decoder
= decoder
[zr
->id
];
1439 } else if (zr
->card
.i2c_decoder
!= 0) {
1440 i2c_dec_name
= i2cid_to_modulename(zr
->card
.i2c_decoder
);
1442 i2c_dec_name
= NULL
;
1446 result
= request_module(i2c_dec_name
);
1450 "%s: failed to load module %s: %d\n",
1451 ZR_DEVNAME(zr
), i2c_dec_name
, result
);
1456 if (encoder
[zr
->id
] != -1) {
1457 i2c_enc_name
= i2cid_to_modulename(encoder
[zr
->id
]);
1458 zr
->card
.i2c_encoder
= encoder
[zr
->id
];
1459 } else if (zr
->card
.i2c_encoder
!= 0) {
1460 i2c_enc_name
= i2cid_to_modulename(zr
->card
.i2c_encoder
);
1462 i2c_enc_name
= NULL
;
1466 result
= request_module(i2c_enc_name
);
1470 "%s: failed to load module %s: %d\n",
1471 ZR_DEVNAME(zr
), i2c_enc_name
, result
);
1475 if (zoran_register_i2c(zr
) < 0) {
1478 "%s: find_zr36057() - can't initialize i2c bus\n",
1484 KERN_INFO
"%s: Initializing videocodec bus...\n",
1487 if (zr
->card
.video_codec
) {
1488 codec_name
= codecid_to_modulename(zr
->card
.video_codec
);
1490 result
= request_module(codec_name
);
1494 "%s: failed to load modules %s: %d\n",
1495 ZR_DEVNAME(zr
), codec_name
, result
);
1499 if (zr
->card
.video_vfe
) {
1500 vfe_name
= codecid_to_modulename(zr
->card
.video_vfe
);
1502 result
= request_module(vfe_name
);
1506 "%s: failed to load modules %s: %d\n",
1507 ZR_DEVNAME(zr
), vfe_name
, result
);
1512 /* reset JPEG codec */
1513 jpeg_codec_sleep(zr
, 1);
1514 jpeg_codec_reset(zr
);
1515 /* video bus enabled */
1516 /* display codec revision */
1517 if (zr
->card
.video_codec
!= 0) {
1518 master_codec
= zoran_setup_videocodec(zr
, zr
->card
.video_codec
);
1521 zr
->codec
= videocodec_attach(master_codec
);
1525 "%s: find_zr36057() - no codec found\n",
1529 if (zr
->codec
->type
!= zr
->card
.video_codec
) {
1532 "%s: find_zr36057() - wrong codec\n",
1534 goto zr_detach_codec
;
1537 if (zr
->card
.video_vfe
!= 0) {
1538 master_vfe
= zoran_setup_videocodec(zr
, zr
->card
.video_vfe
);
1540 goto zr_detach_codec
;
1541 zr
->vfe
= videocodec_attach(master_vfe
);
1545 "%s: find_zr36057() - no VFE found\n",
1549 if (zr
->vfe
->type
!= zr
->card
.video_vfe
) {
1552 "%s: find_zr36057() = wrong VFE\n",
1558 /* take care of Natoma chipset and a revision 1 zr36057 */
1559 if ((pci_pci_problems
& PCIPCI_NATOMA
) && zr
->revision
<= 1) {
1560 zr
->jpg_buffers
.need_contiguous
= 1;
1563 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1567 if (zr36057_init(zr
) < 0)
1570 zoran_proc_init(zr
);
1572 pci_set_drvdata(pdev
, zr
);
1577 videocodec_detach(zr
->vfe
);
1581 videocodec_detach(zr
->codec
);
1583 kfree(master_codec
);
1585 zoran_unregister_i2c(zr
);
1587 btwrite(0, ZR36057_SPGPPCR
);
1588 free_irq(zr
->pci_dev
->irq
, zr
);
1590 iounmap(zr
->zr36057_mem
);
1597 static struct pci_driver zoran_driver
= {
1599 .id_table
= zr36067_pci_tbl
,
1600 .probe
= zoran_probe
,
1601 .remove
= zoran_remove
,
1604 static int __init
zoran_init(void)
1608 printk(KERN_INFO
"Zoran MJPEG board driver version %d.%d.%d\n",
1609 MAJOR_VERSION
, MINOR_VERSION
, RELEASE_VERSION
);
1611 /* check the parameters we have been given, adjust if necessary */
1614 if (v4l_nbufs
> VIDEO_MAX_FRAME
)
1615 v4l_nbufs
= VIDEO_MAX_FRAME
;
1616 /* The user specfies the in KB, we want them in byte
1617 * (and page aligned) */
1618 v4l_bufsize
= PAGE_ALIGN(v4l_bufsize
* 1024);
1619 if (v4l_bufsize
< 32768)
1620 v4l_bufsize
= 32768;
1621 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1622 if (v4l_bufsize
> 2048 * 1024)
1623 v4l_bufsize
= 2048 * 1024;
1626 if (jpg_nbufs
> BUZ_MAX_FRAME
)
1627 jpg_nbufs
= BUZ_MAX_FRAME
;
1628 jpg_bufsize
= PAGE_ALIGN(jpg_bufsize
* 1024);
1629 if (jpg_bufsize
< 8192)
1631 if (jpg_bufsize
> (512 * 1024))
1632 jpg_bufsize
= 512 * 1024;
1633 /* Use parameter for vidmem or try to find a video card */
1637 "%s: Using supplied video memory base address @ 0x%lx\n",
1638 ZORAN_NAME
, vidmem
);
1641 /* random nonsense */
1642 dprintk(6, KERN_DEBUG
"Jotti is een held!\n");
1644 /* some mainboards might not do PCI-PCI data transfer well */
1645 if (pci_pci_problems
& (PCIPCI_FAIL
|PCIAGP_FAIL
|PCIPCI_ALIMAGIK
)) {
1648 "%s: chipset does not support reliable PCI-PCI DMA\n",
1652 res
= pci_register_driver(&zoran_driver
);
1656 "%s: Unable to register ZR36057 driver\n",
1664 static void __exit
zoran_exit(void)
1666 pci_unregister_driver(&zoran_driver
);
1669 module_init(zoran_init
);
1670 module_exit(zoran_exit
);