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 = 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_DEVICE(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057), },
160 MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
162 static unsigned int zoran_num; /* number of cards found */
164 /* videocodec bus functions ZR36060 */
166 zr36060_read (struct videocodec *codec,
169 struct zoran *zr = (struct zoran *) codec->master_data->data;
172 if (post_office_wait(zr)
173 || post_office_write(zr, 0, 1, reg >> 8)
174 || post_office_write(zr, 0, 2, reg & 0xff)) {
178 data = post_office_read(zr, 0, 3) & 0xff;
183 zr36060_write (struct videocodec *codec,
187 struct zoran *zr = (struct zoran *) codec->master_data->data;
189 if (post_office_wait(zr)
190 || post_office_write(zr, 0, 1, reg >> 8)
191 || post_office_write(zr, 0, 2, reg & 0xff)) {
195 post_office_write(zr, 0, 3, val & 0xff);
198 /* videocodec bus functions ZR36050 */
200 zr36050_read (struct videocodec *codec,
203 struct zoran *zr = (struct zoran *) codec->master_data->data;
206 if (post_office_wait(zr)
207 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
211 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
216 zr36050_write (struct videocodec *codec,
220 struct zoran *zr = (struct zoran *) codec->master_data->data;
222 if (post_office_wait(zr)
223 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
227 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
230 /* videocodec bus functions ZR36016 */
232 zr36016_read (struct videocodec *codec,
235 struct zoran *zr = (struct zoran *) codec->master_data->data;
238 if (post_office_wait(zr)) {
242 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
246 /* hack for in zoran_device.c */
248 zr36016_write (struct videocodec *codec,
252 struct zoran *zr = (struct zoran *) codec->master_data->data;
254 if (post_office_wait(zr)) {
258 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
262 * Board specific information
266 dc10_init (struct zoran *zr)
268 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
270 /* Pixel clock selection */
273 /* Enable the video bus sync signals */
278 dc10plus_init (struct zoran *zr)
280 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
284 buz_init (struct zoran *zr)
286 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
288 /* some stuff from Iomega */
289 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
290 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
291 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
295 lml33_init (struct zoran *zr)
297 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
299 GPIO(zr, 2, 1); // Set Composite input/output
303 avs6eyes_init (struct zoran *zr)
305 // AverMedia 6-Eyes original driver by Christer Weinigel
307 // Lifted straight from Christer's old driver and
308 // modified slightly by Martin Samuelsson.
310 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
312 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
315 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
316 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
317 GPIO(zr, 2, mux & 1); /* MUX S0 */
318 GPIO(zr, 3, 0); /* /FRAME on */
319 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
320 GPIO(zr, 5, mux & 2); /* MUX S1 */
321 GPIO(zr, 6, 0); /* ? */
322 GPIO(zr, 7, mux & 4); /* MUX S2 */
327 i2cid_to_modulename (u16 i2c_id)
332 case I2C_DRIVERID_SAA7110:
335 case I2C_DRIVERID_SAA7111A:
338 case I2C_DRIVERID_SAA7114:
341 case I2C_DRIVERID_SAA7185B:
344 case I2C_DRIVERID_ADV7170:
347 case I2C_DRIVERID_ADV7175:
350 case I2C_DRIVERID_BT819:
353 case I2C_DRIVERID_BT856:
356 case I2C_DRIVERID_BT866:
359 case I2C_DRIVERID_VPX3220:
362 case I2C_DRIVERID_KS0127:
371 codecid_to_modulename (u16 codecid)
376 case CODEC_TYPE_ZR36060:
379 case CODEC_TYPE_ZR36050:
382 case CODEC_TYPE_ZR36016:
391 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
394 static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
395 static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
396 static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
397 static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
399 static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
400 static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
402 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
403 static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
404 static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
406 /* FIXME: I cannot swap U and V in saa7114, so i do one
407 * pixel left shift in zoran (75 -> 74)
408 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
409 static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
410 static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
412 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
413 * copy Maxim's left shift hack for the 6 Eyes.
415 * Christer's driver used the unshifted norms, though...
417 static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
418 static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
420 static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
424 .i2c_decoder = I2C_DRIVERID_VPX3220,
425 .video_codec = CODEC_TYPE_ZR36050,
426 .video_vfe = CODEC_TYPE_ZR36016,
432 { 0, "Internal/comp" }
441 .vsync_int = ZR36057_ISR_GIRQ1,
442 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
443 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
445 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
446 .gws_not_connected = 0,
452 .i2c_decoder = I2C_DRIVERID_SAA7110,
453 .i2c_encoder = I2C_DRIVERID_ADV7175,
454 .video_codec = CODEC_TYPE_ZR36060,
460 { 5, "Internal/comp" }
467 .jpeg_int = ZR36057_ISR_GIRQ0,
468 .vsync_int = ZR36057_ISR_GIRQ1,
469 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
470 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
472 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
473 .gws_not_connected = 0,
475 .init = &dc10plus_init,
479 .vendor_id = PCI_VENDOR_ID_MIRO,
480 .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
481 .i2c_decoder = I2C_DRIVERID_SAA7110,
482 .i2c_encoder = I2C_DRIVERID_ADV7175,
483 .video_codec = CODEC_TYPE_ZR36060,
489 { 5, "Internal/comp" }
497 .jpeg_int = ZR36057_ISR_GIRQ0,
498 .vsync_int = ZR36057_ISR_GIRQ1,
499 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
500 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
502 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
503 .gws_not_connected = 0,
505 .init = &dc10plus_init,
509 .i2c_decoder = I2C_DRIVERID_VPX3220,
510 .i2c_encoder = I2C_DRIVERID_ADV7175,
511 .video_codec = CODEC_TYPE_ZR36050,
512 .video_vfe = CODEC_TYPE_ZR36016,
518 { 0, "Internal/comp" }
527 .vsync_int = ZR36057_ISR_GIRQ1,
528 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
529 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
531 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
532 .gws_not_connected = 0,
538 .vendor_id = PCI_VENDOR_ID_MIRO,
539 .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
540 .i2c_decoder = I2C_DRIVERID_VPX3220,
541 .i2c_encoder = I2C_DRIVERID_ADV7175,
542 .video_codec = CODEC_TYPE_ZR36050,
543 .video_vfe = CODEC_TYPE_ZR36016,
549 { 0, "Internal/comp" }
558 .vsync_int = ZR36057_ISR_GIRQ1,
559 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
560 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
562 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
563 .gws_not_connected = 0,
569 .i2c_decoder = I2C_DRIVERID_BT819,
570 .i2c_encoder = I2C_DRIVERID_BT856,
571 .video_codec = CODEC_TYPE_ZR36060,
584 .jpeg_int = ZR36057_ISR_GIRQ1,
585 .vsync_int = ZR36057_ISR_GIRQ0,
586 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
587 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
589 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
590 .gws_not_connected = 1,
596 .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
597 .device_id = PCI_DEVICE_ID_LML_33R10,
598 .i2c_decoder = I2C_DRIVERID_SAA7114,
599 .i2c_encoder = I2C_DRIVERID_ADV7170,
600 .video_codec = CODEC_TYPE_ZR36060,
613 .jpeg_int = ZR36057_ISR_GIRQ1,
614 .vsync_int = ZR36057_ISR_GIRQ0,
615 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
616 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
618 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
619 .gws_not_connected = 1,
625 .vendor_id = PCI_VENDOR_ID_IOMEGA,
626 .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
627 .i2c_decoder = I2C_DRIVERID_SAA7111A,
628 .i2c_encoder = I2C_DRIVERID_SAA7185B,
629 .video_codec = CODEC_TYPE_ZR36060,
642 .jpeg_int = ZR36057_ISR_GIRQ1,
643 .vsync_int = ZR36057_ISR_GIRQ0,
644 .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
645 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
647 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
648 .gws_not_connected = 1,
654 /* AverMedia chose not to brand the 6-Eyes. Thus it
655 can't be autodetected, and requires card=x. */
658 .i2c_decoder = I2C_DRIVERID_KS0127,
659 .i2c_encoder = I2C_DRIVERID_BT866,
660 .video_codec = CODEC_TYPE_ZR36060,
664 { 0, "Composite 1" },
665 { 1, "Composite 2" },
666 { 2, "Composite 3" },
667 { 4, "Composite 4" },
668 { 5, "Composite 5" },
669 { 6, "Composite 6" },
677 &f50ccir601_avs6eyes,
678 &f60ccir601_avs6eyes,
681 .jpeg_int = ZR36057_ISR_GIRQ1,
682 .vsync_int = ZR36057_ISR_GIRQ0,
683 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
684 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
685 .gpcs = { 3, 1 }, // Validity unknown /Sam
686 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
687 .gws_not_connected = 1,
689 .init = &avs6eyes_init,
697 /* software I2C functions */
699 zoran_i2c_getsda (void *data)
701 struct zoran *zr = (struct zoran *) data;
703 return (btread(ZR36057_I2CBR) >> 1) & 1;
707 zoran_i2c_getscl (void *data)
709 struct zoran *zr = (struct zoran *) data;
711 return btread(ZR36057_I2CBR) & 1;
715 zoran_i2c_setsda (void *data,
718 struct zoran *zr = (struct zoran *) data;
724 btwrite(zr->i2cbr, ZR36057_I2CBR);
728 zoran_i2c_setscl (void *data,
731 struct zoran *zr = (struct zoran *) data;
737 btwrite(zr->i2cbr, ZR36057_I2CBR);
741 zoran_i2c_client_register (struct i2c_client *client)
743 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
747 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
748 ZR_DEVNAME(zr), client->driver->id);
750 mutex_lock(&zr->resource_lock);
753 /* we're already busy, so we keep a reference to
754 * them... Could do a lot of stuff here, but this
755 * is easiest. (Did I ever mention I'm a lazy ass?)
758 goto clientreg_unlock_and_return;
761 if (client->driver->id == zr->card.i2c_decoder)
762 zr->decoder = client;
763 else if (client->driver->id == zr->card.i2c_encoder)
764 zr->encoder = client;
767 goto clientreg_unlock_and_return;
770 clientreg_unlock_and_return:
771 mutex_unlock(&zr->resource_lock);
777 zoran_i2c_client_unregister (struct i2c_client *client)
779 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
782 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
784 mutex_lock(&zr->resource_lock);
788 goto clientunreg_unlock_and_return;
791 /* try to locate it */
792 if (client == zr->encoder) {
794 } else if (client == zr->decoder) {
796 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
798 clientunreg_unlock_and_return:
799 mutex_unlock(&zr->resource_lock);
803 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
804 .setsda = zoran_i2c_setsda,
805 .setscl = zoran_i2c_setscl,
806 .getsda = zoran_i2c_getsda,
807 .getscl = zoran_i2c_getscl,
813 zoran_register_i2c (struct zoran *zr)
815 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
816 sizeof(struct i2c_algo_bit_data));
817 zr->i2c_algo.data = zr;
818 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
819 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
820 zr->i2c_adapter.client_register = zoran_i2c_client_register;
821 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
822 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
823 sizeof(zr->i2c_adapter.name));
824 i2c_set_adapdata(&zr->i2c_adapter, zr);
825 zr->i2c_adapter.algo_data = &zr->i2c_algo;
826 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
827 return i2c_bit_add_bus(&zr->i2c_adapter);
831 zoran_unregister_i2c (struct zoran *zr)
833 i2c_del_adapter(&zr->i2c_adapter);
836 /* Check a zoran_params struct for correctness, insert default params */
839 zoran_check_jpg_settings (struct zoran *zr,
840 struct zoran_jpg_settings *settings)
842 int err = 0, err0 = 0;
846 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
847 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
848 settings->VerDcm, settings->TmpDcm);
851 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
852 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
853 settings->img_width, settings->img_height);
854 /* Check decimation, set default values for decimation = 1, 2, 4 */
855 switch (settings->decimation) {
858 settings->HorDcm = 1;
859 settings->VerDcm = 1;
860 settings->TmpDcm = 1;
861 settings->field_per_buff = 2;
864 settings->img_width = BUZ_MAX_WIDTH;
865 settings->img_height = BUZ_MAX_HEIGHT / 2;
869 settings->HorDcm = 2;
870 settings->VerDcm = 1;
871 settings->TmpDcm = 2;
872 settings->field_per_buff = 1;
873 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
875 settings->img_width =
876 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
877 settings->img_height = BUZ_MAX_HEIGHT / 2;
881 if (zr->card.type == DC10_new) {
884 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
890 settings->HorDcm = 4;
891 settings->VerDcm = 2;
892 settings->TmpDcm = 2;
893 settings->field_per_buff = 1;
894 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
896 settings->img_width =
897 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
898 settings->img_height = BUZ_MAX_HEIGHT / 2;
902 /* We have to check the data the user has set */
904 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
905 (zr->card.type == DC10_new || settings->HorDcm != 4))
907 if (settings->VerDcm != 1 && settings->VerDcm != 2)
909 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
911 if (settings->field_per_buff != 1 &&
912 settings->field_per_buff != 2)
914 if (settings->img_x < 0)
916 if (settings->img_y < 0)
918 if (settings->img_width < 0)
920 if (settings->img_height < 0)
922 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
924 if (settings->img_y + settings->img_height >
927 if (settings->HorDcm && settings->VerDcm) {
928 if (settings->img_width %
929 (16 * settings->HorDcm) != 0)
931 if (settings->img_height %
932 (8 * settings->VerDcm) != 0)
939 "%s: check_jpg_settings() - error in params for decimation = 0\n",
947 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
948 ZR_DEVNAME(zr), settings->decimation);
953 if (settings->jpg_comp.quality > 100)
954 settings->jpg_comp.quality = 100;
955 if (settings->jpg_comp.quality < 5)
956 settings->jpg_comp.quality = 5;
957 if (settings->jpg_comp.APPn < 0)
958 settings->jpg_comp.APPn = 0;
959 if (settings->jpg_comp.APPn > 15)
960 settings->jpg_comp.APPn = 15;
961 if (settings->jpg_comp.APP_len < 0)
962 settings->jpg_comp.APP_len = 0;
963 if (settings->jpg_comp.APP_len > 60)
964 settings->jpg_comp.APP_len = 60;
965 if (settings->jpg_comp.COM_len < 0)
966 settings->jpg_comp.COM_len = 0;
967 if (settings->jpg_comp.COM_len > 60)
968 settings->jpg_comp.COM_len = 60;
975 zoran_open_init_params (struct zoran *zr)
979 /* User must explicitly set a window */
980 zr->overlay_settings.is_set = 0;
981 zr->overlay_mask = NULL;
982 zr->overlay_active = ZORAN_FREE;
984 zr->v4l_memgrab_active = 0;
985 zr->v4l_overlay_active = 0;
986 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
987 zr->v4l_grab_seq = 0;
988 zr->v4l_settings.width = 192;
989 zr->v4l_settings.height = 144;
990 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
991 zr->v4l_settings.bytesperline =
992 zr->v4l_settings.width *
993 ((zr->v4l_settings.format->depth + 7) / 8);
995 /* DMA ring stuff for V4L */
996 zr->v4l_pend_tail = 0;
997 zr->v4l_pend_head = 0;
998 zr->v4l_sync_tail = 0;
999 zr->v4l_buffers.active = ZORAN_FREE;
1000 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1001 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1003 zr->v4l_buffers.allocated = 0;
1005 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1006 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1008 zr->jpg_buffers.active = ZORAN_FREE;
1009 zr->jpg_buffers.allocated = 0;
1010 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1011 zr->jpg_settings.decimation = 1;
1012 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1013 if (zr->card.type != BUZ)
1014 zr->jpg_settings.odd_even = 1;
1016 zr->jpg_settings.odd_even = 0;
1017 zr->jpg_settings.jpg_comp.APPn = 0;
1018 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1019 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1020 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1021 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1022 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1023 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1024 zr->jpg_settings.jpg_comp.jpeg_markers =
1025 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1026 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1030 "%s: zoran_open_init_params() internal error\n",
1033 clear_interrupt_counters(zr);
1037 static void __devinit
1038 test_interrupts (struct zoran *zr)
1043 clear_interrupt_counters(zr);
1046 icr = btread(ZR36057_ICR);
1047 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1048 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1049 timeout = schedule_timeout(HZ);
1050 finish_wait(&zr->test_q, &wait);
1051 btwrite(0, ZR36057_ICR);
1052 btwrite(0x78000000, ZR36057_ISR);
1054 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1056 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1058 if (zr36067_debug > 1)
1059 print_interrupts(zr);
1060 btwrite(icr, ZR36057_ICR);
1063 static int __devinit
1064 zr36057_init (struct zoran *zr)
1072 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1073 ZR_DEVNAME(zr), zr->id, zr);
1075 /* default setup of all parameters which will persist between opens */
1078 init_waitqueue_head(&zr->v4l_capq);
1079 init_waitqueue_head(&zr->jpg_capq);
1080 init_waitqueue_head(&zr->test_q);
1081 zr->jpg_buffers.allocated = 0;
1082 zr->v4l_buffers.allocated = 0;
1084 zr->buffer.base = (void *) vidmem;
1085 zr->buffer.width = 0;
1086 zr->buffer.height = 0;
1087 zr->buffer.depth = 0;
1088 zr->buffer.bytesperline = 0;
1090 /* Avoid nonsense settings from user for default input/norm */
1091 if (default_norm < VIDEO_MODE_PAL &&
1092 default_norm > VIDEO_MODE_SECAM)
1093 default_norm = VIDEO_MODE_PAL;
1094 zr->norm = default_norm;
1095 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1098 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1100 zr->norm = VIDEO_MODE_PAL;
1101 zr->timing = zr->card.tvn[zr->norm];
1104 if (default_input > zr->card.inputs-1) {
1107 "%s: default_input value %d out of range (0-%d)\n",
1108 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1111 zr->input = default_input;
1113 /* Should the following be reset at every open ? */
1115 zr->contrast = 32768;
1116 zr->saturation = 32768;
1117 zr->brightness = 32768;
1119 /* default setup (will be repeated at every open) */
1120 zoran_open_init_params(zr);
1122 /* allocate memory *before* doing anything to the hardware
1123 * in case allocation fails */
1124 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1125 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1126 if (!zr->stat_com || !zr->video_dev) {
1129 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1134 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1135 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1139 * Now add the template and register the device unit.
1141 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1142 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1143 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1146 video_set_drvdata(zr->video_dev, zr);
1148 zoran_init_hardware(zr);
1149 if (zr36067_debug > 2)
1150 detect_guest_activity(zr);
1151 test_interrupts(zr);
1152 if (!pass_through) {
1153 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1154 encoder_command(zr, ENCODER_SET_INPUT, &two);
1157 zr->zoran_proc = NULL;
1158 zr->initialized = 1;
1162 kfree(zr->stat_com);
1163 kfree(zr->video_dev);
1167 static void __devexit zoran_remove(struct pci_dev *pdev)
1169 struct zoran *zr = pci_get_drvdata(pdev);
1171 if (!zr->initialized)
1174 /* unregister videocodec bus */
1176 struct videocodec_master *master = zr->codec->master_data;
1178 videocodec_detach(zr->codec);
1182 struct videocodec_master *master = zr->vfe->master_data;
1184 videocodec_detach(zr->vfe);
1188 /* unregister i2c bus */
1189 zoran_unregister_i2c(zr);
1190 /* disable PCI bus-mastering */
1191 zoran_set_pci_master(zr, 0);
1192 /* put chip into reset */
1193 btwrite(0, ZR36057_SPGPPCR);
1194 free_irq(zr->pci_dev->irq, zr);
1195 /* unmap and free memory */
1196 kfree(zr->stat_com);
1197 zoran_proc_cleanup(zr);
1198 iounmap(zr->zr36057_mem);
1199 pci_disable_device(zr->pci_dev);
1200 video_unregister_device(zr->video_dev);
1202 pci_set_drvdata(pdev, NULL);
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 zoran_probe(struct pci_dev *pdev,
1266 const struct pci_device_id *ent)
1268 unsigned char latency, need_latency;
1271 struct videocodec_master *master_vfe = NULL;
1272 struct videocodec_master *master_codec = NULL;
1274 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1279 if (nr >= BUZ_MAX) {
1282 "%s: driver limited to %d card(s) maximum\n",
1283 ZORAN_NAME, BUZ_MAX);
1287 card_num = card[nr];
1288 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1292 "%s: find_zr36057() - kzalloc failed\n",
1298 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1299 spin_lock_init(&zr->spinlock);
1300 mutex_init(&zr->resource_lock);
1301 if (pci_enable_device(pdev))
1303 zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
1304 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
1305 if (zr->revision < 2) {
1308 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1309 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1312 if (card_num == -1) {
1315 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1321 unsigned short ss_vendor, ss_device;
1323 ss_vendor = zr->pci_dev->subsystem_vendor;
1324 ss_device = zr->pci_dev->subsystem_device;
1327 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1328 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1332 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1333 ZR_DEVNAME(zr), ss_vendor, ss_device);
1334 if (card_num == -1) {
1337 "%s: find_zr36057() - trying to autodetect card type\n",
1339 for (i = 0; i < NUM_CARDS; i++) {
1340 if (ss_vendor == zoran_cards[i].vendor_id &&
1341 ss_device == zoran_cards[i].device_id) {
1344 "%s: find_zr36057() - card %s detected\n",
1346 zoran_cards[i].name);
1351 if (i == NUM_CARDS) {
1354 "%s: find_zr36057() - unknown card\n",
1361 if (card_num < 0 || card_num >= NUM_CARDS) {
1364 "%s: find_zr36057() - invalid cardnum %d\n",
1365 ZR_DEVNAME(zr), card_num);
1369 /* even though we make this a non pointer and thus
1370 * theoretically allow for making changes to this struct
1371 * on a per-individual card basis at runtime, this is
1372 * strongly discouraged. This structure is intended to
1373 * keep general card information, no settings or anything */
1374 zr->card = zoran_cards[card_num];
1375 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1376 "%s[%u]", zr->card.name, zr->id);
1378 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1379 if (!zr->zr36057_mem) {
1382 "%s: find_zr36057() - ioremap failed\n",
1387 result = request_irq(zr->pci_dev->irq, zoran_irq,
1388 IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1390 if (result == -EINVAL) {
1393 "%s: find_zr36057() - bad irq number or handler\n",
1395 } else if (result == -EBUSY) {
1398 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1399 ZR_DEVNAME(zr), zr->pci_dev->irq);
1403 "%s: find_zr36057() - can't assign irq, error code %d\n",
1404 ZR_DEVNAME(zr), result);
1409 /* set PCI latency timer */
1410 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1412 need_latency = zr->revision > 1 ? 32 : 48;
1413 if (latency != need_latency) {
1416 "%s: Changing PCI latency from %d to %d\n",
1417 ZR_DEVNAME(zr), latency, need_latency);
1418 pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1422 zr36057_restart(zr);
1424 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1428 if (decoder[zr->id] != -1) {
1429 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1430 zr->card.i2c_decoder = decoder[zr->id];
1431 } else if (zr->card.i2c_decoder != 0) {
1432 i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
1434 i2c_dec_name = NULL;
1438 result = request_module(i2c_dec_name);
1442 "%s: failed to load module %s: %d\n",
1443 ZR_DEVNAME(zr), i2c_dec_name, result);
1448 if (encoder[zr->id] != -1) {
1449 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1450 zr->card.i2c_encoder = encoder[zr->id];
1451 } else if (zr->card.i2c_encoder != 0) {
1452 i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
1454 i2c_enc_name = NULL;
1458 result = request_module(i2c_enc_name);
1462 "%s: failed to load module %s: %d\n",
1463 ZR_DEVNAME(zr), i2c_enc_name, result);
1467 if (zoran_register_i2c(zr) < 0) {
1470 "%s: find_zr36057() - can't initialize i2c bus\n",
1476 KERN_INFO "%s: Initializing videocodec bus...\n",
1479 if (zr->card.video_codec) {
1480 codec_name = codecid_to_modulename(zr->card.video_codec);
1482 result = request_module(codec_name);
1486 "%s: failed to load modules %s: %d\n",
1487 ZR_DEVNAME(zr), codec_name, result);
1491 if (zr->card.video_vfe) {
1492 vfe_name = codecid_to_modulename(zr->card.video_vfe);
1494 result = request_module(vfe_name);
1498 "%s: failed to load modules %s: %d\n",
1499 ZR_DEVNAME(zr), vfe_name, result);
1504 /* reset JPEG codec */
1505 jpeg_codec_sleep(zr, 1);
1506 jpeg_codec_reset(zr);
1507 /* video bus enabled */
1508 /* display codec revision */
1509 if (zr->card.video_codec != 0) {
1510 master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1513 zr->codec = videocodec_attach(master_codec);
1517 "%s: find_zr36057() - no codec found\n",
1521 if (zr->codec->type != zr->card.video_codec) {
1524 "%s: find_zr36057() - wrong codec\n",
1526 goto zr_detach_codec;
1529 if (zr->card.video_vfe != 0) {
1530 master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1532 goto zr_detach_codec;
1533 zr->vfe = videocodec_attach(master_vfe);
1537 "%s: find_zr36057() - no VFE found\n",
1541 if (zr->vfe->type != zr->card.video_vfe) {
1544 "%s: find_zr36057() = wrong VFE\n",
1550 /* take care of Natoma chipset and a revision 1 zr36057 */
1551 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1552 zr->jpg_buffers.need_contiguous = 1;
1555 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1559 if (zr36057_init(zr) < 0)
1562 zoran_proc_init(zr);
1564 pci_set_drvdata(pdev, zr);
1569 videocodec_detach(zr->vfe);
1573 videocodec_detach(zr->codec);
1575 kfree(master_codec);
1577 zoran_unregister_i2c(zr);
1579 btwrite(0, ZR36057_SPGPPCR);
1580 free_irq(zr->pci_dev->irq, zr);
1582 iounmap(zr->zr36057_mem);
1589 static struct pci_driver zoran_driver = {
1591 .id_table = zr36067_pci_tbl,
1592 .probe = zoran_probe,
1593 .remove = zoran_remove,
1596 static int __init zoran_init(void)
1600 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1601 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1603 /* check the parameters we have been given, adjust if necessary */
1606 if (v4l_nbufs > VIDEO_MAX_FRAME)
1607 v4l_nbufs = VIDEO_MAX_FRAME;
1608 /* The user specfies the in KB, we want them in byte
1609 * (and page aligned) */
1610 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1611 if (v4l_bufsize < 32768)
1612 v4l_bufsize = 32768;
1613 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1614 if (v4l_bufsize > 2048 * 1024)
1615 v4l_bufsize = 2048 * 1024;
1618 if (jpg_nbufs > BUZ_MAX_FRAME)
1619 jpg_nbufs = BUZ_MAX_FRAME;
1620 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1621 if (jpg_bufsize < 8192)
1623 if (jpg_bufsize > (512 * 1024))
1624 jpg_bufsize = 512 * 1024;
1625 /* Use parameter for vidmem or try to find a video card */
1629 "%s: Using supplied video memory base address @ 0x%lx\n",
1630 ZORAN_NAME, vidmem);
1633 /* random nonsense */
1634 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
1636 /* some mainboards might not do PCI-PCI data transfer well */
1637 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1640 "%s: chipset does not support reliable PCI-PCI DMA\n",
1644 res = pci_register_driver(&zoran_driver);
1648 "%s: Unable to register ZR36057 driver\n",
1656 static void __exit zoran_exit(void)
1658 pci_unregister_driver(&zoran_driver);
1661 module_init(zoran_init);
1662 module_exit(zoran_exit);