Linux Audio

Check our new training course

Loading...
   1/*
   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
   7 *
   8 * 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
  30#include <linux/delay.h>
  31
  32#include <linux/types.h>
  33#include <linux/kernel.h>
  34#include <linux/module.h>
  35#include <linux/init.h>
  36#include <linux/vmalloc.h>
  37#include <linux/slab.h>
  38
  39#include <linux/proc_fs.h>
  40#include <linux/i2c.h>
  41#include <linux/i2c-algo-bit.h>
  42#include <linux/videodev2.h>
  43#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/mutex.h>
  51#include <linux/io.h>
  52#include <media/v4l2-common.h>
  53#include <media/bt819.h>
  54
  55#include "videocodec.h"
  56#include "zoran.h"
  57#include "zoran_card.h"
  58#include "zoran_device.h"
  59#include "zoran_procfs.h"
  60
  61extern const struct zoran_format zoran_formats[];
  62
  63static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
  64module_param_array(card, int, NULL, 0444);
  65MODULE_PARM_DESC(card, "Card type");
  66
  67/*
  68   The video mem address of the video card.
  69   The driver has a little database for some videocards
  70   to determine it from there. If your video card is not in there
  71   you have either to give it to the driver as a parameter
  72   or set in in a VIDIOCSFBUF ioctl
  73 */
  74
  75static unsigned long vidmem;	/* default = 0 - Video memory base address */
  76module_param(vidmem, ulong, 0444);
  77MODULE_PARM_DESC(vidmem, "Default video memory base address");
  78
  79/*
  80   Default input and video norm at startup of the driver.
  81*/
  82
  83static unsigned int default_input;	/* default 0 = Composite, 1 = S-Video */
  84module_param(default_input, uint, 0444);
  85MODULE_PARM_DESC(default_input,
  86		 "Default input (0=Composite, 1=S-Video, 2=Internal)");
  87
  88static int default_mux = 1;	/* 6 Eyes input selection */
  89module_param(default_mux, int, 0644);
  90MODULE_PARM_DESC(default_mux,
  91		 "Default 6 Eyes mux setting (Input selection)");
  92
  93static int default_norm;	/* default 0 = PAL, 1 = NTSC 2 = SECAM */
  94module_param(default_norm, int, 0444);
  95MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
  96
  97/* /dev/videoN, -1 for autodetect */
  98static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
  99module_param_array(video_nr, int, NULL, 0444);
 100MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
 101
 102int v4l_nbufs = 4;
 103int v4l_bufsize = 864;		/* Everybody should be able to work with this setting */
 104module_param(v4l_nbufs, int, 0644);
 105MODULE_PARM_DESC(v4l_nbufs, "Maximum number of V4L buffers to use");
 106module_param(v4l_bufsize, int, 0644);
 107MODULE_PARM_DESC(v4l_bufsize, "Maximum size per V4L buffer (in kB)");
 108
 109int jpg_nbufs = 32;
 110int jpg_bufsize = 512;		/* max size for 100% quality full-PAL frame */
 111module_param(jpg_nbufs, int, 0644);
 112MODULE_PARM_DESC(jpg_nbufs, "Maximum number of JPG buffers to use");
 113module_param(jpg_bufsize, int, 0644);
 114MODULE_PARM_DESC(jpg_bufsize, "Maximum size per JPG buffer (in kB)");
 115
 116int pass_through = 0;		/* 1=Pass through TV signal when device is not used */
 117				/* 0=Show color bar when device is not used (LML33: only if lml33dpath=1) */
 118module_param(pass_through, int, 0644);
 119MODULE_PARM_DESC(pass_through,
 120		 "Pass TV signal through to TV-out when idling");
 121
 122int zr36067_debug = 1;
 123module_param_named(debug, zr36067_debug, int, 0644);
 124MODULE_PARM_DESC(debug, "Debug level (0-5)");
 125
 126#define ZORAN_VERSION "0.10.1"
 127
 128MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
 129MODULE_AUTHOR("Serguei Miridonov");
 130MODULE_LICENSE("GPL");
 131MODULE_VERSION(ZORAN_VERSION);
 132
 133#define ZR_DEVICE(subven, subdev, data)	{ \
 134	.vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
 135	.subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
 136
 137static struct pci_device_id zr36067_pci_tbl[] = {
 138	ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
 139	ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
 140	ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
 141	ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
 142	ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
 143	{0}
 144};
 145MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
 146
 147static unsigned int zoran_num;		/* number of cards found */
 148
 149/* videocodec bus functions ZR36060 */
 150static u32
 151zr36060_read (struct videocodec *codec,
 152	      u16                reg)
 153{
 154	struct zoran *zr = (struct zoran *) codec->master_data->data;
 155	__u32 data;
 156
 157	if (post_office_wait(zr)
 158	    || post_office_write(zr, 0, 1, reg >> 8)
 159	    || post_office_write(zr, 0, 2, reg & 0xff)) {
 160		return -1;
 161	}
 162
 163	data = post_office_read(zr, 0, 3) & 0xff;
 164	return data;
 165}
 166
 167static void
 168zr36060_write (struct videocodec *codec,
 169	       u16                reg,
 170	       u32                val)
 171{
 172	struct zoran *zr = (struct zoran *) codec->master_data->data;
 173
 174	if (post_office_wait(zr)
 175	    || post_office_write(zr, 0, 1, reg >> 8)
 176	    || post_office_write(zr, 0, 2, reg & 0xff)) {
 177		return;
 178	}
 179
 180	post_office_write(zr, 0, 3, val & 0xff);
 181}
 182
 183/* videocodec bus functions ZR36050 */
 184static u32
 185zr36050_read (struct videocodec *codec,
 186	      u16                reg)
 187{
 188	struct zoran *zr = (struct zoran *) codec->master_data->data;
 189	__u32 data;
 190
 191	if (post_office_wait(zr)
 192	    || post_office_write(zr, 1, 0, reg >> 2)) {	// reg. HIGHBYTES
 193		return -1;
 194	}
 195
 196	data = post_office_read(zr, 0, reg & 0x03) & 0xff;	// reg. LOWBYTES + read
 197	return data;
 198}
 199
 200static void
 201zr36050_write (struct videocodec *codec,
 202	       u16                reg,
 203	       u32                val)
 204{
 205	struct zoran *zr = (struct zoran *) codec->master_data->data;
 206
 207	if (post_office_wait(zr)
 208	    || post_office_write(zr, 1, 0, reg >> 2)) {	// reg. HIGHBYTES
 209		return;
 210	}
 211
 212	post_office_write(zr, 0, reg & 0x03, val & 0xff);	// reg. LOWBYTES + wr. data
 213}
 214
 215/* videocodec bus functions ZR36016 */
 216static u32
 217zr36016_read (struct videocodec *codec,
 218	      u16                reg)
 219{
 220	struct zoran *zr = (struct zoran *) codec->master_data->data;
 221	__u32 data;
 222
 223	if (post_office_wait(zr)) {
 224		return -1;
 225	}
 226
 227	data = post_office_read(zr, 2, reg & 0x03) & 0xff;	// read
 228	return data;
 229}
 230
 231/* hack for in zoran_device.c */
 232void
 233zr36016_write (struct videocodec *codec,
 234	       u16                reg,
 235	       u32                val)
 236{
 237	struct zoran *zr = (struct zoran *) codec->master_data->data;
 238
 239	if (post_office_wait(zr)) {
 240		return;
 241	}
 242
 243	post_office_write(zr, 2, reg & 0x03, val & 0x0ff);	// wr. data
 244}
 245
 246/*
 247 * Board specific information
 248 */
 249
 250static void
 251dc10_init (struct zoran *zr)
 252{
 253	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
 254
 255	/* Pixel clock selection */
 256	GPIO(zr, 4, 0);
 257	GPIO(zr, 5, 1);
 258	/* Enable the video bus sync signals */
 259	GPIO(zr, 7, 0);
 260}
 261
 262static void
 263dc10plus_init (struct zoran *zr)
 264{
 265	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
 266}
 267
 268static void
 269buz_init (struct zoran *zr)
 270{
 271	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
 272
 273	/* some stuff from Iomega */
 274	pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
 275	pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
 276	pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
 277}
 278
 279static void
 280lml33_init (struct zoran *zr)
 281{
 282	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
 283
 284	GPIO(zr, 2, 1);		// Set Composite input/output
 285}
 286
 287static void
 288avs6eyes_init (struct zoran *zr)
 289{
 290	// AverMedia 6-Eyes original driver by Christer Weinigel
 291
 292	// Lifted straight from Christer's old driver and
 293	// modified slightly by Martin Samuelsson.
 294
 295	int mux = default_mux; /* 1 = BT866, 7 = VID1 */
 296
 297	GPIO(zr, 4, 1); /* Bt866 SLEEP on */
 298	udelay(2);
 299
 300	GPIO(zr, 0, 1); /* ZR36060 /RESET on */
 301	GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
 302	GPIO(zr, 2, mux & 1);   /* MUX S0 */
 303	GPIO(zr, 3, 0); /* /FRAME on */
 304	GPIO(zr, 4, 0); /* Bt866 SLEEP off */
 305	GPIO(zr, 5, mux & 2);   /* MUX S1 */
 306	GPIO(zr, 6, 0); /* ? */
 307	GPIO(zr, 7, mux & 4);   /* MUX S2 */
 308
 309}
 310
 311static char *
 312codecid_to_modulename (u16 codecid)
 313{
 314	char *name = NULL;
 315
 316	switch (codecid) {
 317	case CODEC_TYPE_ZR36060:
 318		name = "zr36060";
 319		break;
 320	case CODEC_TYPE_ZR36050:
 321		name = "zr36050";
 322		break;
 323	case CODEC_TYPE_ZR36016:
 324		name = "zr36016";
 325		break;
 326	}
 327
 328	return name;
 329}
 330
 331// struct tvnorm {
 332//      u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
 333// };
 334
 335static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
 336static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
 337static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
 338static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
 339
 340static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
 341static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
 342
 343/* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
 344static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
 345static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
 346
 347/* FIXME: I cannot swap U and V in saa7114, so i do one
 348 * pixel left shift in zoran (75 -> 74)
 349 * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
 350static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
 351static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
 352
 353/* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
 354 * copy Maxim's left shift hack for the 6 Eyes.
 355 *
 356 * Christer's driver used the unshifted norms, though...
 357 * /Sam  */
 358static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
 359static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
 360
 361static const unsigned short vpx3220_addrs[] = { 0x43, 0x47, I2C_CLIENT_END };
 362static const unsigned short saa7110_addrs[] = { 0x4e, 0x4f, I2C_CLIENT_END };
 363static const unsigned short saa7111_addrs[] = { 0x25, 0x24, I2C_CLIENT_END };
 364static const unsigned short saa7114_addrs[] = { 0x21, 0x20, I2C_CLIENT_END };
 365static const unsigned short adv717x_addrs[] = { 0x6a, 0x6b, 0x2a, 0x2b, I2C_CLIENT_END };
 366static const unsigned short ks0127_addrs[] = { 0x6c, 0x6d, I2C_CLIENT_END };
 367static const unsigned short saa7185_addrs[] = { 0x44, I2C_CLIENT_END };
 368static const unsigned short bt819_addrs[] = { 0x45, I2C_CLIENT_END };
 369static const unsigned short bt856_addrs[] = { 0x44, I2C_CLIENT_END };
 370static const unsigned short bt866_addrs[] = { 0x44, I2C_CLIENT_END };
 371
 372static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
 373	{
 374		.type = DC10_old,
 375		.name = "DC10(old)",
 376		.i2c_decoder = "vpx3220a",
 377		.addrs_decoder = vpx3220_addrs,
 378		.video_codec = CODEC_TYPE_ZR36050,
 379		.video_vfe = CODEC_TYPE_ZR36016,
 380
 381		.inputs = 3,
 382		.input = {
 383			{ 1, "Composite" },
 384			{ 2, "S-Video" },
 385			{ 0, "Internal/comp" }
 386		},
 387		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 388		.tvn = {
 389			&f50sqpixel_dc10,
 390			&f60sqpixel_dc10,
 391			&f50sqpixel_dc10
 392		},
 393		.jpeg_int = 0,
 394		.vsync_int = ZR36057_ISR_GIRQ1,
 395		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
 396		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
 397		.gpcs = { -1, 0 },
 398		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 399		.gws_not_connected = 0,
 400		.input_mux = 0,
 401		.init = &dc10_init,
 402	}, {
 403		.type = DC10_new,
 404		.name = "DC10(new)",
 405		.i2c_decoder = "saa7110",
 406		.addrs_decoder = saa7110_addrs,
 407		.i2c_encoder = "adv7175",
 408		.addrs_encoder = adv717x_addrs,
 409		.video_codec = CODEC_TYPE_ZR36060,
 410
 411		.inputs = 3,
 412		.input = {
 413				{ 0, "Composite" },
 414				{ 7, "S-Video" },
 415				{ 5, "Internal/comp" }
 416			},
 417		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 418		.tvn = {
 419				&f50sqpixel,
 420				&f60sqpixel,
 421				&f50sqpixel},
 422		.jpeg_int = ZR36057_ISR_GIRQ0,
 423		.vsync_int = ZR36057_ISR_GIRQ1,
 424		.gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
 425		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 426		.gpcs = { -1, 1},
 427		.vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
 428		.gws_not_connected = 0,
 429		.input_mux = 0,
 430		.init = &dc10plus_init,
 431	}, {
 432		.type = DC10plus,
 433		.name = "DC10plus",
 434		.i2c_decoder = "saa7110",
 435		.addrs_decoder = saa7110_addrs,
 436		.i2c_encoder = "adv7175",
 437		.addrs_encoder = adv717x_addrs,
 438		.video_codec = CODEC_TYPE_ZR36060,
 439
 440		.inputs = 3,
 441		.input = {
 442			{ 0, "Composite" },
 443			{ 7, "S-Video" },
 444			{ 5, "Internal/comp" }
 445		},
 446		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 447		.tvn = {
 448			&f50sqpixel,
 449			&f60sqpixel,
 450			&f50sqpixel
 451		},
 452		.jpeg_int = ZR36057_ISR_GIRQ0,
 453		.vsync_int = ZR36057_ISR_GIRQ1,
 454		.gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
 455		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 456		.gpcs = { -1, 1 },
 457		.vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
 458		.gws_not_connected = 0,
 459		.input_mux = 0,
 460		.init = &dc10plus_init,
 461	}, {
 462		.type = DC30,
 463		.name = "DC30",
 464		.i2c_decoder = "vpx3220a",
 465		.addrs_decoder = vpx3220_addrs,
 466		.i2c_encoder = "adv7175",
 467		.addrs_encoder = adv717x_addrs,
 468		.video_codec = CODEC_TYPE_ZR36050,
 469		.video_vfe = CODEC_TYPE_ZR36016,
 470
 471		.inputs = 3,
 472		.input = {
 473			{ 1, "Composite" },
 474			{ 2, "S-Video" },
 475			{ 0, "Internal/comp" }
 476		},
 477		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 478		.tvn = {
 479			&f50sqpixel_dc10,
 480			&f60sqpixel_dc10,
 481			&f50sqpixel_dc10
 482		},
 483		.jpeg_int = 0,
 484		.vsync_int = ZR36057_ISR_GIRQ1,
 485		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
 486		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
 487		.gpcs = { -1, 0 },
 488		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 489		.gws_not_connected = 0,
 490		.input_mux = 0,
 491		.init = &dc10_init,
 492	}, {
 493		.type = DC30plus,
 494		.name = "DC30plus",
 495		.i2c_decoder = "vpx3220a",
 496		.addrs_decoder = vpx3220_addrs,
 497		.i2c_encoder = "adv7175",
 498		.addrs_encoder = adv717x_addrs,
 499		.video_codec = CODEC_TYPE_ZR36050,
 500		.video_vfe = CODEC_TYPE_ZR36016,
 501
 502		.inputs = 3,
 503		.input = {
 504			{ 1, "Composite" },
 505			{ 2, "S-Video" },
 506			{ 0, "Internal/comp" }
 507		},
 508		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 509		.tvn = {
 510			&f50sqpixel_dc10,
 511			&f60sqpixel_dc10,
 512			&f50sqpixel_dc10
 513		},
 514		.jpeg_int = 0,
 515		.vsync_int = ZR36057_ISR_GIRQ1,
 516		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
 517		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
 518		.gpcs = { -1, 0 },
 519		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 520		.gws_not_connected = 0,
 521		.input_mux = 0,
 522		.init = &dc10_init,
 523	}, {
 524		.type = LML33,
 525		.name = "LML33",
 526		.i2c_decoder = "bt819a",
 527		.addrs_decoder = bt819_addrs,
 528		.i2c_encoder = "bt856",
 529		.addrs_encoder = bt856_addrs,
 530		.video_codec = CODEC_TYPE_ZR36060,
 531
 532		.inputs = 2,
 533		.input = {
 534			{ 0, "Composite" },
 535			{ 7, "S-Video" }
 536		},
 537		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
 538		.tvn = {
 539			&f50ccir601_lml33,
 540			&f60ccir601_lml33,
 541			NULL
 542		},
 543		.jpeg_int = ZR36057_ISR_GIRQ1,
 544		.vsync_int = ZR36057_ISR_GIRQ0,
 545		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
 546		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
 547		.gpcs = { 3, 1 },
 548		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
 549		.gws_not_connected = 1,
 550		.input_mux = 0,
 551		.init = &lml33_init,
 552	}, {
 553		.type = LML33R10,
 554		.name = "LML33R10",
 555		.i2c_decoder = "saa7114",
 556		.addrs_decoder = saa7114_addrs,
 557		.i2c_encoder = "adv7170",
 558		.addrs_encoder = adv717x_addrs,
 559		.video_codec = CODEC_TYPE_ZR36060,
 560
 561		.inputs = 2,
 562		.input = {
 563			{ 0, "Composite" },
 564			{ 7, "S-Video" }
 565		},
 566		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
 567		.tvn = {
 568			&f50ccir601_lm33r10,
 569			&f60ccir601_lm33r10,
 570			NULL
 571		},
 572		.jpeg_int = ZR36057_ISR_GIRQ1,
 573		.vsync_int = ZR36057_ISR_GIRQ0,
 574		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
 575		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
 576		.gpcs = { 3, 1 },
 577		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
 578		.gws_not_connected = 1,
 579		.input_mux = 0,
 580		.init = &lml33_init,
 581	}, {
 582		.type = BUZ,
 583		.name = "Buz",
 584		.i2c_decoder = "saa7111",
 585		.addrs_decoder = saa7111_addrs,
 586		.i2c_encoder = "saa7185",
 587		.addrs_encoder = saa7185_addrs,
 588		.video_codec = CODEC_TYPE_ZR36060,
 589
 590		.inputs = 2,
 591		.input = {
 592			{ 3, "Composite" },
 593			{ 7, "S-Video" }
 594		},
 595		.norms = V4L2_STD_NTSC|V4L2_STD_PAL|V4L2_STD_SECAM,
 596		.tvn = {
 597			&f50ccir601,
 598			&f60ccir601,
 599			&f50ccir601
 600		},
 601		.jpeg_int = ZR36057_ISR_GIRQ1,
 602		.vsync_int = ZR36057_ISR_GIRQ0,
 603		.gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
 604		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
 605		.gpcs = { 3, 1 },
 606		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
 607		.gws_not_connected = 1,
 608		.input_mux = 0,
 609		.init = &buz_init,
 610	}, {
 611		.type = AVS6EYES,
 612		.name = "6-Eyes",
 613		/* AverMedia chose not to brand the 6-Eyes. Thus it
 614		   can't be autodetected, and requires card=x. */
 615		.i2c_decoder = "ks0127",
 616		.addrs_decoder = ks0127_addrs,
 617		.i2c_encoder = "bt866",
 618		.addrs_encoder = bt866_addrs,
 619		.video_codec = CODEC_TYPE_ZR36060,
 620
 621		.inputs = 10,
 622		.input = {
 623			{ 0, "Composite 1" },
 624			{ 1, "Composite 2" },
 625			{ 2, "Composite 3" },
 626			{ 4, "Composite 4" },
 627			{ 5, "Composite 5" },
 628			{ 6, "Composite 6" },
 629			{ 8, "S-Video 1" },
 630			{ 9, "S-Video 2" },
 631			{10, "S-Video 3" },
 632			{15, "YCbCr" }
 633		},
 634		.norms = V4L2_STD_NTSC|V4L2_STD_PAL,
 635		.tvn = {
 636			&f50ccir601_avs6eyes,
 637			&f60ccir601_avs6eyes,
 638			NULL
 639		},
 640		.jpeg_int = ZR36057_ISR_GIRQ1,
 641		.vsync_int = ZR36057_ISR_GIRQ0,
 642		.gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
 643		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
 644		.gpcs = { 3, 1 },			// Validity unknown /Sam
 645		.vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 },  // Validity unknown /Sam
 646		.gws_not_connected = 1,
 647		.input_mux = 1,
 648		.init = &avs6eyes_init,
 649	}
 650
 651};
 652
 653/*
 654 * I2C functions
 655 */
 656/* software I2C functions */
 657static int
 658zoran_i2c_getsda (void *data)
 659{
 660	struct zoran *zr = (struct zoran *) data;
 661
 662	return (btread(ZR36057_I2CBR) >> 1) & 1;
 663}
 664
 665static int
 666zoran_i2c_getscl (void *data)
 667{
 668	struct zoran *zr = (struct zoran *) data;
 669
 670	return btread(ZR36057_I2CBR) & 1;
 671}
 672
 673static void
 674zoran_i2c_setsda (void *data,
 675		  int   state)
 676{
 677	struct zoran *zr = (struct zoran *) data;
 678
 679	if (state)
 680		zr->i2cbr |= 2;
 681	else
 682		zr->i2cbr &= ~2;
 683	btwrite(zr->i2cbr, ZR36057_I2CBR);
 684}
 685
 686static void
 687zoran_i2c_setscl (void *data,
 688		  int   state)
 689{
 690	struct zoran *zr = (struct zoran *) data;
 691
 692	if (state)
 693		zr->i2cbr |= 1;
 694	else
 695		zr->i2cbr &= ~1;
 696	btwrite(zr->i2cbr, ZR36057_I2CBR);
 697}
 698
 699static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
 700	.setsda = zoran_i2c_setsda,
 701	.setscl = zoran_i2c_setscl,
 702	.getsda = zoran_i2c_getsda,
 703	.getscl = zoran_i2c_getscl,
 704	.udelay = 10,
 705	.timeout = 100,
 706};
 707
 708static int
 709zoran_register_i2c (struct zoran *zr)
 710{
 711	memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
 712	       sizeof(struct i2c_algo_bit_data));
 713	zr->i2c_algo.data = zr;
 714	strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
 715		sizeof(zr->i2c_adapter.name));
 716	i2c_set_adapdata(&zr->i2c_adapter, &zr->v4l2_dev);
 717	zr->i2c_adapter.algo_data = &zr->i2c_algo;
 718	zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
 719	return i2c_bit_add_bus(&zr->i2c_adapter);
 720}
 721
 722static void
 723zoran_unregister_i2c (struct zoran *zr)
 724{
 725	i2c_del_adapter(&zr->i2c_adapter);
 726}
 727
 728/* Check a zoran_params struct for correctness, insert default params */
 729
 730int
 731zoran_check_jpg_settings (struct zoran              *zr,
 732			  struct zoran_jpg_settings *settings,
 733			  int try)
 734{
 735	int err = 0, err0 = 0;
 736
 737	dprintk(4,
 738		KERN_DEBUG
 739		"%s: %s - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
 740		ZR_DEVNAME(zr), __func__, settings->decimation, settings->HorDcm,
 741		settings->VerDcm, settings->TmpDcm);
 742	dprintk(4,
 743		KERN_DEBUG
 744		"%s: %s - x: %d, y: %d, w: %d, y: %d\n",
 745		ZR_DEVNAME(zr), __func__, settings->img_x, settings->img_y,
 746		settings->img_width, settings->img_height);
 747	/* Check decimation, set default values for decimation = 1, 2, 4 */
 748	switch (settings->decimation) {
 749	case 1:
 750
 751		settings->HorDcm = 1;
 752		settings->VerDcm = 1;
 753		settings->TmpDcm = 1;
 754		settings->field_per_buff = 2;
 755		settings->img_x = 0;
 756		settings->img_y = 0;
 757		settings->img_width = BUZ_MAX_WIDTH;
 758		settings->img_height = BUZ_MAX_HEIGHT / 2;
 759		break;
 760	case 2:
 761
 762		settings->HorDcm = 2;
 763		settings->VerDcm = 1;
 764		settings->TmpDcm = 2;
 765		settings->field_per_buff = 1;
 766		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
 767		settings->img_y = 0;
 768		settings->img_width =
 769		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
 770		settings->img_height = BUZ_MAX_HEIGHT / 2;
 771		break;
 772	case 4:
 773
 774		if (zr->card.type == DC10_new) {
 775			dprintk(1,
 776				KERN_DEBUG
 777				"%s: %s - HDec by 4 is not supported on the DC10\n",
 778				ZR_DEVNAME(zr), __func__);
 779			err0++;
 780			break;
 781		}
 782
 783		settings->HorDcm = 4;
 784		settings->VerDcm = 2;
 785		settings->TmpDcm = 2;
 786		settings->field_per_buff = 1;
 787		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
 788		settings->img_y = 0;
 789		settings->img_width =
 790		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
 791		settings->img_height = BUZ_MAX_HEIGHT / 2;
 792		break;
 793	case 0:
 794
 795		/* We have to check the data the user has set */
 796
 797		if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
 798		    (zr->card.type == DC10_new || settings->HorDcm != 4)) {
 799			settings->HorDcm = clamp(settings->HorDcm, 1, 2);
 800			err0++;
 801		}
 802		if (settings->VerDcm != 1 && settings->VerDcm != 2) {
 803			settings->VerDcm = clamp(settings->VerDcm, 1, 2);
 804			err0++;
 805		}
 806		if (settings->TmpDcm != 1 && settings->TmpDcm != 2) {
 807			settings->TmpDcm = clamp(settings->TmpDcm, 1, 2);
 808			err0++;
 809		}
 810		if (settings->field_per_buff != 1 &&
 811		    settings->field_per_buff != 2) {
 812			settings->field_per_buff = clamp(settings->field_per_buff, 1, 2);
 813			err0++;
 814		}
 815		if (settings->img_x < 0) {
 816			settings->img_x = 0;
 817			err0++;
 818		}
 819		if (settings->img_y < 0) {
 820			settings->img_y = 0;
 821			err0++;
 822		}
 823		if (settings->img_width < 0 || settings->img_width > BUZ_MAX_WIDTH) {
 824			settings->img_width = clamp(settings->img_width, 0, (int)BUZ_MAX_WIDTH);
 825			err0++;
 826		}
 827		if (settings->img_height < 0 || settings->img_height > BUZ_MAX_HEIGHT / 2) {
 828			settings->img_height = clamp(settings->img_height, 0, BUZ_MAX_HEIGHT / 2);
 829			err0++;
 830		}
 831		if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH) {
 832			settings->img_x = BUZ_MAX_WIDTH - settings->img_width;
 833			err0++;
 834		}
 835		if (settings->img_y + settings->img_height > BUZ_MAX_HEIGHT / 2) {
 836			settings->img_y = BUZ_MAX_HEIGHT / 2 - settings->img_height;
 837			err0++;
 838		}
 839		if (settings->img_width % (16 * settings->HorDcm) != 0) {
 840			settings->img_width -= settings->img_width % (16 * settings->HorDcm);
 841			if (settings->img_width == 0)
 842				settings->img_width = 16 * settings->HorDcm;
 843			err0++;
 844		}
 845		if (settings->img_height % (8 * settings->VerDcm) != 0) {
 846			settings->img_height -= settings->img_height % (8 * settings->VerDcm);
 847			if (settings->img_height == 0)
 848				settings->img_height = 8 * settings->VerDcm;
 849			err0++;
 850		}
 851
 852		if (!try && err0) {
 853			dprintk(1,
 854				KERN_ERR
 855				"%s: %s - error in params for decimation = 0\n",
 856				ZR_DEVNAME(zr), __func__);
 857			err++;
 858		}
 859		break;
 860	default:
 861		dprintk(1,
 862			KERN_ERR
 863			"%s: %s - decimation = %d, must be 0, 1, 2 or 4\n",
 864			ZR_DEVNAME(zr), __func__, settings->decimation);
 865		err++;
 866		break;
 867	}
 868
 869	if (settings->jpg_comp.quality > 100)
 870		settings->jpg_comp.quality = 100;
 871	if (settings->jpg_comp.quality < 5)
 872		settings->jpg_comp.quality = 5;
 873	if (settings->jpg_comp.APPn < 0)
 874		settings->jpg_comp.APPn = 0;
 875	if (settings->jpg_comp.APPn > 15)
 876		settings->jpg_comp.APPn = 15;
 877	if (settings->jpg_comp.APP_len < 0)
 878		settings->jpg_comp.APP_len = 0;
 879	if (settings->jpg_comp.APP_len > 60)
 880		settings->jpg_comp.APP_len = 60;
 881	if (settings->jpg_comp.COM_len < 0)
 882		settings->jpg_comp.COM_len = 0;
 883	if (settings->jpg_comp.COM_len > 60)
 884		settings->jpg_comp.COM_len = 60;
 885	if (err)
 886		return -EINVAL;
 887	return 0;
 888}
 889
 890void
 891zoran_open_init_params (struct zoran *zr)
 892{
 893	int i;
 894
 895	/* User must explicitly set a window */
 896	zr->overlay_settings.is_set = 0;
 897	zr->overlay_mask = NULL;
 898	zr->overlay_active = ZORAN_FREE;
 899
 900	zr->v4l_memgrab_active = 0;
 901	zr->v4l_overlay_active = 0;
 902	zr->v4l_grab_frame = NO_GRAB_ACTIVE;
 903	zr->v4l_grab_seq = 0;
 904	zr->v4l_settings.width = 192;
 905	zr->v4l_settings.height = 144;
 906	zr->v4l_settings.format = &zoran_formats[7];	/* YUY2 - YUV-4:2:2 packed */
 907	zr->v4l_settings.bytesperline =
 908	    zr->v4l_settings.width *
 909	    ((zr->v4l_settings.format->depth + 7) / 8);
 910
 911	/* DMA ring stuff for V4L */
 912	zr->v4l_pend_tail = 0;
 913	zr->v4l_pend_head = 0;
 914	zr->v4l_sync_tail = 0;
 915	zr->v4l_buffers.active = ZORAN_FREE;
 916	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
 917		zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */
 918	}
 919	zr->v4l_buffers.allocated = 0;
 920
 921	for (i = 0; i < BUZ_MAX_FRAME; i++) {
 922		zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */
 923	}
 924	zr->jpg_buffers.active = ZORAN_FREE;
 925	zr->jpg_buffers.allocated = 0;
 926	/* Set necessary params and call zoran_check_jpg_settings to set the defaults */
 927	zr->jpg_settings.decimation = 1;
 928	zr->jpg_settings.jpg_comp.quality = 50;	/* default compression factor 8 */
 929	if (zr->card.type != BUZ)
 930		zr->jpg_settings.odd_even = 1;
 931	else
 932		zr->jpg_settings.odd_even = 0;
 933	zr->jpg_settings.jpg_comp.APPn = 0;
 934	zr->jpg_settings.jpg_comp.APP_len = 0;	/* No APPn marker */
 935	memset(zr->jpg_settings.jpg_comp.APP_data, 0,
 936	       sizeof(zr->jpg_settings.jpg_comp.APP_data));
 937	zr->jpg_settings.jpg_comp.COM_len = 0;	/* No COM marker */
 938	memset(zr->jpg_settings.jpg_comp.COM_data, 0,
 939	       sizeof(zr->jpg_settings.jpg_comp.COM_data));
 940	zr->jpg_settings.jpg_comp.jpeg_markers =
 941	    V4L2_JPEG_MARKER_DHT | V4L2_JPEG_MARKER_DQT;
 942	i = zoran_check_jpg_settings(zr, &zr->jpg_settings, 0);
 943	if (i)
 944		dprintk(1, KERN_ERR "%s: %s internal error\n",
 945			ZR_DEVNAME(zr), __func__);
 946
 947	clear_interrupt_counters(zr);
 948	zr->testing = 0;
 949}
 950
 951static void __devinit
 952test_interrupts (struct zoran *zr)
 953{
 954	DEFINE_WAIT(wait);
 955	int timeout, icr;
 956
 957	clear_interrupt_counters(zr);
 958
 959	zr->testing = 1;
 960	icr = btread(ZR36057_ICR);
 961	btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
 962	prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
 963	timeout = schedule_timeout(HZ);
 964	finish_wait(&zr->test_q, &wait);
 965	btwrite(0, ZR36057_ICR);
 966	btwrite(0x78000000, ZR36057_ISR);
 967	zr->testing = 0;
 968	dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
 969	if (timeout) {
 970		dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
 971	}
 972	if (zr36067_debug > 1)
 973		print_interrupts(zr);
 974	btwrite(icr, ZR36057_ICR);
 975}
 976
 977static int __devinit
 978zr36057_init (struct zoran *zr)
 979{
 980	int j, err;
 981
 982	dprintk(1,
 983		KERN_INFO
 984		"%s: %s - initializing card[%d], zr=%p\n",
 985		ZR_DEVNAME(zr), __func__, zr->id, zr);
 986
 987	/* default setup of all parameters which will persist between opens */
 988	zr->user = 0;
 989
 990	init_waitqueue_head(&zr->v4l_capq);
 991	init_waitqueue_head(&zr->jpg_capq);
 992	init_waitqueue_head(&zr->test_q);
 993	zr->jpg_buffers.allocated = 0;
 994	zr->v4l_buffers.allocated = 0;
 995
 996	zr->vbuf_base = (void *) vidmem;
 997	zr->vbuf_width = 0;
 998	zr->vbuf_height = 0;
 999	zr->vbuf_depth = 0;
1000	zr->vbuf_bytesperline = 0;
1001
1002	/* Avoid nonsense settings from user for default input/norm */
1003	if (default_norm < 0 || default_norm > 2)
1004		default_norm = 0;
1005	if (default_norm == 0) {
1006		zr->norm = V4L2_STD_PAL;
1007		zr->timing = zr->card.tvn[0];
1008	} else if (default_norm == 1) {
1009		zr->norm = V4L2_STD_NTSC;
1010		zr->timing = zr->card.tvn[1];
1011	} else {
1012		zr->norm = V4L2_STD_SECAM;
1013		zr->timing = zr->card.tvn[2];
1014	}
1015	if (zr->timing == NULL) {
1016		dprintk(1,
1017			KERN_WARNING
1018			"%s: %s - default TV standard not supported by hardware. PAL will be used.\n",
1019			ZR_DEVNAME(zr), __func__);
1020		zr->norm = V4L2_STD_PAL;
1021		zr->timing = zr->card.tvn[0];
1022	}
1023
1024	if (default_input > zr->card.inputs-1) {
1025		dprintk(1,
1026			KERN_WARNING
1027			"%s: default_input value %d out of range (0-%d)\n",
1028			ZR_DEVNAME(zr), default_input, zr->card.inputs-1);
1029		default_input = 0;
1030	}
1031	zr->input = default_input;
1032
1033	/* default setup (will be repeated at every open) */
1034	zoran_open_init_params(zr);
1035
1036	/* allocate memory *before* doing anything to the hardware
1037	 * in case allocation fails */
1038	zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1039	zr->video_dev = video_device_alloc();
1040	if (!zr->stat_com || !zr->video_dev) {
1041		dprintk(1,
1042			KERN_ERR
1043			"%s: %s - kmalloc (STAT_COM) failed\n",
1044			ZR_DEVNAME(zr), __func__);
1045		err = -ENOMEM;
1046		goto exit_free;
1047	}
1048	for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1049		zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to zr36057 */
1050	}
1051
1052	/*
1053	 *   Now add the template and register the device unit.
1054	 */
1055	memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1056	zr->video_dev->parent = &zr->pci_dev->dev;
1057	strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1058	err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1059	if (err < 0)
1060		goto exit_free;
1061	video_set_drvdata(zr->video_dev, zr);
1062
1063	zoran_init_hardware(zr);
1064	if (zr36067_debug > 2)
1065		detect_guest_activity(zr);
1066	test_interrupts(zr);
1067	if (!pass_through) {
1068		decoder_call(zr, video, s_stream, 0);
1069		encoder_call(zr, video, s_routing, 2, 0, 0);
1070	}
1071
1072	zr->zoran_proc = NULL;
1073	zr->initialized = 1;
1074	return 0;
1075
1076exit_free:
1077	kfree(zr->stat_com);
1078	kfree(zr->video_dev);
1079	return err;
1080}
1081
1082static void __devexit zoran_remove(struct pci_dev *pdev)
1083{
1084	struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
1085	struct zoran *zr = to_zoran(v4l2_dev);
1086
1087	if (!zr->initialized)
1088		goto exit_free;
1089
1090	/* unregister videocodec bus */
1091	if (zr->codec) {
1092		struct videocodec_master *master = zr->codec->master_data;
1093
1094		videocodec_detach(zr->codec);
1095		kfree(master);
1096	}
1097	if (zr->vfe) {
1098		struct videocodec_master *master = zr->vfe->master_data;
1099
1100		videocodec_detach(zr->vfe);
1101		kfree(master);
1102	}
1103
1104	/* unregister i2c bus */
1105	zoran_unregister_i2c(zr);
1106	/* disable PCI bus-mastering */
1107	zoran_set_pci_master(zr, 0);
1108	/* put chip into reset */
1109	btwrite(0, ZR36057_SPGPPCR);
1110	free_irq(zr->pci_dev->irq, zr);
1111	/* unmap and free memory */
1112	kfree(zr->stat_com);
1113	zoran_proc_cleanup(zr);
1114	iounmap(zr->zr36057_mem);
1115	pci_disable_device(zr->pci_dev);
1116	video_unregister_device(zr->video_dev);
1117exit_free:
1118	v4l2_device_unregister(&zr->v4l2_dev);
1119	kfree(zr);
1120}
1121
1122void
1123zoran_vdev_release (struct video_device *vdev)
1124{
1125	kfree(vdev);
1126}
1127
1128static struct videocodec_master * __devinit
1129zoran_setup_videocodec (struct zoran *zr,
1130			int           type)
1131{
1132	struct videocodec_master *m = NULL;
1133
1134	m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1135	if (!m) {
1136		dprintk(1, KERN_ERR "%s: %s - no memory\n",
1137			ZR_DEVNAME(zr), __func__);
1138		return m;
1139	}
1140
1141	/* magic and type are unused for master struct. Makes sense only at
1142	   codec structs.
1143	   In the past, .type were initialized to the old V4L1 .hardware
1144	   value, as VID_HARDWARE_ZR36067
1145	 */
1146	m->magic = 0L;
1147	m->type = 0;
1148
1149	m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1150	strlcpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1151	m->data = zr;
1152
1153	switch (type)
1154	{
1155	case CODEC_TYPE_ZR36060:
1156		m->readreg = zr36060_read;
1157		m->writereg = zr36060_write;
1158		m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1159		break;
1160	case CODEC_TYPE_ZR36050:
1161		m->readreg = zr36050_read;
1162		m->writereg = zr36050_write;
1163		m->flags |= CODEC_FLAG_JPEG;
1164		break;
1165	case CODEC_TYPE_ZR36016:
1166		m->readreg = zr36016_read;
1167		m->writereg = zr36016_write;
1168		m->flags |= CODEC_FLAG_VFE;
1169		break;
1170	}
1171
1172	return m;
1173}
1174
1175static void zoran_subdev_notify(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
1176{
1177	struct zoran *zr = to_zoran(sd->v4l2_dev);
1178
1179	/* Bt819 needs to reset its FIFO buffer using #FRST pin and
1180	   LML33 card uses GPIO(7) for that. */
1181	if (cmd == BT819_FIFO_RESET_LOW)
1182		GPIO(zr, 7, 0);
1183	else if (cmd == BT819_FIFO_RESET_HIGH)
1184		GPIO(zr, 7, 1);
1185}
1186
1187/*
1188 *   Scan for a Buz card (actually for the PCI controller ZR36057),
1189 *   request the irq and map the io memory
1190 */
1191static int __devinit zoran_probe(struct pci_dev *pdev,
1192				 const struct pci_device_id *ent)
1193{
1194	unsigned char latency, need_latency;
1195	struct zoran *zr;
1196	int result;
1197	struct videocodec_master *master_vfe = NULL;
1198	struct videocodec_master *master_codec = NULL;
1199	int card_num;
1200	char *codec_name, *vfe_name;
1201	unsigned int nr;
1202
1203
1204	nr = zoran_num++;
1205	if (nr >= BUZ_MAX) {
1206		dprintk(1, KERN_ERR "%s: driver limited to %d card(s) maximum\n",
1207			ZORAN_NAME, BUZ_MAX);
1208		return -ENOENT;
1209	}
1210
1211	zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1212	if (!zr) {
1213		dprintk(1, KERN_ERR "%s: %s - kzalloc failed\n",
1214			ZORAN_NAME, __func__);
1215		return -ENOMEM;
1216	}
1217	zr->v4l2_dev.notify = zoran_subdev_notify;
1218	if (v4l2_device_register(&pdev->dev, &zr->v4l2_dev))
1219		goto zr_free_mem;
1220	zr->pci_dev = pdev;
1221	zr->id = nr;
1222	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1223	spin_lock_init(&zr->spinlock);
1224	mutex_init(&zr->resource_lock);
1225	mutex_init(&zr->other_lock);
1226	if (pci_enable_device(pdev))
1227		goto zr_unreg;
1228	zr->revision = zr->pci_dev->revision;
1229
1230	dprintk(1,
1231		KERN_INFO
1232		"%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
1233		ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
1234		zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
1235	if (zr->revision >= 2) {
1236		dprintk(1,
1237			KERN_INFO
1238			"%s: Subsystem vendor=0x%04x id=0x%04x\n",
1239			ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1240			zr->pci_dev->subsystem_device);
1241	}
1242
1243	/* Use auto-detected card type? */
1244	if (card[nr] == -1) {
1245		if (zr->revision < 2) {
1246			dprintk(1,
1247				KERN_ERR
1248				"%s: No card type specified, please use the card=X module parameter\n",
1249				ZR_DEVNAME(zr));
1250			dprintk(1,
1251				KERN_ERR
1252				"%s: It is not possible to auto-detect ZR36057 based cards\n",
1253				ZR_DEVNAME(zr));
1254			goto zr_unreg;
1255		}
1256
1257		card_num = ent->driver_data;
1258		if (card_num >= NUM_CARDS) {
1259			dprintk(1,
1260				KERN_ERR
1261				"%s: Unknown card, try specifying card=X module parameter\n",
1262				ZR_DEVNAME(zr));
1263			goto zr_unreg;
1264		}
1265		dprintk(3,
1266			KERN_DEBUG
1267			"%s: %s() - card %s detected\n",
1268			ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1269	} else {
1270		card_num = card[nr];
1271		if (card_num >= NUM_CARDS || card_num < 0) {
1272			dprintk(1,
1273				KERN_ERR
1274				"%s: User specified card type %d out of range (0 .. %d)\n",
1275				ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1276			goto zr_unreg;
1277		}
1278	}
1279
1280	/* even though we make this a non pointer and thus
1281	 * theoretically allow for making changes to this struct
1282	 * on a per-individual card basis at runtime, this is
1283	 * strongly discouraged. This structure is intended to
1284	 * keep general card information, no settings or anything */
1285	zr->card = zoran_cards[card_num];
1286	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1287		 "%s[%u]", zr->card.name, zr->id);
1288
1289	zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
1290	if (!zr->zr36057_mem) {
1291		dprintk(1, KERN_ERR "%s: %s() - ioremap failed\n",
1292			ZR_DEVNAME(zr), __func__);
1293		goto zr_unreg;
1294	}
1295
1296	result = request_irq(zr->pci_dev->irq, zoran_irq,
1297			     IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1298	if (result < 0) {
1299		if (result == -EINVAL) {
1300			dprintk(1,
1301				KERN_ERR
1302				"%s: %s - bad irq number or handler\n",
1303				ZR_DEVNAME(zr), __func__);
1304		} else if (result == -EBUSY) {
1305			dprintk(1,
1306				KERN_ERR
1307				"%s: %s - IRQ %d busy, change your PnP config in BIOS\n",
1308				ZR_DEVNAME(zr), __func__, zr->pci_dev->irq);
1309		} else {
1310			dprintk(1,
1311				KERN_ERR
1312				"%s: %s - can't assign irq, error code %d\n",
1313				ZR_DEVNAME(zr), __func__, result);
1314		}
1315		goto zr_unmap;
1316	}
1317
1318	/* set PCI latency timer */
1319	pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1320			     &latency);
1321	need_latency = zr->revision > 1 ? 32 : 48;
1322	if (latency != need_latency) {
1323		dprintk(2, KERN_INFO "%s: Changing PCI latency from %d to %d\n",
1324			ZR_DEVNAME(zr), latency, need_latency);
1325		pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1326				      need_latency);
1327	}
1328
1329	zr36057_restart(zr);
1330	/* i2c */
1331	dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1332		ZR_DEVNAME(zr));
1333
1334	if (zoran_register_i2c(zr) < 0) {
1335		dprintk(1, KERN_ERR "%s: %s - can't initialize i2c bus\n",
1336			ZR_DEVNAME(zr), __func__);
1337		goto zr_free_irq;
1338	}
1339
1340	zr->decoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1341		&zr->i2c_adapter, zr->card.i2c_decoder,
1342		0, zr->card.addrs_decoder);
1343
1344	if (zr->card.i2c_encoder)
1345		zr->encoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1346			&zr->i2c_adapter, zr->card.i2c_encoder,
1347			0, zr->card.addrs_encoder);
1348
1349	dprintk(2,
1350		KERN_INFO "%s: Initializing videocodec bus...\n",
1351		ZR_DEVNAME(zr));
1352
1353	if (zr->card.video_codec) {
1354		codec_name = codecid_to_modulename(zr->card.video_codec);
1355		if (codec_name) {
1356			result = request_module(codec_name);
1357			if (result) {
1358				dprintk(1,
1359					KERN_ERR
1360					"%s: failed to load modules %s: %d\n",
1361					ZR_DEVNAME(zr), codec_name, result);
1362			}
1363		}
1364	}
1365	if (zr->card.video_vfe) {
1366		vfe_name = codecid_to_modulename(zr->card.video_vfe);
1367		if (vfe_name) {
1368			result = request_module(vfe_name);
1369			if (result < 0) {
1370				dprintk(1,
1371					KERN_ERR
1372					"%s: failed to load modules %s: %d\n",
1373					ZR_DEVNAME(zr), vfe_name, result);
1374			}
1375		}
1376	}
1377
1378	/* reset JPEG codec */
1379	jpeg_codec_sleep(zr, 1);
1380	jpeg_codec_reset(zr);
1381	/* video bus enabled */
1382	/* display codec revision */
1383	if (zr->card.video_codec != 0) {
1384		master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1385		if (!master_codec)
1386			goto zr_unreg_i2c;
1387		zr->codec = videocodec_attach(master_codec);
1388		if (!zr->codec) {
1389			dprintk(1, KERN_ERR "%s: %s - no codec found\n",
1390				ZR_DEVNAME(zr), __func__);
1391			goto zr_free_codec;
1392		}
1393		if (zr->codec->type != zr->card.video_codec) {
1394			dprintk(1, KERN_ERR "%s: %s - wrong codec\n",
1395				ZR_DEVNAME(zr), __func__);
1396			goto zr_detach_codec;
1397		}
1398	}
1399	if (zr->card.video_vfe != 0) {
1400		master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1401		if (!master_vfe)
1402			goto zr_detach_codec;
1403		zr->vfe = videocodec_attach(master_vfe);
1404		if (!zr->vfe) {
1405			dprintk(1, KERN_ERR "%s: %s - no VFE found\n",
1406				ZR_DEVNAME(zr), __func__);
1407			goto zr_free_vfe;
1408		}
1409		if (zr->vfe->type != zr->card.video_vfe) {
1410			dprintk(1, KERN_ERR "%s: %s = wrong VFE\n",
1411				ZR_DEVNAME(zr), __func__);
1412			goto zr_detach_vfe;
1413		}
1414	}
1415
1416	/* take care of Natoma chipset and a revision 1 zr36057 */
1417	if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1418		zr->jpg_buffers.need_contiguous = 1;
1419		dprintk(1, KERN_INFO
1420			"%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1421			ZR_DEVNAME(zr));
1422	}
1423
1424	if (zr36057_init(zr) < 0)
1425		goto zr_detach_vfe;
1426
1427	zoran_proc_init(zr);
1428
1429	return 0;
1430
1431zr_detach_vfe:
1432	videocodec_detach(zr->vfe);
1433zr_free_vfe:
1434	kfree(master_vfe);
1435zr_detach_codec:
1436	videocodec_detach(zr->codec);
1437zr_free_codec:
1438	kfree(master_codec);
1439zr_unreg_i2c:
1440	zoran_unregister_i2c(zr);
1441zr_free_irq:
1442	btwrite(0, ZR36057_SPGPPCR);
1443	free_irq(zr->pci_dev->irq, zr);
1444zr_unmap:
1445	iounmap(zr->zr36057_mem);
1446zr_unreg:
1447	v4l2_device_unregister(&zr->v4l2_dev);
1448zr_free_mem:
1449	kfree(zr);
1450
1451	return -ENODEV;
1452}
1453
1454static struct pci_driver zoran_driver = {
1455	.name = "zr36067",
1456	.id_table = zr36067_pci_tbl,
1457	.probe = zoran_probe,
1458	.remove = __devexit_p(zoran_remove),
1459};
1460
1461static int __init zoran_init(void)
1462{
1463	int res;
1464
1465	printk(KERN_INFO "Zoran MJPEG board driver version %s\n",
1466	       ZORAN_VERSION);
1467
1468	/* check the parameters we have been given, adjust if necessary */
1469	if (v4l_nbufs < 2)
1470		v4l_nbufs = 2;
1471	if (v4l_nbufs > VIDEO_MAX_FRAME)
1472		v4l_nbufs = VIDEO_MAX_FRAME;
1473	/* The user specfies the in KB, we want them in byte
1474	 * (and page aligned) */
1475	v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1476	if (v4l_bufsize < 32768)
1477		v4l_bufsize = 32768;
1478	/* 2 MB is arbitrary but sufficient for the maximum possible images */
1479	if (v4l_bufsize > 2048 * 1024)
1480		v4l_bufsize = 2048 * 1024;
1481	if (jpg_nbufs < 4)
1482		jpg_nbufs = 4;
1483	if (jpg_nbufs > BUZ_MAX_FRAME)
1484		jpg_nbufs = BUZ_MAX_FRAME;
1485	jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1486	if (jpg_bufsize < 8192)
1487		jpg_bufsize = 8192;
1488	if (jpg_bufsize > (512 * 1024))
1489		jpg_bufsize = 512 * 1024;
1490	/* Use parameter for vidmem or try to find a video card */
1491	if (vidmem) {
1492		dprintk(1,
1493			KERN_INFO
1494			"%s: Using supplied video memory base address @ 0x%lx\n",
1495			ZORAN_NAME, vidmem);
1496	}
1497
1498	/* some mainboards might not do PCI-PCI data transfer well */
1499	if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1500		dprintk(1,
1501			KERN_WARNING
1502			"%s: chipset does not support reliable PCI-PCI DMA\n",
1503			ZORAN_NAME);
1504	}
1505
1506	res = pci_register_driver(&zoran_driver);
1507	if (res) {
1508		dprintk(1,
1509			KERN_ERR
1510			"%s: Unable to register ZR36057 driver\n",
1511			ZORAN_NAME);
1512		return res;
1513	}
1514
1515	return 0;
1516}
1517
1518static void __exit zoran_exit(void)
1519{
1520	pci_unregister_driver(&zoran_driver);
1521}
1522
1523module_init(zoran_init);
1524module_exit(zoran_exit);