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] = { -1, -1, -1, -1 };
65 module_param_array(card, int, NULL, 0444);
66 MODULE_PARM_DESC(card, "The type of card");
68 static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
69 module_param_array(encoder, int, NULL, 0444);
70 MODULE_PARM_DESC(encoder, "i2c TV encoder");
72 static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
73 module_param_array(decoder, int, NULL, 0444);
74 MODULE_PARM_DESC(decoder, "i2c TV decoder");
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] = {-1, -1, -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 = 128; /* 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 static struct pci_device_id zr36067_pci_tbl[] = {
157 {PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057,
158 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161 MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
163 int zoran_num; /* number of Buzs in use */
164 struct zoran *zoran[BUZ_MAX];
166 /* videocodec bus functions ZR36060 */
168 zr36060_read (struct videocodec *codec,
171 struct zoran *zr = (struct zoran *) codec->master_data->data;
174 if (post_office_wait(zr)
175 || post_office_write(zr, 0, 1, reg >> 8)
176 || post_office_write(zr, 0, 2, reg & 0xff)) {
180 data = post_office_read(zr, 0, 3) & 0xff;
185 zr36060_write (struct videocodec *codec,
189 struct zoran *zr = (struct zoran *) codec->master_data->data;
191 if (post_office_wait(zr)
192 || post_office_write(zr, 0, 1, reg >> 8)
193 || post_office_write(zr, 0, 2, reg & 0xff)) {
197 post_office_write(zr, 0, 3, val & 0xff);
200 /* videocodec bus functions ZR36050 */
202 zr36050_read (struct videocodec *codec,
205 struct zoran *zr = (struct zoran *) codec->master_data->data;
208 if (post_office_wait(zr)
209 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
213 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
218 zr36050_write (struct videocodec *codec,
222 struct zoran *zr = (struct zoran *) codec->master_data->data;
224 if (post_office_wait(zr)
225 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
229 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
232 /* videocodec bus functions ZR36016 */
234 zr36016_read (struct videocodec *codec,
237 struct zoran *zr = (struct zoran *) codec->master_data->data;
240 if (post_office_wait(zr)) {
244 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
248 /* hack for in zoran_device.c */
250 zr36016_write (struct videocodec *codec,
254 struct zoran *zr = (struct zoran *) codec->master_data->data;
256 if (post_office_wait(zr)) {
260 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
264 * Board specific information
268 dc10_init (struct zoran *zr)
270 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
272 /* Pixel clock selection */
275 /* Enable the video bus sync signals */
280 dc10plus_init (struct zoran *zr)
282 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
286 buz_init (struct zoran *zr)
288 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
290 /* some stuff from Iomega */
291 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
292 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
293 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
297 lml33_init (struct zoran *zr)
299 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
301 GPIO(zr, 2, 1); // Set Composite input/output
305 avs6eyes_init (struct zoran *zr)
307 // AverMedia 6-Eyes original driver by Christer Weinigel
309 // Lifted straight from Christer's old driver and
310 // modified slightly by Martin Samuelsson.
312 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
314 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
317 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
318 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
319 GPIO(zr, 2, mux & 1); /* MUX S0 */
320 GPIO(zr, 3, 0); /* /FRAME on */
321 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
322 GPIO(zr, 5, mux & 2); /* MUX S1 */
323 GPIO(zr, 6, 0); /* ? */
324 GPIO(zr, 7, mux & 4); /* MUX S2 */
329 i2cid_to_modulename (u16 i2c_id)
334 case I2C_DRIVERID_SAA7110:
337 case I2C_DRIVERID_SAA7111A:
340 case I2C_DRIVERID_SAA7114:
343 case I2C_DRIVERID_SAA7185B:
346 case I2C_DRIVERID_ADV7170:
349 case I2C_DRIVERID_ADV7175:
352 case I2C_DRIVERID_BT819:
355 case I2C_DRIVERID_BT856:
358 case I2C_DRIVERID_BT866:
361 case I2C_DRIVERID_VPX3220:
364 case I2C_DRIVERID_KS0127:
373 codecid_to_modulename (u16 codecid)
378 case CODEC_TYPE_ZR36060:
381 case CODEC_TYPE_ZR36050:
384 case CODEC_TYPE_ZR36016:
393 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
396 static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
397 static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
398 static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
399 static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
401 static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
402 static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
404 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
405 static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
406 static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
408 /* FIXME: I cannot swap U and V in saa7114, so i do one
409 * pixel left shift in zoran (75 -> 74)
410 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
411 static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
412 static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
414 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
415 * copy Maxim's left shift hack for the 6 Eyes.
417 * Christer's driver used the unshifted norms, though...
419 static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
420 static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
422 static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
426 .i2c_decoder = I2C_DRIVERID_VPX3220,
427 .video_codec = CODEC_TYPE_ZR36050,
428 .video_vfe = CODEC_TYPE_ZR36016,
434 { 0, "Internal/comp" }
443 .vsync_int = ZR36057_ISR_GIRQ1,
444 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
445 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
447 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
448 .gws_not_connected = 0,
454 .i2c_decoder = I2C_DRIVERID_SAA7110,
455 .i2c_encoder = I2C_DRIVERID_ADV7175,
456 .video_codec = CODEC_TYPE_ZR36060,
462 { 5, "Internal/comp" }
469 .jpeg_int = ZR36057_ISR_GIRQ0,
470 .vsync_int = ZR36057_ISR_GIRQ1,
471 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
472 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
474 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
475 .gws_not_connected = 0,
477 .init = &dc10plus_init,
481 .vendor_id = PCI_VENDOR_ID_MIRO,
482 .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
483 .i2c_decoder = I2C_DRIVERID_SAA7110,
484 .i2c_encoder = I2C_DRIVERID_ADV7175,
485 .video_codec = CODEC_TYPE_ZR36060,
491 { 5, "Internal/comp" }
499 .jpeg_int = ZR36057_ISR_GIRQ0,
500 .vsync_int = ZR36057_ISR_GIRQ1,
501 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
502 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
504 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
505 .gws_not_connected = 0,
507 .init = &dc10plus_init,
511 .i2c_decoder = I2C_DRIVERID_VPX3220,
512 .i2c_encoder = I2C_DRIVERID_ADV7175,
513 .video_codec = CODEC_TYPE_ZR36050,
514 .video_vfe = CODEC_TYPE_ZR36016,
520 { 0, "Internal/comp" }
529 .vsync_int = ZR36057_ISR_GIRQ1,
530 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
531 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
533 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
534 .gws_not_connected = 0,
540 .vendor_id = PCI_VENDOR_ID_MIRO,
541 .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
542 .i2c_decoder = I2C_DRIVERID_VPX3220,
543 .i2c_encoder = I2C_DRIVERID_ADV7175,
544 .video_codec = CODEC_TYPE_ZR36050,
545 .video_vfe = CODEC_TYPE_ZR36016,
551 { 0, "Internal/comp" }
560 .vsync_int = ZR36057_ISR_GIRQ1,
561 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
562 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
564 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
565 .gws_not_connected = 0,
571 .i2c_decoder = I2C_DRIVERID_BT819,
572 .i2c_encoder = I2C_DRIVERID_BT856,
573 .video_codec = CODEC_TYPE_ZR36060,
586 .jpeg_int = ZR36057_ISR_GIRQ1,
587 .vsync_int = ZR36057_ISR_GIRQ0,
588 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
589 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
591 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
592 .gws_not_connected = 1,
598 .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
599 .device_id = PCI_DEVICE_ID_LML_33R10,
600 .i2c_decoder = I2C_DRIVERID_SAA7114,
601 .i2c_encoder = I2C_DRIVERID_ADV7170,
602 .video_codec = CODEC_TYPE_ZR36060,
615 .jpeg_int = ZR36057_ISR_GIRQ1,
616 .vsync_int = ZR36057_ISR_GIRQ0,
617 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
618 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
620 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
621 .gws_not_connected = 1,
627 .vendor_id = PCI_VENDOR_ID_IOMEGA,
628 .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
629 .i2c_decoder = I2C_DRIVERID_SAA7111A,
630 .i2c_encoder = I2C_DRIVERID_SAA7185B,
631 .video_codec = CODEC_TYPE_ZR36060,
644 .jpeg_int = ZR36057_ISR_GIRQ1,
645 .vsync_int = ZR36057_ISR_GIRQ0,
646 .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
647 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
649 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
650 .gws_not_connected = 1,
656 /* AverMedia chose not to brand the 6-Eyes. Thus it
657 can't be autodetected, and requires card=x. */
660 .i2c_decoder = I2C_DRIVERID_KS0127,
661 .i2c_encoder = I2C_DRIVERID_BT866,
662 .video_codec = CODEC_TYPE_ZR36060,
666 { 0, "Composite 1" },
667 { 1, "Composite 2" },
668 { 2, "Composite 3" },
669 { 4, "Composite 4" },
670 { 5, "Composite 5" },
671 { 6, "Composite 6" },
679 &f50ccir601_avs6eyes,
680 &f60ccir601_avs6eyes,
683 .jpeg_int = ZR36057_ISR_GIRQ1,
684 .vsync_int = ZR36057_ISR_GIRQ0,
685 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
686 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
687 .gpcs = { 3, 1 }, // Validity unknown /Sam
688 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
689 .gws_not_connected = 1,
691 .init = &avs6eyes_init,
699 /* software I2C functions */
701 zoran_i2c_getsda (void *data)
703 struct zoran *zr = (struct zoran *) data;
705 return (btread(ZR36057_I2CBR) >> 1) & 1;
709 zoran_i2c_getscl (void *data)
711 struct zoran *zr = (struct zoran *) data;
713 return btread(ZR36057_I2CBR) & 1;
717 zoran_i2c_setsda (void *data,
720 struct zoran *zr = (struct zoran *) data;
726 btwrite(zr->i2cbr, ZR36057_I2CBR);
730 zoran_i2c_setscl (void *data,
733 struct zoran *zr = (struct zoran *) data;
739 btwrite(zr->i2cbr, ZR36057_I2CBR);
743 zoran_i2c_client_register (struct i2c_client *client)
745 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
749 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
750 ZR_DEVNAME(zr), client->driver->id);
752 mutex_lock(&zr->resource_lock);
755 /* we're already busy, so we keep a reference to
756 * them... Could do a lot of stuff here, but this
757 * is easiest. (Did I ever mention I'm a lazy ass?)
760 goto clientreg_unlock_and_return;
763 if (client->driver->id == zr->card.i2c_decoder)
764 zr->decoder = client;
765 else if (client->driver->id == zr->card.i2c_encoder)
766 zr->encoder = client;
769 goto clientreg_unlock_and_return;
772 clientreg_unlock_and_return:
773 mutex_unlock(&zr->resource_lock);
779 zoran_i2c_client_unregister (struct i2c_client *client)
781 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
784 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
786 mutex_lock(&zr->resource_lock);
790 goto clientunreg_unlock_and_return;
793 /* try to locate it */
794 if (client == zr->encoder) {
796 } else if (client == zr->decoder) {
798 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
800 clientunreg_unlock_and_return:
801 mutex_unlock(&zr->resource_lock);
805 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
806 .setsda = zoran_i2c_setsda,
807 .setscl = zoran_i2c_setscl,
808 .getsda = zoran_i2c_getsda,
809 .getscl = zoran_i2c_getscl,
815 zoran_register_i2c (struct zoran *zr)
817 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
818 sizeof(struct i2c_algo_bit_data));
819 zr->i2c_algo.data = zr;
820 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
821 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
822 zr->i2c_adapter.client_register = zoran_i2c_client_register;
823 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
824 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
825 sizeof(zr->i2c_adapter.name));
826 i2c_set_adapdata(&zr->i2c_adapter, zr);
827 zr->i2c_adapter.algo_data = &zr->i2c_algo;
828 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
829 return i2c_bit_add_bus(&zr->i2c_adapter);
833 zoran_unregister_i2c (struct zoran *zr)
835 i2c_del_adapter(&zr->i2c_adapter);
838 /* Check a zoran_params struct for correctness, insert default params */
841 zoran_check_jpg_settings (struct zoran *zr,
842 struct zoran_jpg_settings *settings)
844 int err = 0, err0 = 0;
848 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
849 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
850 settings->VerDcm, settings->TmpDcm);
853 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
854 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
855 settings->img_width, settings->img_height);
856 /* Check decimation, set default values for decimation = 1, 2, 4 */
857 switch (settings->decimation) {
860 settings->HorDcm = 1;
861 settings->VerDcm = 1;
862 settings->TmpDcm = 1;
863 settings->field_per_buff = 2;
866 settings->img_width = BUZ_MAX_WIDTH;
867 settings->img_height = BUZ_MAX_HEIGHT / 2;
871 settings->HorDcm = 2;
872 settings->VerDcm = 1;
873 settings->TmpDcm = 2;
874 settings->field_per_buff = 1;
875 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
877 settings->img_width =
878 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
879 settings->img_height = BUZ_MAX_HEIGHT / 2;
883 if (zr->card.type == DC10_new) {
886 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
892 settings->HorDcm = 4;
893 settings->VerDcm = 2;
894 settings->TmpDcm = 2;
895 settings->field_per_buff = 1;
896 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
898 settings->img_width =
899 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
900 settings->img_height = BUZ_MAX_HEIGHT / 2;
904 /* We have to check the data the user has set */
906 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
907 (zr->card.type == DC10_new || settings->HorDcm != 4))
909 if (settings->VerDcm != 1 && settings->VerDcm != 2)
911 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
913 if (settings->field_per_buff != 1 &&
914 settings->field_per_buff != 2)
916 if (settings->img_x < 0)
918 if (settings->img_y < 0)
920 if (settings->img_width < 0)
922 if (settings->img_height < 0)
924 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
926 if (settings->img_y + settings->img_height >
929 if (settings->HorDcm && settings->VerDcm) {
930 if (settings->img_width %
931 (16 * settings->HorDcm) != 0)
933 if (settings->img_height %
934 (8 * settings->VerDcm) != 0)
941 "%s: check_jpg_settings() - error in params for decimation = 0\n",
949 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
950 ZR_DEVNAME(zr), settings->decimation);
955 if (settings->jpg_comp.quality > 100)
956 settings->jpg_comp.quality = 100;
957 if (settings->jpg_comp.quality < 5)
958 settings->jpg_comp.quality = 5;
959 if (settings->jpg_comp.APPn < 0)
960 settings->jpg_comp.APPn = 0;
961 if (settings->jpg_comp.APPn > 15)
962 settings->jpg_comp.APPn = 15;
963 if (settings->jpg_comp.APP_len < 0)
964 settings->jpg_comp.APP_len = 0;
965 if (settings->jpg_comp.APP_len > 60)
966 settings->jpg_comp.APP_len = 60;
967 if (settings->jpg_comp.COM_len < 0)
968 settings->jpg_comp.COM_len = 0;
969 if (settings->jpg_comp.COM_len > 60)
970 settings->jpg_comp.COM_len = 60;
977 zoran_open_init_params (struct zoran *zr)
981 /* User must explicitly set a window */
982 zr->overlay_settings.is_set = 0;
983 zr->overlay_mask = NULL;
984 zr->overlay_active = ZORAN_FREE;
986 zr->v4l_memgrab_active = 0;
987 zr->v4l_overlay_active = 0;
988 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
989 zr->v4l_grab_seq = 0;
990 zr->v4l_settings.width = 192;
991 zr->v4l_settings.height = 144;
992 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
993 zr->v4l_settings.bytesperline =
994 zr->v4l_settings.width *
995 ((zr->v4l_settings.format->depth + 7) / 8);
997 /* DMA ring stuff for V4L */
998 zr->v4l_pend_tail = 0;
999 zr->v4l_pend_head = 0;
1000 zr->v4l_sync_tail = 0;
1001 zr->v4l_buffers.active = ZORAN_FREE;
1002 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1003 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1005 zr->v4l_buffers.allocated = 0;
1007 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1008 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1010 zr->jpg_buffers.active = ZORAN_FREE;
1011 zr->jpg_buffers.allocated = 0;
1012 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1013 zr->jpg_settings.decimation = 1;
1014 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1015 if (zr->card.type != BUZ)
1016 zr->jpg_settings.odd_even = 1;
1018 zr->jpg_settings.odd_even = 0;
1019 zr->jpg_settings.jpg_comp.APPn = 0;
1020 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1021 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1022 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1023 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1024 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1025 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1026 zr->jpg_settings.jpg_comp.jpeg_markers =
1027 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1028 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1032 "%s: zoran_open_init_params() internal error\n",
1035 clear_interrupt_counters(zr);
1039 static void __devinit
1040 test_interrupts (struct zoran *zr)
1045 clear_interrupt_counters(zr);
1048 icr = btread(ZR36057_ICR);
1049 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1050 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1051 timeout = schedule_timeout(HZ);
1052 finish_wait(&zr->test_q, &wait);
1053 btwrite(0, ZR36057_ICR);
1054 btwrite(0x78000000, ZR36057_ISR);
1056 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1058 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1060 if (zr36067_debug > 1)
1061 print_interrupts(zr);
1062 btwrite(icr, ZR36057_ICR);
1065 static int __devinit
1066 zr36057_init (struct zoran *zr)
1074 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1075 ZR_DEVNAME(zr), zr->id, zr);
1077 /* default setup of all parameters which will persist between opens */
1080 init_waitqueue_head(&zr->v4l_capq);
1081 init_waitqueue_head(&zr->jpg_capq);
1082 init_waitqueue_head(&zr->test_q);
1083 zr->jpg_buffers.allocated = 0;
1084 zr->v4l_buffers.allocated = 0;
1086 zr->buffer.base = (void *) vidmem;
1087 zr->buffer.width = 0;
1088 zr->buffer.height = 0;
1089 zr->buffer.depth = 0;
1090 zr->buffer.bytesperline = 0;
1092 /* Avoid nonsense settings from user for default input/norm */
1093 if (default_norm < VIDEO_MODE_PAL &&
1094 default_norm > VIDEO_MODE_SECAM)
1095 default_norm = VIDEO_MODE_PAL;
1096 zr->norm = default_norm;
1097 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1100 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1102 zr->norm = VIDEO_MODE_PAL;
1103 zr->timing = zr->card.tvn[zr->norm];
1106 if (default_input > zr->card.inputs-1) {
1109 "%s: default_input value %d out of range (0-%d)\n",
1110 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1113 zr->input = default_input;
1115 /* Should the following be reset at every open ? */
1117 zr->contrast = 32768;
1118 zr->saturation = 32768;
1119 zr->brightness = 32768;
1121 /* default setup (will be repeated at every open) */
1122 zoran_open_init_params(zr);
1124 /* allocate memory *before* doing anything to the hardware
1125 * in case allocation fails */
1126 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1127 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1128 if (!zr->stat_com || !zr->video_dev) {
1131 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1136 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1137 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1141 * Now add the template and register the device unit.
1143 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1144 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1145 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1147 goto exit_unregister;
1149 zoran_init_hardware(zr);
1150 if (zr36067_debug > 2)
1151 detect_guest_activity(zr);
1152 test_interrupts(zr);
1153 if (!pass_through) {
1154 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1155 encoder_command(zr, ENCODER_SET_INPUT, &two);
1158 zr->zoran_proc = NULL;
1159 zr->initialized = 1;
1163 zoran_unregister_i2c(zr);
1165 kfree(zr->stat_com);
1166 kfree(zr->video_dev);
1171 zoran_release (struct zoran *zr)
1173 if (!zr->initialized)
1175 /* unregister videocodec bus */
1177 struct videocodec_master *master = zr->codec->master_data;
1179 videocodec_detach(zr->codec);
1183 struct videocodec_master *master = zr->vfe->master_data;
1185 videocodec_detach(zr->vfe);
1189 /* unregister i2c bus */
1190 zoran_unregister_i2c(zr);
1191 /* disable PCI bus-mastering */
1192 zoran_set_pci_master(zr, 0);
1193 /* put chip into reset */
1194 btwrite(0, ZR36057_SPGPPCR);
1195 free_irq(zr->pci_dev->irq, zr);
1196 /* unmap and free memory */
1197 kfree(zr->stat_com);
1198 zoran_proc_cleanup(zr);
1199 iounmap(zr->zr36057_mem);
1200 pci_disable_device(zr->pci_dev);
1201 video_unregister_device(zr->video_dev);
1207 zoran_vdev_release (struct video_device *vdev)
1212 static struct videocodec_master * __devinit
1213 zoran_setup_videocodec (struct zoran *zr,
1216 struct videocodec_master *m = NULL;
1218 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1222 "%s: zoran_setup_videocodec() - no memory\n",
1227 /* magic and type are unused for master struct. Makes sense only at
1229 In the past, .type were initialized to the old V4L1 .hardware
1230 value, as VID_HARDWARE_ZR36067
1235 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1236 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1241 case CODEC_TYPE_ZR36060:
1242 m->readreg = zr36060_read;
1243 m->writereg = zr36060_write;
1244 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1246 case CODEC_TYPE_ZR36050:
1247 m->readreg = zr36050_read;
1248 m->writereg = zr36050_write;
1249 m->flags |= CODEC_FLAG_JPEG;
1251 case CODEC_TYPE_ZR36016:
1252 m->readreg = zr36016_read;
1253 m->writereg = zr36016_write;
1254 m->flags |= CODEC_FLAG_VFE;
1262 * Scan for a Buz card (actually for the PCI controller ZR36057),
1263 * request the irq and map the io memory
1265 static int __devinit
1268 unsigned char latency, need_latency;
1270 struct pci_dev *dev = NULL;
1272 struct videocodec_master *master_vfe = NULL;
1273 struct videocodec_master *master_codec = NULL;
1275 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1278 while (zoran_num < BUZ_MAX &&
1279 (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
1280 card_num = card[zoran_num];
1281 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1285 "%s: find_zr36057() - kzalloc failed\n",
1290 //zr->zr36057_mem = NULL;
1292 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1293 spin_lock_init(&zr->spinlock);
1294 mutex_init(&zr->resource_lock);
1295 if (pci_enable_device(dev))
1297 zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
1298 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
1300 if (zr->revision < 2) {
1303 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1304 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1307 if (card_num == -1) {
1310 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1316 unsigned short ss_vendor, ss_device;
1318 ss_vendor = zr->pci_dev->subsystem_vendor;
1319 ss_device = zr->pci_dev->subsystem_device;
1322 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1323 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1327 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1328 ZR_DEVNAME(zr), ss_vendor, ss_device);
1329 if (card_num == -1) {
1332 "%s: find_zr36057() - trying to autodetect card type\n",
1334 for (i=0;i<NUM_CARDS;i++) {
1335 if (ss_vendor == zoran_cards[i].vendor_id &&
1336 ss_device == zoran_cards[i].device_id) {
1339 "%s: find_zr36057() - card %s detected\n",
1341 zoran_cards[i].name);
1346 if (i == NUM_CARDS) {
1349 "%s: find_zr36057() - unknown card\n",
1356 if (card_num < 0 || card_num >= NUM_CARDS) {
1359 "%s: find_zr36057() - invalid cardnum %d\n",
1360 ZR_DEVNAME(zr), card_num);
1364 /* even though we make this a non pointer and thus
1365 * theoretically allow for making changes to this struct
1366 * on a per-individual card basis at runtime, this is
1367 * strongly discouraged. This structure is intended to
1368 * keep general card information, no settings or anything */
1369 zr->card = zoran_cards[card_num];
1370 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1371 "%s[%u]", zr->card.name, zr->id);
1373 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1374 if (!zr->zr36057_mem) {
1377 "%s: find_zr36057() - ioremap failed\n",
1382 result = request_irq(zr->pci_dev->irq,
1384 IRQF_SHARED | IRQF_DISABLED,
1388 if (result == -EINVAL) {
1391 "%s: find_zr36057() - bad irq number or handler\n",
1393 } else if (result == -EBUSY) {
1396 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1397 ZR_DEVNAME(zr), zr->pci_dev->irq);
1401 "%s: find_zr36057() - can't assign irq, error code %d\n",
1402 ZR_DEVNAME(zr), result);
1407 /* set PCI latency timer */
1408 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1410 need_latency = zr->revision > 1 ? 32 : 48;
1411 if (latency != need_latency) {
1414 "%s: Changing PCI latency from %d to %d.\n",
1415 ZR_DEVNAME(zr), latency, need_latency);
1416 pci_write_config_byte(zr->pci_dev,
1421 zr36057_restart(zr);
1423 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1427 if (decoder[zr->id] != -1) {
1428 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1429 zr->card.i2c_decoder = decoder[zr->id];
1430 } else if (zr->card.i2c_decoder != 0) {
1432 i2cid_to_modulename(zr->card.i2c_decoder);
1434 i2c_dec_name = NULL;
1438 if ((result = request_module(i2c_dec_name)) < 0) {
1441 "%s: failed to load module %s: %d\n",
1442 ZR_DEVNAME(zr), i2c_dec_name, result);
1447 if (encoder[zr->id] != -1) {
1448 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1449 zr->card.i2c_encoder = encoder[zr->id];
1450 } else if (zr->card.i2c_encoder != 0) {
1452 i2cid_to_modulename(zr->card.i2c_encoder);
1454 i2c_enc_name = NULL;
1458 if ((result = request_module(i2c_enc_name)) < 0) {
1461 "%s: failed to load module %s: %d\n",
1462 ZR_DEVNAME(zr), i2c_enc_name, result);
1466 if (zoran_register_i2c(zr) < 0) {
1469 "%s: find_zr36057() - can't initialize i2c bus\n",
1475 KERN_INFO "%s: Initializing videocodec bus...\n",
1478 if (zr->card.video_codec != 0 &&
1480 codecid_to_modulename(zr->card.video_codec)) != NULL) {
1481 if ((result = request_module(codec_name)) < 0) {
1484 "%s: failed to load modules %s: %d\n",
1485 ZR_DEVNAME(zr), codec_name, result);
1488 if (zr->card.video_vfe != 0 &&
1490 codecid_to_modulename(zr->card.video_vfe)) != NULL) {
1491 if ((result = request_module(vfe_name)) < 0) {
1494 "%s: failed to load modules %s: %d\n",
1495 ZR_DEVNAME(zr), vfe_name, result);
1499 /* reset JPEG codec */
1500 jpeg_codec_sleep(zr, 1);
1501 jpeg_codec_reset(zr);
1502 /* video bus enabled */
1503 /* display codec revision */
1504 if (zr->card.video_codec != 0) {
1505 master_codec = zoran_setup_videocodec(zr,
1506 zr->card.video_codec);
1509 zr->codec = videocodec_attach(master_codec);
1513 "%s: find_zr36057() - no codec found\n",
1517 if (zr->codec->type != zr->card.video_codec) {
1520 "%s: find_zr36057() - wrong codec\n",
1522 goto zr_detach_codec;
1525 if (zr->card.video_vfe != 0) {
1526 master_vfe = zoran_setup_videocodec(zr,
1527 zr->card.video_vfe);
1529 goto zr_detach_codec;
1530 zr->vfe = videocodec_attach(master_vfe);
1534 "%s: find_zr36057() - no VFE found\n",
1538 if (zr->vfe->type != zr->card.video_vfe) {
1541 "%s: find_zr36057() = wrong VFE\n",
1546 /* Success so keep the pci_dev referenced */
1547 pci_dev_get(zr->pci_dev);
1548 zoran[zoran_num++] = zr;
1553 videocodec_detach(zr->vfe);
1557 videocodec_detach(zr->codec);
1559 kfree(master_codec);
1561 zoran_unregister_i2c(zr);
1563 btwrite(0, ZR36057_SPGPPCR);
1564 free_irq(zr->pci_dev->irq, zr);
1566 iounmap(zr->zr36057_mem);
1571 if (dev) /* Clean up ref count on early exit */
1574 if (zoran_num == 0) {
1575 dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
1581 init_dc10_cards (void)
1585 memset(zoran, 0, sizeof(zoran));
1586 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1587 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1589 /* Look for cards */
1590 if (find_zr36057() < 0) {
1595 dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
1597 /* check the parameters we have been given, adjust if necessary */
1600 if (v4l_nbufs > VIDEO_MAX_FRAME)
1601 v4l_nbufs = VIDEO_MAX_FRAME;
1602 /* The user specfies the in KB, we want them in byte
1603 * (and page aligned) */
1604 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1605 if (v4l_bufsize < 32768)
1606 v4l_bufsize = 32768;
1607 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1608 if (v4l_bufsize > 2048 * 1024)
1609 v4l_bufsize = 2048 * 1024;
1612 if (jpg_nbufs > BUZ_MAX_FRAME)
1613 jpg_nbufs = BUZ_MAX_FRAME;
1614 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1615 if (jpg_bufsize < 8192)
1617 if (jpg_bufsize > (512 * 1024))
1618 jpg_bufsize = 512 * 1024;
1619 /* Use parameter for vidmem or try to find a video card */
1623 "%s: Using supplied video memory base address @ 0x%lx\n",
1624 ZORAN_NAME, vidmem);
1627 /* random nonsense */
1628 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
1630 /* some mainboards might not do PCI-PCI data transfer well */
1631 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1634 "%s: chipset does not support reliable PCI-PCI DMA\n",
1638 /* take care of Natoma chipset and a revision 1 zr36057 */
1639 for (i = 0; i < zoran_num; i++) {
1640 struct zoran *zr = zoran[i];
1642 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1643 zr->jpg_buffers.need_contiguous = 1;
1646 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1650 if (zr36057_init(zr) < 0) {
1651 for (i = 0; i < zoran_num; i++)
1652 zoran_release(zoran[i]);
1655 zoran_proc_init(zr);
1662 unload_dc10_cards (void)
1666 for (i = 0; i < zoran_num; i++)
1667 zoran_release(zoran[i]);
1670 module_init(init_dc10_cards);
1671 module_exit(unload_dc10_cards);