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 #define ZR_DEVICE(subven, subdev, data) { \
157 .vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
158 .subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
160 static struct pci_device_id zr36067_pci_tbl[] = {
161 ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
162 ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
163 ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
164 ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
165 ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
168 MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
170 static unsigned int zoran_num; /* number of cards found */
172 /* videocodec bus functions ZR36060 */
174 zr36060_read (struct videocodec *codec,
177 struct zoran *zr = (struct zoran *) codec->master_data->data;
180 if (post_office_wait(zr)
181 || post_office_write(zr, 0, 1, reg >> 8)
182 || post_office_write(zr, 0, 2, reg & 0xff)) {
186 data = post_office_read(zr, 0, 3) & 0xff;
191 zr36060_write (struct videocodec *codec,
195 struct zoran *zr = (struct zoran *) codec->master_data->data;
197 if (post_office_wait(zr)
198 || post_office_write(zr, 0, 1, reg >> 8)
199 || post_office_write(zr, 0, 2, reg & 0xff)) {
203 post_office_write(zr, 0, 3, val & 0xff);
206 /* videocodec bus functions ZR36050 */
208 zr36050_read (struct videocodec *codec,
211 struct zoran *zr = (struct zoran *) codec->master_data->data;
214 if (post_office_wait(zr)
215 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
219 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
224 zr36050_write (struct videocodec *codec,
228 struct zoran *zr = (struct zoran *) codec->master_data->data;
230 if (post_office_wait(zr)
231 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
235 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
238 /* videocodec bus functions ZR36016 */
240 zr36016_read (struct videocodec *codec,
243 struct zoran *zr = (struct zoran *) codec->master_data->data;
246 if (post_office_wait(zr)) {
250 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
254 /* hack for in zoran_device.c */
256 zr36016_write (struct videocodec *codec,
260 struct zoran *zr = (struct zoran *) codec->master_data->data;
262 if (post_office_wait(zr)) {
266 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
270 * Board specific information
274 dc10_init (struct zoran *zr)
276 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
278 /* Pixel clock selection */
281 /* Enable the video bus sync signals */
286 dc10plus_init (struct zoran *zr)
288 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
292 buz_init (struct zoran *zr)
294 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
296 /* some stuff from Iomega */
297 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
298 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
299 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
303 lml33_init (struct zoran *zr)
305 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
307 GPIO(zr, 2, 1); // Set Composite input/output
311 avs6eyes_init (struct zoran *zr)
313 // AverMedia 6-Eyes original driver by Christer Weinigel
315 // Lifted straight from Christer's old driver and
316 // modified slightly by Martin Samuelsson.
318 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
320 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
323 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
324 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
325 GPIO(zr, 2, mux & 1); /* MUX S0 */
326 GPIO(zr, 3, 0); /* /FRAME on */
327 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
328 GPIO(zr, 5, mux & 2); /* MUX S1 */
329 GPIO(zr, 6, 0); /* ? */
330 GPIO(zr, 7, mux & 4); /* MUX S2 */
335 i2cid_to_modulename (u16 i2c_id)
340 case I2C_DRIVERID_SAA7110:
343 case I2C_DRIVERID_SAA7111A:
346 case I2C_DRIVERID_SAA7114:
349 case I2C_DRIVERID_SAA7185B:
352 case I2C_DRIVERID_ADV7170:
355 case I2C_DRIVERID_ADV7175:
358 case I2C_DRIVERID_BT819:
361 case I2C_DRIVERID_BT856:
364 case I2C_DRIVERID_BT866:
367 case I2C_DRIVERID_VPX3220:
370 case I2C_DRIVERID_KS0127:
379 codecid_to_modulename (u16 codecid)
384 case CODEC_TYPE_ZR36060:
387 case CODEC_TYPE_ZR36050:
390 case CODEC_TYPE_ZR36016:
399 // u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
402 static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
403 static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
404 static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
405 static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
407 static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
408 static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
410 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
411 static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
412 static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
414 /* FIXME: I cannot swap U and V in saa7114, so i do one
415 * pixel left shift in zoran (75 -> 74)
416 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
417 static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
418 static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
420 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
421 * copy Maxim's left shift hack for the 6 Eyes.
423 * Christer's driver used the unshifted norms, though...
425 static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
426 static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
428 static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
432 .i2c_decoder = I2C_DRIVERID_VPX3220,
433 .video_codec = CODEC_TYPE_ZR36050,
434 .video_vfe = CODEC_TYPE_ZR36016,
440 { 0, "Internal/comp" }
449 .vsync_int = ZR36057_ISR_GIRQ1,
450 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
451 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
453 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
454 .gws_not_connected = 0,
460 .i2c_decoder = I2C_DRIVERID_SAA7110,
461 .i2c_encoder = I2C_DRIVERID_ADV7175,
462 .video_codec = CODEC_TYPE_ZR36060,
468 { 5, "Internal/comp" }
475 .jpeg_int = ZR36057_ISR_GIRQ0,
476 .vsync_int = ZR36057_ISR_GIRQ1,
477 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
478 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
480 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
481 .gws_not_connected = 0,
483 .init = &dc10plus_init,
487 .i2c_decoder = I2C_DRIVERID_SAA7110,
488 .i2c_encoder = I2C_DRIVERID_ADV7175,
489 .video_codec = CODEC_TYPE_ZR36060,
495 { 5, "Internal/comp" }
503 .jpeg_int = ZR36057_ISR_GIRQ0,
504 .vsync_int = ZR36057_ISR_GIRQ1,
505 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
506 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
508 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
509 .gws_not_connected = 0,
511 .init = &dc10plus_init,
515 .i2c_decoder = I2C_DRIVERID_VPX3220,
516 .i2c_encoder = I2C_DRIVERID_ADV7175,
517 .video_codec = CODEC_TYPE_ZR36050,
518 .video_vfe = CODEC_TYPE_ZR36016,
524 { 0, "Internal/comp" }
533 .vsync_int = ZR36057_ISR_GIRQ1,
534 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
535 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
537 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
538 .gws_not_connected = 0,
544 .i2c_decoder = I2C_DRIVERID_VPX3220,
545 .i2c_encoder = I2C_DRIVERID_ADV7175,
546 .video_codec = CODEC_TYPE_ZR36050,
547 .video_vfe = CODEC_TYPE_ZR36016,
553 { 0, "Internal/comp" }
562 .vsync_int = ZR36057_ISR_GIRQ1,
563 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
564 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
566 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
567 .gws_not_connected = 0,
573 .i2c_decoder = I2C_DRIVERID_BT819,
574 .i2c_encoder = I2C_DRIVERID_BT856,
575 .video_codec = CODEC_TYPE_ZR36060,
588 .jpeg_int = ZR36057_ISR_GIRQ1,
589 .vsync_int = ZR36057_ISR_GIRQ0,
590 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
591 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
593 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
594 .gws_not_connected = 1,
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 .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. */
656 .i2c_decoder = I2C_DRIVERID_KS0127,
657 .i2c_encoder = I2C_DRIVERID_BT866,
658 .video_codec = CODEC_TYPE_ZR36060,
662 { 0, "Composite 1" },
663 { 1, "Composite 2" },
664 { 2, "Composite 3" },
665 { 4, "Composite 4" },
666 { 5, "Composite 5" },
667 { 6, "Composite 6" },
675 &f50ccir601_avs6eyes,
676 &f60ccir601_avs6eyes,
679 .jpeg_int = ZR36057_ISR_GIRQ1,
680 .vsync_int = ZR36057_ISR_GIRQ0,
681 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
682 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
683 .gpcs = { 3, 1 }, // Validity unknown /Sam
684 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
685 .gws_not_connected = 1,
687 .init = &avs6eyes_init,
695 /* software I2C functions */
697 zoran_i2c_getsda (void *data)
699 struct zoran *zr = (struct zoran *) data;
701 return (btread(ZR36057_I2CBR) >> 1) & 1;
705 zoran_i2c_getscl (void *data)
707 struct zoran *zr = (struct zoran *) data;
709 return btread(ZR36057_I2CBR) & 1;
713 zoran_i2c_setsda (void *data,
716 struct zoran *zr = (struct zoran *) data;
722 btwrite(zr->i2cbr, ZR36057_I2CBR);
726 zoran_i2c_setscl (void *data,
729 struct zoran *zr = (struct zoran *) data;
735 btwrite(zr->i2cbr, ZR36057_I2CBR);
739 zoran_i2c_client_register (struct i2c_client *client)
741 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
745 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
746 ZR_DEVNAME(zr), client->driver->id);
748 mutex_lock(&zr->resource_lock);
751 /* we're already busy, so we keep a reference to
752 * them... Could do a lot of stuff here, but this
753 * is easiest. (Did I ever mention I'm a lazy ass?)
756 goto clientreg_unlock_and_return;
759 if (client->driver->id == zr->card.i2c_decoder)
760 zr->decoder = client;
761 else if (client->driver->id == zr->card.i2c_encoder)
762 zr->encoder = client;
765 goto clientreg_unlock_and_return;
768 clientreg_unlock_and_return:
769 mutex_unlock(&zr->resource_lock);
775 zoran_i2c_client_unregister (struct i2c_client *client)
777 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
780 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
782 mutex_lock(&zr->resource_lock);
786 goto clientunreg_unlock_and_return;
789 /* try to locate it */
790 if (client == zr->encoder) {
792 } else if (client == zr->decoder) {
794 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
796 clientunreg_unlock_and_return:
797 mutex_unlock(&zr->resource_lock);
801 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
802 .setsda = zoran_i2c_setsda,
803 .setscl = zoran_i2c_setscl,
804 .getsda = zoran_i2c_getsda,
805 .getscl = zoran_i2c_getscl,
811 zoran_register_i2c (struct zoran *zr)
813 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
814 sizeof(struct i2c_algo_bit_data));
815 zr->i2c_algo.data = zr;
816 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
817 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
818 zr->i2c_adapter.client_register = zoran_i2c_client_register;
819 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
820 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
821 sizeof(zr->i2c_adapter.name));
822 i2c_set_adapdata(&zr->i2c_adapter, zr);
823 zr->i2c_adapter.algo_data = &zr->i2c_algo;
824 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
825 return i2c_bit_add_bus(&zr->i2c_adapter);
829 zoran_unregister_i2c (struct zoran *zr)
831 i2c_del_adapter(&zr->i2c_adapter);
834 /* Check a zoran_params struct for correctness, insert default params */
837 zoran_check_jpg_settings (struct zoran *zr,
838 struct zoran_jpg_settings *settings)
840 int err = 0, err0 = 0;
844 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
845 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
846 settings->VerDcm, settings->TmpDcm);
849 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
850 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
851 settings->img_width, settings->img_height);
852 /* Check decimation, set default values for decimation = 1, 2, 4 */
853 switch (settings->decimation) {
856 settings->HorDcm = 1;
857 settings->VerDcm = 1;
858 settings->TmpDcm = 1;
859 settings->field_per_buff = 2;
862 settings->img_width = BUZ_MAX_WIDTH;
863 settings->img_height = BUZ_MAX_HEIGHT / 2;
867 settings->HorDcm = 2;
868 settings->VerDcm = 1;
869 settings->TmpDcm = 2;
870 settings->field_per_buff = 1;
871 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
873 settings->img_width =
874 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
875 settings->img_height = BUZ_MAX_HEIGHT / 2;
879 if (zr->card.type == DC10_new) {
882 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
888 settings->HorDcm = 4;
889 settings->VerDcm = 2;
890 settings->TmpDcm = 2;
891 settings->field_per_buff = 1;
892 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
894 settings->img_width =
895 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
896 settings->img_height = BUZ_MAX_HEIGHT / 2;
900 /* We have to check the data the user has set */
902 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
903 (zr->card.type == DC10_new || settings->HorDcm != 4))
905 if (settings->VerDcm != 1 && settings->VerDcm != 2)
907 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
909 if (settings->field_per_buff != 1 &&
910 settings->field_per_buff != 2)
912 if (settings->img_x < 0)
914 if (settings->img_y < 0)
916 if (settings->img_width < 0)
918 if (settings->img_height < 0)
920 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
922 if (settings->img_y + settings->img_height >
925 if (settings->HorDcm && settings->VerDcm) {
926 if (settings->img_width %
927 (16 * settings->HorDcm) != 0)
929 if (settings->img_height %
930 (8 * settings->VerDcm) != 0)
937 "%s: check_jpg_settings() - error in params for decimation = 0\n",
945 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
946 ZR_DEVNAME(zr), settings->decimation);
951 if (settings->jpg_comp.quality > 100)
952 settings->jpg_comp.quality = 100;
953 if (settings->jpg_comp.quality < 5)
954 settings->jpg_comp.quality = 5;
955 if (settings->jpg_comp.APPn < 0)
956 settings->jpg_comp.APPn = 0;
957 if (settings->jpg_comp.APPn > 15)
958 settings->jpg_comp.APPn = 15;
959 if (settings->jpg_comp.APP_len < 0)
960 settings->jpg_comp.APP_len = 0;
961 if (settings->jpg_comp.APP_len > 60)
962 settings->jpg_comp.APP_len = 60;
963 if (settings->jpg_comp.COM_len < 0)
964 settings->jpg_comp.COM_len = 0;
965 if (settings->jpg_comp.COM_len > 60)
966 settings->jpg_comp.COM_len = 60;
973 zoran_open_init_params (struct zoran *zr)
977 /* User must explicitly set a window */
978 zr->overlay_settings.is_set = 0;
979 zr->overlay_mask = NULL;
980 zr->overlay_active = ZORAN_FREE;
982 zr->v4l_memgrab_active = 0;
983 zr->v4l_overlay_active = 0;
984 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
985 zr->v4l_grab_seq = 0;
986 zr->v4l_settings.width = 192;
987 zr->v4l_settings.height = 144;
988 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
989 zr->v4l_settings.bytesperline =
990 zr->v4l_settings.width *
991 ((zr->v4l_settings.format->depth + 7) / 8);
993 /* DMA ring stuff for V4L */
994 zr->v4l_pend_tail = 0;
995 zr->v4l_pend_head = 0;
996 zr->v4l_sync_tail = 0;
997 zr->v4l_buffers.active = ZORAN_FREE;
998 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
999 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1001 zr->v4l_buffers.allocated = 0;
1003 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1004 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1006 zr->jpg_buffers.active = ZORAN_FREE;
1007 zr->jpg_buffers.allocated = 0;
1008 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1009 zr->jpg_settings.decimation = 1;
1010 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1011 if (zr->card.type != BUZ)
1012 zr->jpg_settings.odd_even = 1;
1014 zr->jpg_settings.odd_even = 0;
1015 zr->jpg_settings.jpg_comp.APPn = 0;
1016 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1017 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1018 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1019 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1020 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1021 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1022 zr->jpg_settings.jpg_comp.jpeg_markers =
1023 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1024 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1028 "%s: zoran_open_init_params() internal error\n",
1031 clear_interrupt_counters(zr);
1035 static void __devinit
1036 test_interrupts (struct zoran *zr)
1041 clear_interrupt_counters(zr);
1044 icr = btread(ZR36057_ICR);
1045 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1046 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1047 timeout = schedule_timeout(HZ);
1048 finish_wait(&zr->test_q, &wait);
1049 btwrite(0, ZR36057_ICR);
1050 btwrite(0x78000000, ZR36057_ISR);
1052 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1054 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1056 if (zr36067_debug > 1)
1057 print_interrupts(zr);
1058 btwrite(icr, ZR36057_ICR);
1061 static int __devinit
1062 zr36057_init (struct zoran *zr)
1070 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1071 ZR_DEVNAME(zr), zr->id, zr);
1073 /* default setup of all parameters which will persist between opens */
1076 init_waitqueue_head(&zr->v4l_capq);
1077 init_waitqueue_head(&zr->jpg_capq);
1078 init_waitqueue_head(&zr->test_q);
1079 zr->jpg_buffers.allocated = 0;
1080 zr->v4l_buffers.allocated = 0;
1082 zr->buffer.base = (void *) vidmem;
1083 zr->buffer.width = 0;
1084 zr->buffer.height = 0;
1085 zr->buffer.depth = 0;
1086 zr->buffer.bytesperline = 0;
1088 /* Avoid nonsense settings from user for default input/norm */
1089 if (default_norm < VIDEO_MODE_PAL &&
1090 default_norm > VIDEO_MODE_SECAM)
1091 default_norm = VIDEO_MODE_PAL;
1092 zr->norm = default_norm;
1093 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1096 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1098 zr->norm = VIDEO_MODE_PAL;
1099 zr->timing = zr->card.tvn[zr->norm];
1102 if (default_input > zr->card.inputs-1) {
1105 "%s: default_input value %d out of range (0-%d)\n",
1106 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1109 zr->input = default_input;
1111 /* Should the following be reset at every open ? */
1113 zr->contrast = 32768;
1114 zr->saturation = 32768;
1115 zr->brightness = 32768;
1117 /* default setup (will be repeated at every open) */
1118 zoran_open_init_params(zr);
1120 /* allocate memory *before* doing anything to the hardware
1121 * in case allocation fails */
1122 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1123 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1124 if (!zr->stat_com || !zr->video_dev) {
1127 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1132 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1133 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1137 * Now add the template and register the device unit.
1139 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1140 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1141 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1144 video_set_drvdata(zr->video_dev, zr);
1146 zoran_init_hardware(zr);
1147 if (zr36067_debug > 2)
1148 detect_guest_activity(zr);
1149 test_interrupts(zr);
1150 if (!pass_through) {
1151 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1152 encoder_command(zr, ENCODER_SET_INPUT, &two);
1155 zr->zoran_proc = NULL;
1156 zr->initialized = 1;
1160 kfree(zr->stat_com);
1161 kfree(zr->video_dev);
1165 static void __devexit zoran_remove(struct pci_dev *pdev)
1167 struct zoran *zr = pci_get_drvdata(pdev);
1169 if (!zr->initialized)
1172 /* unregister videocodec bus */
1174 struct videocodec_master *master = zr->codec->master_data;
1176 videocodec_detach(zr->codec);
1180 struct videocodec_master *master = zr->vfe->master_data;
1182 videocodec_detach(zr->vfe);
1186 /* unregister i2c bus */
1187 zoran_unregister_i2c(zr);
1188 /* disable PCI bus-mastering */
1189 zoran_set_pci_master(zr, 0);
1190 /* put chip into reset */
1191 btwrite(0, ZR36057_SPGPPCR);
1192 free_irq(zr->pci_dev->irq, zr);
1193 /* unmap and free memory */
1194 kfree(zr->stat_com);
1195 zoran_proc_cleanup(zr);
1196 iounmap(zr->zr36057_mem);
1197 pci_disable_device(zr->pci_dev);
1198 video_unregister_device(zr->video_dev);
1200 pci_set_drvdata(pdev, NULL);
1205 zoran_vdev_release (struct video_device *vdev)
1210 static struct videocodec_master * __devinit
1211 zoran_setup_videocodec (struct zoran *zr,
1214 struct videocodec_master *m = NULL;
1216 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1220 "%s: zoran_setup_videocodec() - no memory\n",
1225 /* magic and type are unused for master struct. Makes sense only at
1227 In the past, .type were initialized to the old V4L1 .hardware
1228 value, as VID_HARDWARE_ZR36067
1233 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1234 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1239 case CODEC_TYPE_ZR36060:
1240 m->readreg = zr36060_read;
1241 m->writereg = zr36060_write;
1242 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1244 case CODEC_TYPE_ZR36050:
1245 m->readreg = zr36050_read;
1246 m->writereg = zr36050_write;
1247 m->flags |= CODEC_FLAG_JPEG;
1249 case CODEC_TYPE_ZR36016:
1250 m->readreg = zr36016_read;
1251 m->writereg = zr36016_write;
1252 m->flags |= CODEC_FLAG_VFE;
1260 * Scan for a Buz card (actually for the PCI controller ZR36057),
1261 * request the irq and map the io memory
1263 static int __devinit zoran_probe(struct pci_dev *pdev,
1264 const struct pci_device_id *ent)
1266 unsigned char latency, need_latency;
1269 struct videocodec_master *master_vfe = NULL;
1270 struct videocodec_master *master_codec = NULL;
1272 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1277 if (nr >= BUZ_MAX) {
1280 "%s: driver limited to %d card(s) maximum\n",
1281 ZORAN_NAME, BUZ_MAX);
1285 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1289 "%s: find_zr36057() - kzalloc failed\n",
1295 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1296 spin_lock_init(&zr->spinlock);
1297 mutex_init(&zr->resource_lock);
1298 if (pci_enable_device(pdev))
1300 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
1304 "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
1305 ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
1306 zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
1307 if (zr->revision >= 2) {
1310 "%s: Subsystem vendor=0x%04x id=0x%04x\n",
1311 ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1312 zr->pci_dev->subsystem_device);
1315 /* Use auto-detected card type? */
1316 if (card[nr] == -1) {
1317 if (zr->revision < 2) {
1320 "%s: No card type specified, please use the card=X module parameter\n",
1324 "%s: It is not possible to auto-detect ZR36057 based cards\n",
1329 card_num = ent->driver_data;
1330 if (card_num >= NUM_CARDS) {
1333 "%s: Unknown card, try specifying card=X module parameter\n",
1339 "%s: %s() - card %s detected\n",
1340 ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1342 card_num = card[nr];
1343 if (card_num >= NUM_CARDS || card_num < 0) {
1346 "%s: User specified card type %d out of range (0 .. %d)\n",
1347 ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1352 /* even though we make this a non pointer and thus
1353 * theoretically allow for making changes to this struct
1354 * on a per-individual card basis at runtime, this is
1355 * strongly discouraged. This structure is intended to
1356 * keep general card information, no settings or anything */
1357 zr->card = zoran_cards[card_num];
1358 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1359 "%s[%u]", zr->card.name, zr->id);
1361 zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
1362 if (!zr->zr36057_mem) {
1365 "%s: %s() - ioremap failed\n",
1366 ZR_DEVNAME(zr), __func__);
1370 result = request_irq(zr->pci_dev->irq, zoran_irq,
1371 IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1373 if (result == -EINVAL) {
1376 "%s: find_zr36057() - bad irq number or handler\n",
1378 } else if (result == -EBUSY) {
1381 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1382 ZR_DEVNAME(zr), zr->pci_dev->irq);
1386 "%s: find_zr36057() - can't assign irq, error code %d\n",
1387 ZR_DEVNAME(zr), result);
1392 /* set PCI latency timer */
1393 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1395 need_latency = zr->revision > 1 ? 32 : 48;
1396 if (latency != need_latency) {
1399 "%s: Changing PCI latency from %d to %d\n",
1400 ZR_DEVNAME(zr), latency, need_latency);
1401 pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1405 zr36057_restart(zr);
1407 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1411 if (decoder[zr->id] != -1) {
1412 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1413 zr->card.i2c_decoder = decoder[zr->id];
1414 } else if (zr->card.i2c_decoder != 0) {
1415 i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
1417 i2c_dec_name = NULL;
1421 result = request_module(i2c_dec_name);
1425 "%s: failed to load module %s: %d\n",
1426 ZR_DEVNAME(zr), i2c_dec_name, result);
1431 if (encoder[zr->id] != -1) {
1432 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1433 zr->card.i2c_encoder = encoder[zr->id];
1434 } else if (zr->card.i2c_encoder != 0) {
1435 i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
1437 i2c_enc_name = NULL;
1441 result = request_module(i2c_enc_name);
1445 "%s: failed to load module %s: %d\n",
1446 ZR_DEVNAME(zr), i2c_enc_name, result);
1450 if (zoran_register_i2c(zr) < 0) {
1453 "%s: find_zr36057() - can't initialize i2c bus\n",
1459 KERN_INFO "%s: Initializing videocodec bus...\n",
1462 if (zr->card.video_codec) {
1463 codec_name = codecid_to_modulename(zr->card.video_codec);
1465 result = request_module(codec_name);
1469 "%s: failed to load modules %s: %d\n",
1470 ZR_DEVNAME(zr), codec_name, result);
1474 if (zr->card.video_vfe) {
1475 vfe_name = codecid_to_modulename(zr->card.video_vfe);
1477 result = request_module(vfe_name);
1481 "%s: failed to load modules %s: %d\n",
1482 ZR_DEVNAME(zr), vfe_name, result);
1487 /* reset JPEG codec */
1488 jpeg_codec_sleep(zr, 1);
1489 jpeg_codec_reset(zr);
1490 /* video bus enabled */
1491 /* display codec revision */
1492 if (zr->card.video_codec != 0) {
1493 master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1496 zr->codec = videocodec_attach(master_codec);
1500 "%s: find_zr36057() - no codec found\n",
1504 if (zr->codec->type != zr->card.video_codec) {
1507 "%s: find_zr36057() - wrong codec\n",
1509 goto zr_detach_codec;
1512 if (zr->card.video_vfe != 0) {
1513 master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1515 goto zr_detach_codec;
1516 zr->vfe = videocodec_attach(master_vfe);
1520 "%s: find_zr36057() - no VFE found\n",
1524 if (zr->vfe->type != zr->card.video_vfe) {
1527 "%s: find_zr36057() = wrong VFE\n",
1533 /* take care of Natoma chipset and a revision 1 zr36057 */
1534 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1535 zr->jpg_buffers.need_contiguous = 1;
1538 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1542 if (zr36057_init(zr) < 0)
1545 zoran_proc_init(zr);
1547 pci_set_drvdata(pdev, zr);
1552 videocodec_detach(zr->vfe);
1556 videocodec_detach(zr->codec);
1558 kfree(master_codec);
1560 zoran_unregister_i2c(zr);
1562 btwrite(0, ZR36057_SPGPPCR);
1563 free_irq(zr->pci_dev->irq, zr);
1565 iounmap(zr->zr36057_mem);
1572 static struct pci_driver zoran_driver = {
1574 .id_table = zr36067_pci_tbl,
1575 .probe = zoran_probe,
1576 .remove = zoran_remove,
1579 static int __init zoran_init(void)
1583 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1584 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1586 /* check the parameters we have been given, adjust if necessary */
1589 if (v4l_nbufs > VIDEO_MAX_FRAME)
1590 v4l_nbufs = VIDEO_MAX_FRAME;
1591 /* The user specfies the in KB, we want them in byte
1592 * (and page aligned) */
1593 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1594 if (v4l_bufsize < 32768)
1595 v4l_bufsize = 32768;
1596 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1597 if (v4l_bufsize > 2048 * 1024)
1598 v4l_bufsize = 2048 * 1024;
1601 if (jpg_nbufs > BUZ_MAX_FRAME)
1602 jpg_nbufs = BUZ_MAX_FRAME;
1603 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1604 if (jpg_bufsize < 8192)
1606 if (jpg_bufsize > (512 * 1024))
1607 jpg_bufsize = 512 * 1024;
1608 /* Use parameter for vidmem or try to find a video card */
1612 "%s: Using supplied video memory base address @ 0x%lx\n",
1613 ZORAN_NAME, vidmem);
1616 /* random nonsense */
1617 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
1619 /* some mainboards might not do PCI-PCI data transfer well */
1620 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1623 "%s: chipset does not support reliable PCI-PCI DMA\n",
1627 res = pci_register_driver(&zoran_driver);
1631 "%s: Unable to register ZR36057 driver\n",
1639 static void __exit zoran_exit(void)
1641 pci_unregister_driver(&zoran_driver);
1644 module_init(zoran_init);
1645 module_exit(zoran_exit);