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");
157 int zoran_num; /* number of Buzs in use */
158 struct zoran *zoran[BUZ_MAX];
160 /* videocodec bus functions ZR36060 */
162 zr36060_read (struct videocodec *codec,
165 struct zoran *zr = (struct zoran *) codec->master_data->data;
168 if (post_office_wait(zr)
169 || post_office_write(zr, 0, 1, reg >> 8)
170 || post_office_write(zr, 0, 2, reg & 0xff)) {
174 data = post_office_read(zr, 0, 3) & 0xff;
179 zr36060_write (struct videocodec *codec,
183 struct zoran *zr = (struct zoran *) codec->master_data->data;
185 if (post_office_wait(zr)
186 || post_office_write(zr, 0, 1, reg >> 8)
187 || post_office_write(zr, 0, 2, reg & 0xff)) {
191 post_office_write(zr, 0, 3, val & 0xff);
194 /* videocodec bus functions ZR36050 */
196 zr36050_read (struct videocodec *codec,
199 struct zoran *zr = (struct zoran *) codec->master_data->data;
202 if (post_office_wait(zr)
203 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
207 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
212 zr36050_write (struct videocodec *codec,
216 struct zoran *zr = (struct zoran *) codec->master_data->data;
218 if (post_office_wait(zr)
219 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
223 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
226 /* videocodec bus functions ZR36016 */
228 zr36016_read (struct videocodec *codec,
231 struct zoran *zr = (struct zoran *) codec->master_data->data;
234 if (post_office_wait(zr)) {
238 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
242 /* hack for in zoran_device.c */
244 zr36016_write (struct videocodec *codec,
248 struct zoran *zr = (struct zoran *) codec->master_data->data;
250 if (post_office_wait(zr)) {
254 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
258 * Board specific information
262 dc10_init (struct zoran *zr)
264 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
266 /* Pixel clock selection */
269 /* Enable the video bus sync signals */
274 dc10plus_init (struct zoran *zr)
276 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
280 buz_init (struct zoran *zr)
282 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
284 /* some stuff from Iomega */
285 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
286 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
287 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
291 lml33_init (struct zoran *zr)
293 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
295 GPIO(zr, 2, 1); // Set Composite input/output
299 avs6eyes_init (struct zoran *zr)
301 // AverMedia 6-Eyes original driver by Christer Weinigel
303 // Lifted straight from Christer's old driver and
304 // modified slightly by Martin Samuelsson.
306 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
308 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
311 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
312 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
313 GPIO(zr, 2, mux & 1); /* MUX S0 */
314 GPIO(zr, 3, 0); /* /FRAME on */
315 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
316 GPIO(zr, 5, mux & 2); /* MUX S1 */
317 GPIO(zr, 6, 0); /* ? */
318 GPIO(zr, 7, mux & 4); /* MUX S2 */
323 i2cid_to_modulename (u16 i2c_id)
328 case I2C_DRIVERID_SAA7110:
331 case I2C_DRIVERID_SAA7111A:
334 case I2C_DRIVERID_SAA7114:
337 case I2C_DRIVERID_SAA7185B:
340 case I2C_DRIVERID_ADV7170:
343 case I2C_DRIVERID_ADV7175:
346 case I2C_DRIVERID_BT819:
349 case I2C_DRIVERID_BT856:
352 case I2C_DRIVERID_BT866:
355 case I2C_DRIVERID_VPX3220:
358 case I2C_DRIVERID_KS0127:
367 codecid_to_modulename (u16 codecid)
372 case CODEC_TYPE_ZR36060:
375 case CODEC_TYPE_ZR36050:
378 case CODEC_TYPE_ZR36016:
387 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
390 static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
391 static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
392 static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
393 static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
395 static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
396 static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
398 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
399 static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
400 static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
402 /* FIXME: I cannot swap U and V in saa7114, so i do one
403 * pixel left shift in zoran (75 -> 74)
404 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
405 static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
406 static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
408 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
409 * copy Maxim's left shift hack for the 6 Eyes.
411 * Christer's driver used the unshifted norms, though...
413 static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
414 static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
416 static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
420 .i2c_decoder = I2C_DRIVERID_VPX3220,
421 .video_codec = CODEC_TYPE_ZR36050,
422 .video_vfe = CODEC_TYPE_ZR36016,
428 { 0, "Internal/comp" }
437 .vsync_int = ZR36057_ISR_GIRQ1,
438 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
439 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
441 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
442 .gws_not_connected = 0,
448 .i2c_decoder = I2C_DRIVERID_SAA7110,
449 .i2c_encoder = I2C_DRIVERID_ADV7175,
450 .video_codec = CODEC_TYPE_ZR36060,
456 { 5, "Internal/comp" }
463 .jpeg_int = ZR36057_ISR_GIRQ0,
464 .vsync_int = ZR36057_ISR_GIRQ1,
465 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
466 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
468 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
469 .gws_not_connected = 0,
471 .init = &dc10plus_init,
475 .vendor_id = PCI_VENDOR_ID_MIRO,
476 .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
477 .i2c_decoder = I2C_DRIVERID_SAA7110,
478 .i2c_encoder = I2C_DRIVERID_ADV7175,
479 .video_codec = CODEC_TYPE_ZR36060,
485 { 5, "Internal/comp" }
493 .jpeg_int = ZR36057_ISR_GIRQ0,
494 .vsync_int = ZR36057_ISR_GIRQ1,
495 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
496 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
498 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
499 .gws_not_connected = 0,
501 .init = &dc10plus_init,
505 .i2c_decoder = I2C_DRIVERID_VPX3220,
506 .i2c_encoder = I2C_DRIVERID_ADV7175,
507 .video_codec = CODEC_TYPE_ZR36050,
508 .video_vfe = CODEC_TYPE_ZR36016,
514 { 0, "Internal/comp" }
523 .vsync_int = ZR36057_ISR_GIRQ1,
524 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
525 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
527 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
528 .gws_not_connected = 0,
534 .vendor_id = PCI_VENDOR_ID_MIRO,
535 .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
536 .i2c_decoder = I2C_DRIVERID_VPX3220,
537 .i2c_encoder = I2C_DRIVERID_ADV7175,
538 .video_codec = CODEC_TYPE_ZR36050,
539 .video_vfe = CODEC_TYPE_ZR36016,
545 { 0, "Internal/comp" }
554 .vsync_int = ZR36057_ISR_GIRQ1,
555 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
556 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
558 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
559 .gws_not_connected = 0,
565 .i2c_decoder = I2C_DRIVERID_BT819,
566 .i2c_encoder = I2C_DRIVERID_BT856,
567 .video_codec = CODEC_TYPE_ZR36060,
580 .jpeg_int = ZR36057_ISR_GIRQ1,
581 .vsync_int = ZR36057_ISR_GIRQ0,
582 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
583 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
585 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
586 .gws_not_connected = 1,
592 .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
593 .device_id = PCI_DEVICE_ID_LML_33R10,
594 .i2c_decoder = I2C_DRIVERID_SAA7114,
595 .i2c_encoder = I2C_DRIVERID_ADV7170,
596 .video_codec = CODEC_TYPE_ZR36060,
609 .jpeg_int = ZR36057_ISR_GIRQ1,
610 .vsync_int = ZR36057_ISR_GIRQ0,
611 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
612 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
614 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
615 .gws_not_connected = 1,
621 .vendor_id = PCI_VENDOR_ID_IOMEGA,
622 .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
623 .i2c_decoder = I2C_DRIVERID_SAA7111A,
624 .i2c_encoder = I2C_DRIVERID_SAA7185B,
625 .video_codec = CODEC_TYPE_ZR36060,
638 .jpeg_int = ZR36057_ISR_GIRQ1,
639 .vsync_int = ZR36057_ISR_GIRQ0,
640 .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
641 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
643 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
644 .gws_not_connected = 1,
650 /* AverMedia chose not to brand the 6-Eyes. Thus it
651 can't be autodetected, and requires card=x. */
654 .i2c_decoder = I2C_DRIVERID_KS0127,
655 .i2c_encoder = I2C_DRIVERID_BT866,
656 .video_codec = CODEC_TYPE_ZR36060,
660 { 0, "Composite 1" },
661 { 1, "Composite 2" },
662 { 2, "Composite 3" },
663 { 4, "Composite 4" },
664 { 5, "Composite 5" },
665 { 6, "Composite 6" },
673 &f50ccir601_avs6eyes,
674 &f60ccir601_avs6eyes,
677 .jpeg_int = ZR36057_ISR_GIRQ1,
678 .vsync_int = ZR36057_ISR_GIRQ0,
679 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
680 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
681 .gpcs = { 3, 1 }, // Validity unknown /Sam
682 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
683 .gws_not_connected = 1,
685 .init = &avs6eyes_init,
693 /* software I2C functions */
695 zoran_i2c_getsda (void *data)
697 struct zoran *zr = (struct zoran *) data;
699 return (btread(ZR36057_I2CBR) >> 1) & 1;
703 zoran_i2c_getscl (void *data)
705 struct zoran *zr = (struct zoran *) data;
707 return btread(ZR36057_I2CBR) & 1;
711 zoran_i2c_setsda (void *data,
714 struct zoran *zr = (struct zoran *) data;
720 btwrite(zr->i2cbr, ZR36057_I2CBR);
724 zoran_i2c_setscl (void *data,
727 struct zoran *zr = (struct zoran *) data;
733 btwrite(zr->i2cbr, ZR36057_I2CBR);
737 zoran_i2c_client_register (struct i2c_client *client)
739 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
743 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
744 ZR_DEVNAME(zr), client->driver->id);
746 mutex_lock(&zr->resource_lock);
749 /* we're already busy, so we keep a reference to
750 * them... Could do a lot of stuff here, but this
751 * is easiest. (Did I ever mention I'm a lazy ass?)
754 goto clientreg_unlock_and_return;
757 if (client->driver->id == zr->card.i2c_decoder)
758 zr->decoder = client;
759 else if (client->driver->id == zr->card.i2c_encoder)
760 zr->encoder = client;
763 goto clientreg_unlock_and_return;
766 clientreg_unlock_and_return:
767 mutex_unlock(&zr->resource_lock);
773 zoran_i2c_client_unregister (struct i2c_client *client)
775 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
778 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
780 mutex_lock(&zr->resource_lock);
784 goto clientunreg_unlock_and_return;
787 /* try to locate it */
788 if (client == zr->encoder) {
790 } else if (client == zr->decoder) {
792 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
794 clientunreg_unlock_and_return:
795 mutex_unlock(&zr->resource_lock);
799 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
800 .setsda = zoran_i2c_setsda,
801 .setscl = zoran_i2c_setscl,
802 .getsda = zoran_i2c_getsda,
803 .getscl = zoran_i2c_getscl,
809 zoran_register_i2c (struct zoran *zr)
811 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
812 sizeof(struct i2c_algo_bit_data));
813 zr->i2c_algo.data = zr;
814 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
815 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
816 zr->i2c_adapter.client_register = zoran_i2c_client_register;
817 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
818 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
819 sizeof(zr->i2c_adapter.name));
820 i2c_set_adapdata(&zr->i2c_adapter, zr);
821 zr->i2c_adapter.algo_data = &zr->i2c_algo;
822 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
823 return i2c_bit_add_bus(&zr->i2c_adapter);
827 zoran_unregister_i2c (struct zoran *zr)
829 i2c_del_adapter(&zr->i2c_adapter);
832 /* Check a zoran_params struct for correctness, insert default params */
835 zoran_check_jpg_settings (struct zoran *zr,
836 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))
903 if (settings->VerDcm != 1 && settings->VerDcm != 2)
905 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
907 if (settings->field_per_buff != 1 &&
908 settings->field_per_buff != 2)
910 if (settings->img_x < 0)
912 if (settings->img_y < 0)
914 if (settings->img_width < 0)
916 if (settings->img_height < 0)
918 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
920 if (settings->img_y + settings->img_height >
923 if (settings->HorDcm && settings->VerDcm) {
924 if (settings->img_width %
925 (16 * settings->HorDcm) != 0)
927 if (settings->img_height %
928 (8 * settings->VerDcm) != 0)
935 "%s: check_jpg_settings() - error in params for decimation = 0\n",
943 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
944 ZR_DEVNAME(zr), settings->decimation);
949 if (settings->jpg_comp.quality > 100)
950 settings->jpg_comp.quality = 100;
951 if (settings->jpg_comp.quality < 5)
952 settings->jpg_comp.quality = 5;
953 if (settings->jpg_comp.APPn < 0)
954 settings->jpg_comp.APPn = 0;
955 if (settings->jpg_comp.APPn > 15)
956 settings->jpg_comp.APPn = 15;
957 if (settings->jpg_comp.APP_len < 0)
958 settings->jpg_comp.APP_len = 0;
959 if (settings->jpg_comp.APP_len > 60)
960 settings->jpg_comp.APP_len = 60;
961 if (settings->jpg_comp.COM_len < 0)
962 settings->jpg_comp.COM_len = 0;
963 if (settings->jpg_comp.COM_len > 60)
964 settings->jpg_comp.COM_len = 60;
971 zoran_open_init_params (struct zoran *zr)
975 /* User must explicitly set a window */
976 zr->overlay_settings.is_set = 0;
977 zr->overlay_mask = NULL;
978 zr->overlay_active = ZORAN_FREE;
980 zr->v4l_memgrab_active = 0;
981 zr->v4l_overlay_active = 0;
982 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
983 zr->v4l_grab_seq = 0;
984 zr->v4l_settings.width = 192;
985 zr->v4l_settings.height = 144;
986 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
987 zr->v4l_settings.bytesperline =
988 zr->v4l_settings.width *
989 ((zr->v4l_settings.format->depth + 7) / 8);
991 /* DMA ring stuff for V4L */
992 zr->v4l_pend_tail = 0;
993 zr->v4l_pend_head = 0;
994 zr->v4l_sync_tail = 0;
995 zr->v4l_buffers.active = ZORAN_FREE;
996 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
997 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
999 zr->v4l_buffers.allocated = 0;
1001 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1002 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1004 zr->jpg_buffers.active = ZORAN_FREE;
1005 zr->jpg_buffers.allocated = 0;
1006 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1007 zr->jpg_settings.decimation = 1;
1008 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1009 if (zr->card.type != BUZ)
1010 zr->jpg_settings.odd_even = 1;
1012 zr->jpg_settings.odd_even = 0;
1013 zr->jpg_settings.jpg_comp.APPn = 0;
1014 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1015 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1016 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1017 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1018 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1019 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1020 zr->jpg_settings.jpg_comp.jpeg_markers =
1021 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1022 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1026 "%s: zoran_open_init_params() internal error\n",
1029 clear_interrupt_counters(zr);
1033 static void __devinit
1034 test_interrupts (struct zoran *zr)
1039 clear_interrupt_counters(zr);
1042 icr = btread(ZR36057_ICR);
1043 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1044 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1045 timeout = schedule_timeout(HZ);
1046 finish_wait(&zr->test_q, &wait);
1047 btwrite(0, ZR36057_ICR);
1048 btwrite(0x78000000, ZR36057_ISR);
1050 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1052 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1054 if (zr36067_debug > 1)
1055 print_interrupts(zr);
1056 btwrite(icr, ZR36057_ICR);
1059 static int __devinit
1060 zr36057_init (struct zoran *zr)
1068 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1069 ZR_DEVNAME(zr), zr->id, zr);
1071 /* default setup of all parameters which will persist between opens */
1074 init_waitqueue_head(&zr->v4l_capq);
1075 init_waitqueue_head(&zr->jpg_capq);
1076 init_waitqueue_head(&zr->test_q);
1077 zr->jpg_buffers.allocated = 0;
1078 zr->v4l_buffers.allocated = 0;
1080 zr->buffer.base = (void *) vidmem;
1081 zr->buffer.width = 0;
1082 zr->buffer.height = 0;
1083 zr->buffer.depth = 0;
1084 zr->buffer.bytesperline = 0;
1086 /* Avoid nonsense settings from user for default input/norm */
1087 if (default_norm < VIDEO_MODE_PAL &&
1088 default_norm > VIDEO_MODE_SECAM)
1089 default_norm = VIDEO_MODE_PAL;
1090 zr->norm = default_norm;
1091 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1094 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1096 zr->norm = VIDEO_MODE_PAL;
1097 zr->timing = zr->card.tvn[zr->norm];
1100 if (default_input > zr->card.inputs-1) {
1103 "%s: default_input value %d out of range (0-%d)\n",
1104 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1107 zr->input = default_input;
1109 /* Should the following be reset at every open ? */
1111 zr->contrast = 32768;
1112 zr->saturation = 32768;
1113 zr->brightness = 32768;
1115 /* default setup (will be repeated at every open) */
1116 zoran_open_init_params(zr);
1118 /* allocate memory *before* doing anything to the hardware
1119 * in case allocation fails */
1120 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1121 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1122 if (!zr->stat_com || !zr->video_dev) {
1125 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1130 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1131 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1135 * Now add the template and register the device unit.
1137 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1138 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1139 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1141 goto exit_unregister;
1143 zoran_init_hardware(zr);
1144 if (zr36067_debug > 2)
1145 detect_guest_activity(zr);
1146 test_interrupts(zr);
1147 if (!pass_through) {
1148 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1149 encoder_command(zr, ENCODER_SET_INPUT, &two);
1152 zr->zoran_proc = NULL;
1153 zr->initialized = 1;
1157 zoran_unregister_i2c(zr);
1159 kfree(zr->stat_com);
1160 kfree(zr->video_dev);
1165 zoran_release (struct zoran *zr)
1167 if (!zr->initialized)
1169 /* unregister videocodec bus */
1171 struct videocodec_master *master = zr->codec->master_data;
1173 videocodec_detach(zr->codec);
1177 struct videocodec_master *master = zr->vfe->master_data;
1179 videocodec_detach(zr->vfe);
1183 /* unregister i2c bus */
1184 zoran_unregister_i2c(zr);
1185 /* disable PCI bus-mastering */
1186 zoran_set_pci_master(zr, 0);
1187 /* put chip into reset */
1188 btwrite(0, ZR36057_SPGPPCR);
1189 free_irq(zr->pci_dev->irq, zr);
1190 /* unmap and free memory */
1191 kfree(zr->stat_com);
1192 zoran_proc_cleanup(zr);
1193 iounmap(zr->zr36057_mem);
1194 pci_disable_device(zr->pci_dev);
1195 video_unregister_device(zr->video_dev);
1201 zoran_vdev_release (struct video_device *vdev)
1206 static struct videocodec_master * __devinit
1207 zoran_setup_videocodec (struct zoran *zr,
1210 struct videocodec_master *m = NULL;
1212 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1216 "%s: zoran_setup_videocodec() - no memory\n",
1221 /* magic and type are unused for master struct. Makes sense only at
1223 In the past, .type were initialized to the old V4L1 .hardware
1224 value, as VID_HARDWARE_ZR36067
1229 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1230 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1235 case CODEC_TYPE_ZR36060:
1236 m->readreg = zr36060_read;
1237 m->writereg = zr36060_write;
1238 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1240 case CODEC_TYPE_ZR36050:
1241 m->readreg = zr36050_read;
1242 m->writereg = zr36050_write;
1243 m->flags |= CODEC_FLAG_JPEG;
1245 case CODEC_TYPE_ZR36016:
1246 m->readreg = zr36016_read;
1247 m->writereg = zr36016_write;
1248 m->flags |= CODEC_FLAG_VFE;
1256 * Scan for a Buz card (actually for the PCI controller ZR36057),
1257 * request the irq and map the io memory
1259 static int __devinit
1262 unsigned char latency, need_latency;
1264 struct pci_dev *dev = NULL;
1266 struct videocodec_master *master_vfe = NULL;
1267 struct videocodec_master *master_codec = NULL;
1269 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1272 while (zoran_num < BUZ_MAX &&
1273 (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
1274 card_num = card[zoran_num];
1275 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1279 "%s: find_zr36057() - kzalloc failed\n",
1284 //zr->zr36057_mem = NULL;
1286 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1287 spin_lock_init(&zr->spinlock);
1288 mutex_init(&zr->resource_lock);
1289 if (pci_enable_device(dev))
1291 zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
1292 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
1294 if (zr->revision < 2) {
1297 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1298 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1301 if (card_num == -1) {
1304 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1310 unsigned short ss_vendor, ss_device;
1312 ss_vendor = zr->pci_dev->subsystem_vendor;
1313 ss_device = zr->pci_dev->subsystem_device;
1316 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1317 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1321 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1322 ZR_DEVNAME(zr), ss_vendor, ss_device);
1323 if (card_num == -1) {
1326 "%s: find_zr36057() - trying to autodetect card type\n",
1328 for (i=0;i<NUM_CARDS;i++) {
1329 if (ss_vendor == zoran_cards[i].vendor_id &&
1330 ss_device == zoran_cards[i].device_id) {
1333 "%s: find_zr36057() - card %s detected\n",
1335 zoran_cards[i].name);
1340 if (i == NUM_CARDS) {
1343 "%s: find_zr36057() - unknown card\n",
1350 if (card_num < 0 || card_num >= NUM_CARDS) {
1353 "%s: find_zr36057() - invalid cardnum %d\n",
1354 ZR_DEVNAME(zr), card_num);
1358 /* even though we make this a non pointer and thus
1359 * theoretically allow for making changes to this struct
1360 * on a per-individual card basis at runtime, this is
1361 * strongly discouraged. This structure is intended to
1362 * keep general card information, no settings or anything */
1363 zr->card = zoran_cards[card_num];
1364 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1365 "%s[%u]", zr->card.name, zr->id);
1367 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1368 if (!zr->zr36057_mem) {
1371 "%s: find_zr36057() - ioremap failed\n",
1376 result = request_irq(zr->pci_dev->irq,
1378 IRQF_SHARED | IRQF_DISABLED,
1382 if (result == -EINVAL) {
1385 "%s: find_zr36057() - bad irq number or handler\n",
1387 } else if (result == -EBUSY) {
1390 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1391 ZR_DEVNAME(zr), zr->pci_dev->irq);
1395 "%s: find_zr36057() - can't assign irq, error code %d\n",
1396 ZR_DEVNAME(zr), result);
1401 /* set PCI latency timer */
1402 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1404 need_latency = zr->revision > 1 ? 32 : 48;
1405 if (latency != need_latency) {
1408 "%s: Changing PCI latency from %d to %d.\n",
1409 ZR_DEVNAME(zr), latency, need_latency);
1410 pci_write_config_byte(zr->pci_dev,
1415 zr36057_restart(zr);
1417 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1421 if (decoder[zr->id] != -1) {
1422 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1423 zr->card.i2c_decoder = decoder[zr->id];
1424 } else if (zr->card.i2c_decoder != 0) {
1426 i2cid_to_modulename(zr->card.i2c_decoder);
1428 i2c_dec_name = NULL;
1432 if ((result = request_module(i2c_dec_name)) < 0) {
1435 "%s: failed to load module %s: %d\n",
1436 ZR_DEVNAME(zr), i2c_dec_name, result);
1441 if (encoder[zr->id] != -1) {
1442 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1443 zr->card.i2c_encoder = encoder[zr->id];
1444 } else if (zr->card.i2c_encoder != 0) {
1446 i2cid_to_modulename(zr->card.i2c_encoder);
1448 i2c_enc_name = NULL;
1452 if ((result = request_module(i2c_enc_name)) < 0) {
1455 "%s: failed to load module %s: %d\n",
1456 ZR_DEVNAME(zr), i2c_enc_name, result);
1460 if (zoran_register_i2c(zr) < 0) {
1463 "%s: find_zr36057() - can't initialize i2c bus\n",
1469 KERN_INFO "%s: Initializing videocodec bus...\n",
1472 if (zr->card.video_codec != 0 &&
1474 codecid_to_modulename(zr->card.video_codec)) != NULL) {
1475 if ((result = request_module(codec_name)) < 0) {
1478 "%s: failed to load modules %s: %d\n",
1479 ZR_DEVNAME(zr), codec_name, result);
1482 if (zr->card.video_vfe != 0 &&
1484 codecid_to_modulename(zr->card.video_vfe)) != NULL) {
1485 if ((result = request_module(vfe_name)) < 0) {
1488 "%s: failed to load modules %s: %d\n",
1489 ZR_DEVNAME(zr), vfe_name, result);
1493 /* reset JPEG codec */
1494 jpeg_codec_sleep(zr, 1);
1495 jpeg_codec_reset(zr);
1496 /* video bus enabled */
1497 /* display codec revision */
1498 if (zr->card.video_codec != 0) {
1499 master_codec = zoran_setup_videocodec(zr,
1500 zr->card.video_codec);
1503 zr->codec = videocodec_attach(master_codec);
1507 "%s: find_zr36057() - no codec found\n",
1511 if (zr->codec->type != zr->card.video_codec) {
1514 "%s: find_zr36057() - wrong codec\n",
1516 goto zr_detach_codec;
1519 if (zr->card.video_vfe != 0) {
1520 master_vfe = zoran_setup_videocodec(zr,
1521 zr->card.video_vfe);
1523 goto zr_detach_codec;
1524 zr->vfe = videocodec_attach(master_vfe);
1528 "%s: find_zr36057() - no VFE found\n",
1532 if (zr->vfe->type != zr->card.video_vfe) {
1535 "%s: find_zr36057() = wrong VFE\n",
1540 /* Success so keep the pci_dev referenced */
1541 pci_dev_get(zr->pci_dev);
1542 zoran[zoran_num++] = zr;
1547 videocodec_detach(zr->vfe);
1551 videocodec_detach(zr->codec);
1553 kfree(master_codec);
1555 zoran_unregister_i2c(zr);
1557 btwrite(0, ZR36057_SPGPPCR);
1558 free_irq(zr->pci_dev->irq, zr);
1560 iounmap(zr->zr36057_mem);
1565 if (dev) /* Clean up ref count on early exit */
1568 if (zoran_num == 0) {
1569 dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
1575 init_dc10_cards (void)
1579 memset(zoran, 0, sizeof(zoran));
1580 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1581 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1583 /* Look for cards */
1584 if (find_zr36057() < 0) {
1589 dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
1591 /* check the parameters we have been given, adjust if necessary */
1594 if (v4l_nbufs > VIDEO_MAX_FRAME)
1595 v4l_nbufs = VIDEO_MAX_FRAME;
1596 /* The user specfies the in KB, we want them in byte
1597 * (and page aligned) */
1598 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1599 if (v4l_bufsize < 32768)
1600 v4l_bufsize = 32768;
1601 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1602 if (v4l_bufsize > 2048 * 1024)
1603 v4l_bufsize = 2048 * 1024;
1606 if (jpg_nbufs > BUZ_MAX_FRAME)
1607 jpg_nbufs = BUZ_MAX_FRAME;
1608 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1609 if (jpg_bufsize < 8192)
1611 if (jpg_bufsize > (512 * 1024))
1612 jpg_bufsize = 512 * 1024;
1613 /* Use parameter for vidmem or try to find a video card */
1617 "%s: Using supplied video memory base address @ 0x%lx\n",
1618 ZORAN_NAME, vidmem);
1621 /* random nonsense */
1622 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
1624 /* some mainboards might not do PCI-PCI data transfer well */
1625 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1628 "%s: chipset does not support reliable PCI-PCI DMA\n",
1632 /* take care of Natoma chipset and a revision 1 zr36057 */
1633 for (i = 0; i < zoran_num; i++) {
1634 struct zoran *zr = zoran[i];
1636 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1637 zr->jpg_buffers.need_contiguous = 1;
1640 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1644 if (zr36057_init(zr) < 0) {
1645 for (i = 0; i < zoran_num; i++)
1646 zoran_release(zoran[i]);
1649 zoran_proc_init(zr);
1656 unload_dc10_cards (void)
1660 for (i = 0; i < zoran_num; i++)
1661 zoran_release(zoran[i]);
1664 module_init(init_dc10_cards);
1665 module_exit(unload_dc10_cards);