blob: 774717bf43cce26cce80a4b6280c246a59cab192 [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,
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300838 struct zoran_jpg_settings *settings,
839 int try)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840{
841 int err = 0, err0 = 0;
842
843 dprintk(4,
844 KERN_DEBUG
845 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
846 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
847 settings->VerDcm, settings->TmpDcm);
848 dprintk(4,
849 KERN_DEBUG
850 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
851 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
852 settings->img_width, settings->img_height);
853 /* Check decimation, set default values for decimation = 1, 2, 4 */
854 switch (settings->decimation) {
855 case 1:
856
857 settings->HorDcm = 1;
858 settings->VerDcm = 1;
859 settings->TmpDcm = 1;
860 settings->field_per_buff = 2;
861 settings->img_x = 0;
862 settings->img_y = 0;
863 settings->img_width = BUZ_MAX_WIDTH;
864 settings->img_height = BUZ_MAX_HEIGHT / 2;
865 break;
866 case 2:
867
868 settings->HorDcm = 2;
869 settings->VerDcm = 1;
870 settings->TmpDcm = 2;
871 settings->field_per_buff = 1;
872 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
873 settings->img_y = 0;
874 settings->img_width =
875 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
876 settings->img_height = BUZ_MAX_HEIGHT / 2;
877 break;
878 case 4:
879
880 if (zr->card.type == DC10_new) {
881 dprintk(1,
882 KERN_DEBUG
883 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
884 ZR_DEVNAME(zr));
885 err0++;
886 break;
887 }
888
889 settings->HorDcm = 4;
890 settings->VerDcm = 2;
891 settings->TmpDcm = 2;
892 settings->field_per_buff = 1;
893 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
894 settings->img_y = 0;
895 settings->img_width =
896 (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
897 settings->img_height = BUZ_MAX_HEIGHT / 2;
898 break;
899 case 0:
900
901 /* We have to check the data the user has set */
902
903 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300904 (zr->card.type == DC10_new || settings->HorDcm != 4)) {
905 settings->HorDcm = clamp(settings->HorDcm, 1, 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300907 }
908 if (settings->VerDcm != 1 && settings->VerDcm != 2) {
909 settings->VerDcm = clamp(settings->VerDcm, 1, 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300911 }
912 if (settings->TmpDcm != 1 && settings->TmpDcm != 2) {
913 settings->TmpDcm = clamp(settings->TmpDcm, 1, 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300915 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916 if (settings->field_per_buff != 1 &&
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300917 settings->field_per_buff != 2) {
918 settings->field_per_buff = clamp(settings->field_per_buff, 1, 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300920 }
921 if (settings->img_x < 0) {
922 settings->img_x = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300924 }
925 if (settings->img_y < 0) {
926 settings->img_y = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300928 }
929 if (settings->img_width < 0 || settings->img_width > BUZ_MAX_WIDTH) {
930 settings->img_width = clamp(settings->img_width, 0, (int)BUZ_MAX_WIDTH);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300932 }
933 if (settings->img_height < 0 || settings->img_height > BUZ_MAX_HEIGHT / 2) {
934 settings->img_height = clamp(settings->img_height, 0, BUZ_MAX_HEIGHT / 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300936 }
937 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH) {
938 settings->img_x = BUZ_MAX_WIDTH - settings->img_width;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300940 }
941 if (settings->img_y + settings->img_height > BUZ_MAX_HEIGHT / 2) {
942 settings->img_y = BUZ_MAX_HEIGHT / 2 - settings->img_height;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 err0++;
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300944 }
945 if (settings->img_width % (16 * settings->HorDcm) != 0) {
946 settings->img_width -= settings->img_width % (16 * settings->HorDcm);
947 if (settings->img_width == 0)
948 settings->img_width = 16 * settings->HorDcm;
949 err0++;
950 }
951 if (settings->img_height % (8 * settings->VerDcm) != 0) {
952 settings->img_height -= settings->img_height % (8 * settings->VerDcm);
953 if (settings->img_height == 0)
954 settings->img_height = 8 * settings->VerDcm;
955 err0++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 }
957
Hans Verkuil0ba514d2009-02-18 17:11:17 -0300958 if (!try && err0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 dprintk(1,
960 KERN_ERR
961 "%s: check_jpg_settings() - error in params for decimation = 0\n",
962 ZR_DEVNAME(zr));
963 err++;
964 }
965 break;
966 default:
967 dprintk(1,
968 KERN_ERR
969 "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
970 ZR_DEVNAME(zr), settings->decimation);
971 err++;
972 break;
973 }
974
975 if (settings->jpg_comp.quality > 100)
976 settings->jpg_comp.quality = 100;
977 if (settings->jpg_comp.quality < 5)
978 settings->jpg_comp.quality = 5;
979 if (settings->jpg_comp.APPn < 0)
980 settings->jpg_comp.APPn = 0;
981 if (settings->jpg_comp.APPn > 15)
982 settings->jpg_comp.APPn = 15;
983 if (settings->jpg_comp.APP_len < 0)
984 settings->jpg_comp.APP_len = 0;
985 if (settings->jpg_comp.APP_len > 60)
986 settings->jpg_comp.APP_len = 60;
987 if (settings->jpg_comp.COM_len < 0)
988 settings->jpg_comp.COM_len = 0;
989 if (settings->jpg_comp.COM_len > 60)
990 settings->jpg_comp.COM_len = 60;
991 if (err)
992 return -EINVAL;
993 return 0;
994}
995
996void
997zoran_open_init_params (struct zoran *zr)
998{
999 int i;
1000
1001 /* User must explicitly set a window */
1002 zr->overlay_settings.is_set = 0;
1003 zr->overlay_mask = NULL;
1004 zr->overlay_active = ZORAN_FREE;
1005
1006 zr->v4l_memgrab_active = 0;
1007 zr->v4l_overlay_active = 0;
1008 zr->v4l_grab_frame = NO_GRAB_ACTIVE;
1009 zr->v4l_grab_seq = 0;
1010 zr->v4l_settings.width = 192;
1011 zr->v4l_settings.height = 144;
Jean Delvarec014ec92008-09-07 05:21:34 -03001012 zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 zr->v4l_settings.bytesperline =
1014 zr->v4l_settings.width *
1015 ((zr->v4l_settings.format->depth + 7) / 8);
1016
1017 /* DMA ring stuff for V4L */
1018 zr->v4l_pend_tail = 0;
1019 zr->v4l_pend_head = 0;
1020 zr->v4l_sync_tail = 0;
1021 zr->v4l_buffers.active = ZORAN_FREE;
1022 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1023 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1024 }
1025 zr->v4l_buffers.allocated = 0;
1026
1027 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1028 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
1029 }
1030 zr->jpg_buffers.active = ZORAN_FREE;
1031 zr->jpg_buffers.allocated = 0;
1032 /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1033 zr->jpg_settings.decimation = 1;
1034 zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1035 if (zr->card.type != BUZ)
1036 zr->jpg_settings.odd_even = 1;
1037 else
1038 zr->jpg_settings.odd_even = 0;
1039 zr->jpg_settings.jpg_comp.APPn = 0;
1040 zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */
1041 memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1042 sizeof(zr->jpg_settings.jpg_comp.APP_data));
1043 zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */
1044 memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1045 sizeof(zr->jpg_settings.jpg_comp.COM_data));
1046 zr->jpg_settings.jpg_comp.jpeg_markers =
1047 JPEG_MARKER_DHT | JPEG_MARKER_DQT;
Hans Verkuil0ba514d2009-02-18 17:11:17 -03001048 i = zoran_check_jpg_settings(zr, &zr->jpg_settings, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 if (i)
1050 dprintk(1,
1051 KERN_ERR
1052 "%s: zoran_open_init_params() internal error\n",
1053 ZR_DEVNAME(zr));
1054
1055 clear_interrupt_counters(zr);
1056 zr->testing = 0;
1057}
1058
1059static void __devinit
1060test_interrupts (struct zoran *zr)
1061{
1062 DEFINE_WAIT(wait);
1063 int timeout, icr;
1064
1065 clear_interrupt_counters(zr);
1066
1067 zr->testing = 1;
1068 icr = btread(ZR36057_ICR);
1069 btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1070 prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1071 timeout = schedule_timeout(HZ);
1072 finish_wait(&zr->test_q, &wait);
1073 btwrite(0, ZR36057_ICR);
1074 btwrite(0x78000000, ZR36057_ISR);
1075 zr->testing = 0;
1076 dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1077 if (timeout) {
1078 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1079 }
Jean Delvare18b548c2007-07-17 18:29:41 -03001080 if (zr36067_debug > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 print_interrupts(zr);
1082 btwrite(icr, ZR36057_ICR);
1083}
1084
1085static int __devinit
1086zr36057_init (struct zoran *zr)
1087{
Jean Delvaredaf72f42006-03-22 03:48:37 -03001088 int j, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089 int two = 2;
1090 int zero = 0;
1091
1092 dprintk(1,
1093 KERN_INFO
1094 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1095 ZR_DEVNAME(zr), zr->id, zr);
1096
1097 /* default setup of all parameters which will persist between opens */
1098 zr->user = 0;
1099
1100 init_waitqueue_head(&zr->v4l_capq);
1101 init_waitqueue_head(&zr->jpg_capq);
1102 init_waitqueue_head(&zr->test_q);
1103 zr->jpg_buffers.allocated = 0;
1104 zr->v4l_buffers.allocated = 0;
1105
1106 zr->buffer.base = (void *) vidmem;
1107 zr->buffer.width = 0;
1108 zr->buffer.height = 0;
1109 zr->buffer.depth = 0;
1110 zr->buffer.bytesperline = 0;
1111
1112 /* Avoid nonsense settings from user for default input/norm */
1113 if (default_norm < VIDEO_MODE_PAL &&
1114 default_norm > VIDEO_MODE_SECAM)
1115 default_norm = VIDEO_MODE_PAL;
1116 zr->norm = default_norm;
1117 if (!(zr->timing = zr->card.tvn[zr->norm])) {
1118 dprintk(1,
1119 KERN_WARNING
1120 "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1121 ZR_DEVNAME(zr));
1122 zr->norm = VIDEO_MODE_PAL;
1123 zr->timing = zr->card.tvn[zr->norm];
1124 }
1125
Trent Piepho60e3cac2007-07-17 18:29:42 -03001126 if (default_input > zr->card.inputs-1) {
1127 dprintk(1,
1128 KERN_WARNING
1129 "%s: default_input value %d out of range (0-%d)\n",
1130 ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1131 default_input = 0;
1132 }
1133 zr->input = default_input;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134
1135 /* Should the following be reset at every open ? */
1136 zr->hue = 32768;
1137 zr->contrast = 32768;
1138 zr->saturation = 32768;
1139 zr->brightness = 32768;
1140
1141 /* default setup (will be repeated at every open) */
1142 zoran_open_init_params(zr);
1143
1144 /* allocate memory *before* doing anything to the hardware
1145 * in case allocation fails */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001146 zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1147 zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1148 if (!zr->stat_com || !zr->video_dev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 dprintk(1,
1150 KERN_ERR
1151 "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1152 ZR_DEVNAME(zr));
Jean Delvaredaf72f42006-03-22 03:48:37 -03001153 err = -ENOMEM;
1154 goto exit_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
Al Viro9c169df2008-06-22 14:19:49 -03001157 zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 }
1159
1160 /*
1161 * Now add the template and register the device unit.
1162 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
Hans Verkuilaff88bc2009-02-18 13:52:24 -03001164 zr->video_dev->parent = &zr->pci_dev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
Trent Piepho60e3cac2007-07-17 18:29:42 -03001166 err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
Jean Delvaredaf72f42006-03-22 03:48:37 -03001167 if (err < 0)
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001168 goto exit_free;
Trent Piepho601139e2009-01-12 13:09:46 -03001169 video_set_drvdata(zr->video_dev, zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170
1171 zoran_init_hardware(zr);
Jean Delvare18b548c2007-07-17 18:29:41 -03001172 if (zr36067_debug > 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 detect_guest_activity(zr);
1174 test_interrupts(zr);
1175 if (!pass_through) {
1176 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1177 encoder_command(zr, ENCODER_SET_INPUT, &two);
1178 }
1179
1180 zr->zoran_proc = NULL;
1181 zr->initialized = 1;
1182 return 0;
Jean Delvaredaf72f42006-03-22 03:48:37 -03001183
Jean Delvaredaf72f42006-03-22 03:48:37 -03001184exit_free:
1185 kfree(zr->stat_com);
1186 kfree(zr->video_dev);
1187 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188}
1189
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001190static void __devexit zoran_remove(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001192 struct zoran *zr = pci_get_drvdata(pdev);
1193
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 if (!zr->initialized)
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001195 goto exit_free;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001196
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 /* unregister videocodec bus */
1198 if (zr->codec) {
1199 struct videocodec_master *master = zr->codec->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001200
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 videocodec_detach(zr->codec);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001202 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 }
1204 if (zr->vfe) {
1205 struct videocodec_master *master = zr->vfe->master_data;
Jesper Juhl2ea75332005-11-07 01:01:31 -08001206
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207 videocodec_detach(zr->vfe);
Jesper Juhl2ea75332005-11-07 01:01:31 -08001208 kfree(master);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 }
1210
1211 /* unregister i2c bus */
1212 zoran_unregister_i2c(zr);
1213 /* disable PCI bus-mastering */
1214 zoran_set_pci_master(zr, 0);
1215 /* put chip into reset */
1216 btwrite(0, ZR36057_SPGPPCR);
1217 free_irq(zr->pci_dev->irq, zr);
1218 /* unmap and free memory */
Jean Delvaredaf72f42006-03-22 03:48:37 -03001219 kfree(zr->stat_com);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 zoran_proc_cleanup(zr);
1221 iounmap(zr->zr36057_mem);
1222 pci_disable_device(zr->pci_dev);
1223 video_unregister_device(zr->video_dev);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001224exit_free:
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001225 pci_set_drvdata(pdev, NULL);
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001226 kfree(zr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227}
1228
1229void
1230zoran_vdev_release (struct video_device *vdev)
1231{
1232 kfree(vdev);
1233}
1234
1235static struct videocodec_master * __devinit
1236zoran_setup_videocodec (struct zoran *zr,
1237 int type)
1238{
1239 struct videocodec_master *m = NULL;
1240
1241 m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1242 if (!m) {
1243 dprintk(1,
1244 KERN_ERR
1245 "%s: zoran_setup_videocodec() - no memory\n",
1246 ZR_DEVNAME(zr));
1247 return m;
1248 }
1249
Mauro Carvalho Chehab22c4a4e2007-10-15 12:09:17 -03001250 /* magic and type are unused for master struct. Makes sense only at
1251 codec structs.
1252 In the past, .type were initialized to the old V4L1 .hardware
1253 value, as VID_HARDWARE_ZR36067
1254 */
1255 m->magic = 0L;
1256 m->type = 0;
1257
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1259 strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1260 m->data = zr;
1261
1262 switch (type)
1263 {
1264 case CODEC_TYPE_ZR36060:
1265 m->readreg = zr36060_read;
1266 m->writereg = zr36060_write;
1267 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1268 break;
1269 case CODEC_TYPE_ZR36050:
1270 m->readreg = zr36050_read;
1271 m->writereg = zr36050_write;
1272 m->flags |= CODEC_FLAG_JPEG;
1273 break;
1274 case CODEC_TYPE_ZR36016:
1275 m->readreg = zr36016_read;
1276 m->writereg = zr36016_write;
1277 m->flags |= CODEC_FLAG_VFE;
1278 break;
1279 }
1280
1281 return m;
1282}
1283
1284/*
Joe Perchesc84e6032008-02-03 17:18:59 +02001285 * Scan for a Buz card (actually for the PCI controller ZR36057),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286 * request the irq and map the io memory
1287 */
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001288static int __devinit zoran_probe(struct pci_dev *pdev,
1289 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290{
1291 unsigned char latency, need_latency;
1292 struct zoran *zr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293 int result;
1294 struct videocodec_master *master_vfe = NULL;
1295 struct videocodec_master *master_codec = NULL;
1296 int card_num;
1297 char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001298 unsigned int nr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001300
Trent Piepho601139e2009-01-12 13:09:46 -03001301 nr = zoran_num++;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001302 if (nr >= BUZ_MAX) {
1303 dprintk(1,
1304 KERN_ERR
1305 "%s: driver limited to %d card(s) maximum\n",
1306 ZORAN_NAME, BUZ_MAX);
1307 return -ENOENT;
1308 }
1309
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001310 zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1311 if (!zr) {
1312 dprintk(1,
1313 KERN_ERR
1314 "%s: find_zr36057() - kzalloc failed\n",
1315 ZORAN_NAME);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001316 return -ENOMEM;
1317 }
1318 zr->pci_dev = pdev;
1319 zr->id = nr;
1320 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1321 spin_lock_init(&zr->spinlock);
1322 mutex_init(&zr->resource_lock);
1323 if (pci_enable_device(pdev))
1324 goto zr_free_mem;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001325 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
Trent Piepho17faeb22009-01-12 13:09:46 -03001326
1327 dprintk(1,
1328 KERN_INFO
Trent Piepho5e098b62009-01-12 13:09:46 -03001329 "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
Trent Piepho17faeb22009-01-12 13:09:46 -03001330 ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
Trent Piepho5e098b62009-01-12 13:09:46 -03001331 zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
Trent Piepho17faeb22009-01-12 13:09:46 -03001332 if (zr->revision >= 2) {
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001333 dprintk(1,
1334 KERN_INFO
Trent Piepho17faeb22009-01-12 13:09:46 -03001335 "%s: Subsystem vendor=0x%04x id=0x%04x\n",
1336 ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1337 zr->pci_dev->subsystem_device);
1338 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001339
Trent Piepho17faeb22009-01-12 13:09:46 -03001340 /* Use auto-detected card type? */
1341 if (card[nr] == -1) {
1342 if (zr->revision < 2) {
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001343 dprintk(1,
1344 KERN_ERR
Trent Piepho17faeb22009-01-12 13:09:46 -03001345 "%s: No card type specified, please use the card=X module parameter\n",
1346 ZR_DEVNAME(zr));
1347 dprintk(1,
1348 KERN_ERR
1349 "%s: It is not possible to auto-detect ZR36057 based cards\n",
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001350 ZR_DEVNAME(zr));
Jean Delvare85b9b8a2008-07-14 09:51:03 -03001351 goto zr_free_mem;
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001352 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353
Trent Piepho17faeb22009-01-12 13:09:46 -03001354 card_num = ent->driver_data;
1355 if (card_num >= NUM_CARDS) {
1356 dprintk(1,
1357 KERN_ERR
1358 "%s: Unknown card, try specifying card=X module parameter\n",
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001359 ZR_DEVNAME(zr));
Trent Piepho17faeb22009-01-12 13:09:46 -03001360 goto zr_free_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 }
Trent Piepho17faeb22009-01-12 13:09:46 -03001362 dprintk(3,
1363 KERN_DEBUG
1364 "%s: %s() - card %s detected\n",
1365 ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1366 } else {
1367 card_num = card[nr];
1368 if (card_num >= NUM_CARDS || card_num < 0) {
1369 dprintk(1,
1370 KERN_ERR
1371 "%s: User specified card type %d out of range (0 .. %d)\n",
1372 ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1373 goto zr_free_mem;
1374 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001375 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001377 /* even though we make this a non pointer and thus
1378 * theoretically allow for making changes to this struct
1379 * on a per-individual card basis at runtime, this is
1380 * strongly discouraged. This structure is intended to
1381 * keep general card information, no settings or anything */
1382 zr->card = zoran_cards[card_num];
1383 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1384 "%s[%u]", zr->card.name, zr->id);
1385
Trent Piepho5e098b62009-01-12 13:09:46 -03001386 zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001387 if (!zr->zr36057_mem) {
1388 dprintk(1,
1389 KERN_ERR
Trent Piepho5e098b62009-01-12 13:09:46 -03001390 "%s: %s() - ioremap failed\n",
1391 ZR_DEVNAME(zr), __func__);
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001392 goto zr_free_mem;
1393 }
1394
1395 result = request_irq(zr->pci_dev->irq, zoran_irq,
1396 IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1397 if (result < 0) {
1398 if (result == -EINVAL) {
1399 dprintk(1,
1400 KERN_ERR
1401 "%s: find_zr36057() - bad irq number or handler\n",
1402 ZR_DEVNAME(zr));
1403 } else if (result == -EBUSY) {
1404 dprintk(1,
1405 KERN_ERR
1406 "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1407 ZR_DEVNAME(zr), zr->pci_dev->irq);
1408 } else {
1409 dprintk(1,
1410 KERN_ERR
1411 "%s: find_zr36057() - can't assign irq, error code %d\n",
1412 ZR_DEVNAME(zr), result);
1413 }
1414 goto zr_unmap;
1415 }
1416
1417 /* set PCI latency timer */
1418 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1419 &latency);
1420 need_latency = zr->revision > 1 ? 32 : 48;
1421 if (latency != need_latency) {
1422 dprintk(2,
1423 KERN_INFO
1424 "%s: Changing PCI latency from %d to %d\n",
1425 ZR_DEVNAME(zr), latency, need_latency);
1426 pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1427 need_latency);
1428 }
1429
1430 zr36057_restart(zr);
1431 /* i2c */
1432 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1433 ZR_DEVNAME(zr));
1434
1435 /* i2c decoder */
1436 if (decoder[zr->id] != -1) {
1437 i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1438 zr->card.i2c_decoder = decoder[zr->id];
1439 } else if (zr->card.i2c_decoder != 0) {
1440 i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
1441 } else {
1442 i2c_dec_name = NULL;
1443 }
1444
1445 if (i2c_dec_name) {
1446 result = request_module(i2c_dec_name);
1447 if (result < 0) {
1448 dprintk(1,
1449 KERN_ERR
1450 "%s: failed to load module %s: %d\n",
1451 ZR_DEVNAME(zr), i2c_dec_name, result);
1452 }
1453 }
1454
1455 /* i2c encoder */
1456 if (encoder[zr->id] != -1) {
1457 i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1458 zr->card.i2c_encoder = encoder[zr->id];
1459 } else if (zr->card.i2c_encoder != 0) {
1460 i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
1461 } else {
1462 i2c_enc_name = NULL;
1463 }
1464
1465 if (i2c_enc_name) {
1466 result = request_module(i2c_enc_name);
1467 if (result < 0) {
1468 dprintk(1,
1469 KERN_ERR
1470 "%s: failed to load module %s: %d\n",
1471 ZR_DEVNAME(zr), i2c_enc_name, result);
1472 }
1473 }
1474
1475 if (zoran_register_i2c(zr) < 0) {
1476 dprintk(1,
1477 KERN_ERR
1478 "%s: find_zr36057() - can't initialize i2c bus\n",
1479 ZR_DEVNAME(zr));
1480 goto zr_free_irq;
1481 }
1482
1483 dprintk(2,
1484 KERN_INFO "%s: Initializing videocodec bus...\n",
1485 ZR_DEVNAME(zr));
1486
1487 if (zr->card.video_codec) {
1488 codec_name = codecid_to_modulename(zr->card.video_codec);
1489 if (codec_name) {
1490 result = request_module(codec_name);
1491 if (result) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 dprintk(1,
1493 KERN_ERR
1494 "%s: failed to load modules %s: %d\n",
1495 ZR_DEVNAME(zr), codec_name, result);
1496 }
1497 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001498 }
1499 if (zr->card.video_vfe) {
1500 vfe_name = codecid_to_modulename(zr->card.video_vfe);
1501 if (vfe_name) {
1502 result = request_module(vfe_name);
1503 if (result < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 dprintk(1,
1505 KERN_ERR
1506 "%s: failed to load modules %s: %d\n",
1507 ZR_DEVNAME(zr), vfe_name, result);
1508 }
1509 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 }
Alan Coxe491cbc2006-10-03 20:44:12 -03001511
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001512 /* reset JPEG codec */
1513 jpeg_codec_sleep(zr, 1);
1514 jpeg_codec_reset(zr);
1515 /* video bus enabled */
1516 /* display codec revision */
1517 if (zr->card.video_codec != 0) {
1518 master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1519 if (!master_codec)
1520 goto zr_unreg_i2c;
1521 zr->codec = videocodec_attach(master_codec);
1522 if (!zr->codec) {
1523 dprintk(1,
1524 KERN_ERR
1525 "%s: find_zr36057() - no codec found\n",
1526 ZR_DEVNAME(zr));
1527 goto zr_free_codec;
1528 }
1529 if (zr->codec->type != zr->card.video_codec) {
1530 dprintk(1,
1531 KERN_ERR
1532 "%s: find_zr36057() - wrong codec\n",
1533 ZR_DEVNAME(zr));
1534 goto zr_detach_codec;
1535 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001537 if (zr->card.video_vfe != 0) {
1538 master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1539 if (!master_vfe)
1540 goto zr_detach_codec;
1541 zr->vfe = videocodec_attach(master_vfe);
1542 if (!zr->vfe) {
1543 dprintk(1,
1544 KERN_ERR
1545 "%s: find_zr36057() - no VFE found\n",
1546 ZR_DEVNAME(zr));
1547 goto zr_free_vfe;
1548 }
1549 if (zr->vfe->type != zr->card.video_vfe) {
1550 dprintk(1,
1551 KERN_ERR
1552 "%s: find_zr36057() = wrong VFE\n",
1553 ZR_DEVNAME(zr));
1554 goto zr_detach_vfe;
1555 }
1556 }
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001557
1558 /* take care of Natoma chipset and a revision 1 zr36057 */
1559 if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1560 zr->jpg_buffers.need_contiguous = 1;
1561 dprintk(1,
1562 KERN_INFO
1563 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1564 ZR_DEVNAME(zr));
1565 }
1566
1567 if (zr36057_init(zr) < 0)
1568 goto zr_detach_vfe;
1569
1570 zoran_proc_init(zr);
1571
1572 pci_set_drvdata(pdev, zr);
1573
1574 return 0;
1575
1576zr_detach_vfe:
1577 videocodec_detach(zr->vfe);
1578zr_free_vfe:
1579 kfree(master_vfe);
1580zr_detach_codec:
1581 videocodec_detach(zr->codec);
1582zr_free_codec:
1583 kfree(master_codec);
1584zr_unreg_i2c:
1585 zoran_unregister_i2c(zr);
1586zr_free_irq:
1587 btwrite(0, ZR36057_SPGPPCR);
1588 free_irq(zr->pci_dev->irq, zr);
1589zr_unmap:
1590 iounmap(zr->zr36057_mem);
1591zr_free_mem:
1592 kfree(zr);
1593
1594 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595}
1596
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001597static struct pci_driver zoran_driver = {
1598 .name = "zr36067",
1599 .id_table = zr36067_pci_tbl,
1600 .probe = zoran_probe,
1601 .remove = zoran_remove,
1602};
1603
1604static int __init zoran_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001606 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1609 MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1610
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611 /* check the parameters we have been given, adjust if necessary */
1612 if (v4l_nbufs < 2)
1613 v4l_nbufs = 2;
1614 if (v4l_nbufs > VIDEO_MAX_FRAME)
1615 v4l_nbufs = VIDEO_MAX_FRAME;
1616 /* The user specfies the in KB, we want them in byte
1617 * (and page aligned) */
1618 v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1619 if (v4l_bufsize < 32768)
1620 v4l_bufsize = 32768;
1621 /* 2 MB is arbitrary but sufficient for the maximum possible images */
1622 if (v4l_bufsize > 2048 * 1024)
1623 v4l_bufsize = 2048 * 1024;
1624 if (jpg_nbufs < 4)
1625 jpg_nbufs = 4;
1626 if (jpg_nbufs > BUZ_MAX_FRAME)
1627 jpg_nbufs = BUZ_MAX_FRAME;
1628 jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1629 if (jpg_bufsize < 8192)
1630 jpg_bufsize = 8192;
1631 if (jpg_bufsize > (512 * 1024))
1632 jpg_bufsize = 512 * 1024;
1633 /* Use parameter for vidmem or try to find a video card */
1634 if (vidmem) {
1635 dprintk(1,
1636 KERN_INFO
1637 "%s: Using supplied video memory base address @ 0x%lx\n",
1638 ZORAN_NAME, vidmem);
1639 }
1640
1641 /* random nonsense */
Jean Delvare18b548c2007-07-17 18:29:41 -03001642 dprintk(6, KERN_DEBUG "Jotti is een held!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643
1644 /* some mainboards might not do PCI-PCI data transfer well */
Alan Coxe3558802006-09-14 11:47:55 -03001645 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 dprintk(1,
1647 KERN_WARNING
Alan Coxe3558802006-09-14 11:47:55 -03001648 "%s: chipset does not support reliable PCI-PCI DMA\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 ZORAN_NAME);
1650 }
1651
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001652 res = pci_register_driver(&zoran_driver);
1653 if (res) {
1654 dprintk(1,
1655 KERN_ERR
1656 "%s: Unable to register ZR36057 driver\n",
1657 ZORAN_NAME);
1658 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 }
1660
1661 return 0;
1662}
1663
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001664static void __exit zoran_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665{
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001666 pci_unregister_driver(&zoran_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667}
1668
Trent Piepho66aa66ea32009-01-11 12:02:54 -03001669module_init(zoran_init);
1670module_exit(zoran_exit);