blob: 38d7ed8588122287a62cc8ca871e4be262289729 [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
64static int card[BUZ_MAX] = { -1, -1, -1, -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030065module_param_array(card, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070066MODULE_PARM_DESC(card, "The type of card");
67
68static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030069module_param_array(encoder, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070070MODULE_PARM_DESC(encoder, "i2c TV encoder");
71
72static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
Trent Piepho60e3cac2007-07-17 18:29:42 -030073module_param_array(decoder, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074MODULE_PARM_DESC(decoder, "i2c TV decoder");
75
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 */
107static int video_nr[BUZ_MAX] = {-1, -1, -1, -1};
108module_param_array(video_nr, int, NULL, 0444);
109MODULE_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
156static struct pci_device_id zr36067_pci_tbl[] = {
157 {PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057,
158 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159 {0}
160};
161MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
162
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163int zoran_num; /* number of Buzs in use */
Jean Delvare85b9b8a2008-07-14 09:51:03 -0300164struct zoran *zoran[BUZ_MAX];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165
166/* videocodec bus functions ZR36060 */
167static u32
168zr36060_read (struct videocodec *codec,
169 u16 reg)
170{
171 struct zoran *zr = (struct zoran *) codec->master_data->data;
172 __u32 data;
173
174 if (post_office_wait(zr)
175 || post_office_write(zr, 0, 1, reg >> 8)
176 || post_office_write(zr, 0, 2, reg & 0xff)) {
177 return -1;
178 }
179
180 data = post_office_read(zr, 0, 3) & 0xff;
181 return data;
182}
183
184static void
185zr36060_write (struct videocodec *codec,
186 u16 reg,
187 u32 val)
188{
189 struct zoran *zr = (struct zoran *) codec->master_data->data;
190
191 if (post_office_wait(zr)
192 || post_office_write(zr, 0, 1, reg >> 8)
193 || post_office_write(zr, 0, 2, reg & 0xff)) {
194 return;
195 }
196
197 post_office_write(zr, 0, 3, val & 0xff);
198}
199
200/* videocodec bus functions ZR36050 */
201static u32
202zr36050_read (struct videocodec *codec,
203 u16 reg)
204{
205 struct zoran *zr = (struct zoran *) codec->master_data->data;
206 __u32 data;
207
208 if (post_office_wait(zr)
209 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
210 return -1;
211 }
212
213 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
214 return data;
215}
216
217static void
218zr36050_write (struct videocodec *codec,
219 u16 reg,
220 u32 val)
221{
222 struct zoran *zr = (struct zoran *) codec->master_data->data;
223
224 if (post_office_wait(zr)
225 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
226 return;
227 }
228
229 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
230}
231
232/* videocodec bus functions ZR36016 */
233static u32
234zr36016_read (struct videocodec *codec,
235 u16 reg)
236{
237 struct zoran *zr = (struct zoran *) codec->master_data->data;
238 __u32 data;
239
240 if (post_office_wait(zr)) {
241 return -1;
242 }
243
244 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
245 return data;
246}
247
248/* hack for in zoran_device.c */
249void
250zr36016_write (struct videocodec *codec,
251 u16 reg,
252 u32 val)
253{
254 struct zoran *zr = (struct zoran *) codec->master_data->data;
255
256 if (post_office_wait(zr)) {
257 return;
258 }
259
260 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
261}
262
263/*
264 * Board specific information
265 */
266
267static void
268dc10_init (struct zoran *zr)
269{
270 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
271
272 /* Pixel clock selection */
273 GPIO(zr, 4, 0);
274 GPIO(zr, 5, 1);
275 /* Enable the video bus sync signals */
276 GPIO(zr, 7, 0);
277}
278
279static void
280dc10plus_init (struct zoran *zr)
281{
282 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
283}
284
285static void
286buz_init (struct zoran *zr)
287{
288 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
289
290 /* some stuff from Iomega */
291 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
292 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
293 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
294}
295
296static void
297lml33_init (struct zoran *zr)
298{
299 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
300
301 GPIO(zr, 2, 1); // Set Composite input/output
302}
303
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300304static void
305avs6eyes_init (struct zoran *zr)
306{
307 // AverMedia 6-Eyes original driver by Christer Weinigel
308
309 // Lifted straight from Christer's old driver and
310 // modified slightly by Martin Samuelsson.
311
312 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
313
314 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
315 udelay(2);
316
317 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
318 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
319 GPIO(zr, 2, mux & 1); /* MUX S0 */
320 GPIO(zr, 3, 0); /* /FRAME on */
321 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
322 GPIO(zr, 5, mux & 2); /* MUX S1 */
323 GPIO(zr, 6, 0); /* ? */
324 GPIO(zr, 7, mux & 4); /* MUX S2 */
325
326}
327
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328static char *
329i2cid_to_modulename (u16 i2c_id)
330{
331 char *name = NULL;
332
333 switch (i2c_id) {
334 case I2C_DRIVERID_SAA7110:
335 name = "saa7110";
336 break;
337 case I2C_DRIVERID_SAA7111A:
338 name = "saa7111";
339 break;
340 case I2C_DRIVERID_SAA7114:
341 name = "saa7114";
342 break;
343 case I2C_DRIVERID_SAA7185B:
344 name = "saa7185";
345 break;
346 case I2C_DRIVERID_ADV7170:
347 name = "adv7170";
348 break;
349 case I2C_DRIVERID_ADV7175:
350 name = "adv7175";
351 break;
352 case I2C_DRIVERID_BT819:
353 name = "bt819";
354 break;
355 case I2C_DRIVERID_BT856:
356 name = "bt856";
357 break;
358 case I2C_DRIVERID_VPX3220:
359 name = "vpx3220";
360 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 }
362
363 return name;
364}
365
366static char *
367codecid_to_modulename (u16 codecid)
368{
369 char *name = NULL;
370
371 switch (codecid) {
372 case CODEC_TYPE_ZR36060:
373 name = "zr36060";
374 break;
375 case CODEC_TYPE_ZR36050:
376 name = "zr36050";
377 break;
378 case CODEC_TYPE_ZR36016:
379 name = "zr36016";
380 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381 }
382
383 return name;
384}
385
386// struct tvnorm {
387// u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
388// };
389
390static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
391static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
392static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
393static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
394
395static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
396static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
397
398/* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
399static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
400static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
401
402/* FIXME: I cannot swap U and V in saa7114, so i do one
403 * pixel left shift in zoran (75 -> 74)
404 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
405static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
406static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
407
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300408/* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
409 * copy Maxim's left shift hack for the 6 Eyes.
410 *
411 * Christer's driver used the unshifted norms, though...
412 * /Sam */
413static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
414static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
415
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
417 {
418 .type = DC10_old,
419 .name = "DC10(old)",
420 .i2c_decoder = I2C_DRIVERID_VPX3220,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 .video_codec = CODEC_TYPE_ZR36050,
422 .video_vfe = CODEC_TYPE_ZR36016,
423
424 .inputs = 3,
425 .input = {
426 { 1, "Composite" },
427 { 2, "S-Video" },
428 { 0, "Internal/comp" }
429 },
430 .norms = 3,
431 .tvn = {
432 &f50sqpixel_dc10,
433 &f60sqpixel_dc10,
434 &f50sqpixel_dc10
435 },
436 .jpeg_int = 0,
437 .vsync_int = ZR36057_ISR_GIRQ1,
438 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
439 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
440 .gpcs = { -1, 0 },
441 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
442 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300443 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 .init = &dc10_init,
445 }, {
446 .type = DC10_new,
447 .name = "DC10(new)",
448 .i2c_decoder = I2C_DRIVERID_SAA7110,
449 .i2c_encoder = I2C_DRIVERID_ADV7175,
450 .video_codec = CODEC_TYPE_ZR36060,
451
452 .inputs = 3,
453 .input = {
454 { 0, "Composite" },
455 { 7, "S-Video" },
456 { 5, "Internal/comp" }
457 },
458 .norms = 3,
459 .tvn = {
460 &f50sqpixel,
461 &f60sqpixel,
462 &f50sqpixel},
463 .jpeg_int = ZR36057_ISR_GIRQ0,
464 .vsync_int = ZR36057_ISR_GIRQ1,
465 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
466 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
467 .gpcs = { -1, 1},
468 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
469 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300470 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 .init = &dc10plus_init,
472 }, {
473 .type = DC10plus,
474 .name = "DC10plus",
475 .vendor_id = PCI_VENDOR_ID_MIRO,
476 .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
477 .i2c_decoder = I2C_DRIVERID_SAA7110,
478 .i2c_encoder = I2C_DRIVERID_ADV7175,
479 .video_codec = CODEC_TYPE_ZR36060,
480
481 .inputs = 3,
482 .input = {
483 { 0, "Composite" },
484 { 7, "S-Video" },
485 { 5, "Internal/comp" }
486 },
487 .norms = 3,
488 .tvn = {
489 &f50sqpixel,
490 &f60sqpixel,
491 &f50sqpixel
492 },
493 .jpeg_int = ZR36057_ISR_GIRQ0,
494 .vsync_int = ZR36057_ISR_GIRQ1,
495 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
496 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
497 .gpcs = { -1, 1 },
498 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
499 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300500 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 .init = &dc10plus_init,
502 }, {
503 .type = DC30,
504 .name = "DC30",
505 .i2c_decoder = I2C_DRIVERID_VPX3220,
506 .i2c_encoder = I2C_DRIVERID_ADV7175,
507 .video_codec = CODEC_TYPE_ZR36050,
508 .video_vfe = CODEC_TYPE_ZR36016,
509
510 .inputs = 3,
511 .input = {
512 { 1, "Composite" },
513 { 2, "S-Video" },
514 { 0, "Internal/comp" }
515 },
516 .norms = 3,
517 .tvn = {
518 &f50sqpixel_dc10,
519 &f60sqpixel_dc10,
520 &f50sqpixel_dc10
521 },
522 .jpeg_int = 0,
523 .vsync_int = ZR36057_ISR_GIRQ1,
524 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
525 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
526 .gpcs = { -1, 0 },
527 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
528 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300529 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530 .init = &dc10_init,
531 }, {
532 .type = DC30plus,
533 .name = "DC30plus",
534 .vendor_id = PCI_VENDOR_ID_MIRO,
535 .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
536 .i2c_decoder = I2C_DRIVERID_VPX3220,
537 .i2c_encoder = I2C_DRIVERID_ADV7175,
538 .video_codec = CODEC_TYPE_ZR36050,
539 .video_vfe = CODEC_TYPE_ZR36016,
540
541 .inputs = 3,
542 .input = {
543 { 1, "Composite" },
544 { 2, "S-Video" },
545 { 0, "Internal/comp" }
546 },
547 .norms = 3,
548 .tvn = {
549 &f50sqpixel_dc10,
550 &f60sqpixel_dc10,
551 &f50sqpixel_dc10
552 },
553 .jpeg_int = 0,
554 .vsync_int = ZR36057_ISR_GIRQ1,
555 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
556 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
557 .gpcs = { -1, 0 },
558 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
559 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300560 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 .init = &dc10_init,
562 }, {
563 .type = LML33,
564 .name = "LML33",
565 .i2c_decoder = I2C_DRIVERID_BT819,
566 .i2c_encoder = I2C_DRIVERID_BT856,
567 .video_codec = CODEC_TYPE_ZR36060,
568
569 .inputs = 2,
570 .input = {
571 { 0, "Composite" },
572 { 7, "S-Video" }
573 },
574 .norms = 2,
575 .tvn = {
576 &f50ccir601_lml33,
577 &f60ccir601_lml33,
578 NULL
579 },
580 .jpeg_int = ZR36057_ISR_GIRQ1,
581 .vsync_int = ZR36057_ISR_GIRQ0,
582 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
583 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
584 .gpcs = { 3, 1 },
585 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
586 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300587 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 .init = &lml33_init,
589 }, {
590 .type = LML33R10,
591 .name = "LML33R10",
592 .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
593 .device_id = PCI_DEVICE_ID_LML_33R10,
594 .i2c_decoder = I2C_DRIVERID_SAA7114,
595 .i2c_encoder = I2C_DRIVERID_ADV7170,
596 .video_codec = CODEC_TYPE_ZR36060,
597
598 .inputs = 2,
599 .input = {
600 { 0, "Composite" },
601 { 7, "S-Video" }
602 },
603 .norms = 2,
604 .tvn = {
605 &f50ccir601_lm33r10,
606 &f60ccir601_lm33r10,
607 NULL
608 },
609 .jpeg_int = ZR36057_ISR_GIRQ1,
610 .vsync_int = ZR36057_ISR_GIRQ0,
611 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
612 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
613 .gpcs = { 3, 1 },
614 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
615 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300616 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 .init = &lml33_init,
618 }, {
619 .type = BUZ,
620 .name = "Buz",
621 .vendor_id = PCI_VENDOR_ID_IOMEGA,
622 .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
623 .i2c_decoder = I2C_DRIVERID_SAA7111A,
624 .i2c_encoder = I2C_DRIVERID_SAA7185B,
625 .video_codec = CODEC_TYPE_ZR36060,
626
627 .inputs = 2,
628 .input = {
629 { 3, "Composite" },
630 { 7, "S-Video" }
631 },
632 .norms = 3,
633 .tvn = {
634 &f50ccir601,
635 &f60ccir601,
636 &f50ccir601
637 },
638 .jpeg_int = ZR36057_ISR_GIRQ1,
639 .vsync_int = ZR36057_ISR_GIRQ0,
640 .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
641 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
642 .gpcs = { 3, 1 },
643 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
644 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300645 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 .init = &buz_init,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300647 }, {
648 .type = AVS6EYES,
649 .name = "6-Eyes",
650 /* AverMedia chose not to brand the 6-Eyes. Thus it
651 can't be autodetected, and requires card=x. */
652 .vendor_id = -1,
653 .device_id = -1,
654 .i2c_decoder = I2C_DRIVERID_KS0127,
655 .i2c_encoder = I2C_DRIVERID_BT866,
656 .video_codec = CODEC_TYPE_ZR36060,
657
658 .inputs = 10,
659 .input = {
660 { 0, "Composite 1" },
661 { 1, "Composite 2" },
662 { 2, "Composite 3" },
663 { 4, "Composite 4" },
664 { 5, "Composite 5" },
665 { 6, "Composite 6" },
666 { 8, "S-Video 1" },
667 { 9, "S-Video 2" },
668 {10, "S-Video 3" },
669 {15, "YCbCr" }
670 },
671 .norms = 2,
672 .tvn = {
673 &f50ccir601_avs6eyes,
674 &f60ccir601_avs6eyes,
675 NULL
676 },
677 .jpeg_int = ZR36057_ISR_GIRQ1,
678 .vsync_int = ZR36057_ISR_GIRQ0,
679 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
680 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
681 .gpcs = { 3, 1 }, // Validity unknown /Sam
682 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
683 .gws_not_connected = 1,
684 .input_mux = 1,
685 .init = &avs6eyes_init,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 }
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300687
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688};
689
690/*
691 * I2C functions
692 */
693/* software I2C functions */
694static int
695zoran_i2c_getsda (void *data)
696{
697 struct zoran *zr = (struct zoran *) data;
698
699 return (btread(ZR36057_I2CBR) >> 1) & 1;
700}
701
702static int
703zoran_i2c_getscl (void *data)
704{
705 struct zoran *zr = (struct zoran *) data;
706
707 return btread(ZR36057_I2CBR) & 1;
708}
709
710static void
711zoran_i2c_setsda (void *data,
712 int state)
713{
714 struct zoran *zr = (struct zoran *) data;
715
716 if (state)
717 zr->i2cbr |= 2;
718 else
719 zr->i2cbr &= ~2;
720 btwrite(zr->i2cbr, ZR36057_I2CBR);
721}
722
723static void
724zoran_i2c_setscl (void *data,
725 int state)
726{
727 struct zoran *zr = (struct zoran *) data;
728
729 if (state)
730 zr->i2cbr |= 1;
731 else
732 zr->i2cbr &= ~1;
733 btwrite(zr->i2cbr, ZR36057_I2CBR);
734}
735
736static int
737zoran_i2c_client_register (struct i2c_client *client)
738{
739 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
740 int res = 0;
741
742 dprintk(2,
743 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
744 ZR_DEVNAME(zr), client->driver->id);
745
Ingo Molnar384c3682006-03-22 03:54:16 -0300746 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747
748 if (zr->user > 0) {
749 /* we're already busy, so we keep a reference to
750 * them... Could do a lot of stuff here, but this
751 * is easiest. (Did I ever mention I'm a lazy ass?)
752 */
753 res = -EBUSY;
754 goto clientreg_unlock_and_return;
755 }
756
757 if (client->driver->id == zr->card.i2c_decoder)
758 zr->decoder = client;
759 else if (client->driver->id == zr->card.i2c_encoder)
760 zr->encoder = client;
761 else {
762 res = -ENODEV;
763 goto clientreg_unlock_and_return;
764 }
765
766clientreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300767 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768
769 return res;
770}
771
772static int
773zoran_i2c_client_unregister (struct i2c_client *client)
774{
775 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
776 int res = 0;
777
778 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
779
Ingo Molnar384c3682006-03-22 03:54:16 -0300780 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781
782 if (zr->user > 0) {
783 res = -EBUSY;
784 goto clientunreg_unlock_and_return;
785 }
786
787 /* try to locate it */
788 if (client == zr->encoder) {
789 zr->encoder = NULL;
790 } else if (client == zr->decoder) {
791 zr->decoder = NULL;
792 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
793 }
794clientunreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300795 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 return res;
797}
798
Jean Delvare62751632008-06-12 13:20:46 -0300799static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 .setsda = zoran_i2c_setsda,
801 .setscl = zoran_i2c_setscl,
802 .getsda = zoran_i2c_getsda,
803 .getscl = zoran_i2c_getscl,
804 .udelay = 10,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 .timeout = 100,
806};
807
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808static int
809zoran_register_i2c (struct zoran *zr)
810{
811 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
812 sizeof(struct i2c_algo_bit_data));
813 zr->i2c_algo.data = zr;
Jean Delvare62751632008-06-12 13:20:46 -0300814 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
815 zr->i2c_adapter.client_register = zoran_i2c_client_register;
816 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
817 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
818 sizeof(zr->i2c_adapter.name));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 i2c_set_adapdata(&zr->i2c_adapter, zr);
820 zr->i2c_adapter.algo_data = &zr->i2c_algo;
Jean Delvare12a917f2007-02-13 22:09:03 +0100821 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 return i2c_bit_add_bus(&zr->i2c_adapter);
823}
824
825static void
826zoran_unregister_i2c (struct zoran *zr)
827{
Jean Delvare32697112006-12-10 21:21:33 +0100828 i2c_del_adapter(&zr->i2c_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829}
830
831/* Check a zoran_params struct for correctness, insert default params */
832
833int
834zoran_check_jpg_settings (struct zoran *zr,
835 struct zoran_jpg_settings *settings)
836{
837 int err = 0, err0 = 0;
838
839 dprintk(4,
840 KERN_DEBUG
841 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
842 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
843 settings->VerDcm, settings->TmpDcm);
844 dprintk(4,
845 KERN_DEBUG
846 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
847 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
848 settings->img_width, settings->img_height);
849 /* Check decimation, set default values for decimation = 1, 2, 4 */
850 switch (settings->decimation) {
851 case 1:
852
853 settings->HorDcm = 1;
854 settings->VerDcm = 1;
855 settings->TmpDcm = 1;
856 settings->field_per_buff = 2;
857 settings->img_x = 0;
858 settings->img_y = 0;
859 settings->img_width = BUZ_MAX_WIDTH;
860 settings->img_height = BUZ_MAX_HEIGHT / 2;
861 break;
862 case 2:
863
864 settings->HorDcm = 2;
865 settings->VerDcm = 1;
866 settings->TmpDcm = 2;
867 settings->field_per_buff = 1;
868 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
869 settings->img_y = 0;
870 settings->img_width =
871 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
872 settings->img_height = BUZ_MAX_HEIGHT / 2;
873 break;
874 case 4:
875
876 if (zr->card.type == DC10_new) {
877 dprintk(1,
878 KERN_DEBUG
879 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
880 ZR_DEVNAME(zr));
881 err0++;
882 break;
883 }
884
885 settings->HorDcm = 4;
886 settings->VerDcm = 2;
887 settings->TmpDcm = 2;
888 settings->field_per_buff = 1;
889 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
890 settings->img_y = 0;
891 settings->img_width =
892 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
893 settings->img_height = BUZ_MAX_HEIGHT / 2;
894 break;
895 case 0:
896
897 /* We have to check the data the user has set */
898
899 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
900 (zr->card.type == DC10_new || settings->HorDcm != 4))
901 err0++;
902 if (settings->VerDcm != 1 && settings->VerDcm != 2)
903 err0++;
904 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
905 err0++;
906 if (settings->field_per_buff != 1 &&
907 settings->field_per_buff != 2)
908 err0++;
909 if (settings->img_x < 0)
910 err0++;
911 if (settings->img_y < 0)
912 err0++;
913 if (settings->img_width < 0)
914 err0++;
915 if (settings->img_height < 0)
916 err0++;
917 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
918 err0++;
919 if (settings->img_y + settings->img_height >
920 BUZ_MAX_HEIGHT / 2)
921 err0++;
922 if (settings->HorDcm && settings->VerDcm) {
923 if (settings->img_width %
924 (16 * settings->HorDcm) != 0)
925 err0++;
926 if (settings->img_height %
927 (8 * settings->VerDcm) != 0)
928 err0++;
929 }
930
931 if (err0) {
932 dprintk(1,
933 KERN_ERR
934 "%s: check_jpg_settings() - error in params for decimation = 0\n",
935 ZR_DEVNAME(zr));
936 err++;
937 }
938 break;
939 default:
940 dprintk(1,
941 KERN_ERR
942 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
943 ZR_DEVNAME(zr), settings->decimation);
944 err++;
945 break;
946 }
947
948 if (settings->jpg_comp.quality > 100)
949 settings->jpg_comp.quality = 100;
950 if (settings->jpg_comp.quality < 5)
951 settings->jpg_comp.quality = 5;
952 if (settings->jpg_comp.APPn < 0)
953 settings->jpg_comp.APPn = 0;
954 if (settings->jpg_comp.APPn > 15)
955 settings->jpg_comp.APPn = 15;
956 if (settings->jpg_comp.APP_len < 0)
957 settings->jpg_comp.APP_len = 0;
958 if (settings->jpg_comp.APP_len > 60)
959 settings->jpg_comp.APP_len = 60;
960 if (settings->jpg_comp.COM_len < 0)
961 settings->jpg_comp.COM_len = 0;
962 if (settings->jpg_comp.COM_len > 60)
963 settings->jpg_comp.COM_len = 60;
964 if (err)
965 return -EINVAL;
966 return 0;
967}
968
969void
970zoran_open_init_params (struct zoran *zr)
971{
972 int i;
973
974 /* User must explicitly set a window */
975 zr->overlay_settings.is_set = 0;
976 zr->overlay_mask = NULL;
977 zr->overlay_active = ZORAN_FREE;
978
979 zr->v4l_memgrab_active = 0;
980 zr->v4l_overlay_active = 0;
981 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
982 zr->v4l_grab_seq = 0;
983 zr->v4l_settings.width = 192;
984 zr->v4l_settings.height = 144;
985 zr->v4l_settings.format = &zoran_formats[4]; /* YUY2 - YUV-4:2:2 packed */
986 zr->v4l_settings.bytesperline =
987 zr->v4l_settings.width *
988 ((zr->v4l_settings.format->depth + 7) / 8);
989
990 /* DMA ring stuff for V4L */
991 zr->v4l_pend_tail = 0;
992 zr->v4l_pend_head = 0;
993 zr->v4l_sync_tail = 0;
994 zr->v4l_buffers.active = ZORAN_FREE;
995 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
996 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
997 }
998 zr->v4l_buffers.allocated = 0;
999
1000 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1001 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1002 }
1003 zr->jpg_buffers.active = ZORAN_FREE;
1004 zr->jpg_buffers.allocated = 0;
1005 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1006 zr->jpg_settings.decimation = 1;
1007 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1008 if (zr->card.type != BUZ)
1009 zr->jpg_settings.odd_even = 1;
1010 else
1011 zr->jpg_settings.odd_even = 0;
1012 zr->jpg_settings.jpg_comp.APPn = 0;
1013 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1014 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1015 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1016 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1017 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1018 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1019 zr->jpg_settings.jpg_comp.jpeg_markers =
1020 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1021 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1022 if (i)
1023 dprintk(1,
1024 KERN_ERR
1025 "%s: zoran_open_init_params() internal error\n",
1026 ZR_DEVNAME(zr));
1027
1028 clear_interrupt_counters(zr);
1029 zr->testing = 0;
1030}
1031
1032static void __devinit
1033test_interrupts (struct zoran *zr)
1034{
1035 DEFINE_WAIT(wait);
1036 int timeout, icr;
1037
1038 clear_interrupt_counters(zr);
1039
1040 zr->testing = 1;
1041 icr = btread(ZR36057_ICR);
1042 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1043 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1044 timeout = schedule_timeout(HZ);
1045 finish_wait(&zr->test_q, &wait);
1046 btwrite(0, ZR36057_ICR);
1047 btwrite(0x78000000, ZR36057_ISR);
1048 zr->testing = 0;
1049 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1050 if (timeout) {
1051 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1052 }
Jean Delvare18b548c2007-07-17 18:29:41 -03001053 if (zr36067_debug > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 print_interrupts(zr);
1055 btwrite(icr, ZR36057_ICR);
1056}
1057
1058static int __devinit
1059zr36057_init (struct zoran *zr)
1060{
Jean Delvaredaf72f42006-03-22 03:48:37 -03001061 int j, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 int two = 2;
1063 int zero = 0;
1064
1065 dprintk(1,
1066 KERN_INFO
1067 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1068 ZR_DEVNAME(zr), zr->id, zr);
1069
1070 /* default setup of all parameters which will persist between opens */
1071 zr->user = 0;
1072
1073 init_waitqueue_head(&zr->v4l_capq);
1074 init_waitqueue_head(&zr->jpg_capq);
1075 init_waitqueue_head(&zr->test_q);
1076 zr->jpg_buffers.allocated = 0;
1077 zr->v4l_buffers.allocated = 0;
1078
1079 zr->buffer.base = (void *) vidmem;
1080 zr->buffer.width = 0;
1081 zr->buffer.height = 0;
1082 zr->buffer.depth = 0;
1083 zr->buffer.bytesperline = 0;
1084
1085 /* Avoid nonsense settings from user for default input/norm */
1086 if (default_norm < VIDEO_MODE_PAL &&
1087 default_norm > VIDEO_MODE_SECAM)
1088 default_norm = VIDEO_MODE_PAL;
1089 zr->norm = default_norm;
1090 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1091 dprintk(1,
1092 KERN_WARNING
1093 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1094 ZR_DEVNAME(zr));
1095 zr->norm = VIDEO_MODE_PAL;
1096 zr->timing = zr->card.tvn[zr->norm];
1097 }
1098
Trent Piepho60e3cac2007-07-17 18:29:42 -03001099 if (default_input > zr->card.inputs-1) {
1100 dprintk(1,
1101 KERN_WARNING
1102 "%s: default_input value %d out of range (0-%d)\n",
1103 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1104 default_input = 0;
1105 }
1106 zr->input = default_input;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107
1108 /* Should the following be reset at every open ? */
1109 zr->hue = 32768;
1110 zr->contrast = 32768;
1111 zr->saturation = 32768;
1112 zr->brightness = 32768;
1113
1114 /* default setup (will be repeated at every open) */
1115 zoran_open_init_params(zr);
1116
1117 /* allocate memory *before* doing anything to the hardware
1118 * in case allocation fails */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001119 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1120 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1121 if (!zr->stat_com || !zr->video_dev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 dprintk(1,
1123 KERN_ERR
1124 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1125 ZR_DEVNAME(zr));
Jean Delvaredaf72f42006-03-22 03:48:37 -03001126 err = -ENOMEM;
1127 goto exit_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
Al Viro9c169df2008-06-22 14:19:49 -03001130 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 }
1132
1133 /*
1134 * Now add the template and register the device unit.
1135 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1137 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
Trent Piepho60e3cac2007-07-17 18:29:42 -03001138 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
Jean Delvaredaf72f42006-03-22 03:48:37 -03001139 if (err < 0)
1140 goto exit_unregister;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141
1142 zoran_init_hardware(zr);
Jean Delvare18b548c2007-07-17 18:29:41 -03001143 if (zr36067_debug > 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144 detect_guest_activity(zr);
1145 test_interrupts(zr);
1146 if (!pass_through) {
1147 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1148 encoder_command(zr, ENCODER_SET_INPUT, &two);
1149 }
1150
1151 zr->zoran_proc = NULL;
1152 zr->initialized = 1;
1153 return 0;
Jean Delvaredaf72f42006-03-22 03:48:37 -03001154
1155exit_unregister:
1156 zoran_unregister_i2c(zr);
1157exit_free:
1158 kfree(zr->stat_com);
1159 kfree(zr->video_dev);
1160 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161}
1162
1163static void
1164zoran_release (struct zoran *zr)
1165{
1166 if (!zr->initialized)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001167 goto exit_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 /* unregister videocodec bus */
1169 if (zr->codec) {
1170 struct videocodec_master *master = zr->codec->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001171
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 videocodec_detach(zr->codec);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001173 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 }
1175 if (zr->vfe) {
1176 struct videocodec_master *master = zr->vfe->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001177
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 videocodec_detach(zr->vfe);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001179 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 }
1181
1182 /* unregister i2c bus */
1183 zoran_unregister_i2c(zr);
1184 /* disable PCI bus-mastering */
1185 zoran_set_pci_master(zr, 0);
1186 /* put chip into reset */
1187 btwrite(0, ZR36057_SPGPPCR);
1188 free_irq(zr->pci_dev->irq, zr);
1189 /* unmap and free memory */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001190 kfree(zr->stat_com);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 zoran_proc_cleanup(zr);
1192 iounmap(zr->zr36057_mem);
1193 pci_disable_device(zr->pci_dev);
1194 video_unregister_device(zr->video_dev);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001195exit_free:
1196 kfree(zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197}
1198
1199void
1200zoran_vdev_release (struct video_device *vdev)
1201{
1202 kfree(vdev);
1203}
1204
1205static struct videocodec_master * __devinit
1206zoran_setup_videocodec (struct zoran *zr,
1207 int type)
1208{
1209 struct videocodec_master *m = NULL;
1210
1211 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1212 if (!m) {
1213 dprintk(1,
1214 KERN_ERR
1215 "%s: zoran_setup_videocodec() - no memory\n",
1216 ZR_DEVNAME(zr));
1217 return m;
1218 }
1219
Mauro Carvalho Chehab22c4a4e2007-10-15 12:09:17 -03001220 /* magic and type are unused for master struct. Makes sense only at
1221 codec structs.
1222 In the past, .type were initialized to the old V4L1 .hardware
1223 value, as VID_HARDWARE_ZR36067
1224 */
1225 m->magic = 0L;
1226 m->type = 0;
1227
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1229 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1230 m->data = zr;
1231
1232 switch (type)
1233 {
1234 case CODEC_TYPE_ZR36060:
1235 m->readreg = zr36060_read;
1236 m->writereg = zr36060_write;
1237 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1238 break;
1239 case CODEC_TYPE_ZR36050:
1240 m->readreg = zr36050_read;
1241 m->writereg = zr36050_write;
1242 m->flags |= CODEC_FLAG_JPEG;
1243 break;
1244 case CODEC_TYPE_ZR36016:
1245 m->readreg = zr36016_read;
1246 m->writereg = zr36016_write;
1247 m->flags |= CODEC_FLAG_VFE;
1248 break;
1249 }
1250
1251 return m;
1252}
1253
1254/*
Joe Perchesc84e6032008-02-03 17:18:59 +02001255 * Scan for a Buz card (actually for the PCI controller ZR36057),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 * request the irq and map the io memory
1257 */
1258static int __devinit
1259find_zr36057 (void)
1260{
1261 unsigned char latency, need_latency;
1262 struct zoran *zr;
1263 struct pci_dev *dev = NULL;
1264 int result;
1265 struct videocodec_master *master_vfe = NULL;
1266 struct videocodec_master *master_codec = NULL;
1267 int card_num;
1268 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1269
1270 zoran_num = 0;
1271 while (zoran_num < BUZ_MAX &&
Alan Coxe491cbc2006-10-03 20:44:12 -03001272 (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 card_num = card[zoran_num];
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001274 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1275 if (!zr) {
1276 dprintk(1,
1277 KERN_ERR
1278 "%s: find_zr36057() - kzalloc failed\n",
1279 ZORAN_NAME);
1280 continue;
1281 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 zr->pci_dev = dev;
1283 //zr->zr36057_mem = NULL;
1284 zr->id = zoran_num;
1285 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1286 spin_lock_init(&zr->spinlock);
Ingo Molnar384c3682006-03-22 03:54:16 -03001287 mutex_init(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 if (pci_enable_device(dev))
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001289 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290 zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
1291 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
1292 &zr->revision);
1293 if (zr->revision < 2) {
1294 dprintk(1,
1295 KERN_INFO
1296 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1297 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1298 zr->zr36057_adr);
1299
1300 if (card_num == -1) {
1301 dprintk(1,
1302 KERN_ERR
1303 "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1304 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001305 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306 }
1307 } else {
1308 int i;
1309 unsigned short ss_vendor, ss_device;
1310
1311 ss_vendor = zr->pci_dev->subsystem_vendor;
1312 ss_device = zr->pci_dev->subsystem_device;
1313 dprintk(1,
1314 KERN_INFO
1315 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1316 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1317 zr->zr36057_adr);
1318 dprintk(1,
1319 KERN_INFO
1320 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1321 ZR_DEVNAME(zr), ss_vendor, ss_device);
1322 if (card_num == -1) {
1323 dprintk(3,
1324 KERN_DEBUG
1325 "%s: find_zr36057() - trying to autodetect card type\n",
1326 ZR_DEVNAME(zr));
1327 for (i=0;i<NUM_CARDS;i++) {
1328 if (ss_vendor == zoran_cards[i].vendor_id &&
1329 ss_device == zoran_cards[i].device_id) {
1330 dprintk(3,
1331 KERN_DEBUG
1332 "%s: find_zr36057() - card %s detected\n",
1333 ZR_DEVNAME(zr),
1334 zoran_cards[i].name);
1335 card_num = i;
1336 break;
1337 }
1338 }
1339 if (i == NUM_CARDS) {
1340 dprintk(1,
1341 KERN_ERR
1342 "%s: find_zr36057() - unknown card\n",
1343 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001344 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345 }
1346 }
1347 }
1348
1349 if (card_num < 0 || card_num >= NUM_CARDS) {
1350 dprintk(2,
1351 KERN_ERR
1352 "%s: find_zr36057() - invalid cardnum %d\n",
1353 ZR_DEVNAME(zr), card_num);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001354 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 }
1356
1357 /* even though we make this a non pointer and thus
1358 * theoretically allow for making changes to this struct
1359 * on a per-individual card basis at runtime, this is
1360 * strongly discouraged. This structure is intended to
1361 * keep general card information, no settings or anything */
1362 zr->card = zoran_cards[card_num];
1363 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1364 "%s[%u]", zr->card.name, zr->id);
1365
1366 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1367 if (!zr->zr36057_mem) {
1368 dprintk(1,
1369 KERN_ERR
1370 "%s: find_zr36057() - ioremap failed\n",
1371 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001372 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 }
1374
1375 result = request_irq(zr->pci_dev->irq,
1376 zoran_irq,
Thomas Gleixner8076fe32006-07-01 19:29:37 -07001377 IRQF_SHARED | IRQF_DISABLED,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 ZR_DEVNAME(zr),
1379 (void *) zr);
1380 if (result < 0) {
1381 if (result == -EINVAL) {
1382 dprintk(1,
1383 KERN_ERR
1384 "%s: find_zr36057() - bad irq number or handler\n",
1385 ZR_DEVNAME(zr));
1386 } else if (result == -EBUSY) {
1387 dprintk(1,
1388 KERN_ERR
1389 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1390 ZR_DEVNAME(zr), zr->pci_dev->irq);
1391 } else {
1392 dprintk(1,
1393 KERN_ERR
1394 "%s: find_zr36057() - can't assign irq, error code %d\n",
1395 ZR_DEVNAME(zr), result);
1396 }
1397 goto zr_unmap;
1398 }
1399
1400 /* set PCI latency timer */
1401 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1402 &latency);
1403 need_latency = zr->revision > 1 ? 32 : 48;
1404 if (latency != need_latency) {
1405 dprintk(2,
1406 KERN_INFO
1407 "%s: Changing PCI latency from %d to %d.\n",
1408 ZR_DEVNAME(zr), latency, need_latency);
1409 pci_write_config_byte(zr->pci_dev,
1410 PCI_LATENCY_TIMER,
1411 need_latency);
1412 }
1413
1414 zr36057_restart(zr);
1415 /* i2c */
1416 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1417 ZR_DEVNAME(zr));
1418
1419 /* i2c decoder */
1420 if (decoder[zr->id] != -1) {
1421 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1422 zr->card.i2c_decoder = decoder[zr->id];
1423 } else if (zr->card.i2c_decoder != 0) {
1424 i2c_dec_name =
1425 i2cid_to_modulename(zr->card.i2c_decoder);
1426 } else {
1427 i2c_dec_name = NULL;
1428 }
1429
1430 if (i2c_dec_name) {
1431 if ((result = request_module(i2c_dec_name)) < 0) {
1432 dprintk(1,
1433 KERN_ERR
1434 "%s: failed to load module %s: %d\n",
1435 ZR_DEVNAME(zr), i2c_dec_name, result);
1436 }
1437 }
1438
1439 /* i2c encoder */
1440 if (encoder[zr->id] != -1) {
1441 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1442 zr->card.i2c_encoder = encoder[zr->id];
1443 } else if (zr->card.i2c_encoder != 0) {
1444 i2c_enc_name =
1445 i2cid_to_modulename(zr->card.i2c_encoder);
1446 } else {
1447 i2c_enc_name = NULL;
1448 }
1449
1450 if (i2c_enc_name) {
1451 if ((result = request_module(i2c_enc_name)) < 0) {
1452 dprintk(1,
1453 KERN_ERR
1454 "%s: failed to load module %s: %d\n",
1455 ZR_DEVNAME(zr), i2c_enc_name, result);
1456 }
1457 }
1458
1459 if (zoran_register_i2c(zr) < 0) {
1460 dprintk(1,
1461 KERN_ERR
1462 "%s: find_zr36057() - can't initialize i2c bus\n",
1463 ZR_DEVNAME(zr));
1464 goto zr_free_irq;
1465 }
1466
1467 dprintk(2,
1468 KERN_INFO "%s: Initializing videocodec bus...\n",
1469 ZR_DEVNAME(zr));
1470
1471 if (zr->card.video_codec != 0 &&
1472 (codec_name =
1473 codecid_to_modulename(zr->card.video_codec)) != NULL) {
1474 if ((result = request_module(codec_name)) < 0) {
1475 dprintk(1,
1476 KERN_ERR
1477 "%s: failed to load modules %s: %d\n",
1478 ZR_DEVNAME(zr), codec_name, result);
1479 }
1480 }
1481 if (zr->card.video_vfe != 0 &&
1482 (vfe_name =
1483 codecid_to_modulename(zr->card.video_vfe)) != NULL) {
1484 if ((result = request_module(vfe_name)) < 0) {
1485 dprintk(1,
1486 KERN_ERR
1487 "%s: failed to load modules %s: %d\n",
1488 ZR_DEVNAME(zr), vfe_name, result);
1489 }
1490 }
1491
1492 /* reset JPEG codec */
1493 jpeg_codec_sleep(zr, 1);
1494 jpeg_codec_reset(zr);
1495 /* video bus enabled */
1496 /* display codec revision */
1497 if (zr->card.video_codec != 0) {
1498 master_codec = zoran_setup_videocodec(zr,
1499 zr->card.video_codec);
1500 if (!master_codec)
1501 goto zr_unreg_i2c;
1502 zr->codec = videocodec_attach(master_codec);
1503 if (!zr->codec) {
1504 dprintk(1,
1505 KERN_ERR
1506 "%s: find_zr36057() - no codec found\n",
1507 ZR_DEVNAME(zr));
1508 goto zr_free_codec;
1509 }
1510 if (zr->codec->type != zr->card.video_codec) {
1511 dprintk(1,
1512 KERN_ERR
1513 "%s: find_zr36057() - wrong codec\n",
1514 ZR_DEVNAME(zr));
1515 goto zr_detach_codec;
1516 }
1517 }
1518 if (zr->card.video_vfe != 0) {
1519 master_vfe = zoran_setup_videocodec(zr,
1520 zr->card.video_vfe);
1521 if (!master_vfe)
1522 goto zr_detach_codec;
1523 zr->vfe = videocodec_attach(master_vfe);
1524 if (!zr->vfe) {
1525 dprintk(1,
1526 KERN_ERR
1527 "%s: find_zr36057() - no VFE found\n",
1528 ZR_DEVNAME(zr));
1529 goto zr_free_vfe;
1530 }
1531 if (zr->vfe->type != zr->card.video_vfe) {
1532 dprintk(1,
1533 KERN_ERR
1534 "%s: find_zr36057() = wrong VFE\n",
1535 ZR_DEVNAME(zr));
1536 goto zr_detach_vfe;
1537 }
1538 }
Alan Coxe491cbc2006-10-03 20:44:12 -03001539 /* Success so keep the pci_dev referenced */
1540 pci_dev_get(zr->pci_dev);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001541 zoran[zoran_num++] = zr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001542 continue;
1543
1544 // Init errors
1545 zr_detach_vfe:
1546 videocodec_detach(zr->vfe);
1547 zr_free_vfe:
1548 kfree(master_vfe);
1549 zr_detach_codec:
1550 videocodec_detach(zr->codec);
1551 zr_free_codec:
1552 kfree(master_codec);
1553 zr_unreg_i2c:
1554 zoran_unregister_i2c(zr);
1555 zr_free_irq:
1556 btwrite(0, ZR36057_SPGPPCR);
1557 free_irq(zr->pci_dev->irq, zr);
1558 zr_unmap:
1559 iounmap(zr->zr36057_mem);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001560 zr_free_mem:
1561 kfree(zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001562 continue;
1563 }
Alan Coxe491cbc2006-10-03 20:44:12 -03001564 if (dev) /* Clean up ref count on early exit */
1565 pci_dev_put(dev);
1566
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 if (zoran_num == 0) {
1568 dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
1569 }
1570 return zoran_num;
1571}
1572
1573static int __init
1574init_dc10_cards (void)
1575{
1576 int i;
1577
1578 memset(zoran, 0, sizeof(zoran));
1579 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1580 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1581
1582 /* Look for cards */
1583 if (find_zr36057() < 0) {
1584 return -EIO;
1585 }
1586 if (zoran_num == 0)
1587 return -ENODEV;
1588 dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
1589 zoran_num);
1590 /* check the parameters we have been given, adjust if necessary */
1591 if (v4l_nbufs < 2)
1592 v4l_nbufs = 2;
1593 if (v4l_nbufs > VIDEO_MAX_FRAME)
1594 v4l_nbufs = VIDEO_MAX_FRAME;
1595 /* The user specfies the in KB, we want them in byte
1596 * (and page aligned) */
1597 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1598 if (v4l_bufsize < 32768)
1599 v4l_bufsize = 32768;
1600 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1601 if (v4l_bufsize > 2048 * 1024)
1602 v4l_bufsize = 2048 * 1024;
1603 if (jpg_nbufs < 4)
1604 jpg_nbufs = 4;
1605 if (jpg_nbufs > BUZ_MAX_FRAME)
1606 jpg_nbufs = BUZ_MAX_FRAME;
1607 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1608 if (jpg_bufsize < 8192)
1609 jpg_bufsize = 8192;
1610 if (jpg_bufsize > (512 * 1024))
1611 jpg_bufsize = 512 * 1024;
1612 /* Use parameter for vidmem or try to find a video card */
1613 if (vidmem) {
1614 dprintk(1,
1615 KERN_INFO
1616 "%s: Using supplied video memory base address @ 0x%lx\n",
1617 ZORAN_NAME, vidmem);
1618 }
1619
1620 /* random nonsense */
Jean Delvare18b548c2007-07-17 18:29:41 -03001621 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622
1623 /* some mainboards might not do PCI-PCI data transfer well */
Alan Coxe3558802006-09-14 11:47:55 -03001624 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625 dprintk(1,
1626 KERN_WARNING
Alan Coxe3558802006-09-14 11:47:55 -03001627 "%s: chipset does not support reliable PCI-PCI DMA\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 ZORAN_NAME);
1629 }
1630
1631 /* take care of Natoma chipset and a revision 1 zr36057 */
1632 for (i = 0; i < zoran_num; i++) {
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001633 struct zoran *zr = zoran[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634
Alan Coxe3558802006-09-14 11:47:55 -03001635 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636 zr->jpg_buffers.need_contiguous = 1;
1637 dprintk(1,
1638 KERN_INFO
1639 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1640 ZR_DEVNAME(zr));
1641 }
1642
1643 if (zr36057_init(zr) < 0) {
1644 for (i = 0; i < zoran_num; i++)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001645 zoran_release(zoran[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 return -EIO;
1647 }
1648 zoran_proc_init(zr);
1649 }
1650
1651 return 0;
1652}
1653
1654static void __exit
1655unload_dc10_cards (void)
1656{
1657 int i;
1658
1659 for (i = 0; i < zoran_num; i++)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001660 zoran_release(zoran[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661}
1662
1663module_init(init_dc10_cards);
1664module_exit(unload_dc10_cards);