blob: 5d2f090aa0f82c12aa3adec4daed69bffea4d63a [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
Trent Piepho17faeb22009-01-12 13:09:46 -0300156#define ZR_DEVICE(subven, subdev, data) { \
157 .vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
158 .subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
159
Mauro Carvalho Chehabdbdf03b2009-01-08 23:27:32 -0300160static struct pci_device_id zr36067_pci_tbl[] = {
Trent Piepho17faeb22009-01-12 13:09:46 -0300161 ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
162 ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
163 ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
164 ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
165 ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
Mauro Carvalho Chehabdbdf03b2009-01-08 23:27:32 -0300166 {0}
167};
168MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169
Trent Piepho601139e2009-01-12 13:09:46 -0300170static unsigned int zoran_num; /* number of cards found */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171
172/* videocodec bus functions ZR36060 */
173static u32
174zr36060_read (struct videocodec *codec,
175 u16 reg)
176{
177 struct zoran *zr = (struct zoran *) codec->master_data->data;
178 __u32 data;
179
180 if (post_office_wait(zr)
181 || post_office_write(zr, 0, 1, reg >> 8)
182 || post_office_write(zr, 0, 2, reg & 0xff)) {
183 return -1;
184 }
185
186 data = post_office_read(zr, 0, 3) & 0xff;
187 return data;
188}
189
190static void
191zr36060_write (struct videocodec *codec,
192 u16 reg,
193 u32 val)
194{
195 struct zoran *zr = (struct zoran *) codec->master_data->data;
196
197 if (post_office_wait(zr)
198 || post_office_write(zr, 0, 1, reg >> 8)
199 || post_office_write(zr, 0, 2, reg & 0xff)) {
200 return;
201 }
202
203 post_office_write(zr, 0, 3, val & 0xff);
204}
205
206/* videocodec bus functions ZR36050 */
207static u32
208zr36050_read (struct videocodec *codec,
209 u16 reg)
210{
211 struct zoran *zr = (struct zoran *) codec->master_data->data;
212 __u32 data;
213
214 if (post_office_wait(zr)
215 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
216 return -1;
217 }
218
219 data = post_office_read(zr, 0, reg & 0x03) & 0xff; // reg. LOWBYTES + read
220 return data;
221}
222
223static void
224zr36050_write (struct videocodec *codec,
225 u16 reg,
226 u32 val)
227{
228 struct zoran *zr = (struct zoran *) codec->master_data->data;
229
230 if (post_office_wait(zr)
231 || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
232 return;
233 }
234
235 post_office_write(zr, 0, reg & 0x03, val & 0xff); // reg. LOWBYTES + wr. data
236}
237
238/* videocodec bus functions ZR36016 */
239static u32
240zr36016_read (struct videocodec *codec,
241 u16 reg)
242{
243 struct zoran *zr = (struct zoran *) codec->master_data->data;
244 __u32 data;
245
246 if (post_office_wait(zr)) {
247 return -1;
248 }
249
250 data = post_office_read(zr, 2, reg & 0x03) & 0xff; // read
251 return data;
252}
253
254/* hack for in zoran_device.c */
255void
256zr36016_write (struct videocodec *codec,
257 u16 reg,
258 u32 val)
259{
260 struct zoran *zr = (struct zoran *) codec->master_data->data;
261
262 if (post_office_wait(zr)) {
263 return;
264 }
265
266 post_office_write(zr, 2, reg & 0x03, val & 0x0ff); // wr. data
267}
268
269/*
270 * Board specific information
271 */
272
273static void
274dc10_init (struct zoran *zr)
275{
276 dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
277
278 /* Pixel clock selection */
279 GPIO(zr, 4, 0);
280 GPIO(zr, 5, 1);
281 /* Enable the video bus sync signals */
282 GPIO(zr, 7, 0);
283}
284
285static void
286dc10plus_init (struct zoran *zr)
287{
288 dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
289}
290
291static void
292buz_init (struct zoran *zr)
293{
294 dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
295
296 /* some stuff from Iomega */
297 pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
298 pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
299 pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
300}
301
302static void
303lml33_init (struct zoran *zr)
304{
305 dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
306
307 GPIO(zr, 2, 1); // Set Composite input/output
308}
309
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300310static void
311avs6eyes_init (struct zoran *zr)
312{
313 // AverMedia 6-Eyes original driver by Christer Weinigel
314
315 // Lifted straight from Christer's old driver and
316 // modified slightly by Martin Samuelsson.
317
318 int mux = default_mux; /* 1 = BT866, 7 = VID1 */
319
320 GPIO(zr, 4, 1); /* Bt866 SLEEP on */
321 udelay(2);
322
323 GPIO(zr, 0, 1); /* ZR36060 /RESET on */
324 GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
325 GPIO(zr, 2, mux & 1); /* MUX S0 */
326 GPIO(zr, 3, 0); /* /FRAME on */
327 GPIO(zr, 4, 0); /* Bt866 SLEEP off */
328 GPIO(zr, 5, mux & 2); /* MUX S1 */
329 GPIO(zr, 6, 0); /* ? */
330 GPIO(zr, 7, mux & 4); /* MUX S2 */
331
332}
333
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334static char *
335i2cid_to_modulename (u16 i2c_id)
336{
337 char *name = NULL;
338
339 switch (i2c_id) {
340 case I2C_DRIVERID_SAA7110:
341 name = "saa7110";
342 break;
343 case I2C_DRIVERID_SAA7111A:
344 name = "saa7111";
345 break;
346 case I2C_DRIVERID_SAA7114:
347 name = "saa7114";
348 break;
349 case I2C_DRIVERID_SAA7185B:
350 name = "saa7185";
351 break;
352 case I2C_DRIVERID_ADV7170:
353 name = "adv7170";
354 break;
355 case I2C_DRIVERID_ADV7175:
356 name = "adv7175";
357 break;
358 case I2C_DRIVERID_BT819:
359 name = "bt819";
360 break;
361 case I2C_DRIVERID_BT856:
362 name = "bt856";
363 break;
Martin Samuelssoned1aedb2008-07-14 09:28:59 -0300364 case I2C_DRIVERID_BT866:
365 name = "bt866";
366 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 case I2C_DRIVERID_VPX3220:
368 name = "vpx3220";
369 break;
Martin Samuelssoned1aedb2008-07-14 09:28:59 -0300370 case I2C_DRIVERID_KS0127:
371 name = "ks0127";
372 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 }
374
375 return name;
376}
377
378static char *
379codecid_to_modulename (u16 codecid)
380{
381 char *name = NULL;
382
383 switch (codecid) {
384 case CODEC_TYPE_ZR36060:
385 name = "zr36060";
386 break;
387 case CODEC_TYPE_ZR36050:
388 name = "zr36050";
389 break;
390 case CODEC_TYPE_ZR36016:
391 name = "zr36016";
392 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 }
394
395 return name;
396}
397
398// struct tvnorm {
399// u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
400// };
401
402static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
403static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
404static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
405static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
406
407static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
408static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
409
410/* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
411static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
412static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
413
414/* FIXME: I cannot swap U and V in saa7114, so i do one
415 * pixel left shift in zoran (75 -> 74)
416 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
417static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
418static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
419
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300420/* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
421 * copy Maxim's left shift hack for the 6 Eyes.
422 *
423 * Christer's driver used the unshifted norms, though...
424 * /Sam */
425static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
426static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
427
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
429 {
430 .type = DC10_old,
431 .name = "DC10(old)",
432 .i2c_decoder = I2C_DRIVERID_VPX3220,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 .video_codec = CODEC_TYPE_ZR36050,
434 .video_vfe = CODEC_TYPE_ZR36016,
435
436 .inputs = 3,
437 .input = {
438 { 1, "Composite" },
439 { 2, "S-Video" },
440 { 0, "Internal/comp" }
441 },
442 .norms = 3,
443 .tvn = {
444 &f50sqpixel_dc10,
445 &f60sqpixel_dc10,
446 &f50sqpixel_dc10
447 },
448 .jpeg_int = 0,
449 .vsync_int = ZR36057_ISR_GIRQ1,
450 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
451 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
452 .gpcs = { -1, 0 },
453 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
454 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300455 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 .init = &dc10_init,
457 }, {
458 .type = DC10_new,
459 .name = "DC10(new)",
460 .i2c_decoder = I2C_DRIVERID_SAA7110,
461 .i2c_encoder = I2C_DRIVERID_ADV7175,
462 .video_codec = CODEC_TYPE_ZR36060,
463
464 .inputs = 3,
465 .input = {
466 { 0, "Composite" },
467 { 7, "S-Video" },
468 { 5, "Internal/comp" }
469 },
470 .norms = 3,
471 .tvn = {
472 &f50sqpixel,
473 &f60sqpixel,
474 &f50sqpixel},
475 .jpeg_int = ZR36057_ISR_GIRQ0,
476 .vsync_int = ZR36057_ISR_GIRQ1,
477 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
478 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
479 .gpcs = { -1, 1},
480 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
481 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300482 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 .init = &dc10plus_init,
484 }, {
485 .type = DC10plus,
486 .name = "DC10plus",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 .i2c_decoder = I2C_DRIVERID_SAA7110,
488 .i2c_encoder = I2C_DRIVERID_ADV7175,
489 .video_codec = CODEC_TYPE_ZR36060,
490
491 .inputs = 3,
492 .input = {
493 { 0, "Composite" },
494 { 7, "S-Video" },
495 { 5, "Internal/comp" }
496 },
497 .norms = 3,
498 .tvn = {
499 &f50sqpixel,
500 &f60sqpixel,
501 &f50sqpixel
502 },
503 .jpeg_int = ZR36057_ISR_GIRQ0,
504 .vsync_int = ZR36057_ISR_GIRQ1,
505 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
506 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
507 .gpcs = { -1, 1 },
508 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
509 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300510 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 .init = &dc10plus_init,
512 }, {
513 .type = DC30,
514 .name = "DC30",
515 .i2c_decoder = I2C_DRIVERID_VPX3220,
516 .i2c_encoder = I2C_DRIVERID_ADV7175,
517 .video_codec = CODEC_TYPE_ZR36050,
518 .video_vfe = CODEC_TYPE_ZR36016,
519
520 .inputs = 3,
521 .input = {
522 { 1, "Composite" },
523 { 2, "S-Video" },
524 { 0, "Internal/comp" }
525 },
526 .norms = 3,
527 .tvn = {
528 &f50sqpixel_dc10,
529 &f60sqpixel_dc10,
530 &f50sqpixel_dc10
531 },
532 .jpeg_int = 0,
533 .vsync_int = ZR36057_ISR_GIRQ1,
534 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
535 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
536 .gpcs = { -1, 0 },
537 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
538 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300539 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 .init = &dc10_init,
541 }, {
542 .type = DC30plus,
543 .name = "DC30plus",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 .i2c_decoder = I2C_DRIVERID_VPX3220,
545 .i2c_encoder = I2C_DRIVERID_ADV7175,
546 .video_codec = CODEC_TYPE_ZR36050,
547 .video_vfe = CODEC_TYPE_ZR36016,
548
549 .inputs = 3,
550 .input = {
551 { 1, "Composite" },
552 { 2, "S-Video" },
553 { 0, "Internal/comp" }
554 },
555 .norms = 3,
556 .tvn = {
557 &f50sqpixel_dc10,
558 &f60sqpixel_dc10,
559 &f50sqpixel_dc10
560 },
561 .jpeg_int = 0,
562 .vsync_int = ZR36057_ISR_GIRQ1,
563 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
564 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
565 .gpcs = { -1, 0 },
566 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
567 .gws_not_connected = 0,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300568 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 .init = &dc10_init,
570 }, {
571 .type = LML33,
572 .name = "LML33",
573 .i2c_decoder = I2C_DRIVERID_BT819,
574 .i2c_encoder = I2C_DRIVERID_BT856,
575 .video_codec = CODEC_TYPE_ZR36060,
576
577 .inputs = 2,
578 .input = {
579 { 0, "Composite" },
580 { 7, "S-Video" }
581 },
582 .norms = 2,
583 .tvn = {
584 &f50ccir601_lml33,
585 &f60ccir601_lml33,
586 NULL
587 },
588 .jpeg_int = ZR36057_ISR_GIRQ1,
589 .vsync_int = ZR36057_ISR_GIRQ0,
590 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
591 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
592 .gpcs = { 3, 1 },
593 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
594 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300595 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596 .init = &lml33_init,
597 }, {
598 .type = LML33R10,
599 .name = "LML33R10",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600 .i2c_decoder = I2C_DRIVERID_SAA7114,
601 .i2c_encoder = I2C_DRIVERID_ADV7170,
602 .video_codec = CODEC_TYPE_ZR36060,
603
604 .inputs = 2,
605 .input = {
606 { 0, "Composite" },
607 { 7, "S-Video" }
608 },
609 .norms = 2,
610 .tvn = {
611 &f50ccir601_lm33r10,
612 &f60ccir601_lm33r10,
613 NULL
614 },
615 .jpeg_int = ZR36057_ISR_GIRQ1,
616 .vsync_int = ZR36057_ISR_GIRQ0,
617 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
618 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
619 .gpcs = { 3, 1 },
620 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
621 .gws_not_connected = 1,
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300622 .input_mux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 .init = &lml33_init,
624 }, {
625 .type = BUZ,
626 .name = "Buz",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 .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. */
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300656 .i2c_decoder = I2C_DRIVERID_KS0127,
657 .i2c_encoder = I2C_DRIVERID_BT866,
658 .video_codec = CODEC_TYPE_ZR36060,
659
660 .inputs = 10,
661 .input = {
662 { 0, "Composite 1" },
663 { 1, "Composite 2" },
664 { 2, "Composite 3" },
665 { 4, "Composite 4" },
666 { 5, "Composite 5" },
667 { 6, "Composite 6" },
668 { 8, "S-Video 1" },
669 { 9, "S-Video 2" },
670 {10, "S-Video 3" },
671 {15, "YCbCr" }
672 },
673 .norms = 2,
674 .tvn = {
675 &f50ccir601_avs6eyes,
676 &f60ccir601_avs6eyes,
677 NULL
678 },
679 .jpeg_int = ZR36057_ISR_GIRQ1,
680 .vsync_int = ZR36057_ISR_GIRQ0,
681 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
682 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
683 .gpcs = { 3, 1 }, // Validity unknown /Sam
684 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam
685 .gws_not_connected = 1,
686 .input_mux = 1,
687 .init = &avs6eyes_init,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 }
Martin Samuelssonfbe60da2006-04-27 10:17:00 -0300689
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690};
691
692/*
693 * I2C functions
694 */
695/* software I2C functions */
696static int
697zoran_i2c_getsda (void *data)
698{
699 struct zoran *zr = (struct zoran *) data;
700
701 return (btread(ZR36057_I2CBR) >> 1) & 1;
702}
703
704static int
705zoran_i2c_getscl (void *data)
706{
707 struct zoran *zr = (struct zoran *) data;
708
709 return btread(ZR36057_I2CBR) & 1;
710}
711
712static void
713zoran_i2c_setsda (void *data,
714 int state)
715{
716 struct zoran *zr = (struct zoran *) data;
717
718 if (state)
719 zr->i2cbr |= 2;
720 else
721 zr->i2cbr &= ~2;
722 btwrite(zr->i2cbr, ZR36057_I2CBR);
723}
724
725static void
726zoran_i2c_setscl (void *data,
727 int state)
728{
729 struct zoran *zr = (struct zoran *) data;
730
731 if (state)
732 zr->i2cbr |= 1;
733 else
734 zr->i2cbr &= ~1;
735 btwrite(zr->i2cbr, ZR36057_I2CBR);
736}
737
738static int
739zoran_i2c_client_register (struct i2c_client *client)
740{
741 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
742 int res = 0;
743
744 dprintk(2,
745 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
746 ZR_DEVNAME(zr), client->driver->id);
747
Ingo Molnar384c3682006-03-22 03:54:16 -0300748 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749
750 if (zr->user > 0) {
751 /* we're already busy, so we keep a reference to
752 * them... Could do a lot of stuff here, but this
753 * is easiest. (Did I ever mention I'm a lazy ass?)
754 */
755 res = -EBUSY;
756 goto clientreg_unlock_and_return;
757 }
758
759 if (client->driver->id == zr->card.i2c_decoder)
760 zr->decoder = client;
761 else if (client->driver->id == zr->card.i2c_encoder)
762 zr->encoder = client;
763 else {
764 res = -ENODEV;
765 goto clientreg_unlock_and_return;
766 }
767
768clientreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300769 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770
771 return res;
772}
773
774static int
775zoran_i2c_client_unregister (struct i2c_client *client)
776{
777 struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
778 int res = 0;
779
780 dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
781
Ingo Molnar384c3682006-03-22 03:54:16 -0300782 mutex_lock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783
784 if (zr->user > 0) {
785 res = -EBUSY;
786 goto clientunreg_unlock_and_return;
787 }
788
789 /* try to locate it */
790 if (client == zr->encoder) {
791 zr->encoder = NULL;
792 } else if (client == zr->decoder) {
793 zr->decoder = NULL;
794 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
795 }
796clientunreg_unlock_and_return:
Ingo Molnar384c3682006-03-22 03:54:16 -0300797 mutex_unlock(&zr->resource_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798 return res;
799}
800
Jean Delvare62751632008-06-12 13:20:46 -0300801static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 .setsda = zoran_i2c_setsda,
803 .setscl = zoran_i2c_setscl,
804 .getsda = zoran_i2c_getsda,
805 .getscl = zoran_i2c_getscl,
806 .udelay = 10,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 .timeout = 100,
808};
809
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810static int
811zoran_register_i2c (struct zoran *zr)
812{
813 memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
814 sizeof(struct i2c_algo_bit_data));
815 zr->i2c_algo.data = zr;
Jean Delvare54c776a2008-10-13 07:28:39 -0300816 zr->i2c_adapter.class = I2C_CLASS_TV_ANALOG;
Jean Delvare62751632008-06-12 13:20:46 -0300817 zr->i2c_adapter.id = I2C_HW_B_ZR36067;
818 zr->i2c_adapter.client_register = zoran_i2c_client_register;
819 zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
820 strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
821 sizeof(zr->i2c_adapter.name));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 i2c_set_adapdata(&zr->i2c_adapter, zr);
823 zr->i2c_adapter.algo_data = &zr->i2c_algo;
Jean Delvare12a917f2007-02-13 22:09:03 +0100824 zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825 return i2c_bit_add_bus(&zr->i2c_adapter);
826}
827
828static void
829zoran_unregister_i2c (struct zoran *zr)
830{
Jean Delvare32697112006-12-10 21:21:33 +0100831 i2c_del_adapter(&zr->i2c_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832}
833
834/* Check a zoran_params struct for correctness, insert default params */
835
836int
837zoran_check_jpg_settings (struct zoran *zr,
838 struct zoran_jpg_settings *settings)
839{
840 int err = 0, err0 = 0;
841
842 dprintk(4,
843 KERN_DEBUG
844 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
845 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
846 settings->VerDcm, settings->TmpDcm);
847 dprintk(4,
848 KERN_DEBUG
849 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
850 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
851 settings->img_width, settings->img_height);
852 /* Check decimation, set default values for decimation = 1, 2, 4 */
853 switch (settings->decimation) {
854 case 1:
855
856 settings->HorDcm = 1;
857 settings->VerDcm = 1;
858 settings->TmpDcm = 1;
859 settings->field_per_buff = 2;
860 settings->img_x = 0;
861 settings->img_y = 0;
862 settings->img_width = BUZ_MAX_WIDTH;
863 settings->img_height = BUZ_MAX_HEIGHT / 2;
864 break;
865 case 2:
866
867 settings->HorDcm = 2;
868 settings->VerDcm = 1;
869 settings->TmpDcm = 2;
870 settings->field_per_buff = 1;
871 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
872 settings->img_y = 0;
873 settings->img_width =
874 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
875 settings->img_height = BUZ_MAX_HEIGHT / 2;
876 break;
877 case 4:
878
879 if (zr->card.type == DC10_new) {
880 dprintk(1,
881 KERN_DEBUG
882 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
883 ZR_DEVNAME(zr));
884 err0++;
885 break;
886 }
887
888 settings->HorDcm = 4;
889 settings->VerDcm = 2;
890 settings->TmpDcm = 2;
891 settings->field_per_buff = 1;
892 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
893 settings->img_y = 0;
894 settings->img_width =
895 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
896 settings->img_height = BUZ_MAX_HEIGHT / 2;
897 break;
898 case 0:
899
900 /* We have to check the data the user has set */
901
902 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
903 (zr->card.type == DC10_new || settings->HorDcm != 4))
904 err0++;
905 if (settings->VerDcm != 1 && settings->VerDcm != 2)
906 err0++;
907 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
908 err0++;
909 if (settings->field_per_buff != 1 &&
910 settings->field_per_buff != 2)
911 err0++;
912 if (settings->img_x < 0)
913 err0++;
914 if (settings->img_y < 0)
915 err0++;
916 if (settings->img_width < 0)
917 err0++;
918 if (settings->img_height < 0)
919 err0++;
920 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
921 err0++;
922 if (settings->img_y + settings->img_height >
923 BUZ_MAX_HEIGHT / 2)
924 err0++;
925 if (settings->HorDcm && settings->VerDcm) {
926 if (settings->img_width %
927 (16 * settings->HorDcm) != 0)
928 err0++;
929 if (settings->img_height %
930 (8 * settings->VerDcm) != 0)
931 err0++;
932 }
933
934 if (err0) {
935 dprintk(1,
936 KERN_ERR
937 "%s: check_jpg_settings() - error in params for decimation = 0\n",
938 ZR_DEVNAME(zr));
939 err++;
940 }
941 break;
942 default:
943 dprintk(1,
944 KERN_ERR
945 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
946 ZR_DEVNAME(zr), settings->decimation);
947 err++;
948 break;
949 }
950
951 if (settings->jpg_comp.quality > 100)
952 settings->jpg_comp.quality = 100;
953 if (settings->jpg_comp.quality < 5)
954 settings->jpg_comp.quality = 5;
955 if (settings->jpg_comp.APPn < 0)
956 settings->jpg_comp.APPn = 0;
957 if (settings->jpg_comp.APPn > 15)
958 settings->jpg_comp.APPn = 15;
959 if (settings->jpg_comp.APP_len < 0)
960 settings->jpg_comp.APP_len = 0;
961 if (settings->jpg_comp.APP_len > 60)
962 settings->jpg_comp.APP_len = 60;
963 if (settings->jpg_comp.COM_len < 0)
964 settings->jpg_comp.COM_len = 0;
965 if (settings->jpg_comp.COM_len > 60)
966 settings->jpg_comp.COM_len = 60;
967 if (err)
968 return -EINVAL;
969 return 0;
970}
971
972void
973zoran_open_init_params (struct zoran *zr)
974{
975 int i;
976
977 /* User must explicitly set a window */
978 zr->overlay_settings.is_set = 0;
979 zr->overlay_mask = NULL;
980 zr->overlay_active = ZORAN_FREE;
981
982 zr->v4l_memgrab_active = 0;
983 zr->v4l_overlay_active = 0;
984 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
985 zr->v4l_grab_seq = 0;
986 zr->v4l_settings.width = 192;
987 zr->v4l_settings.height = 144;
Jean Delvarec014ec92008-09-07 05:21:34 -0300988 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 zr->v4l_settings.bytesperline =
990 zr->v4l_settings.width *
991 ((zr->v4l_settings.format->depth + 7) / 8);
992
993 /* DMA ring stuff for V4L */
994 zr->v4l_pend_tail = 0;
995 zr->v4l_pend_head = 0;
996 zr->v4l_sync_tail = 0;
997 zr->v4l_buffers.active = ZORAN_FREE;
998 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
999 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1000 }
1001 zr->v4l_buffers.allocated = 0;
1002
1003 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1004 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1005 }
1006 zr->jpg_buffers.active = ZORAN_FREE;
1007 zr->jpg_buffers.allocated = 0;
1008 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1009 zr->jpg_settings.decimation = 1;
1010 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1011 if (zr->card.type != BUZ)
1012 zr->jpg_settings.odd_even = 1;
1013 else
1014 zr->jpg_settings.odd_even = 0;
1015 zr->jpg_settings.jpg_comp.APPn = 0;
1016 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1017 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1018 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1019 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1020 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1021 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1022 zr->jpg_settings.jpg_comp.jpeg_markers =
1023 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1024 i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1025 if (i)
1026 dprintk(1,
1027 KERN_ERR
1028 "%s: zoran_open_init_params() internal error\n",
1029 ZR_DEVNAME(zr));
1030
1031 clear_interrupt_counters(zr);
1032 zr->testing = 0;
1033}
1034
1035static void __devinit
1036test_interrupts (struct zoran *zr)
1037{
1038 DEFINE_WAIT(wait);
1039 int timeout, icr;
1040
1041 clear_interrupt_counters(zr);
1042
1043 zr->testing = 1;
1044 icr = btread(ZR36057_ICR);
1045 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1046 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1047 timeout = schedule_timeout(HZ);
1048 finish_wait(&zr->test_q, &wait);
1049 btwrite(0, ZR36057_ICR);
1050 btwrite(0x78000000, ZR36057_ISR);
1051 zr->testing = 0;
1052 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1053 if (timeout) {
1054 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1055 }
Jean Delvare18b548c2007-07-17 18:29:41 -03001056 if (zr36067_debug > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 print_interrupts(zr);
1058 btwrite(icr, ZR36057_ICR);
1059}
1060
1061static int __devinit
1062zr36057_init (struct zoran *zr)
1063{
Jean Delvaredaf72f42006-03-22 03:48:37 -03001064 int j, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 int two = 2;
1066 int zero = 0;
1067
1068 dprintk(1,
1069 KERN_INFO
1070 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1071 ZR_DEVNAME(zr), zr->id, zr);
1072
1073 /* default setup of all parameters which will persist between opens */
1074 zr->user = 0;
1075
1076 init_waitqueue_head(&zr->v4l_capq);
1077 init_waitqueue_head(&zr->jpg_capq);
1078 init_waitqueue_head(&zr->test_q);
1079 zr->jpg_buffers.allocated = 0;
1080 zr->v4l_buffers.allocated = 0;
1081
1082 zr->buffer.base = (void *) vidmem;
1083 zr->buffer.width = 0;
1084 zr->buffer.height = 0;
1085 zr->buffer.depth = 0;
1086 zr->buffer.bytesperline = 0;
1087
1088 /* Avoid nonsense settings from user for default input/norm */
1089 if (default_norm < VIDEO_MODE_PAL &&
1090 default_norm > VIDEO_MODE_SECAM)
1091 default_norm = VIDEO_MODE_PAL;
1092 zr->norm = default_norm;
1093 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1094 dprintk(1,
1095 KERN_WARNING
1096 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1097 ZR_DEVNAME(zr));
1098 zr->norm = VIDEO_MODE_PAL;
1099 zr->timing = zr->card.tvn[zr->norm];
1100 }
1101
Trent Piepho60e3cac2007-07-17 18:29:42 -03001102 if (default_input > zr->card.inputs-1) {
1103 dprintk(1,
1104 KERN_WARNING
1105 "%s: default_input value %d out of range (0-%d)\n",
1106 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1107 default_input = 0;
1108 }
1109 zr->input = default_input;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110
1111 /* Should the following be reset at every open ? */
1112 zr->hue = 32768;
1113 zr->contrast = 32768;
1114 zr->saturation = 32768;
1115 zr->brightness = 32768;
1116
1117 /* default setup (will be repeated at every open) */
1118 zoran_open_init_params(zr);
1119
1120 /* allocate memory *before* doing anything to the hardware
1121 * in case allocation fails */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001122 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1123 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1124 if (!zr->stat_com || !zr->video_dev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 dprintk(1,
1126 KERN_ERR
1127 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1128 ZR_DEVNAME(zr));
Jean Delvaredaf72f42006-03-22 03:48:37 -03001129 err = -ENOMEM;
1130 goto exit_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
Al Viro9c169df2008-06-22 14:19:49 -03001133 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 }
1135
1136 /*
1137 * Now add the template and register the device unit.
1138 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1140 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
Trent Piepho60e3cac2007-07-17 18:29:42 -03001141 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
Jean Delvaredaf72f42006-03-22 03:48:37 -03001142 if (err < 0)
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001143 goto exit_free;
Trent Piepho601139e2009-01-12 13:09:46 -03001144 video_set_drvdata(zr->video_dev, zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145
1146 zoran_init_hardware(zr);
Jean Delvare18b548c2007-07-17 18:29:41 -03001147 if (zr36067_debug > 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148 detect_guest_activity(zr);
1149 test_interrupts(zr);
1150 if (!pass_through) {
1151 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1152 encoder_command(zr, ENCODER_SET_INPUT, &two);
1153 }
1154
1155 zr->zoran_proc = NULL;
1156 zr->initialized = 1;
1157 return 0;
Jean Delvaredaf72f42006-03-22 03:48:37 -03001158
Jean Delvaredaf72f42006-03-22 03:48:37 -03001159exit_free:
1160 kfree(zr->stat_com);
1161 kfree(zr->video_dev);
1162 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163}
1164
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001165static void __devexit zoran_remove(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001167 struct zoran *zr = pci_get_drvdata(pdev);
1168
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 if (!zr->initialized)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001170 goto exit_free;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001171
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 /* unregister videocodec bus */
1173 if (zr->codec) {
1174 struct videocodec_master *master = zr->codec->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001175
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176 videocodec_detach(zr->codec);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001177 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 }
1179 if (zr->vfe) {
1180 struct videocodec_master *master = zr->vfe->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001181
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 videocodec_detach(zr->vfe);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001183 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 }
1185
1186 /* unregister i2c bus */
1187 zoran_unregister_i2c(zr);
1188 /* disable PCI bus-mastering */
1189 zoran_set_pci_master(zr, 0);
1190 /* put chip into reset */
1191 btwrite(0, ZR36057_SPGPPCR);
1192 free_irq(zr->pci_dev->irq, zr);
1193 /* unmap and free memory */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001194 kfree(zr->stat_com);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195 zoran_proc_cleanup(zr);
1196 iounmap(zr->zr36057_mem);
1197 pci_disable_device(zr->pci_dev);
1198 video_unregister_device(zr->video_dev);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001199exit_free:
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001200 pci_set_drvdata(pdev, NULL);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001201 kfree(zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202}
1203
1204void
1205zoran_vdev_release (struct video_device *vdev)
1206{
1207 kfree(vdev);
1208}
1209
1210static struct videocodec_master * __devinit
1211zoran_setup_videocodec (struct zoran *zr,
1212 int type)
1213{
1214 struct videocodec_master *m = NULL;
1215
1216 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1217 if (!m) {
1218 dprintk(1,
1219 KERN_ERR
1220 "%s: zoran_setup_videocodec() - no memory\n",
1221 ZR_DEVNAME(zr));
1222 return m;
1223 }
1224
Mauro Carvalho Chehab22c4a4e2007-10-15 12:09:17 -03001225 /* magic and type are unused for master struct. Makes sense only at
1226 codec structs.
1227 In the past, .type were initialized to the old V4L1 .hardware
1228 value, as VID_HARDWARE_ZR36067
1229 */
1230 m->magic = 0L;
1231 m->type = 0;
1232
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1234 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1235 m->data = zr;
1236
1237 switch (type)
1238 {
1239 case CODEC_TYPE_ZR36060:
1240 m->readreg = zr36060_read;
1241 m->writereg = zr36060_write;
1242 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1243 break;
1244 case CODEC_TYPE_ZR36050:
1245 m->readreg = zr36050_read;
1246 m->writereg = zr36050_write;
1247 m->flags |= CODEC_FLAG_JPEG;
1248 break;
1249 case CODEC_TYPE_ZR36016:
1250 m->readreg = zr36016_read;
1251 m->writereg = zr36016_write;
1252 m->flags |= CODEC_FLAG_VFE;
1253 break;
1254 }
1255
1256 return m;
1257}
1258
1259/*
Joe Perchesc84e6032008-02-03 17:18:59 +02001260 * Scan for a Buz card (actually for the PCI controller ZR36057),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 * request the irq and map the io memory
1262 */
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001263static int __devinit zoran_probe(struct pci_dev *pdev,
1264 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265{
1266 unsigned char latency, need_latency;
1267 struct zoran *zr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 int result;
1269 struct videocodec_master *master_vfe = NULL;
1270 struct videocodec_master *master_codec = NULL;
1271 int card_num;
1272 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001273 unsigned int nr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001275
Trent Piepho601139e2009-01-12 13:09:46 -03001276 nr = zoran_num++;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001277 if (nr >= BUZ_MAX) {
1278 dprintk(1,
1279 KERN_ERR
1280 "%s: driver limited to %d card(s) maximum\n",
1281 ZORAN_NAME, BUZ_MAX);
1282 return -ENOENT;
1283 }
1284
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001285 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1286 if (!zr) {
1287 dprintk(1,
1288 KERN_ERR
1289 "%s: find_zr36057() - kzalloc failed\n",
1290 ZORAN_NAME);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001291 return -ENOMEM;
1292 }
1293 zr->pci_dev = pdev;
1294 zr->id = nr;
1295 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1296 spin_lock_init(&zr->spinlock);
1297 mutex_init(&zr->resource_lock);
1298 if (pci_enable_device(pdev))
1299 goto zr_free_mem;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001300 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
Trent Piepho17faeb22009-01-12 13:09:46 -03001301
1302 dprintk(1,
1303 KERN_INFO
Trent Piepho5e098b62009-01-12 13:09:46 -03001304 "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
Trent Piepho17faeb22009-01-12 13:09:46 -03001305 ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
Trent Piepho5e098b62009-01-12 13:09:46 -03001306 zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
Trent Piepho17faeb22009-01-12 13:09:46 -03001307 if (zr->revision >= 2) {
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001308 dprintk(1,
1309 KERN_INFO
Trent Piepho17faeb22009-01-12 13:09:46 -03001310 "%s: Subsystem vendor=0x%04x id=0x%04x\n",
1311 ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1312 zr->pci_dev->subsystem_device);
1313 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001314
Trent Piepho17faeb22009-01-12 13:09:46 -03001315 /* Use auto-detected card type? */
1316 if (card[nr] == -1) {
1317 if (zr->revision < 2) {
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001318 dprintk(1,
1319 KERN_ERR
Trent Piepho17faeb22009-01-12 13:09:46 -03001320 "%s: No card type specified, please use the card=X module parameter\n",
1321 ZR_DEVNAME(zr));
1322 dprintk(1,
1323 KERN_ERR
1324 "%s: It is not possible to auto-detect ZR36057 based cards\n",
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001325 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001326 goto zr_free_mem;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001327 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328
Trent Piepho17faeb22009-01-12 13:09:46 -03001329 card_num = ent->driver_data;
1330 if (card_num >= NUM_CARDS) {
1331 dprintk(1,
1332 KERN_ERR
1333 "%s: Unknown card, try specifying card=X module parameter\n",
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001334 ZR_DEVNAME(zr));
Trent Piepho17faeb22009-01-12 13:09:46 -03001335 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336 }
Trent Piepho17faeb22009-01-12 13:09:46 -03001337 dprintk(3,
1338 KERN_DEBUG
1339 "%s: %s() - card %s detected\n",
1340 ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1341 } else {
1342 card_num = card[nr];
1343 if (card_num >= NUM_CARDS || card_num < 0) {
1344 dprintk(1,
1345 KERN_ERR
1346 "%s: User specified card type %d out of range (0 .. %d)\n",
1347 ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1348 goto zr_free_mem;
1349 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001350 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001352 /* even though we make this a non pointer and thus
1353 * theoretically allow for making changes to this struct
1354 * on a per-individual card basis at runtime, this is
1355 * strongly discouraged. This structure is intended to
1356 * keep general card information, no settings or anything */
1357 zr->card = zoran_cards[card_num];
1358 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1359 "%s[%u]", zr->card.name, zr->id);
1360
Trent Piepho5e098b62009-01-12 13:09:46 -03001361 zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001362 if (!zr->zr36057_mem) {
1363 dprintk(1,
1364 KERN_ERR
Trent Piepho5e098b62009-01-12 13:09:46 -03001365 "%s: %s() - ioremap failed\n",
1366 ZR_DEVNAME(zr), __func__);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001367 goto zr_free_mem;
1368 }
1369
1370 result = request_irq(zr->pci_dev->irq, zoran_irq,
1371 IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1372 if (result < 0) {
1373 if (result == -EINVAL) {
1374 dprintk(1,
1375 KERN_ERR
1376 "%s: find_zr36057() - bad irq number or handler\n",
1377 ZR_DEVNAME(zr));
1378 } else if (result == -EBUSY) {
1379 dprintk(1,
1380 KERN_ERR
1381 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1382 ZR_DEVNAME(zr), zr->pci_dev->irq);
1383 } else {
1384 dprintk(1,
1385 KERN_ERR
1386 "%s: find_zr36057() - can't assign irq, error code %d\n",
1387 ZR_DEVNAME(zr), result);
1388 }
1389 goto zr_unmap;
1390 }
1391
1392 /* set PCI latency timer */
1393 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1394 &latency);
1395 need_latency = zr->revision > 1 ? 32 : 48;
1396 if (latency != need_latency) {
1397 dprintk(2,
1398 KERN_INFO
1399 "%s: Changing PCI latency from %d to %d\n",
1400 ZR_DEVNAME(zr), latency, need_latency);
1401 pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1402 need_latency);
1403 }
1404
1405 zr36057_restart(zr);
1406 /* i2c */
1407 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1408 ZR_DEVNAME(zr));
1409
1410 /* i2c decoder */
1411 if (decoder[zr->id] != -1) {
1412 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1413 zr->card.i2c_decoder = decoder[zr->id];
1414 } else if (zr->card.i2c_decoder != 0) {
1415 i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
1416 } else {
1417 i2c_dec_name = NULL;
1418 }
1419
1420 if (i2c_dec_name) {
1421 result = request_module(i2c_dec_name);
1422 if (result < 0) {
1423 dprintk(1,
1424 KERN_ERR
1425 "%s: failed to load module %s: %d\n",
1426 ZR_DEVNAME(zr), i2c_dec_name, result);
1427 }
1428 }
1429
1430 /* i2c encoder */
1431 if (encoder[zr->id] != -1) {
1432 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1433 zr->card.i2c_encoder = encoder[zr->id];
1434 } else if (zr->card.i2c_encoder != 0) {
1435 i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
1436 } else {
1437 i2c_enc_name = NULL;
1438 }
1439
1440 if (i2c_enc_name) {
1441 result = request_module(i2c_enc_name);
1442 if (result < 0) {
1443 dprintk(1,
1444 KERN_ERR
1445 "%s: failed to load module %s: %d\n",
1446 ZR_DEVNAME(zr), i2c_enc_name, result);
1447 }
1448 }
1449
1450 if (zoran_register_i2c(zr) < 0) {
1451 dprintk(1,
1452 KERN_ERR
1453 "%s: find_zr36057() - can't initialize i2c bus\n",
1454 ZR_DEVNAME(zr));
1455 goto zr_free_irq;
1456 }
1457
1458 dprintk(2,
1459 KERN_INFO "%s: Initializing videocodec bus...\n",
1460 ZR_DEVNAME(zr));
1461
1462 if (zr->card.video_codec) {
1463 codec_name = codecid_to_modulename(zr->card.video_codec);
1464 if (codec_name) {
1465 result = request_module(codec_name);
1466 if (result) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 dprintk(1,
1468 KERN_ERR
1469 "%s: failed to load modules %s: %d\n",
1470 ZR_DEVNAME(zr), codec_name, result);
1471 }
1472 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001473 }
1474 if (zr->card.video_vfe) {
1475 vfe_name = codecid_to_modulename(zr->card.video_vfe);
1476 if (vfe_name) {
1477 result = request_module(vfe_name);
1478 if (result < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 dprintk(1,
1480 KERN_ERR
1481 "%s: failed to load modules %s: %d\n",
1482 ZR_DEVNAME(zr), vfe_name, result);
1483 }
1484 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 }
Alan Coxe491cbc2006-10-03 20:44:12 -03001486
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001487 /* reset JPEG codec */
1488 jpeg_codec_sleep(zr, 1);
1489 jpeg_codec_reset(zr);
1490 /* video bus enabled */
1491 /* display codec revision */
1492 if (zr->card.video_codec != 0) {
1493 master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1494 if (!master_codec)
1495 goto zr_unreg_i2c;
1496 zr->codec = videocodec_attach(master_codec);
1497 if (!zr->codec) {
1498 dprintk(1,
1499 KERN_ERR
1500 "%s: find_zr36057() - no codec found\n",
1501 ZR_DEVNAME(zr));
1502 goto zr_free_codec;
1503 }
1504 if (zr->codec->type != zr->card.video_codec) {
1505 dprintk(1,
1506 KERN_ERR
1507 "%s: find_zr36057() - wrong codec\n",
1508 ZR_DEVNAME(zr));
1509 goto zr_detach_codec;
1510 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001512 if (zr->card.video_vfe != 0) {
1513 master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1514 if (!master_vfe)
1515 goto zr_detach_codec;
1516 zr->vfe = videocodec_attach(master_vfe);
1517 if (!zr->vfe) {
1518 dprintk(1,
1519 KERN_ERR
1520 "%s: find_zr36057() - no VFE found\n",
1521 ZR_DEVNAME(zr));
1522 goto zr_free_vfe;
1523 }
1524 if (zr->vfe->type != zr->card.video_vfe) {
1525 dprintk(1,
1526 KERN_ERR
1527 "%s: find_zr36057() = wrong VFE\n",
1528 ZR_DEVNAME(zr));
1529 goto zr_detach_vfe;
1530 }
1531 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001532
1533 /* take care of Natoma chipset and a revision 1 zr36057 */
1534 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1535 zr->jpg_buffers.need_contiguous = 1;
1536 dprintk(1,
1537 KERN_INFO
1538 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1539 ZR_DEVNAME(zr));
1540 }
1541
1542 if (zr36057_init(zr) < 0)
1543 goto zr_detach_vfe;
1544
1545 zoran_proc_init(zr);
1546
1547 pci_set_drvdata(pdev, zr);
1548
1549 return 0;
1550
1551zr_detach_vfe:
1552 videocodec_detach(zr->vfe);
1553zr_free_vfe:
1554 kfree(master_vfe);
1555zr_detach_codec:
1556 videocodec_detach(zr->codec);
1557zr_free_codec:
1558 kfree(master_codec);
1559zr_unreg_i2c:
1560 zoran_unregister_i2c(zr);
1561zr_free_irq:
1562 btwrite(0, ZR36057_SPGPPCR);
1563 free_irq(zr->pci_dev->irq, zr);
1564zr_unmap:
1565 iounmap(zr->zr36057_mem);
1566zr_free_mem:
1567 kfree(zr);
1568
1569 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570}
1571
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001572static struct pci_driver zoran_driver = {
1573 .name = "zr36067",
1574 .id_table = zr36067_pci_tbl,
1575 .probe = zoran_probe,
1576 .remove = zoran_remove,
1577};
1578
1579static int __init zoran_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001580{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001581 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1584 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1585
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 /* check the parameters we have been given, adjust if necessary */
1587 if (v4l_nbufs < 2)
1588 v4l_nbufs = 2;
1589 if (v4l_nbufs > VIDEO_MAX_FRAME)
1590 v4l_nbufs = VIDEO_MAX_FRAME;
1591 /* The user specfies the in KB, we want them in byte
1592 * (and page aligned) */
1593 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1594 if (v4l_bufsize < 32768)
1595 v4l_bufsize = 32768;
1596 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1597 if (v4l_bufsize > 2048 * 1024)
1598 v4l_bufsize = 2048 * 1024;
1599 if (jpg_nbufs < 4)
1600 jpg_nbufs = 4;
1601 if (jpg_nbufs > BUZ_MAX_FRAME)
1602 jpg_nbufs = BUZ_MAX_FRAME;
1603 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1604 if (jpg_bufsize < 8192)
1605 jpg_bufsize = 8192;
1606 if (jpg_bufsize > (512 * 1024))
1607 jpg_bufsize = 512 * 1024;
1608 /* Use parameter for vidmem or try to find a video card */
1609 if (vidmem) {
1610 dprintk(1,
1611 KERN_INFO
1612 "%s: Using supplied video memory base address @ 0x%lx\n",
1613 ZORAN_NAME, vidmem);
1614 }
1615
1616 /* random nonsense */
Jean Delvare18b548c2007-07-17 18:29:41 -03001617 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618
1619 /* some mainboards might not do PCI-PCI data transfer well */
Alan Coxe3558802006-09-14 11:47:55 -03001620 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 dprintk(1,
1622 KERN_WARNING
Alan Coxe3558802006-09-14 11:47:55 -03001623 "%s: chipset does not support reliable PCI-PCI DMA\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 ZORAN_NAME);
1625 }
1626
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001627 res = pci_register_driver(&zoran_driver);
1628 if (res) {
1629 dprintk(1,
1630 KERN_ERR
1631 "%s: Unable to register ZR36057 driver\n",
1632 ZORAN_NAME);
1633 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 }
1635
1636 return 0;
1637}
1638
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001639static void __exit zoran_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001641 pci_unregister_driver(&zoran_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642}
1643
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001644module_init(zoran_init);
1645module_exit(zoran_exit);