blob: 117650fecd897c4441a46ce2bc110a1f61b55ac4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Zoran zr36057/zr36067 PCI controller driver, for the
3 * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4 * Media Labs LML33/LML33R10.
5 *
6 * This part handles card-specific data and detection
Mauro Carvalho Chehabd56410e2006-03-25 09:19:53 -03007 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
9 *
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>
14 *
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.
19 *
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.
24 *
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.
28 */
29
Martin Samuelssonfbe60da2006-04-27 10:17:00 -030030#include <linux/delay.h>
31
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/types.h>
33#include <linux/kernel.h>
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/vmalloc.h>
37
38#include <linux/proc_fs.h>
39#include <linux/i2c.h>
40#include <linux/i2c-algo-bit.h>
41#include <linux/videodev.h>
Mauro Carvalho Chehab5e87efa2006-06-05 10:26:32 -030042#include <media/v4l2-common.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <linux/spinlock.h>
44#include <linux/sem.h>
45#include <linux/kmod.h>
46#include <linux/wait.h>
47
48#include <linux/pci.h>
49#include <linux/interrupt.h>
50#include <linux/video_decoder.h>
51#include <linux/video_encoder.h>
Ingo Molnar384c3682006-03-22 03:54:16 -030052#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
54#include <asm/io.h>
55
56#include "videocodec.h"
57#include "zoran.h"
58#include "zoran_card.h"
59#include "zoran_device.h"
60#include "zoran_procfs.h"
61
Linus Torvalds1da177e2005-04-16 15:20:36 -070062extern const struct zoran_format zoran_formats[];
63
Trent Piepho45bdcef2009-01-12 13:09:46 -030064static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030065module_param_array(card, int, NULL, 0444);
Trent Piepho45bdcef2009-01-12 13:09:46 -030066MODULE_PARM_DESC(card, "Card type");
Linus Torvalds1da177e2005-04-16 15:20:36 -070067
Trent Piepho45bdcef2009-01-12 13:09:46 -030068static int encoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030069module_param_array(encoder, int, NULL, 0444);
Trent Piepho45bdcef2009-01-12 13:09:46 -030070MODULE_PARM_DESC(encoder, "Video encoder chip");
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
Trent Piepho45bdcef2009-01-12 13:09:46 -030072static int decoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030073module_param_array(decoder, int, NULL, 0444);
Trent Piepho45bdcef2009-01-12 13:09:46 -030074MODULE_PARM_DESC(decoder, "Video decoder chip");
Linus Torvalds1da177e2005-04-16 15:20:36 -070075
76/*
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
82 */
83
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030084static unsigned long vidmem; /* default = 0 - Video memory base address */
Trent Piepho60e3cac2007-07-17 18:29:42 -030085module_param(vidmem, ulong, 0444);
86MODULE_PARM_DESC(vidmem, "Default video memory base address");
Linus Torvalds1da177e2005-04-16 15:20:36 -070087
88/*
89 Default input and video norm at startup of the driver.
90*/
91
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030092static unsigned int default_input; /* default 0 = Composite, 1 = S-Video */
Trent Piepho60e3cac2007-07-17 18:29:42 -030093module_param(default_input, uint, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094MODULE_PARM_DESC(default_input,
95 "Default input (0=Composite, 1=S-Video, 2=Internal)");
96
Martin Samuelssonfbe60da2006-04-27 10:17:00 -030097static int default_mux = 1; /* 6 Eyes input selection */
Trent Piepho60e3cac2007-07-17 18:29:42 -030098module_param(default_mux, int, 0644);
Martin Samuelssonfbe60da2006-04-27 10:17:00 -030099MODULE_PARM_DESC(default_mux,
100 "Default 6 Eyes mux setting (Input selection)");
101
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -0300102static int default_norm; /* default 0 = PAL, 1 = NTSC 2 = SECAM */
Trent Piepho60e3cac2007-07-17 18:29:42 -0300103module_param(default_norm, int, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
105
Trent Piepho60e3cac2007-07-17 18:29:42 -0300106/* /dev/videoN, -1 for autodetect */
Trent Piepho45bdcef2009-01-12 13:09:46 -0300107static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -0300108module_param_array(video_nr, int, NULL, 0444);
Trent Piepho45bdcef2009-01-12 13:09:46 -0300109MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
111/*
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>).
117
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.
123
124 v4l_bufsize has to be given in KB !
125
126*/
127
128int v4l_nbufs = 2;
129int v4l_bufsize = 128; /* Everybody should be able to work with this setting */
Trent Piepho60e3cac2007-07-17 18:29:42 -0300130module_param(v4l_nbufs, int, 0644);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131MODULE_PARM_DESC(v4l_nbufs, "Maximum number of V4L buffers to use");
Trent Piepho60e3cac2007-07-17 18:29:42 -0300132module_param(v4l_bufsize, int, 0644);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133MODULE_PARM_DESC(v4l_bufsize, "Maximum size per V4L buffer (in kB)");
134
135int jpg_nbufs = 32;
136int jpg_bufsize = 512; /* max size for 100% quality full-PAL frame */
Trent Piepho60e3cac2007-07-17 18:29:42 -0300137module_param(jpg_nbufs, int, 0644);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138MODULE_PARM_DESC(jpg_nbufs, "Maximum number of JPG buffers to use");
Trent Piepho60e3cac2007-07-17 18:29:42 -0300139module_param(jpg_bufsize, int, 0644);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140MODULE_PARM_DESC(jpg_bufsize, "Maximum size per JPG buffer (in kB)");
141
142int 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) */
Trent Piepho60e3cac2007-07-17 18:29:42 -0300144module_param(pass_through, int, 0644);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145MODULE_PARM_DESC(pass_through,
146 "Pass TV signal through to TV-out when idling");
147
Jean Delvare18b548c2007-07-17 18:29:41 -0300148int zr36067_debug = 1;
149module_param_named(debug, zr36067_debug, int, 0644);
150MODULE_PARM_DESC(debug, "Debug level (0-5)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151
152MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
153MODULE_AUTHOR("Serguei Miridonov");
154MODULE_LICENSE("GPL");
155
Mauro Carvalho Chehabdbdf03b2009-01-08 23:27:32 -0300156static struct pci_device_id zr36067_pci_tbl[] = {
Trent Piepho66aa66ea32009-01-11 12:02:54 -0300157 { PCI_DEVICE(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057), },
Mauro Carvalho Chehabdbdf03b2009-01-08 23:27:32 -0300158 {0}
159};
160MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161
Trent Piepho601139e2009-01-12 13:09:46 -0300162static unsigned int zoran_num; /* number of cards found */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163
164/* videocodec bus functions ZR36060 */
165static u32
166zr36060_read (struct videocodec *codec,
167 u16 reg)
168{
169 struct zoran *zr = (struct zoran *) codec->master_data->data;
170 __u32 data;
171
172 if (post_office_wait(zr)
173 || post_office_write(zr, 0, 1, reg >> 8)
174 || post_office_write(zr, 0, 2, reg & 0xff)) {
175 return -1;
176 }
177
178 data = post_office_read(zr, 0, 3) & 0xff;
179 return data;
180}
181
182static void
183zr36060_write (struct videocodec *codec,
184 u16 reg,
185 u32 val)
186{
187 struct zoran *zr = (struct zoran *) codec->master_data->data;
188
189 if (post_office_wait(zr)
190 || post_office_write(zr, 0, 1, reg >> 8)
191 || post_office_write(zr, 0, 2, reg & 0xff)) {
192 return;
193 }
194
195 post_office_write(zr, 0, 3, val & 0xff);
196}
197
198/* videocodec bus functions ZR36050 */
199static u32
200zr36050_read (struct videocodec *codec,
201 u16 reg)
202{
203 struct zoran *zr = (struct zoran *) codec->master_data->data;
204 __u32 data;
205
206 if (post_office_wait(zr)
207 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
208 return -1;
209 }
210
211 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
212 return data;
213}
214
215static void
216zr36050_write (struct videocodec *codec,
217 u16 reg,
218 u32 val)
219{
220 struct zoran *zr = (struct zoran *) codec->master_data->data;
221
222 if (post_office_wait(zr)
223 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
224 return;
225 }
226
227 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
228}
229
230/* videocodec bus functions ZR36016 */
231static u32
232zr36016_read (struct videocodec *codec,
233 u16 reg)
234{
235 struct zoran *zr = (struct zoran *) codec->master_data->data;
236 __u32 data;
237
238 if (post_office_wait(zr)) {
239 return -1;
240 }
241
242 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
243 return data;
244}
245
246/* hack for in zoran_device.c */
247void
248zr36016_write (struct videocodec *codec,
249 u16 reg,
250 u32 val)
251{
252 struct zoran *zr = (struct zoran *) codec->master_data->data;
253
254 if (post_office_wait(zr)) {
255 return;
256 }
257
258 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
259}
260
261/*
262 * Board specific information
263 */
264
265static void
266dc10_init (struct zoran *zr)
267{
268 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
269
270 /* Pixel clock selection */
271 GPIO(zr, 4, 0);
272 GPIO(zr, 5, 1);
273 /* Enable the video bus sync signals */
274 GPIO(zr, 7, 0);
275}
276
277static void
278dc10plus_init (struct zoran *zr)
279{
280 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
281}
282
283static void
284buz_init (struct zoran *zr)
285{
286 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
287
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);
292}
293
294static void
295lml33_init (struct zoran *zr)
296{
297 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
298
299 GPIO(zr, 2, 1); // Set Composite input/output
300}
301
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300302static void
303avs6eyes_init (struct zoran *zr)
304{
305 // AverMedia 6-Eyes original driver by Christer Weinigel
306
307 // Lifted straight from Christer's old driver and
308 // modified slightly by Martin Samuelsson.
309
310 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
311
312 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
313 udelay(2);
314
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 */
323
324}
325
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326static char *
327i2cid_to_modulename (u16 i2c_id)
328{
329 char *name = NULL;
330
331 switch (i2c_id) {
332 case I2C_DRIVERID_SAA7110:
333 name = "saa7110";
334 break;
335 case I2C_DRIVERID_SAA7111A:
336 name = "saa7111";
337 break;
338 case I2C_DRIVERID_SAA7114:
339 name = "saa7114";
340 break;
341 case I2C_DRIVERID_SAA7185B:
342 name = "saa7185";
343 break;
344 case I2C_DRIVERID_ADV7170:
345 name = "adv7170";
346 break;
347 case I2C_DRIVERID_ADV7175:
348 name = "adv7175";
349 break;
350 case I2C_DRIVERID_BT819:
351 name = "bt819";
352 break;
353 case I2C_DRIVERID_BT856:
354 name = "bt856";
355 break;
Martin Samuelssoned1aedb2008-07-14 09:28:59 -0300356 case I2C_DRIVERID_BT866:
357 name = "bt866";
358 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 case I2C_DRIVERID_VPX3220:
360 name = "vpx3220";
361 break;
Martin Samuelssoned1aedb2008-07-14 09:28:59 -0300362 case I2C_DRIVERID_KS0127:
363 name = "ks0127";
364 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 }
366
367 return name;
368}
369
370static char *
371codecid_to_modulename (u16 codecid)
372{
373 char *name = NULL;
374
375 switch (codecid) {
376 case CODEC_TYPE_ZR36060:
377 name = "zr36060";
378 break;
379 case CODEC_TYPE_ZR36050:
380 name = "zr36050";
381 break;
382 case CODEC_TYPE_ZR36016:
383 name = "zr36016";
384 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 }
386
387 return name;
388}
389
390// struct tvnorm {
391// u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
392// };
393
394static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
395static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
396static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
397static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
398
399static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
400static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
401
402/* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
403static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
404static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
405
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>) */
409static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
410static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
411
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300412/* 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.
414 *
415 * Christer's driver used the unshifted norms, though...
416 * /Sam */
417static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
418static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
419
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
421 {
422 .type = DC10_old,
423 .name = "DC10(old)",
424 .i2c_decoder = I2C_DRIVERID_VPX3220,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 .video_codec = CODEC_TYPE_ZR36050,
426 .video_vfe = CODEC_TYPE_ZR36016,
427
428 .inputs = 3,
429 .input = {
430 { 1, "Composite" },
431 { 2, "S-Video" },
432 { 0, "Internal/comp" }
433 },
434 .norms = 3,
435 .tvn = {
436 &f50sqpixel_dc10,
437 &f60sqpixel_dc10,
438 &f50sqpixel_dc10
439 },
440 .jpeg_int = 0,
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 },
444 .gpcs = { -1, 0 },
445 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
446 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300447 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 .init = &dc10_init,
449 }, {
450 .type = DC10_new,
451 .name = "DC10(new)",
452 .i2c_decoder = I2C_DRIVERID_SAA7110,
453 .i2c_encoder = I2C_DRIVERID_ADV7175,
454 .video_codec = CODEC_TYPE_ZR36060,
455
456 .inputs = 3,
457 .input = {
458 { 0, "Composite" },
459 { 7, "S-Video" },
460 { 5, "Internal/comp" }
461 },
462 .norms = 3,
463 .tvn = {
464 &f50sqpixel,
465 &f60sqpixel,
466 &f50sqpixel},
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 },
471 .gpcs = { -1, 1},
472 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
473 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300474 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 .init = &dc10plus_init,
476 }, {
477 .type = DC10plus,
478 .name = "DC10plus",
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,
484
485 .inputs = 3,
486 .input = {
487 { 0, "Composite" },
488 { 7, "S-Video" },
489 { 5, "Internal/comp" }
490 },
491 .norms = 3,
492 .tvn = {
493 &f50sqpixel,
494 &f60sqpixel,
495 &f50sqpixel
496 },
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 },
501 .gpcs = { -1, 1 },
502 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
503 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300504 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 .init = &dc10plus_init,
506 }, {
507 .type = DC30,
508 .name = "DC30",
509 .i2c_decoder = I2C_DRIVERID_VPX3220,
510 .i2c_encoder = I2C_DRIVERID_ADV7175,
511 .video_codec = CODEC_TYPE_ZR36050,
512 .video_vfe = CODEC_TYPE_ZR36016,
513
514 .inputs = 3,
515 .input = {
516 { 1, "Composite" },
517 { 2, "S-Video" },
518 { 0, "Internal/comp" }
519 },
520 .norms = 3,
521 .tvn = {
522 &f50sqpixel_dc10,
523 &f60sqpixel_dc10,
524 &f50sqpixel_dc10
525 },
526 .jpeg_int = 0,
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 },
530 .gpcs = { -1, 0 },
531 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
532 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300533 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 .init = &dc10_init,
535 }, {
536 .type = DC30plus,
537 .name = "DC30plus",
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,
544
545 .inputs = 3,
546 .input = {
547 { 1, "Composite" },
548 { 2, "S-Video" },
549 { 0, "Internal/comp" }
550 },
551 .norms = 3,
552 .tvn = {
553 &f50sqpixel_dc10,
554 &f60sqpixel_dc10,
555 &f50sqpixel_dc10
556 },
557 .jpeg_int = 0,
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 },
561 .gpcs = { -1, 0 },
562 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
563 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300564 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 .init = &dc10_init,
566 }, {
567 .type = LML33,
568 .name = "LML33",
569 .i2c_decoder = I2C_DRIVERID_BT819,
570 .i2c_encoder = I2C_DRIVERID_BT856,
571 .video_codec = CODEC_TYPE_ZR36060,
572
573 .inputs = 2,
574 .input = {
575 { 0, "Composite" },
576 { 7, "S-Video" }
577 },
578 .norms = 2,
579 .tvn = {
580 &f50ccir601_lml33,
581 &f60ccir601_lml33,
582 NULL
583 },
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 },
588 .gpcs = { 3, 1 },
589 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
590 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300591 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 .init = &lml33_init,
593 }, {
594 .type = LML33R10,
595 .name = "LML33R10",
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,
601
602 .inputs = 2,
603 .input = {
604 { 0, "Composite" },
605 { 7, "S-Video" }
606 },
607 .norms = 2,
608 .tvn = {
609 &f50ccir601_lm33r10,
610 &f60ccir601_lm33r10,
611 NULL
612 },
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 },
617 .gpcs = { 3, 1 },
618 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
619 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300620 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 .init = &lml33_init,
622 }, {
623 .type = BUZ,
624 .name = "Buz",
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,
630
631 .inputs = 2,
632 .input = {
633 { 3, "Composite" },
634 { 7, "S-Video" }
635 },
636 .norms = 3,
637 .tvn = {
638 &f50ccir601,
639 &f60ccir601,
640 &f50ccir601
641 },
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 },
646 .gpcs = { 3, 1 },
647 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
648 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300649 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 .init = &buz_init,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300651 }, {
652 .type = AVS6EYES,
653 .name = "6-Eyes",
654 /* AverMedia chose not to brand the 6-Eyes. Thus it
655 can't be autodetected, and requires card=x. */
656 .vendor_id = -1,
657 .device_id = -1,
658 .i2c_decoder = I2C_DRIVERID_KS0127,
659 .i2c_encoder = I2C_DRIVERID_BT866,
660 .video_codec = CODEC_TYPE_ZR36060,
661
662 .inputs = 10,
663 .input = {
664 { 0, "Composite 1" },
665 { 1, "Composite 2" },
666 { 2, "Composite 3" },
667 { 4, "Composite 4" },
668 { 5, "Composite 5" },
669 { 6, "Composite 6" },
670 { 8, "S-Video 1" },
671 { 9, "S-Video 2" },
672 {10, "S-Video 3" },
673 {15, "YCbCr" }
674 },
675 .norms = 2,
676 .tvn = {
677 &f50ccir601_avs6eyes,
678 &f60ccir601_avs6eyes,
679 NULL
680 },
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,
688 .input_mux = 1,
689 .init = &avs6eyes_init,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 }
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300691
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692};
693
694/*
695 * I2C functions
696 */
697/* software I2C functions */
698static int
699zoran_i2c_getsda (void *data)
700{
701 struct zoran *zr = (struct zoran *) data;
702
703 return (btread(ZR36057_I2CBR) >> 1) & 1;
704}
705
706static int
707zoran_i2c_getscl (void *data)
708{
709 struct zoran *zr = (struct zoran *) data;
710
711 return btread(ZR36057_I2CBR) & 1;
712}
713
714static void
715zoran_i2c_setsda (void *data,
716 int state)
717{
718 struct zoran *zr = (struct zoran *) data;
719
720 if (state)
721 zr->i2cbr |= 2;
722 else
723 zr->i2cbr &= ~2;
724 btwrite(zr->i2cbr, ZR36057_I2CBR);
725}
726
727static void
728zoran_i2c_setscl (void *data,
729 int state)
730{
731 struct zoran *zr = (struct zoran *) data;
732
733 if (state)
734 zr->i2cbr |= 1;
735 else
736 zr->i2cbr &= ~1;
737 btwrite(zr->i2cbr, ZR36057_I2CBR);
738}
739
740static int
741zoran_i2c_client_register (struct i2c_client *client)
742{
743 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
744 int res = 0;
745
746 dprintk(2,
747 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
748 ZR_DEVNAME(zr), client->driver->id);
749
Ingo Molnar384c3682006-03-22 03:54:16 -0300750 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751
752 if (zr->user > 0) {
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?)
756 */
757 res = -EBUSY;
758 goto clientreg_unlock_and_return;
759 }
760
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;
765 else {
766 res = -ENODEV;
767 goto clientreg_unlock_and_return;
768 }
769
770clientreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300771 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
773 return res;
774}
775
776static int
777zoran_i2c_client_unregister (struct i2c_client *client)
778{
779 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
780 int res = 0;
781
782 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
783
Ingo Molnar384c3682006-03-22 03:54:16 -0300784 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785
786 if (zr->user > 0) {
787 res = -EBUSY;
788 goto clientunreg_unlock_and_return;
789 }
790
791 /* try to locate it */
792 if (client == zr->encoder) {
793 zr->encoder = NULL;
794 } else if (client == zr->decoder) {
795 zr->decoder = NULL;
796 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
797 }
798clientunreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300799 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 return res;
801}
802
Jean Delvare62751632008-06-12 13:20:46 -0300803static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 .setsda = zoran_i2c_setsda,
805 .setscl = zoran_i2c_setscl,
806 .getsda = zoran_i2c_getsda,
807 .getscl = zoran_i2c_getscl,
808 .udelay = 10,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 .timeout = 100,
810};
811
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812static int
813zoran_register_i2c (struct zoran *zr)
814{
815 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
816 sizeof(struct i2c_algo_bit_data));
817 zr->i2c_algo.data = zr;
Jean Delvare54c776a2008-10-13 07:28:39 -0300818 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
Jean Delvare62751632008-06-12 13:20:46 -0300819 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));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 i2c_set_adapdata(&zr->i2c_adapter, zr);
825 zr->i2c_adapter.algo_data = &zr->i2c_algo;
Jean Delvare12a917f2007-02-13 22:09:03 +0100826 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 return i2c_bit_add_bus(&zr->i2c_adapter);
828}
829
830static void
831zoran_unregister_i2c (struct zoran *zr)
832{
Jean Delvare32697112006-12-10 21:21:33 +0100833 i2c_del_adapter(&zr->i2c_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834}
835
836/* Check a zoran_params struct for correctness, insert default params */
837
838int
839zoran_check_jpg_settings (struct zoran *zr,
840 struct zoran_jpg_settings *settings)
841{
842 int err = 0, err0 = 0;
843
844 dprintk(4,
845 KERN_DEBUG
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);
849 dprintk(4,
850 KERN_DEBUG
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) {
856 case 1:
857
858 settings->HorDcm = 1;
859 settings->VerDcm = 1;
860 settings->TmpDcm = 1;
861 settings->field_per_buff = 2;
862 settings->img_x = 0;
863 settings->img_y = 0;
864 settings->img_width = BUZ_MAX_WIDTH;
865 settings->img_height = BUZ_MAX_HEIGHT / 2;
866 break;
867 case 2:
868
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;
874 settings->img_y = 0;
875 settings->img_width =
876 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
877 settings->img_height = BUZ_MAX_HEIGHT / 2;
878 break;
879 case 4:
880
881 if (zr->card.type == DC10_new) {
882 dprintk(1,
883 KERN_DEBUG
884 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
885 ZR_DEVNAME(zr));
886 err0++;
887 break;
888 }
889
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;
895 settings->img_y = 0;
896 settings->img_width =
897 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
898 settings->img_height = BUZ_MAX_HEIGHT / 2;
899 break;
900 case 0:
901
902 /* We have to check the data the user has set */
903
904 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
905 (zr->card.type == DC10_new || settings->HorDcm != 4))
906 err0++;
907 if (settings->VerDcm != 1 && settings->VerDcm != 2)
908 err0++;
909 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
910 err0++;
911 if (settings->field_per_buff != 1 &&
912 settings->field_per_buff != 2)
913 err0++;
914 if (settings->img_x < 0)
915 err0++;
916 if (settings->img_y < 0)
917 err0++;
918 if (settings->img_width < 0)
919 err0++;
920 if (settings->img_height < 0)
921 err0++;
922 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
923 err0++;
924 if (settings->img_y + settings->img_height >
925 BUZ_MAX_HEIGHT / 2)
926 err0++;
927 if (settings->HorDcm && settings->VerDcm) {
928 if (settings->img_width %
929 (16 * settings->HorDcm) != 0)
930 err0++;
931 if (settings->img_height %
932 (8 * settings->VerDcm) != 0)
933 err0++;
934 }
935
936 if (err0) {
937 dprintk(1,
938 KERN_ERR
939 "%s: check_jpg_settings() - error in params for decimation = 0\n",
940 ZR_DEVNAME(zr));
941 err++;
942 }
943 break;
944 default:
945 dprintk(1,
946 KERN_ERR
947 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
948 ZR_DEVNAME(zr), settings->decimation);
949 err++;
950 break;
951 }
952
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;
969 if (err)
970 return -EINVAL;
971 return 0;
972}
973
974void
975zoran_open_init_params (struct zoran *zr)
976{
977 int i;
978
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;
983
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;
Jean Delvarec014ec92008-09-07 05:21:34 -0300990 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991 zr->v4l_settings.bytesperline =
992 zr->v4l_settings.width *
993 ((zr->v4l_settings.format->depth + 7) / 8);
994
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 */
1002 }
1003 zr->v4l_buffers.allocated = 0;
1004
1005 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1006 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1007 }
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;
1015 else
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);
1027 if (i)
1028 dprintk(1,
1029 KERN_ERR
1030 "%s: zoran_open_init_params() internal error\n",
1031 ZR_DEVNAME(zr));
1032
1033 clear_interrupt_counters(zr);
1034 zr->testing = 0;
1035}
1036
1037static void __devinit
1038test_interrupts (struct zoran *zr)
1039{
1040 DEFINE_WAIT(wait);
1041 int timeout, icr;
1042
1043 clear_interrupt_counters(zr);
1044
1045 zr->testing = 1;
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);
1053 zr->testing = 0;
1054 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1055 if (timeout) {
1056 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1057 }
Jean Delvare18b548c2007-07-17 18:29:41 -03001058 if (zr36067_debug > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 print_interrupts(zr);
1060 btwrite(icr, ZR36057_ICR);
1061}
1062
1063static int __devinit
1064zr36057_init (struct zoran *zr)
1065{
Jean Delvaredaf72f42006-03-22 03:48:37 -03001066 int j, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 int two = 2;
1068 int zero = 0;
1069
1070 dprintk(1,
1071 KERN_INFO
1072 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1073 ZR_DEVNAME(zr), zr->id, zr);
1074
1075 /* default setup of all parameters which will persist between opens */
1076 zr->user = 0;
1077
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;
1083
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;
1089
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])) {
1096 dprintk(1,
1097 KERN_WARNING
1098 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1099 ZR_DEVNAME(zr));
1100 zr->norm = VIDEO_MODE_PAL;
1101 zr->timing = zr->card.tvn[zr->norm];
1102 }
1103
Trent Piepho60e3cac2007-07-17 18:29:42 -03001104 if (default_input > zr->card.inputs-1) {
1105 dprintk(1,
1106 KERN_WARNING
1107 "%s: default_input value %d out of range (0-%d)\n",
1108 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1109 default_input = 0;
1110 }
1111 zr->input = default_input;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112
1113 /* Should the following be reset at every open ? */
1114 zr->hue = 32768;
1115 zr->contrast = 32768;
1116 zr->saturation = 32768;
1117 zr->brightness = 32768;
1118
1119 /* default setup (will be repeated at every open) */
1120 zoran_open_init_params(zr);
1121
1122 /* allocate memory *before* doing anything to the hardware
1123 * in case allocation fails */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001124 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) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 dprintk(1,
1128 KERN_ERR
1129 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1130 ZR_DEVNAME(zr));
Jean Delvaredaf72f42006-03-22 03:48:37 -03001131 err = -ENOMEM;
1132 goto exit_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
Al Viro9c169df2008-06-22 14:19:49 -03001135 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 }
1137
1138 /*
1139 * Now add the template and register the device unit.
1140 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1142 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
Trent Piepho60e3cac2007-07-17 18:29:42 -03001143 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
Jean Delvaredaf72f42006-03-22 03:48:37 -03001144 if (err < 0)
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001145 goto exit_free;
Trent Piepho601139e2009-01-12 13:09:46 -03001146 video_set_drvdata(zr->video_dev, zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147
1148 zoran_init_hardware(zr);
Jean Delvare18b548c2007-07-17 18:29:41 -03001149 if (zr36067_debug > 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 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);
1155 }
1156
1157 zr->zoran_proc = NULL;
1158 zr->initialized = 1;
1159 return 0;
Jean Delvaredaf72f42006-03-22 03:48:37 -03001160
Jean Delvaredaf72f42006-03-22 03:48:37 -03001161exit_free:
1162 kfree(zr->stat_com);
1163 kfree(zr->video_dev);
1164 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165}
1166
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001167static void __devexit zoran_remove(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001169 struct zoran *zr = pci_get_drvdata(pdev);
1170
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 if (!zr->initialized)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001172 goto exit_free;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001173
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 /* unregister videocodec bus */
1175 if (zr->codec) {
1176 struct videocodec_master *master = zr->codec->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001177
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 videocodec_detach(zr->codec);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001179 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 }
1181 if (zr->vfe) {
1182 struct videocodec_master *master = zr->vfe->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001183
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 videocodec_detach(zr->vfe);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001185 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186 }
1187
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 */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001196 kfree(zr->stat_com);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 zoran_proc_cleanup(zr);
1198 iounmap(zr->zr36057_mem);
1199 pci_disable_device(zr->pci_dev);
1200 video_unregister_device(zr->video_dev);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001201exit_free:
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001202 pci_set_drvdata(pdev, NULL);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001203 kfree(zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204}
1205
1206void
1207zoran_vdev_release (struct video_device *vdev)
1208{
1209 kfree(vdev);
1210}
1211
1212static struct videocodec_master * __devinit
1213zoran_setup_videocodec (struct zoran *zr,
1214 int type)
1215{
1216 struct videocodec_master *m = NULL;
1217
1218 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1219 if (!m) {
1220 dprintk(1,
1221 KERN_ERR
1222 "%s: zoran_setup_videocodec() - no memory\n",
1223 ZR_DEVNAME(zr));
1224 return m;
1225 }
1226
Mauro Carvalho Chehab22c4a4e2007-10-15 12:09:17 -03001227 /* magic and type are unused for master struct. Makes sense only at
1228 codec structs.
1229 In the past, .type were initialized to the old V4L1 .hardware
1230 value, as VID_HARDWARE_ZR36067
1231 */
1232 m->magic = 0L;
1233 m->type = 0;
1234
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1236 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1237 m->data = zr;
1238
1239 switch (type)
1240 {
1241 case CODEC_TYPE_ZR36060:
1242 m->readreg = zr36060_read;
1243 m->writereg = zr36060_write;
1244 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1245 break;
1246 case CODEC_TYPE_ZR36050:
1247 m->readreg = zr36050_read;
1248 m->writereg = zr36050_write;
1249 m->flags |= CODEC_FLAG_JPEG;
1250 break;
1251 case CODEC_TYPE_ZR36016:
1252 m->readreg = zr36016_read;
1253 m->writereg = zr36016_write;
1254 m->flags |= CODEC_FLAG_VFE;
1255 break;
1256 }
1257
1258 return m;
1259}
1260
1261/*
Joe Perchesc84e6032008-02-03 17:18:59 +02001262 * Scan for a Buz card (actually for the PCI controller ZR36057),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 * request the irq and map the io memory
1264 */
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001265static int __devinit zoran_probe(struct pci_dev *pdev,
1266 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267{
1268 unsigned char latency, need_latency;
1269 struct zoran *zr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270 int result;
1271 struct videocodec_master *master_vfe = NULL;
1272 struct videocodec_master *master_codec = NULL;
1273 int card_num;
1274 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001275 unsigned int nr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001277
Trent Piepho601139e2009-01-12 13:09:46 -03001278 nr = zoran_num++;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001279 if (nr >= BUZ_MAX) {
1280 dprintk(1,
1281 KERN_ERR
1282 "%s: driver limited to %d card(s) maximum\n",
1283 ZORAN_NAME, BUZ_MAX);
1284 return -ENOENT;
1285 }
1286
1287 card_num = card[nr];
1288 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1289 if (!zr) {
1290 dprintk(1,
1291 KERN_ERR
1292 "%s: find_zr36057() - kzalloc failed\n",
1293 ZORAN_NAME);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001294 return -ENOMEM;
1295 }
1296 zr->pci_dev = pdev;
1297 zr->id = nr;
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))
1302 goto zr_free_mem;
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) {
1306 dprintk(1,
1307 KERN_INFO
1308 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1309 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1310 zr->zr36057_adr);
1311
1312 if (card_num == -1) {
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001313 dprintk(1,
1314 KERN_ERR
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001315 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1316 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001317 goto zr_free_mem;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001318 }
1319 } else {
1320 int i;
1321 unsigned short ss_vendor, ss_device;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001323 ss_vendor = zr->pci_dev->subsystem_vendor;
1324 ss_device = zr->pci_dev->subsystem_device;
1325 dprintk(1,
1326 KERN_INFO
1327 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1328 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1329 zr->zr36057_adr);
1330 dprintk(1,
1331 KERN_INFO
1332 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1333 ZR_DEVNAME(zr), ss_vendor, ss_device);
1334 if (card_num == -1) {
1335 dprintk(3,
1336 KERN_DEBUG
1337 "%s: find_zr36057() - trying to autodetect card type\n",
1338 ZR_DEVNAME(zr));
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) {
1342 dprintk(3,
1343 KERN_DEBUG
1344 "%s: find_zr36057() - card %s detected\n",
1345 ZR_DEVNAME(zr),
1346 zoran_cards[i].name);
1347 card_num = i;
1348 break;
1349 }
1350 }
1351 if (i == NUM_CARDS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 dprintk(1,
1353 KERN_ERR
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001354 "%s: find_zr36057() - unknown card\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001356 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001359 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001361 if (card_num < 0 || card_num >= NUM_CARDS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 dprintk(2,
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001363 KERN_ERR
1364 "%s: find_zr36057() - invalid cardnum %d\n",
1365 ZR_DEVNAME(zr), card_num);
1366 goto zr_free_mem;
1367 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001369 /* 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);
1377
1378 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1379 if (!zr->zr36057_mem) {
1380 dprintk(1,
1381 KERN_ERR
1382 "%s: find_zr36057() - ioremap failed\n",
1383 ZR_DEVNAME(zr));
1384 goto zr_free_mem;
1385 }
1386
1387 result = request_irq(zr->pci_dev->irq, zoran_irq,
1388 IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1389 if (result < 0) {
1390 if (result == -EINVAL) {
1391 dprintk(1,
1392 KERN_ERR
1393 "%s: find_zr36057() - bad irq number or handler\n",
1394 ZR_DEVNAME(zr));
1395 } else if (result == -EBUSY) {
1396 dprintk(1,
1397 KERN_ERR
1398 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1399 ZR_DEVNAME(zr), zr->pci_dev->irq);
1400 } else {
1401 dprintk(1,
1402 KERN_ERR
1403 "%s: find_zr36057() - can't assign irq, error code %d\n",
1404 ZR_DEVNAME(zr), result);
1405 }
1406 goto zr_unmap;
1407 }
1408
1409 /* set PCI latency timer */
1410 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1411 &latency);
1412 need_latency = zr->revision > 1 ? 32 : 48;
1413 if (latency != need_latency) {
1414 dprintk(2,
1415 KERN_INFO
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,
1419 need_latency);
1420 }
1421
1422 zr36057_restart(zr);
1423 /* i2c */
1424 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1425 ZR_DEVNAME(zr));
1426
1427 /* i2c decoder */
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);
1433 } else {
1434 i2c_dec_name = NULL;
1435 }
1436
1437 if (i2c_dec_name) {
1438 result = request_module(i2c_dec_name);
1439 if (result < 0) {
1440 dprintk(1,
1441 KERN_ERR
1442 "%s: failed to load module %s: %d\n",
1443 ZR_DEVNAME(zr), i2c_dec_name, result);
1444 }
1445 }
1446
1447 /* i2c encoder */
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);
1453 } else {
1454 i2c_enc_name = NULL;
1455 }
1456
1457 if (i2c_enc_name) {
1458 result = request_module(i2c_enc_name);
1459 if (result < 0) {
1460 dprintk(1,
1461 KERN_ERR
1462 "%s: failed to load module %s: %d\n",
1463 ZR_DEVNAME(zr), i2c_enc_name, result);
1464 }
1465 }
1466
1467 if (zoran_register_i2c(zr) < 0) {
1468 dprintk(1,
1469 KERN_ERR
1470 "%s: find_zr36057() - can't initialize i2c bus\n",
1471 ZR_DEVNAME(zr));
1472 goto zr_free_irq;
1473 }
1474
1475 dprintk(2,
1476 KERN_INFO "%s: Initializing videocodec bus...\n",
1477 ZR_DEVNAME(zr));
1478
1479 if (zr->card.video_codec) {
1480 codec_name = codecid_to_modulename(zr->card.video_codec);
1481 if (codec_name) {
1482 result = request_module(codec_name);
1483 if (result) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 dprintk(1,
1485 KERN_ERR
1486 "%s: failed to load modules %s: %d\n",
1487 ZR_DEVNAME(zr), codec_name, result);
1488 }
1489 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001490 }
1491 if (zr->card.video_vfe) {
1492 vfe_name = codecid_to_modulename(zr->card.video_vfe);
1493 if (vfe_name) {
1494 result = request_module(vfe_name);
1495 if (result < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 dprintk(1,
1497 KERN_ERR
1498 "%s: failed to load modules %s: %d\n",
1499 ZR_DEVNAME(zr), vfe_name, result);
1500 }
1501 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 }
Alan Coxe491cbc2006-10-03 20:44:12 -03001503
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001504 /* 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);
1511 if (!master_codec)
1512 goto zr_unreg_i2c;
1513 zr->codec = videocodec_attach(master_codec);
1514 if (!zr->codec) {
1515 dprintk(1,
1516 KERN_ERR
1517 "%s: find_zr36057() - no codec found\n",
1518 ZR_DEVNAME(zr));
1519 goto zr_free_codec;
1520 }
1521 if (zr->codec->type != zr->card.video_codec) {
1522 dprintk(1,
1523 KERN_ERR
1524 "%s: find_zr36057() - wrong codec\n",
1525 ZR_DEVNAME(zr));
1526 goto zr_detach_codec;
1527 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001529 if (zr->card.video_vfe != 0) {
1530 master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1531 if (!master_vfe)
1532 goto zr_detach_codec;
1533 zr->vfe = videocodec_attach(master_vfe);
1534 if (!zr->vfe) {
1535 dprintk(1,
1536 KERN_ERR
1537 "%s: find_zr36057() - no VFE found\n",
1538 ZR_DEVNAME(zr));
1539 goto zr_free_vfe;
1540 }
1541 if (zr->vfe->type != zr->card.video_vfe) {
1542 dprintk(1,
1543 KERN_ERR
1544 "%s: find_zr36057() = wrong VFE\n",
1545 ZR_DEVNAME(zr));
1546 goto zr_detach_vfe;
1547 }
1548 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001549
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;
1553 dprintk(1,
1554 KERN_INFO
1555 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1556 ZR_DEVNAME(zr));
1557 }
1558
1559 if (zr36057_init(zr) < 0)
1560 goto zr_detach_vfe;
1561
1562 zoran_proc_init(zr);
1563
1564 pci_set_drvdata(pdev, zr);
1565
1566 return 0;
1567
1568zr_detach_vfe:
1569 videocodec_detach(zr->vfe);
1570zr_free_vfe:
1571 kfree(master_vfe);
1572zr_detach_codec:
1573 videocodec_detach(zr->codec);
1574zr_free_codec:
1575 kfree(master_codec);
1576zr_unreg_i2c:
1577 zoran_unregister_i2c(zr);
1578zr_free_irq:
1579 btwrite(0, ZR36057_SPGPPCR);
1580 free_irq(zr->pci_dev->irq, zr);
1581zr_unmap:
1582 iounmap(zr->zr36057_mem);
1583zr_free_mem:
1584 kfree(zr);
1585
1586 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587}
1588
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001589static struct pci_driver zoran_driver = {
1590 .name = "zr36067",
1591 .id_table = zr36067_pci_tbl,
1592 .probe = zoran_probe,
1593 .remove = zoran_remove,
1594};
1595
1596static int __init zoran_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001598 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1601 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1602
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603 /* check the parameters we have been given, adjust if necessary */
1604 if (v4l_nbufs < 2)
1605 v4l_nbufs = 2;
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;
1616 if (jpg_nbufs < 4)
1617 jpg_nbufs = 4;
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)
1622 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 */
1626 if (vidmem) {
1627 dprintk(1,
1628 KERN_INFO
1629 "%s: Using supplied video memory base address @ 0x%lx\n",
1630 ZORAN_NAME, vidmem);
1631 }
1632
1633 /* random nonsense */
Jean Delvare18b548c2007-07-17 18:29:41 -03001634 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635
1636 /* some mainboards might not do PCI-PCI data transfer well */
Alan Coxe3558802006-09-14 11:47:55 -03001637 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 dprintk(1,
1639 KERN_WARNING
Alan Coxe3558802006-09-14 11:47:55 -03001640 "%s: chipset does not support reliable PCI-PCI DMA\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 ZORAN_NAME);
1642 }
1643
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001644 res = pci_register_driver(&zoran_driver);
1645 if (res) {
1646 dprintk(1,
1647 KERN_ERR
1648 "%s: Unable to register ZR36057 driver\n",
1649 ZORAN_NAME);
1650 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 }
1652
1653 return 0;
1654}
1655
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001656static void __exit zoran_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001658 pci_unregister_driver(&zoran_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659}
1660
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001661module_init(zoran_init);
1662module_exit(zoran_exit);