linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch] saa7134 driver update
@ 2003-07-17 18:51 Gerd Knorr
  0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2003-07-17 18:51 UTC (permalink / raw)
  To: Linus Torvalds, Kernel List

  Hi,

This patch is a update for the saa7134 driver.  Changes:

  * add support for a add new card, some detection code changes.
  * fix double i2c bus unregister (=> used to oops on rmmod).
  * add dual languange support.
  * catch kernel_thread() failures.

Please apply,

  Gerd

diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-cards.c linux/drivers/media/video/saa7134/saa7134-cards.c
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-cards.c	2003-07-17 18:56:50.109689951 +0200
+++ linux/drivers/media/video/saa7134/saa7134-cards.c	2003-07-17 19:13:34.649284273 +0200
@@ -444,7 +444,40 @@
 			.tv   = 1,
 		}},
         },
-	
+	[SAA7134_BOARD_ASUSTeK_TVFM7134] = {
+                .name           = "ASUS TV-FM 7134",
+                .audio_clock    = 0x00187de7,
+                .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
+                .need_tda9887   = 1,
+                .inputs         = {{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = TV,
+                        .tv   = 1,
+#if 0 /* untested */
+                },{
+                        .name = name_comp1,
+                        .vmux = 4,
+                        .amux = LINE2,
+                },{
+                        .name = name_comp2,
+                        .vmux = 2,
+                        .amux = LINE2,
+                },{
+                        .name = name_svideo,
+                        .vmux = 6,
+                        .amux = LINE2,
+                },{
+                        .name = "S-Video2",
+                        .vmux = 7,
+                        .amux = LINE2,
+#endif
+                }},
+                .radio = {
+                        .name = name_radio,
+                        .amux = LINE1,
+                },
+        },
 };
 const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
 
@@ -519,6 +552,18 @@
 		.subdevice    = 0x226b,
 		.driver_data  = SAA7134_BOARD_ELSA_500TV,
 	},{
+                .vendor       = PCI_VENDOR_ID_PHILIPS,
+                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = PCI_VENDOR_ID_ASUSTEK,
+                .subdevice    = 0x4842,
+                .driver_data  = SAA7134_BOARD_ASUSTeK_TVFM7134,
+	},{
+                .vendor       = PCI_VENDOR_ID_PHILIPS,
+                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = PCI_VENDOR_ID_ASUSTEK,
+                .subdevice    = 0x4830,
+                .driver_data  = SAA7134_BOARD_ASUSTeK_TVFM7134,
+        },{
 		
 		/* --- boards without eeprom + subsystem ID --- */
                 .vendor       = PCI_VENDOR_ID_PHILIPS,
@@ -595,22 +640,16 @@
 
 static void board_flyvideo(struct saa7134_dev *dev)
 {
+#if 0
 	u32 value;
+	int index;
 
-	saa_writel(SAA7134_GPIO_GPMODE0 >> 2,   0);
-	value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
-#if 0
-	{
-		int index = (value & 0x1f00) >> 8;
-		printk(KERN_INFO "%s: flyvideo: gpio is 0x%x "
-				"[model=%s,tuner=%d]\n",
-		       dev->name, value, fly_list[index].model,
-		       fly_list[index].tuner_type);
-		dev->tuner_type = fly_list[index].tuner_type;
-	}
-#else
-	printk(KERN_INFO "%s: flyvideo: gpio is 0x%x\n",
-	       dev->name, value);
+	value = dev->gpio_value;
+	index = (value & 0x1f00) >> 8;
+	printk(KERN_INFO "%s: flyvideo: gpio is 0x%x [model=%s,tuner=%d]\n",
+	       dev->name, value, fly_list[index].model,
+	       fly_list[index].tuner_type);
+	dev->tuner_type = fly_list[index].tuner_type;
 #endif
 }
 
@@ -618,6 +657,11 @@
 
 int saa7134_board_init(struct saa7134_dev *dev)
 {
+	// Always print gpio, often manufacturers encode tuner type and other info.
+	saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0);
+	dev->gpio_value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
+	printk(KERN_INFO "%s: board init: gpio is %x\n", dev->name, dev->gpio_value);
+
 	switch (dev->board) {
 	case SAA7134_BOARD_FLYVIDEO2000:
 	case SAA7134_BOARD_FLYVIDEO3000:
diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-core.c linux/drivers/media/video/saa7134/saa7134-core.c
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-core.c	2003-07-17 18:55:30.485362002 +0200
+++ linux/drivers/media/video/saa7134/saa7134-core.c	2003-07-17 19:13:34.655283269 +0200
@@ -35,7 +35,7 @@
 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
 MODULE_LICENSE("GPL");
 
-#define SAA7134_MAXBOARDS 4
+#define SAA7134_MAXBOARDS 8
 
 /* ------------------------------------------------------------------ */
 
@@ -954,7 +954,6 @@
 	saa7134_vbi_fini(dev);
 	saa7134_video_fini(dev);
 	saa7134_tvaudio_fini(dev);
-	saa7134_i2c_unregister(dev);
 
 	/* release ressources */
 	free_irq(pci_dev->irq, dev);
diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-i2c.c linux/drivers/media/video/saa7134/saa7134-i2c.c
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-i2c.c	2003-07-17 18:55:13.105357045 +0200
+++ linux/drivers/media/video/saa7134/saa7134-i2c.c	2003-07-17 19:13:34.667281261 +0200
@@ -400,6 +400,7 @@
 {
 	dev->i2c_adap = saa7134_adap_template;
 	strcpy(dev->i2c_adap.dev.name,dev->name);
+	dev->i2c_adap.dev.parent = &dev->pci->dev;
 	dev->i2c_adap.algo_data = dev;
 	i2c_add_adapter(&dev->i2c_adap);
 	
diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-tvaudio.c linux/drivers/media/video/saa7134/saa7134-tvaudio.c
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-07-17 18:54:26.028483383 +0200
+++ linux/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-07-17 19:13:34.673280257 +0200
@@ -2,7 +2,7 @@
  * device driver for philips saa7134 based TV cards
  * tv audio decoder (fm stereo, nicam, ...)
  *
- * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -547,11 +547,19 @@
 		tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
 		dev->tvaudio = &tvaudio[audio];
 
-		if (tvaudio_sleep(dev,3*HZ))
-			goto restart;
-		rx = tvaudio_getstereo(dev,&tvaudio[i]);
-		mode = saa7134_tvaudio_rx2mode(rx);
-		tvaudio_setstereo(dev,&tvaudio[audio],mode);
+		for (;;) {
+			if (tvaudio_sleep(dev,3*HZ))
+				break;
+			if (dev->thread.exit || signal_pending(current))
+				break;
+			if (UNSET == dev->thread.mode) {
+				rx = tvaudio_getstereo(dev,&tvaudio[i]);
+				mode = saa7134_tvaudio_rx2mode(rx);
+			} else {
+				mode = dev->thread.mode;
+			}
+			tvaudio_setstereo(dev,&tvaudio[audio],mode);
+		}
 	}
 
  done:
@@ -842,6 +850,7 @@
 {
 	DECLARE_MUTEX_LOCKED(sem);
 	int (*my_thread)(void *data) = NULL;
+	int rc;
 
 	/* enable I2S audio output */
 	if (saa7134_boards[dev->board].i2s_rate) {
@@ -872,8 +881,12 @@
 		/* start tvaudio thread */
 		init_waitqueue_head(&dev->thread.wq);
 		dev->thread.notify = &sem;
-		kernel_thread(my_thread,dev,0);
-		down(&sem);
+		rc = kernel_thread(my_thread,dev,0);
+		if (rc < 0)
+			printk(KERN_WARNING "%s: kernel_thread() failed\n",
+			       dev->name);
+		else
+			down(&sem);
 		dev->thread.notify = NULL;
 		wake_up_interruptible(&dev->thread.wq);
 	}
@@ -900,6 +913,7 @@
 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
 {
 	if (dev->thread.task) {
+		dev->thread.mode = UNSET;
 		dev->thread.scan2++;
 		wake_up_interruptible(&dev->thread.wq);
 	} else {
diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-video.c linux/drivers/media/video/saa7134/saa7134-video.c
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134-video.c	2003-07-17 18:55:13.909218803 +0200
+++ linux/drivers/media/video/saa7134/saa7134-video.c	2003-07-17 19:13:34.680279086 +0200
@@ -1643,9 +1643,17 @@
 	}
 	case VIDIOC_S_TUNER:
 	{
-#if 0
 		struct v4l2_tuner *t = arg;
-#endif
+		int rx,mode;
+
+		mode = dev->thread.mode;
+		if (UNSET == mode) {
+			rx   = saa7134_tvaudio_getstereo(dev);
+			mode = saa7134_tvaudio_rx2mode(t->rxsubchans);
+		}
+		if (mode != t->audmode) {
+			dev->thread.mode = t->audmode;
+		}
 		return 0;
 	}
 	case VIDIOC_G_FREQUENCY:
diff -u linux-2.6.0-test1/drivers/media/video/saa7134/saa7134.h linux/drivers/media/video/saa7134/saa7134.h
--- linux-2.6.0-test1/drivers/media/video/saa7134/saa7134.h	2003-07-17 18:56:45.007564774 +0200
+++ linux/drivers/media/video/saa7134/saa7134.h	2003-07-17 19:13:34.685278250 +0200
@@ -28,6 +28,7 @@
 #include <media/audiochip.h>
 #include <media/id.h>
 
+#include <linux/version.h>
 #define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,8)
 
 #ifndef TRUE
@@ -130,6 +131,7 @@
 #define SAA7134_BOARD_TYPHOON_90031    13
 #define SAA7134_BOARD_ELSA             14
 #define SAA7134_BOARD_ELSA_500TV       15
+#define SAA7134_BOARD_ASUSTeK_TVFM7134 16
 
 #define SAA7134_INPUT_MAX 8
 
@@ -197,6 +199,7 @@
 	unsigned int               exit;
 	unsigned int               scan1;
 	unsigned int               scan2;
+	unsigned int               mode;
 };
 
 /* buffer for one video/vbi/ts frame */
@@ -308,6 +311,7 @@
 	/* config info */
 	unsigned int               board;
 	unsigned int               tuner_type;
+	unsigned int               gpio_value;
 
 	/* i2c i/o */
 	struct i2c_adapter         i2c_adap;

-- 
sigfault

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [patch] saa7134 driver update
@ 2003-10-07 11:04 Gerd Knorr
  0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2003-10-07 11:04 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton, Kernel List

  Hi,

This patch updates the saa7134 driver.  It depends on the videobuf
patch.

Changes:

  * add support for mplex mpeg2 encoder cards (new saa6752hs module).
  * tv card list updates.
  * adapt to videobuf changes.
  * better sysfs support.

Please apply,

  Gerd

diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa6752hs.c linux/drivers/media/video/saa7134/saa6752hs.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa6752hs.c	2003-10-06 17:48:03.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa6752hs.c	2003-10-06 17:48:03.000000000 +0200
@@ -0,0 +1,406 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/i2c.h>
+#include <linux/types.h>
+#include <linux/videodev.h>
+#include <linux/init.h>
+
+#include <media/id.h>
+#include <media/saa6752hs.h>
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = {0x20, I2C_CLIENT_END};
+static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
+I2C_CLIENT_INSMOD;
+
+MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
+MODULE_AUTHOR("Andrew de Quincey");
+MODULE_LICENSE("GPL");
+
+static struct i2c_driver driver;
+static struct i2c_client client_template;
+
+
+enum saa6752hs_command {
+	SAA6752HS_COMMAND_RESET = 0,
+    	SAA6752HS_COMMAND_STOP = 1,
+    	SAA6752HS_COMMAND_START = 2,
+    	SAA6752HS_COMMAND_PAUSE = 3,
+    	SAA6752HS_COMMAND_RECONFIGURE = 4,
+    	SAA6752HS_COMMAND_SLEEP = 5,
+	SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6,
+    
+	SAA6752HS_COMMAND_MAX
+};
+
+
+/* ---------------------------------------------------------------------- */
+
+static u8 PAT[] = {
+	0xc2, // i2c register
+	0x00, // table number for encoder
+  
+	0x47, // sync
+	0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0)
+	0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0)
+     
+	0x00, // PSI pointer to start of table
+    
+	0x00, // tid(0)
+	0xb0, 0x0d, // section_syntax_indicator(1), section_length(13)
+    
+	0x00, 0x01, // transport_stream_id(1)
+    
+	0xc1, // version_number(0), current_next_indicator(1)
+    
+	0x00, 0x00, // section_number(0), last_section_number(0)
+
+	0x00, 0x01, // program_number(1)
+	
+	0xe0, 0x10, // PMT PID(0x10)
+
+	0x76, 0xf1, 0x44, 0xd1 // CRC32
+};
+
+static u8 PMT[] = {
+	0xc2, // i2c register
+	0x01, // table number for encoder
+  
+	0x47, // sync
+	0x40, 0x10, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0x10)
+	0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0)
+     
+	0x00, // PSI pointer to start of table
+    
+	0x02, // tid(2)
+	0xb0, 0x17, // section_syntax_indicator(1), section_length(23)
+
+	0x00, 0x01, // program_number(1)
+    
+	0xc1, // version_number(0), current_next_indicator(1)
+    
+	0x00, 0x00, // section_number(0), last_section_number(0)
+    
+	0xe1, 0x04, // PCR_PID (0x104)
+   
+	0xf0, 0x00, // program_info_length(0)
+    
+	0x02, 0xe1, 0x00, 0xf0, 0x00, // video stream type(2), pid(0x100)
+	0x04, 0xe1, 0x03, 0xf0, 0x00, // audio stream type(4), pid(0x103)
+    
+	0xa1, 0xca, 0x0f, 0x82 // CRC32
+};
+
+static struct mpeg_params mpeg_params_template =
+{
+	.bitrate_mode = MPEG_BITRATE_MODE_CBR,
+	.video_target_bitrate = 5000,
+	.audio_bitrate = MPEG_AUDIO_BITRATE_256,
+	.total_bitrate = 6000,
+};
+
+  
+/* ---------------------------------------------------------------------- */
+
+
+static int saa6752hs_chip_command(struct i2c_client* client,
+				  enum saa6752hs_command command)
+{
+	unsigned char buf[3];
+	unsigned long timeout;
+	int status = 0;
+
+	// execute the command
+	switch(command) {
+  	case SAA6752HS_COMMAND_RESET:
+  		buf[0] = 0x00;
+		break;
+	  
+	case SAA6752HS_COMMAND_STOP:
+		  	buf[0] = 0x03;
+		break;
+	  
+	case SAA6752HS_COMMAND_START:
+  		buf[0] = 0x02;
+		break;
+
+	case SAA6752HS_COMMAND_PAUSE:
+  		buf[0] = 0x04;
+		break;
+	  
+	case SAA6752HS_COMMAND_RECONFIGURE:
+		buf[0] = 0x05;
+		break;
+	  
+  	case SAA6752HS_COMMAND_SLEEP:
+  		buf[0] = 0x06;
+		break;
+
+  	case SAA6752HS_COMMAND_RECONFIGURE_FORCE:
+		buf[0] = 0x07;
+		break;
+	
+	default:
+		return -EINVAL;  
+	}
+	
+  	// set it and wait for it to be so
+	i2c_master_send(client, buf, 1);
+	timeout = jiffies + HZ * 3;
+	for (;;) {
+		// get the current status
+		buf[0] = 0x10;
+	  	i2c_master_send(client, buf, 1);
+		i2c_master_recv(client, buf, 1);
+
+		if (!(buf[0] & 0x20))
+			break;
+		if (time_after(jiffies,timeout)) {
+			status = -ETIMEDOUT;
+			break;
+		}
+	
+		// wait a bit
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+
+	// delay a bit to let encoder settle
+	current->state = TASK_INTERRUPTIBLE;
+	schedule_timeout(5);
+	
+	// done
+  	return status;
+}
+
+
+static int saa6752hs_set_bitrate(struct i2c_client* client,
+				 struct mpeg_params* params)
+{
+  	u8 buf[3];
+  
+	// set the bitrate mode
+	buf[0] = 0x71;
+	buf[1] = params->bitrate_mode;
+	i2c_master_send(client, buf, 2);
+	  
+	// set the video bitrate
+	if (params->bitrate_mode == MPEG_BITRATE_MODE_VBR) {
+		// set the target bitrate
+		buf[0] = 0x80;
+	    	buf[1] = params->video_target_bitrate >> 8;
+	  	buf[2] = params->video_target_bitrate & 0xff;
+		i2c_master_send(client, buf, 3);
+
+		// set the max bitrate
+		buf[0] = 0x81;
+	    	buf[1] = params->video_max_bitrate >> 8;
+	  	buf[2] = params->video_max_bitrate & 0xff;
+		i2c_master_send(client, buf, 3);
+	} else {
+		// set the target bitrate (no max bitrate for CBR)
+  		buf[0] = 0x81;
+	    	buf[1] = params->video_target_bitrate >> 8;
+	  	buf[2] = params->video_target_bitrate & 0xff;
+		i2c_master_send(client, buf, 3);
+	}
+	  
+	// set the audio bitrate
+ 	buf[0] = 0x94;
+  	buf[1] = params->audio_bitrate;
+	i2c_master_send(client, buf, 2);
+	
+	// set the total bitrate
+	buf[0] = 0xb1;
+  	buf[1] = params->total_bitrate >> 8;
+  	buf[2] = params->total_bitrate & 0xff;
+	i2c_master_send(client, buf, 3);
+  
+	return 0;
+}
+
+
+static int saa6752hs_init(struct i2c_client* client, struct mpeg_params* params)
+{  
+	unsigned char buf[3];
+
+	// check the bitrate parameters first
+	if (params != NULL) {
+		if (params->bitrate_mode >= MPEG_BITRATE_MODE_MAX)
+			return -EINVAL;
+		if (params->video_target_bitrate >= MPEG_VIDEO_TARGET_BITRATE_MAX)
+			return -EINVAL;
+  		if (params->video_max_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX)
+			return -EINVAL;
+		if (params->audio_bitrate >= MPEG_AUDIO_BITRATE_MAX)
+			return -EINVAL;
+		if (params->total_bitrate >= MPEG_TOTAL_BITRATE_MAX)
+        		return -EINVAL;
+		if (params->bitrate_mode         == MPEG_BITRATE_MODE_MAX &&
+		    params->video_target_bitrate <= params->video_max_bitrate)
+			return -EINVAL; 
+	}
+  
+    	// Set GOP structure {3, 13}
+	buf[0] = 0x72;
+	buf[1] = 0x03;
+	buf[2] = 0x0D;
+	i2c_master_send(client,buf,3);
+  
+    	// Set minimum Q-scale {4}
+	buf[0] = 0x82;
+	buf[1] = 0x04;
+	i2c_master_send(client,buf,2);
+  
+    	// Set maximum Q-scale {12}
+	buf[0] = 0x83;
+	buf[1] = 0x0C;
+	i2c_master_send(client,buf,2);
+  
+    	// Set Output Protocol
+	buf[0] = 0xD0;
+	buf[1] = 0x01;
+	i2c_master_send(client,buf,2);
+  
+    	// Set video output stream format {TS}
+	buf[0] = 0xB0;
+	buf[1] = 0x05;
+	i2c_master_send(client,buf,2);
+  
+    	// Set Audio PID {0x103}
+	buf[0] = 0xC1;
+	buf[1] = 0x01;
+	buf[2] = 0x03;
+	i2c_master_send(client,buf,3);
+  
+        // setup bitrate settings
+	if (params) {
+		saa6752hs_set_bitrate(client, params);
+		memcpy(client->data, params, sizeof(struct mpeg_params));
+	} else {
+		// parameters were not supplied. use the previous set
+   		saa6752hs_set_bitrate(client, (struct mpeg_params*) client->data);
+	}
+	  
+	// Send SI tables
+  	i2c_master_send(client,PAT,sizeof(PAT));
+  	i2c_master_send(client,PMT,sizeof(PMT));
+	  
+	// mute then unmute audio. This removes buzzing artefacts
+	buf[0] = 0xa4;
+	buf[1] = 1;
+	i2c_master_send(client, buf, 2);
+  	buf[1] = 0;
+	i2c_master_send(client, buf, 2);
+	  
+	// start it going
+	saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
+
+	return 0;
+}
+
+static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
+{
+	struct i2c_client *client;
+	struct mpeg_params* params;
+
+        client_template.adapter = adap;
+        client_template.addr = addr;
+
+        printk("saa6752hs: chip found @ 0x%x\n", addr<<1);
+
+        if (NULL == (client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)))
+                return -ENOMEM;
+        memcpy(client,&client_template,sizeof(struct i2c_client));
+	strlcpy(client->name, "saa6752hs", sizeof(client->name));
+   
+	if (NULL == (params = kmalloc(sizeof(struct mpeg_params), GFP_KERNEL)))
+		return -ENOMEM;
+	memcpy(params,&mpeg_params_template,sizeof(struct mpeg_params));
+	client->data = params;
+
+        i2c_attach_client(client);
+  
+	return 0;
+}
+
+static int saa6752hs_probe(struct i2c_adapter *adap)
+{
+	if (adap->class & I2C_ADAP_CLASS_TV_ANALOG)
+		return i2c_probe(adap, &addr_data, saa6752hs_attach);
+
+	return 0;
+}
+
+static int saa6752hs_detach(struct i2c_client *client)
+{
+	i2c_detach_client(client);
+	kfree(client->data);
+	kfree(client);
+	return 0;
+}
+
+static int
+saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+	struct mpeg_params* init_arg = arg;
+
+        switch (cmd) {
+	case MPEG_SETPARAMS:
+   		return saa6752hs_init(client, init_arg);
+
+	default:
+		/* nothing */
+		break;
+	}
+	
+	return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver driver = {
+	.owner          = THIS_MODULE,
+        .name           = "i2c saa6752hs MPEG encoder",
+        .id             = I2C_DRIVERID_SAA6752HS,
+        .flags          = I2C_DF_NOTIFY,
+        .attach_adapter = saa6752hs_probe,
+        .detach_client  = saa6752hs_detach,
+        .command        = saa6752hs_command,
+};
+
+static struct i2c_client client_template =
+{
+	I2C_DEVNAME("(saa6752hs unset)"),
+	.flags      = I2C_CLIENT_ALLOW_USE,
+        .driver     = &driver,
+};
+
+static int saa6752hs_init_module(void)
+{
+	i2c_add_driver(&driver);
+	return 0;
+}
+
+static void saa6752hs_cleanup_module(void)
+{
+	i2c_del_driver(&driver);
+}
+
+module_init(saa6752hs_init_module);
+module_exit(saa6752hs_cleanup_module);
+
+/*
+ * Overrides for Emacs so that we follow Linus's tabbing style.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-cards.c linux/drivers/media/video/saa7134/saa7134-cards.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-cards.c	2003-10-06 17:46:19.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-cards.c	2003-10-06 17:48:03.000000000 +0200
@@ -32,6 +32,8 @@
 static char name_tv_mono[] = "TV (mono only)";
 static char name_comp1[]   = "Composite1";
 static char name_comp2[]   = "Composite2";
+static char name_comp3[]   = "Composite3";
+static char name_comp4[]   = "Composite4";
 static char name_svideo[]  = "S-Video";
 
 /* ------------------------------------------------------------------ */
@@ -361,14 +363,16 @@
         },
 	[SAA7134_BOARD_MD7134] = {
 		.name           = "Medion 7134",
-		.audio_clock    = 0x00200000,
+		//.audio_clock    = 0x00200000,
+		.audio_clock    = 0x00187de7,
 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
 		.need_tda9887   = 1,
 		.inputs = {{
 			.name   = name_tv,
 			.vmux   = 1,
-			.amux   = LINE2,
+			.amux   = TV,
 			.tv     = 1,
+#if 0
 		},{
 			.name   = name_comp1,
 			.vmux   = 0,
@@ -381,6 +385,7 @@
 			.name   = name_svideo,
 			.vmux   = 8,
 			.amux   = LINE2,
+#endif
 		}},
 		.radio = {
 			.name   = name_radio,
@@ -388,9 +393,12 @@
 		},
 	},
 	[SAA7134_BOARD_TYPHOON_90031] = {
+		/* Christian Rothl�nder <Christian@Rothlaender.net> */
 		.name           = "Typhoon TV+Radio 90031",
 		.audio_clock    = 0x00200000,
-		.tuner_type     = TUNER_PHILIPS_PAL,
+		//.tuner_type     = TUNER_PHILIPS_PAL,
+		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
+		.need_tda9887   = 1,
 		.inputs         = {{
 			.name   = name_tv,
 			.vmux   = 1,
@@ -409,7 +417,7 @@
 			.name   = name_radio,
 			.amux   = LINE2,
 		},
-	},
+        },
 	[SAA7134_BOARD_ELSA] = {
 		.name           = "ELSA EX-VISION 300TV",
 		.audio_clock    = 0x00187de7,
@@ -444,14 +452,123 @@
 			.tv   = 1,
 		}},
         },
-	
+	[SAA7134_BOARD_ASUSTeK_TVFM7134] = {
+                .name           = "ASUS TV-FM 7134",
+                .audio_clock    = 0x00187de7,
+                .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
+                .need_tda9887   = 1,
+                .inputs         = {{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = TV,
+                        .tv   = 1,
+#if 0 /* untested */
+                },{
+                        .name = name_comp1,
+                        .vmux = 4,
+                        .amux = LINE2,
+                },{
+                        .name = name_comp2,
+                        .vmux = 2,
+                        .amux = LINE2,
+                },{
+                        .name = name_svideo,
+                        .vmux = 6,
+                        .amux = LINE2,
+                },{
+                        .name = "S-Video2",
+                        .vmux = 7,
+                        .amux = LINE2,
+#endif
+                }},
+                .radio = {
+                        .name = name_radio,
+                        .amux = LINE1,
+                },
+	},
+	[SAA7134_BOARD_VA1000POWER] = {
+                .name           = "AOPEN VA1000 POWER",
+		.audio_clock    = 0x00187de7,
+		.tuner_type     = TUNER_PHILIPS_NTSC,
+                .inputs         = {{
+                        .name = name_svideo,
+                        .vmux = 8,
+                        .amux = LINE1,
+                },{
+                        .name = name_comp1,
+                        .vmux = 3,
+                        .amux = LINE1,
+                },{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = LINE2,
+                        .tv   = 1,
+                }},
+	},
+	[SAA7134_BOARD_BMK_MPEX_NOTUNER] = {
+		/* "Andrew de Quincey" <adq@lidskialf.net> */
+		.name		= "BMK MPEX No Tuner",
+		.audio_clock	= 0x200000,
+		.tuner_type	= TUNER_ABSENT,
+		.inputs         = {{
+			.name = name_comp1,
+			.vmux = 4,
+			.amux = LINE1,
+		},{
+			.name = name_comp2,
+			.vmux = 3,
+			.amux = LINE1,
+		},{
+			.name = name_comp3,
+			.vmux = 0,
+			.amux = LINE1,
+		},{
+			.name = name_comp4,
+			.vmux = 1,
+			.amux = LINE1,
+		},{
+			.name = name_svideo,
+			.vmux = 8,
+			.amux = LINE1,
+		}},
+		.i2s_rate  = 48000,
+		.has_ts    = 1,
+		.video_out = CCIR656,
+	},
+	[SAA7134_BOARD_VIDEOMATE_TV] = {
+		.name           = "Compro VideoMate TV",
+		.audio_clock    = 0x00187de7,
+		.tuner_type     = TUNER_PHILIPS_NTSC_M,
+                .inputs         = {{
+                        .name = name_svideo,
+                        .vmux = 8,
+                        .amux = LINE1,
+                },{
+                        .name = name_comp1,
+                        .vmux = 3,
+                        .amux = LINE1,
+                },{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = LINE2,
+                        .tv   = 1,
+                }},
+        },
+	[SAA7134_BOARD_CRONOS_PLUS] = {
+		.name           = "Matrox CronosPlus",
+		.tuner_type     = TUNER_ABSENT,
+                .inputs         = {{
+                        .name = name_comp1,
+                        .vmux = 0,
+                }},
+        },
 };
 const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
 
 /* ------------------------------------------------------------------ */
 /* PCI ids + subsystem IDs                                            */
 
-struct pci_device_id __devinitdata saa7134_pci_tbl[] = {
+struct pci_device_id saa7134_pci_tbl[] = {
 	{
 		.vendor       = PCI_VENDOR_ID_PHILIPS,
 		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -519,6 +636,42 @@
 		.subdevice    = 0x226b,
 		.driver_data  = SAA7134_BOARD_ELSA_500TV,
 	},{
+                .vendor       = PCI_VENDOR_ID_PHILIPS,
+                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = PCI_VENDOR_ID_ASUSTEK,
+                .subdevice    = 0x4842,
+                .driver_data  = SAA7134_BOARD_ASUSTeK_TVFM7134,
+	},{
+                .vendor       = PCI_VENDOR_ID_PHILIPS,
+                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = PCI_VENDOR_ID_ASUSTEK,
+                .subdevice    = 0x4830,
+                .driver_data  = SAA7134_BOARD_ASUSTeK_TVFM7134,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+		.subvendor    = PCI_VENDOR_ID_PHILIPS,
+		.subdevice    = 0xfe01,
+		.driver_data  = SAA7134_BOARD_TYPHOON_90031,
+	},{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = 0x1131,
+                .subdevice    = 0x7133,
+		.driver_data  = SAA7134_BOARD_VA1000POWER,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+                .subvendor    = 0x185b,
+                .subdevice    = 0xc100,
+		.driver_data  = SAA7134_BOARD_VIDEOMATE_TV,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7130,
+                .subvendor    = PCI_VENDOR_ID_MATROX,
+                .subdevice    = 0x48d0,
+		.driver_data  = SAA7134_BOARD_CRONOS_PLUS,
+	},{
 		
 		/* --- boards without eeprom + subsystem ID --- */
                 .vendor       = PCI_VENDOR_ID_PHILIPS,
@@ -595,22 +748,16 @@
 
 static void board_flyvideo(struct saa7134_dev *dev)
 {
+#if 0
 	u32 value;
+	int index;
 
-	saa_writel(SAA7134_GPIO_GPMODE0 >> 2,   0);
-	value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
-#if 0
-	{
-		int index = (value & 0x1f00) >> 8;
-		printk(KERN_INFO "%s: flyvideo: gpio is 0x%x "
-				"[model=%s,tuner=%d]\n",
-		       dev->name, value, fly_list[index].model,
-		       fly_list[index].tuner_type);
-		dev->tuner_type = fly_list[index].tuner_type;
-	}
-#else
-	printk(KERN_INFO "%s: flyvideo: gpio is 0x%x\n",
-	       dev->name, value);
+	value = dev->gpio_value;
+	index = (value & 0x1f00) >> 8;
+	printk(KERN_INFO "%s: flyvideo: gpio is 0x%x [model=%s,tuner=%d]\n",
+	       dev->name, value, fly_list[index].model,
+	       fly_list[index].tuner_type);
+	dev->tuner_type = fly_list[index].tuner_type;
 #endif
 }
 
@@ -618,10 +765,19 @@
 
 int saa7134_board_init(struct saa7134_dev *dev)
 {
+	// Always print gpio, often manufacturers encode tuner type and other info.
+	saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0);
+	dev->gpio_value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
+	printk(KERN_INFO "%s: board init: gpio is %x\n", dev->name, dev->gpio_value);
+
 	switch (dev->board) {
 	case SAA7134_BOARD_FLYVIDEO2000:
 	case SAA7134_BOARD_FLYVIDEO3000:
 		board_flyvideo(dev);
+		dev->has_remote = 1;
+		break;
+	case SAA7134_BOARD_CINERGY400:
+		dev->has_remote = 1;
 		break;
 	}
 	return 0;
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-core.c linux/drivers/media/video/saa7134/saa7134-core.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-core.c	2003-10-06 17:45:12.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-core.c	2003-10-06 17:48:03.000000000 +0200
@@ -35,7 +35,7 @@
 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
 MODULE_LICENSE("GPL");
 
-#define SAA7134_MAXBOARDS 4
+#define SAA7134_MAXBOARDS 8
 
 /* ------------------------------------------------------------------ */
 
@@ -51,32 +51,32 @@
 MODULE_PARM(gpio_tracking,"i");
 MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
 
-static unsigned int video_nr = -1;
-MODULE_PARM(video_nr,"i");
+static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(video_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(video_nr,"video device number");
 
-static unsigned int ts_nr = -1;
-MODULE_PARM(ts_nr,"i");
+static unsigned int ts_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(ts_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(ts_nr,"ts device number");
 
-static unsigned int vbi_nr = -1;
-MODULE_PARM(vbi_nr,"i");
+static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(vbi_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(vbi_nr,"vbi device number");
 
-static unsigned int radio_nr = -1;
-MODULE_PARM(radio_nr,"i");
+static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(radio_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(radio_nr,"radio device number");
 
 static unsigned int oss = 0;
 MODULE_PARM(oss,"i");
 MODULE_PARM_DESC(oss,"register oss devices (default: no)");
 
-static unsigned int dsp_nr = -1;
-MODULE_PARM(dsp_nr,"i");
+static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(dsp_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(dsp_nr,"oss dsp device number");
 
-static unsigned int mixer_nr = -1;
-MODULE_PARM(mixer_nr,"i");
+static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(mixer_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
 MODULE_PARM_DESC(mixer_nr,"oss mixer device number");
 
 static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
@@ -529,7 +529,8 @@
 static char *irqbits[] = {
 	"DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3",
 	"AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC",
-	"TRIG_ERR", "CONF_ERR", "LOAD_ERR"
+	"TRIG_ERR", "CONF_ERR", "LOAD_ERR",
+	"GPIO16?", "GPIO18", "GPIO22", "GPIO23"
 };
 #define IRQBITS ARRAY_SIZE(irqbits)
 
@@ -598,6 +599,13 @@
 		if ((report & SAA7134_IRQ_REPORT_DONE_RA3))
 			saa7134_irq_oss_done(dev,status);
 
+#ifdef CONFIG_VIDEO_IR
+		if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
+			       SAA7134_IRQ_REPORT_GPIO18)) &&
+		    dev->remote)
+			saa7134_input_irq(dev);
+#endif
+
 	};
 	if (10 == loop) {
 		print_irqstatus(dev,loop,report,status);
@@ -613,23 +621,30 @@
 
 /* ------------------------------------------------------------------ */
 
-static int saa7134_hwinit(struct saa7134_dev *dev)
+/* early init (no i2c, no irq) */
+static int saa7134_hwinit1(struct saa7134_dev *dev)
 {
+	dprintk("hwinit1\n");
+
+	saa_writel(SAA7134_IRQ1, 0);
+	saa_writel(SAA7134_IRQ2, 0);
         init_MUTEX(&dev->lock);
 	dev->slock = SPIN_LOCK_UNLOCKED;
 
 	saa7134_track_gpio(dev,"pre-init");
-	saa7134_tvaudio_init(dev);
-	saa7134_video_init(dev);
-	saa7134_vbi_init(dev);
+	saa7134_video_init1(dev);
+	saa7134_vbi_init1(dev);
 	if (card_has_ts(dev))
-		saa7134_ts_init(dev);
+		saa7134_ts_init1(dev);
+#ifdef CONFIG_VIDEO_IR
+	saa7134_input_init1(dev);
+#endif
 
 	switch (dev->pci->device) {
 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
-		saa7134_oss_init(dev);
+		saa7134_oss_init1(dev);
 		break;
 	}
 	
@@ -648,20 +663,6 @@
 		   SAA7134_MAIN_CTRL_EBADC |
 		   SAA7134_MAIN_CTRL_EBDAC);
 
-	/* IRQ's */
-	saa_writel(SAA7134_IRQ1, 0);
-	saa_writel(SAA7134_IRQ2,
-		   SAA7134_IRQ2_INTE_SC2  |
-		   SAA7134_IRQ2_INTE_SC1  |
-		   SAA7134_IRQ2_INTE_SC0  |
-		   /* SAA7134_IRQ2_INTE_DEC5 |  FIXME: TRIG_ERR ??? */
-		   SAA7134_IRQ2_INTE_DEC3 |
-		   SAA7134_IRQ2_INTE_DEC2 |
-		   /* SAA7134_IRQ2_INTE_DEC1 | */
-		   SAA7134_IRQ2_INTE_DEC0 |
-		   SAA7134_IRQ2_INTE_PE |
-		   SAA7134_IRQ2_INTE_AR);
-
 	/* enable peripheral devices */
 	saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
 
@@ -671,6 +672,57 @@
 	return 0;
 }
 
+/* late init (with i2c + irq) */
+static int saa7134_hwinit2(struct saa7134_dev *dev)
+{
+	dprintk("hwinit2\n");
+
+	saa7134_video_init2(dev);
+	saa7134_tvaudio_init2(dev);
+
+	/* enable IRQ's */
+	saa_writel(SAA7134_IRQ1, 0);
+	saa_writel(SAA7134_IRQ2,
+		   SAA7134_IRQ2_INTE_GPIO18  |
+		   SAA7134_IRQ2_INTE_GPIO18A |
+		   SAA7134_IRQ2_INTE_GPIO16  |
+		   SAA7134_IRQ2_INTE_SC2     |
+		   SAA7134_IRQ2_INTE_SC1     |
+		   SAA7134_IRQ2_INTE_SC0     |
+		   /* SAA7134_IRQ2_INTE_DEC5    |  FIXME: TRIG_ERR ??? */
+		   SAA7134_IRQ2_INTE_DEC3    |
+		   SAA7134_IRQ2_INTE_DEC2    |
+		   /* SAA7134_IRQ2_INTE_DEC1    | */
+		   SAA7134_IRQ2_INTE_DEC0    |
+		   SAA7134_IRQ2_INTE_PE      |
+		   SAA7134_IRQ2_INTE_AR);
+
+	return 0;
+}
+
+/* shutdown */
+static int saa7134_hwfini(struct saa7134_dev *dev)
+{
+	dprintk("hwfini\n");
+
+	switch (dev->pci->device) {
+	case PCI_DEVICE_ID_PHILIPS_SAA7134:
+	case PCI_DEVICE_ID_PHILIPS_SAA7133:
+	case PCI_DEVICE_ID_PHILIPS_SAA7135:
+		saa7134_oss_fini(dev);
+		break;
+	}
+	if (card_has_ts(dev))
+		saa7134_ts_fini(dev);
+#ifdef CONFIG_VIDEO_IR
+	saa7134_input_fini(dev);
+#endif
+	saa7134_vbi_fini(dev);
+	saa7134_video_fini(dev);
+	saa7134_tvaudio_fini(dev);
+	return 0;
+}
+
 static void __devinit must_configure_manually(void)
 {
 	unsigned int i,p;
@@ -698,6 +750,56 @@
 	}
 }
 
+static struct video_device *vdev_init(struct saa7134_dev *dev,
+				      struct video_device *template,
+				      char *type)
+{
+	struct video_device *vfd;
+	
+	vfd = video_device_alloc();
+	if (NULL == vfd)
+		return NULL;
+	*vfd = *template;
+	vfd->minor   = -1;
+	vfd->dev     = &dev->pci->dev;
+	vfd->release = video_device_release;
+	snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
+		 dev->name, type, saa7134_boards[dev->board].name);
+	return vfd;
+}
+
+static void saa7134_unregister_video(struct saa7134_dev *dev)
+{
+	if (dev->video_dev) {
+		if (-1 != dev->video_dev->minor)
+			video_unregister_device(dev->video_dev);
+		else
+			video_device_release(dev->video_dev);
+		dev->video_dev = NULL;
+	}
+	if (dev->ts_dev) {
+		if (-1 != dev->ts_dev->minor)
+			video_unregister_device(dev->ts_dev);
+		else
+			video_device_release(dev->ts_dev);
+		dev->ts_dev = NULL;
+	}
+	if (dev->vbi_dev) {
+		if (-1 != dev->vbi_dev->minor)
+			video_unregister_device(dev->vbi_dev);
+		else
+			video_device_release(dev->vbi_dev);
+		dev->vbi_dev = NULL;
+	}
+	if (dev->radio_dev) {
+		if (-1 != dev->radio_dev->minor)
+			video_unregister_device(dev->radio_dev);
+		else
+			video_device_release(dev->radio_dev);
+		dev->radio_dev = NULL;
+	}
+}
+
 static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
 				     const struct pci_device_id *pci_id)
 {
@@ -705,10 +807,8 @@
 	int err;
 
 	dev = kmalloc(sizeof(*dev),GFP_KERNEL);
-	if (NULL == dev) {
-		err = -ENOMEM;
-		goto fail0;
-	}
+	if (NULL == dev)
+		return -ENOMEM;
 	memset(dev,0,sizeof(*dev));
 
 	/* pci init */
@@ -785,19 +885,17 @@
 		goto fail1;
 	}
 	dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000);
-	if (!dev->lmmio) {
-		printk(KERN_ERR "Unable to remap memory.\n");
-		err = -ENOMEM;
+	dev->bmmio = (__u8*)dev->lmmio;
+	if (NULL == dev->lmmio) {
+		err = -EIO;
+		printk(KERN_ERR "%s: can't ioremap() MMIO memory\n",
+		       dev->name);
 		goto fail2;
 	}
-	dev->bmmio = (__u8*)dev->lmmio;
-
-	/* register i2c bus */
-	saa7134_i2c_register(dev);
 
-	/* initialize hardware */
+	/* initialize hardware #1 */
 	saa7134_board_init(dev);
-	saa7134_hwinit(dev);
+	saa7134_hwinit1(dev);
 
 	/* get irq */
 	err = request_irq(pci_dev->irq, saa7134_irq,
@@ -808,53 +906,63 @@
 		goto fail3;
 	}
 
+	/* wait a bit, register i2c bus */
+	current->state = TASK_INTERRUPTIBLE;
+	schedule_timeout(HZ/10);
+	saa7134_i2c_register(dev);
+
+	/* initialize hardware #2 */
+	saa7134_hwinit2(dev);
+
 	/* load i2c helpers */
 	if (TUNER_ABSENT != dev->tuner_type)
 		request_module("tuner");
 	if (saa7134_boards[dev->board].need_tda9887)
 		request_module("tda9887");
+  	if (card_has_ts(dev))
+		request_module("saa6752hs");
 
 	/* register v4l devices */
-	dev->video_dev = saa7134_video_template;
-	dev->video_dev.priv = dev;
-	err = video_register_device(&dev->video_dev,VFL_TYPE_GRABBER,video_nr);
+	dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
+	err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
+				    video_nr[saa7134_devcount]);
 	if (err < 0) {
 		printk(KERN_INFO "%s: can't register video device\n",
 		       dev->name);
 		goto fail4;
 	}
 	printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
-	       dev->name,dev->video_dev.minor & 0x1f);
+	       dev->name,dev->video_dev->minor & 0x1f);
 
-	dev->ts_dev = saa7134_ts_template;
-	dev->ts_dev.priv = dev;
 	if (card_has_ts(dev)) {
-		err = video_register_device(&dev->ts_dev,VFL_TYPE_GRABBER,ts_nr);
+		dev->ts_dev = vdev_init(dev,&saa7134_ts_template,"ts");
+		err = video_register_device(dev->ts_dev,VFL_TYPE_GRABBER,
+					    ts_nr[saa7134_devcount]);
 		if (err < 0) {
 			printk(KERN_INFO "%s: can't register video device\n",
 			       dev->name);
-			goto fail5;
+			goto fail4;
 		}
 		printk(KERN_INFO "%s: registered device video%d [ts]\n",
-		       dev->name,dev->ts_dev.minor & 0x1f);
+		       dev->name,dev->ts_dev->minor & 0x1f);
 	}
 	
-	dev->vbi_dev = saa7134_vbi_template;
-	dev->vbi_dev.priv = dev;
-	err = video_register_device(&dev->vbi_dev,VFL_TYPE_VBI,vbi_nr);
+	dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi");
+	err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
+				    vbi_nr[saa7134_devcount]);
 	if (err < 0)
-		goto fail6;
+		goto fail4;
 	printk(KERN_INFO "%s: registered device vbi%d\n",
-	       dev->name,dev->vbi_dev.minor & 0x1f);
+	       dev->name,dev->vbi_dev->minor & 0x1f);
 
-	dev->radio_dev = saa7134_radio_template;
-	dev->radio_dev.priv = dev;
 	if (card_has_radio(dev)) {
-		err = video_register_device(&dev->radio_dev,VFL_TYPE_RADIO,radio_nr);
+		dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
+		err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
+					    radio_nr[saa7134_devcount]);
 		if (err < 0)
-			goto fail7;
+			goto fail4;
 		printk(KERN_INFO "%s: registered device radio%d\n",
-		       dev->name,dev->radio_dev.minor & 0x1f);
+		       dev->name,dev->radio_dev->minor & 0x1f);
 	}
 
 	/* register oss devices */
@@ -864,17 +972,19 @@
 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
 		if (oss) {
 			err = dev->oss.minor_dsp =
-				register_sound_dsp(&saa7134_dsp_fops,dsp_nr);
+				register_sound_dsp(&saa7134_dsp_fops,
+						   dsp_nr[saa7134_devcount]);
 			if (err < 0) {
-				goto fail8;
+				goto fail4;
 			}
 			printk(KERN_INFO "%s: registered device dsp%d\n",
 			       dev->name,dev->oss.minor_dsp >> 4);
 			
 			err = dev->oss.minor_mixer =
-				register_sound_mixer(&saa7134_mixer_fops,mixer_nr);
+				register_sound_mixer(&saa7134_mixer_fops,
+						     mixer_nr[saa7134_devcount]);
 			if (err < 0)
-				goto fail9;
+				goto fail5;
 			printk(KERN_INFO "%s: registered device mixer%d\n",
 			       dev->name,dev->oss.minor_mixer >> 4);
 		}
@@ -887,7 +997,7 @@
 	saa7134_devcount++;
 	return 0;
 
- fail9:
+ fail5:
 	switch (dev->pci->device) {
 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
@@ -896,39 +1006,18 @@
 			unregister_sound_dsp(dev->oss.minor_dsp);
 		break;
 	}
- fail8:
-	if (card_has_radio(dev))
-		video_unregister_device(&dev->radio_dev);
- fail7:
-	video_unregister_device(&dev->vbi_dev);
- fail6:
- 	if (card_has_ts(dev))
-  		video_unregister_device(&dev->ts_dev);
- fail5:
-	video_unregister_device(&dev->video_dev);
  fail4:
+	saa7134_unregister_video(dev);
+	saa7134_i2c_unregister(dev);
 	free_irq(pci_dev->irq, dev);
  fail3:
-	switch (dev->pci->device) {
-	case PCI_DEVICE_ID_PHILIPS_SAA7134:
-	case PCI_DEVICE_ID_PHILIPS_SAA7133:
-	case PCI_DEVICE_ID_PHILIPS_SAA7135:
-		saa7134_oss_fini(dev);
-		break;
-	}
-	if (card_has_ts(dev))
-		saa7134_ts_fini(dev);
-	saa7134_vbi_fini(dev);
-	saa7134_video_fini(dev);
-	saa7134_tvaudio_fini(dev);
-	iounmap (dev->lmmio);
-	saa7134_i2c_unregister(dev);
+	saa7134_hwfini(dev);
+	iounmap(dev->lmmio);
  fail2:
 	release_mem_region(pci_resource_start(pci_dev,0),
 			   pci_resource_len(pci_dev,0));
  fail1:
 	kfree(dev);
- fail0:
 	return err;
 }
 
@@ -964,12 +1053,6 @@
 	saa7134_vbi_fini(dev);
 	saa7134_video_fini(dev);
 	saa7134_tvaudio_fini(dev);
-	iounmap(dev->lmmio);
-
-	/* release ressources */
-	free_irq(pci_dev->irq, dev);
-	release_mem_region(pci_resource_start(pci_dev,0),
-			   pci_resource_len(pci_dev,0));
 
 	/* unregister */
 	saa7134_i2c_unregister(dev);
@@ -983,17 +1066,18 @@
 		}
 		break;
 	}
-	if (card_has_radio(dev))
-		video_unregister_device(&dev->radio_dev);
-	video_unregister_device(&dev->vbi_dev);
-	if (card_has_ts(dev))
-		video_unregister_device(&dev->ts_dev);
-	video_unregister_device(&dev->video_dev);
-	pci_set_drvdata(pci_dev, NULL);
-#if 0
-	/* causes some trouble when reinserting the driver ... */
+	saa7134_unregister_video(dev);
+
+	/* release ressources */
+	free_irq(pci_dev->irq, dev);
+	iounmap(dev->lmmio);
+	release_mem_region(pci_resource_start(pci_dev,0),
+			   pci_resource_len(pci_dev,0));
+
+#if 0  /* causes some trouble when reinserting the driver ... */
 	pci_disable_device(pci_dev);
 #endif
+	pci_set_drvdata(pci_dev, NULL);
 
 	/* free memory */
 	list_del(&dev->devlist);
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-i2c.c linux/drivers/media/video/saa7134/saa7134-i2c.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-i2c.c	2003-10-06 17:44:51.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-i2c.c	2003-10-06 17:48:03.000000000 +0200
@@ -311,6 +311,17 @@
 	return I2C_FUNC_SMBUS_EMUL;
 }
 
+#ifndef I2C_PEC
+static void inc_use(struct i2c_adapter *adap)
+{
+	MOD_INC_USE_COUNT;
+}
+
+static void dec_use(struct i2c_adapter *adap)
+{
+	MOD_DEC_USE_COUNT;
+}
+#endif
 
 static int attach_inform(struct i2c_client *client)
 {
@@ -330,8 +341,15 @@
 };
 
 static struct i2c_adapter saa7134_adap_template = {
+#ifdef I2C_PEC
 	.owner         = THIS_MODULE,
+#else
+	.inc_use       = inc_use,
+	.dec_use       = dec_use,
+#endif
+#ifdef I2C_ADAP_CLASS_TV_ANALOG
 	.class         = I2C_ADAP_CLASS_TV_ANALOG,
+#endif
 	I2C_DEVNAME("saa7134"),
 	.id            = I2C_ALGO_SAA7134,
 	.algo          = &saa7134_algo,
@@ -393,12 +411,14 @@
 void saa7134_i2c_call_clients(struct saa7134_dev *dev,
 			      unsigned int cmd, void *arg)
 {
+	BUG_ON(NULL == dev->i2c_adap.algo_data);
 	i2c_clients_command(&dev->i2c_adap, cmd, arg);
 }
 
 int saa7134_i2c_register(struct saa7134_dev *dev)
 {
 	dev->i2c_adap = saa7134_adap_template;
+	dev->i2c_adap.dev.parent = &dev->pci->dev;
 	strcpy(dev->i2c_adap.name,dev->name);
 	dev->i2c_adap.algo_data = dev;
 	i2c_add_adapter(&dev->i2c_adap);
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-oss.c linux/drivers/media/video/saa7134/saa7134-oss.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-oss.c	2003-10-06 17:45:22.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-oss.c	2003-10-06 17:48:03.000000000 +0200
@@ -732,7 +732,7 @@
 
 /* ------------------------------------------------------------------ */
 
-int saa7134_oss_init(struct saa7134_dev *dev)
+int saa7134_oss_init1(struct saa7134_dev *dev)
 {
 	/* general */
         init_MUTEX(&dev->oss.lock);
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-reg.h linux/drivers/media/video/saa7134/saa7134-reg.h
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-reg.h	2003-10-06 17:45:54.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-reg.h	2003-10-06 17:48:03.000000000 +0200
@@ -101,7 +101,15 @@
 #define   SAA7134_IRQ1_INTE_RA0_2               (1 <<  2)
 #define   SAA7134_IRQ1_INTE_RA0_1               (1 <<  1)
 #define   SAA7134_IRQ1_INTE_RA0_0               (1 <<  0)
+
 #define SAA7134_IRQ2                            (0x2c8 >> 2)
+#define   SAA7134_IRQ2_INTE_GPIO23A             (1 << 17)
+#define   SAA7134_IRQ2_INTE_GPIO23              (1 << 16)
+#define   SAA7134_IRQ2_INTE_GPIO22A             (1 << 15)
+#define   SAA7134_IRQ2_INTE_GPIO22              (1 << 14)
+#define   SAA7134_IRQ2_INTE_GPIO18A             (1 << 13)
+#define   SAA7134_IRQ2_INTE_GPIO18              (1 << 12)
+#define   SAA7134_IRQ2_INTE_GPIO16              (1 << 11) /* not certain */
 #define   SAA7134_IRQ2_INTE_SC2                 (1 << 10)
 #define   SAA7134_IRQ2_INTE_SC1                 (1 <<  9)
 #define   SAA7134_IRQ2_INTE_SC0                 (1 <<  8)
@@ -113,7 +121,12 @@
 #define   SAA7134_IRQ2_INTE_DEC0                (1 <<  2)
 #define   SAA7134_IRQ2_INTE_PE                  (1 <<  1)
 #define   SAA7134_IRQ2_INTE_AR                  (1 <<  0)
+
 #define SAA7134_IRQ_REPORT                      (0x2cc >> 2)
+#define   SAA7134_IRQ_REPORT_GPIO23             (1 << 17)
+#define   SAA7134_IRQ_REPORT_GPIO22             (1 << 16)
+#define   SAA7134_IRQ_REPORT_GPIO18             (1 << 15)
+#define   SAA7134_IRQ_REPORT_GPIO16             (1 << 14) /* not certain */
 #define   SAA7134_IRQ_REPORT_LOAD_ERR           (1 << 13)
 #define   SAA7134_IRQ_REPORT_CONF_ERR           (1 << 12)
 #define   SAA7134_IRQ_REPORT_TRIG_ERR           (1 << 11)
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-ts.c linux/drivers/media/video/saa7134/saa7134-ts.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-ts.c	2003-10-06 17:44:30.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-ts.c	2003-10-06 17:48:03.000000000 +0200
@@ -24,10 +24,13 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
+#include <linux/delay.h>
 
 #include "saa7134-reg.h"
 #include "saa7134.h"
 
+#include <media/saa6752hs.h>
+
 /* ------------------------------------------------------------------ */
 
 static unsigned int ts_debug  = 0;
@@ -109,7 +112,7 @@
 		buf->vb.size   = size;
 		buf->pt        = &dev->ts.pt_ts;
 
-		err = videobuf_iolock(dev->pci,&buf->vb);
+		err = videobuf_iolock(dev->pci,&buf->vb,NULL);
 		if (err)
 			goto oops;
 		err = saa7134_pgtable_build(dev->pci,buf->pt,
@@ -162,6 +165,26 @@
 	.buf_release  = buffer_release,
 };
 
+
+/* ------------------------------------------------------------------ */
+
+static void ts_reset_encoder(struct saa7134_dev* dev) 
+{
+	saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
+	mdelay(10);
+   	saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
+   	current->state = TASK_INTERRUPTIBLE;
+	schedule_timeout(HZ/10);
+}
+
+static int ts_init_encoder(struct saa7134_dev* dev, void* arg) 
+{
+	ts_reset_encoder(dev);
+	saa7134_i2c_call_clients(dev, MPEG_SETPARAMS, arg);
+ 	return 0;
+}
+
+
 /* ------------------------------------------------------------------ */
 
 static int ts_open(struct inode *inode, struct file *file)
@@ -173,7 +196,7 @@
 	
 	list_for_each(list,&saa7134_devlist) {
 		h = list_entry(list, struct saa7134_dev, devlist);
-		if (h->ts_dev.minor == minor)
+		if (h->ts_dev->minor == minor)
 			dev = h;
 	}
 	if (NULL == dev)
@@ -185,9 +208,11 @@
 	if (dev->ts.users)
 		goto done;
 
+	dev->ts.started = 0;
 	dev->ts.users++;
 	file->private_data = dev;
 	err = 0;
+
  done:
 	up(&dev->ts.ts.lock);
 	return err;
@@ -203,6 +228,11 @@
 	if (dev->ts.ts.reading)
 		videobuf_read_stop(file,&dev->ts.ts);
 	dev->ts.users--;
+
+	/* stop the encoder */
+	if (dev->ts.started)
+	      	ts_reset_encoder(dev);
+  
 	up(&dev->ts.ts.lock);
 	return 0;
 }
@@ -212,6 +242,11 @@
 {
 	struct saa7134_dev *dev = file->private_data;
 
+	if (!dev->ts.started) {
+		ts_init_encoder(dev, NULL);
+		dev->ts.started = 1;
+	}
+  
 	return videobuf_read_stream(file, &dev->ts.ts, data, count, ppos, 0);
 }
 
@@ -345,6 +380,7 @@
 		f->fmt.pix.height       = 576;
 		f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
 		f->fmt.pix.sizeimage    = TS_PACKET_SIZE*TS_NR_PACKETS;
+		return 0;
 	}
 
 	case VIDIOC_REQBUFS:
@@ -365,6 +401,14 @@
 	case VIDIOC_STREAMOFF:
 		return videobuf_streamoff(file,&dev->ts.ts);
 
+	case VIDIOC_QUERYCTRL:
+	case VIDIOC_G_CTRL:
+	case VIDIOC_S_CTRL:
+		return saa7134_common_ioctl(dev, cmd, arg);
+
+	case MPEG_SETPARAMS:
+		return ts_init_encoder(dev, arg);
+	  
 	default:
 		return -ENOIOCTLCMD;
 	}
@@ -404,7 +448,7 @@
 	.minor	       = -1,
 };
 
-int saa7134_ts_init(struct saa7134_dev *dev)
+int saa7134_ts_init1(struct saa7134_dev *dev)
 {
 	/* sanitycheck insmod options */
 	if (tsbufs < 2)
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-tvaudio.c linux/drivers/media/video/saa7134/saa7134-tvaudio.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-10-06 17:44:29.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-10-06 17:48:03.000000000 +0200
@@ -2,7 +2,7 @@
  * device driver for philips saa7134 based TV cards
  * tv audio decoder (fm stereo, nicam, ...)
  *
- * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -172,7 +172,7 @@
 {
 	unsigned int mute;
 	struct saa7134_input *in;
-	int reg = 0;
+	int ausel=0, ics=0, ocs=0;
 	int mask;
 
 	/* look what is to do ... */
@@ -200,11 +200,13 @@
 
 	/* switch internal audio mux */
 	switch (in->amux) {
-	case TV:    reg = 0x02; break;
-	case LINE1: reg = 0x00; break;
-	case LINE2: reg = 0x01; break;
-	}
-	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, reg);
+	case TV:    ausel=0xc0; ics=0x00; ocs=0x02; break;
+	case LINE1: ausel=0x80; ics=0x00; ocs=0x00; break;
+	case LINE2: ausel=0x80; ics=0x08; ocs=0x01; break;
+	}
+	saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, ausel);
+	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, ics);
+	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, ocs);
 
 	/* switch gpio-connected external audio mux */
 	if (0 == card(dev).gpiomask)
@@ -547,11 +549,19 @@
 		tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
 		dev->tvaudio = &tvaudio[audio];
 
-		if (tvaudio_sleep(dev,3*HZ))
-			goto restart;
-		rx = tvaudio_getstereo(dev,&tvaudio[i]);
-		mode = saa7134_tvaudio_rx2mode(rx);
-		tvaudio_setstereo(dev,&tvaudio[audio],mode);
+		for (;;) {
+			if (tvaudio_sleep(dev,3*HZ))
+				goto restart;
+			if (dev->thread.exit || signal_pending(current))
+				break;
+			if (UNSET == dev->thread.mode) {
+				rx = tvaudio_getstereo(dev,&tvaudio[i]);
+				mode = saa7134_tvaudio_rx2mode(rx);
+			} else {
+				mode = dev->thread.mode;
+			}
+			tvaudio_setstereo(dev,&tvaudio[audio],mode);
+		}
 	}
 
  done:
@@ -592,8 +602,8 @@
 	[0x1f] = "??? [in progress]",
 };
 
-#define DSP_RETRY 16
-#define DSP_DELAY 16
+#define DSP_RETRY 30
+#define DSP_DELAY 10
 
 static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
 {
@@ -838,10 +848,11 @@
 	return retval;
 }
 
-int saa7134_tvaudio_init(struct saa7134_dev *dev)
+int saa7134_tvaudio_init2(struct saa7134_dev *dev)
 {
 	DECLARE_MUTEX_LOCKED(sem);
 	int (*my_thread)(void *data) = NULL;
+	int rc;
 
 	/* enable I2S audio output */
 	if (saa7134_boards[dev->board].i2s_rate) {
@@ -872,8 +883,12 @@
 		/* start tvaudio thread */
 		init_waitqueue_head(&dev->thread.wq);
 		dev->thread.notify = &sem;
-		kernel_thread(my_thread,dev,0);
-		down(&sem);
+		rc = kernel_thread(my_thread,dev,0);
+		if (rc < 0)
+			printk(KERN_WARNING "%s: kernel_thread() failed\n",
+			       dev->name);
+		else
+			down(&sem);
 		dev->thread.notify = NULL;
 		wake_up_interruptible(&dev->thread.wq);
 	}
@@ -900,6 +915,7 @@
 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
 {
 	if (dev->thread.task) {
+		dev->thread.mode = UNSET;
 		dev->thread.scan2++;
 		wake_up_interruptible(&dev->thread.wq);
 	} else {
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-vbi.c linux/drivers/media/video/saa7134/saa7134-vbi.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-vbi.c	2003-10-06 17:46:31.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-vbi.c	2003-10-06 17:48:03.000000000 +0200
@@ -146,7 +146,7 @@
 		buf->vb.size   = size;
 		buf->pt        = &fh->pt_vbi;
 
-		err = videobuf_iolock(dev->pci,&buf->vb);
+		err = videobuf_iolock(dev->pci,&buf->vb,NULL);
 		if (err)
 			goto oops;
 		err = saa7134_pgtable_build(dev->pci,buf->pt,
@@ -215,7 +215,7 @@
 
 /* ------------------------------------------------------------------ */
 
-int saa7134_vbi_init(struct saa7134_dev *dev)
+int saa7134_vbi_init1(struct saa7134_dev *dev)
 {
 	INIT_LIST_HEAD(&dev->vbi_q.queue);
 	init_timer(&dev->vbi_q.timeout);
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-video.c linux/drivers/media/video/saa7134/saa7134-video.c
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134-video.c	2003-10-06 17:44:51.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-video.c	2003-10-06 17:48:03.000000000 +0200
@@ -578,21 +578,12 @@
 	saa_writeb(SAA7134_VIDEO_LINES2(task),      height/div >> 8);
 
 	/* deinterlace y offsets */
-	if (interlace) {
-		y_odd  = dev->ctl_y_odd;
-		y_even = dev->ctl_y_even;
-		saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd);
-		saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even);
-		saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd);
-		saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even);
-	} else {
-		y_odd  = dev->ctl_y_odd;
-		y_even = dev->ctl_y_even;
-		saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd);
-		saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even);
-		saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd);
-		saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even);
-	}
+	y_odd  = dev->ctl_y_odd;
+	y_even = dev->ctl_y_even;
+	saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd);
+	saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even);
+	saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd);
+	saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even);
 }
 
 /* ------------------------------------------------------------------ */
@@ -912,7 +903,7 @@
 		buf->fmt       = fh->fmt;
 		buf->pt        = &fh->pt_cap;
 
-		err = videobuf_iolock(dev->pci,&buf->vb);
+		err = videobuf_iolock(dev->pci,&buf->vb,&dev->ovbuf);
 		if (err)
 			goto oops;
 		err = saa7134_pgtable_build(dev->pci,buf->pt,
@@ -1084,7 +1075,7 @@
 	default:
 		return -EINVAL;
 	}
-	if (restart_overlay && res_check(fh, RESOURCE_OVERLAY)) {
+	if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) {
 		spin_lock_irqsave(&dev->slock,flags);
 		stop_preview(dev,fh);
 		start_preview(dev,fh);
@@ -1140,13 +1131,13 @@
 	
 	list_for_each(list,&saa7134_devlist) {
 		h = list_entry(list, struct saa7134_dev, devlist);
-		if (h->video_dev.minor == minor)
+		if (h->video_dev && (h->video_dev->minor == minor))
 			dev = h;
-		if (h->radio_dev.minor == minor) {
+		if (h->radio_dev && (h->radio_dev->minor == minor)) {
 			radio = 1;
 			dev = h;
 		}
-		if (h->vbi_dev.minor == minor) {
+		if (h->vbi_dev && (h->vbi_dev->minor == minor)) {
 			type = V4L2_BUF_TYPE_VBI_CAPTURE;
 			dev = h;
 		}
@@ -1188,13 +1179,10 @@
 
 	if (fh->radio) {
 		/* switch to radio mode */
-		u32 v = 400*16;
 		saa7134_tvaudio_setinput(dev,&card(dev).radio);
-		saa7134_i2c_call_clients(dev,VIDIOCSFREQ,&v);
 		saa7134_i2c_call_clients(dev,AUDC_SET_RADIO,NULL);
 	} else {
 		/* switch to video/vbi mode */
-		set_tvnorm(dev,dev->tvnorm);
 		video_mux(dev,dev->ctl_input);
 	}
         return 0;
@@ -1327,7 +1315,7 @@
 	f->fmt.vbi.count[0] = norm->vbi_v_stop - norm->vbi_v_start +1;
 	f->fmt.vbi.start[1] = norm->video_v_stop + norm->vbi_v_start +1;
 	f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
-	f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */;
+	f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */
 
 #if 0
 	if (V4L2_STD_PAL == norm->id) {
@@ -1479,6 +1467,92 @@
 	}
 }
 
+int saa7134_common_ioctl(struct saa7134_dev *dev,
+			 unsigned int cmd, void *arg)
+{
+	int err;
+	
+	switch (cmd) {
+	case VIDIOC_QUERYCTRL:
+	{
+		const struct v4l2_queryctrl *ctrl;
+		struct v4l2_queryctrl *c = arg;
+
+		if ((c->id <  V4L2_CID_BASE ||
+		     c->id >= V4L2_CID_LASTP1) &&
+		    (c->id <  V4L2_CID_PRIVATE_BASE ||
+		     c->id >= V4L2_CID_PRIVATE_LASTP1))
+			return -EINVAL;
+		ctrl = ctrl_by_id(c->id);
+		*c = (NULL != ctrl) ? *ctrl : no_ctrl;
+		return 0;
+	}
+	case VIDIOC_G_CTRL:
+		return get_control(dev,arg);
+	case VIDIOC_S_CTRL:
+	{
+		down(&dev->lock);
+		err = set_control(dev,NULL,arg);
+		up(&dev->lock);
+		return err;
+	}
+	/* --- input switching --------------------------------------- */
+	case VIDIOC_ENUMINPUT:
+	{
+		struct v4l2_input *i = arg;
+		unsigned int n;
+
+		n = i->index;
+		if (n >= SAA7134_INPUT_MAX)
+			return -EINVAL;
+		if (NULL == card_in(dev,i->index).name)
+			return -EINVAL;
+		memset(i,0,sizeof(*i));
+		i->index = n;
+		i->type  = V4L2_INPUT_TYPE_CAMERA;
+		strcpy(i->name,card_in(dev,n).name);
+		if (card_in(dev,n).tv)
+			i->type = V4L2_INPUT_TYPE_TUNER;
+		i->audioset = 1;
+		if (n == dev->ctl_input) {
+			int v1 = saa_readb(SAA7134_STATUS_VIDEO1);
+			int v2 = saa_readb(SAA7134_STATUS_VIDEO2);
+
+			if (0 != (v1 & 0x40))
+				i->status |= V4L2_IN_ST_NO_H_LOCK;
+			if (0 != (v2 & 0x40))
+				i->status |= V4L2_IN_ST_NO_SYNC;
+			if (0 != (v2 & 0x0e))
+				i->status |= V4L2_IN_ST_MACROVISION;
+		}
+		for (n = 0; n < TVNORMS; n++)
+			i->std |= tvnorms[n].id;
+		return 0;
+	}
+	case VIDIOC_G_INPUT:
+	{
+		int *i = arg;
+		*i = dev->ctl_input;
+		return 0;
+	}
+	case VIDIOC_S_INPUT:
+	{
+		int *i = arg;
+		
+		if (*i < 0  ||  *i >= SAA7134_INPUT_MAX)
+			return -EINVAL;
+		if (NULL == card_in(dev,*i).name)
+			return -EINVAL;
+		down(&dev->lock);
+		video_mux(dev,*i);
+		up(&dev->lock);
+		return 0;
+	}
+
+	}
+	return 0;
+}
+
 /*
  * This function is _not_ called directly, but from
  * video_generic_ioctl (and maybe others).  userspace
@@ -1562,59 +1636,6 @@
 		return 0;
 	}
 
-	/* --- input switching --------------------------------------- */
-	case VIDIOC_ENUMINPUT:
-	{
-		struct v4l2_input *i = arg;
-		unsigned int n;
-
-		n = i->index;
-		if (n >= SAA7134_INPUT_MAX)
-			return -EINVAL;
-		if (NULL == card_in(dev,i->index).name)
-			return -EINVAL;
-		memset(i,0,sizeof(*i));
-		i->index = n;
-		i->type  = V4L2_INPUT_TYPE_CAMERA;
-		strcpy(i->name,card_in(dev,n).name);
-		if (card_in(dev,n).tv)
-			i->type = V4L2_INPUT_TYPE_TUNER;
-		i->audioset = 1;
-		if (n == dev->ctl_input) {
-			int v1 = saa_readb(SAA7134_STATUS_VIDEO1);
-			int v2 = saa_readb(SAA7134_STATUS_VIDEO2);
-
-			if (0 != (v1 & 0x40))
-				i->status |= V4L2_IN_ST_NO_H_LOCK;
-			if (0 != (v2 & 0x40))
-				i->status |= V4L2_IN_ST_NO_SYNC;
-			if (0 != (v2 & 0x0e))
-				i->status |= V4L2_IN_ST_MACROVISION;
-		}
-		for (n = 0; n < TVNORMS; n++)
-			i->std |= tvnorms[n].id;
-		return 0;
-	}
-	case VIDIOC_G_INPUT:
-	{
-		int *i = arg;
-		*i = dev->ctl_input;
-		return 0;
-	}
-	case VIDIOC_S_INPUT:
-	{
-		int *i = arg;
-		
-		if (*i < 0  ||  *i >= SAA7134_INPUT_MAX)
-			return -EINVAL;
-		if (NULL == card_in(dev,*i).name)
-			return -EINVAL;
-		down(&dev->lock);
-		video_mux(dev,*i);
-		up(&dev->lock);
-		return 0;
-	}
-
 	/* --- tuner ioctls ------------------------------------------ */
 	case VIDIOC_G_TUNER:
 	{
@@ -1643,9 +1664,17 @@
 	}
 	case VIDIOC_S_TUNER:
 	{
-#if 0
 		struct v4l2_tuner *t = arg;
-#endif
+		int rx,mode;
+
+		mode = dev->thread.mode;
+		if (UNSET == mode) {
+			rx   = saa7134_tvaudio_getstereo(dev);
+			mode = saa7134_tvaudio_rx2mode(t->rxsubchans);
+		}
+		if (mode != t->audmode) {
+			dev->thread.mode = t->audmode;
+		}
 		return 0;
 	}
 	case VIDIOC_G_FREQUENCY:
@@ -1673,29 +1702,14 @@
 	}
 		
 	/* --- control ioctls ---------------------------------------- */
+	case VIDIOC_ENUMINPUT:
+	case VIDIOC_G_INPUT:
+	case VIDIOC_S_INPUT:
 	case VIDIOC_QUERYCTRL:
-	{
-		const struct v4l2_queryctrl *ctrl;
-		struct v4l2_queryctrl *c = arg;
-
-		if ((c->id <  V4L2_CID_BASE ||
-		     c->id >= V4L2_CID_LASTP1) &&
-		    (c->id <  V4L2_CID_PRIVATE_BASE ||
-		     c->id >= V4L2_CID_PRIVATE_LASTP1))
-			return -EINVAL;
-		ctrl = ctrl_by_id(c->id);
-		*c = (NULL != ctrl) ? *ctrl : no_ctrl;
-		return 0;
-	}
 	case VIDIOC_G_CTRL:
-		return get_control(dev,arg);
 	case VIDIOC_S_CTRL:
-	{
-		down(&dev->lock);
-		err = set_control(dev,fh,arg);
-		up(&dev->lock);
-		return err;
-	}
+		return saa7134_common_ioctl(dev, cmd, arg);
+
 	case VIDIOC_G_AUDIO:
 	{
 		struct v4l2_audio *a = arg;
@@ -1828,8 +1842,9 @@
 
 		q = saa7134_queue(fh);
 		memset(&req,0,sizeof(req));
-		req.type  = q->type;
-		req.count = gbuffers;
+		req.type   = q->type;
+		req.count  = gbuffers;
+		req.memory = V4L2_MEMORY_MMAP;
 		err = videobuf_reqbufs(file,q,&req);
 		if (err < 0)
 			return err;
@@ -1913,6 +1928,9 @@
 		struct v4l2_tuner *t = arg;
 		struct video_tuner vt;
 
+		if (0 != t->index)
+			return -EINVAL;
+
 		memset(t,0,sizeof(*t));
 		strcpy(t->name, "Radio");
                 t->rangelow  = (int)(65*16);
@@ -2046,7 +2064,7 @@
 	.minor         = -1,
 };
 
-int saa7134_video_init(struct saa7134_dev *dev)
+int saa7134_video_init1(struct saa7134_dev *dev)
 {
 	/* sanitycheck insmod options */
 	if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
@@ -2072,12 +2090,6 @@
 	dev->video_q.timeout.data     = (unsigned long)(&dev->video_q);
 	dev->video_q.dev              = dev;
 
-	/* init video hw */
-	set_tvnorm(dev,&tvnorms[0]);
-	video_mux(dev,0);
-	saa7134_tvaudio_setmute(dev);
-	saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
-
 	if (saa7134_boards[dev->board].video_out) {
 		/* enable video output */
 		int vo = saa7134_boards[dev->board].video_out;
@@ -2095,6 +2107,16 @@
 	return 0;
 }
 
+int saa7134_video_init2(struct saa7134_dev *dev)
+{
+	/* init video hw */
+	set_tvnorm(dev,&tvnorms[0]);
+	video_mux(dev,0);
+	saa7134_tvaudio_setmute(dev);
+	saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
+	return 0;
+}
+
 int saa7134_video_fini(struct saa7134_dev *dev)
 {
 	/* nothing */
diff -u linux-2.6.0-test6/drivers/media/video/saa7134/saa7134.h linux/drivers/media/video/saa7134/saa7134.h
--- linux-2.6.0-test6/drivers/media/video/saa7134/saa7134.h	2003-10-06 17:45:55.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134.h	2003-10-06 17:48:03.000000000 +0200
@@ -19,20 +19,25 @@
  */
 
 #include <linux/version.h>
+#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,9)
+
 #include <linux/pci.h>
 #include <linux/i2c.h>
 #include <linux/videodev.h>
 #include <linux/kdev_t.h>
+#include <linux/input.h>
 
 #include <asm/io.h>
 
+#ifdef CONFIG_VIDEO_IR
+#include "ir-common.h"
+#endif
+
 #include <media/video-buf.h>
 #include <media/tuner.h>
 #include <media/audiochip.h>
 #include <media/id.h>
 
-#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,8)
-
 #ifndef TRUE
 # define TRUE (1==1)
 #endif
@@ -133,6 +138,11 @@
 #define SAA7134_BOARD_TYPHOON_90031    13
 #define SAA7134_BOARD_ELSA             14
 #define SAA7134_BOARD_ELSA_500TV       15
+#define SAA7134_BOARD_ASUSTeK_TVFM7134 16
+#define SAA7134_BOARD_VA1000POWER      17
+#define SAA7134_BOARD_BMK_MPEX_NOTUNER 18
+#define SAA7134_BOARD_VIDEOMATE_TV     19
+#define SAA7134_BOARD_CRONOS_PLUS      20
 
 #define SAA7134_INPUT_MAX 8
 
@@ -200,6 +210,7 @@
 	unsigned int               exit;
 	unsigned int               scan1;
 	unsigned int               scan2;
+	unsigned int               mode;
 };
 
 /* buffer for one video/vbi/ts frame */
@@ -255,6 +266,7 @@
 	/* TS capture */
 	struct videobuf_queue      ts;
 	struct saa7134_pgtable     pt_ts;
+	int			   started;
 };
 
 /* oss dsp status */
@@ -286,6 +298,18 @@
 	unsigned int               read_count;
 };
 
+#ifdef CONFIG_VIDEO_IR
+/* IR input */
+struct saa7134_ir {
+	struct input_dev           dev;
+	struct ir_input_state      ir;
+	char                       name[32];
+	char                       phys[32];
+	u32                        mask_keycode;
+	u32                        mask_keydown;
+};
+#endif
+
 /* global device status */
 struct saa7134_dev {
 	struct list_head           devlist;
@@ -294,13 +318,19 @@
 
 	/* various device info */
 	unsigned int               resources;
-	struct video_device        video_dev;
-	struct video_device        ts_dev;
-	struct video_device        radio_dev;
-	struct video_device        vbi_dev;
+	struct video_device        *video_dev;
+	struct video_device        *ts_dev;
+	struct video_device        *radio_dev;
+	struct video_device        *vbi_dev;
 	struct saa7134_oss         oss;
 	struct saa7134_ts          ts;
 
+	/* infrared remote */
+	int                        has_remote;
+#ifdef CONFIG_VIDEO_IR
+	struct saa7134_ir          *remote;
+#endif
+
 	/* pci i/o */
 	char                       name[32];
 	struct pci_dev             *pci;
@@ -311,6 +341,7 @@
 	/* config info */
 	unsigned int               board;
 	unsigned int               tuner_type;
+	unsigned int               gpio_value;
 
 	/* i2c i/o */
 	struct i2c_adapter         i2c_adap;
@@ -372,7 +403,9 @@
 #define saa_setb(reg,bit)          saa_andorb((reg),(bit),(bit))
 #define saa_clearb(reg,bit)        saa_andorb((reg),(bit),0)
 
-#define saa_wait(d) { if (need_resched()) schedule(); else udelay(d);}
+//#define saa_wait(d) { if (need_resched()) schedule(); else udelay(d);}
+#define saa_wait(d) { udelay(d); }
+//#define saa_wait(d) { schedule_timeout(HZ*d/1000 ?:1); }
 
 /* ----------------------------------------------------------- */
 /* saa7134-core.c                                              */
@@ -433,7 +466,8 @@
 int saa7134_common_ioctl(struct saa7134_dev *dev,
 			 unsigned int cmd, void *arg);
 
-int saa7134_video_init(struct saa7134_dev *dev);
+int saa7134_video_init1(struct saa7134_dev *dev);
+int saa7134_video_init2(struct saa7134_dev *dev);
 int saa7134_video_fini(struct saa7134_dev *dev);
 void saa7134_irq_video_intl(struct saa7134_dev *dev);
 void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status);
@@ -443,7 +477,7 @@
 /* saa7134-ts.c                                                */
 
 extern struct video_device saa7134_ts_template;
-int saa7134_ts_init(struct saa7134_dev *dev);
+int saa7134_ts_init1(struct saa7134_dev *dev);
 int saa7134_ts_fini(struct saa7134_dev *dev);
 void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status);
 
@@ -454,7 +488,7 @@
 extern struct videobuf_queue_ops saa7134_vbi_qops;
 extern struct video_device saa7134_vbi_template;
 
-int saa7134_vbi_init(struct saa7134_dev *dev);
+int saa7134_vbi_init1(struct saa7134_dev *dev);
 int saa7134_vbi_fini(struct saa7134_dev *dev);
 void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status);
 
@@ -470,7 +504,7 @@
 void saa7134_tvaudio_setvolume(struct saa7134_dev *dev, int level);
 int saa7134_tvaudio_getstereo(struct saa7134_dev *dev);
 
-int saa7134_tvaudio_init(struct saa7134_dev *dev);
+int saa7134_tvaudio_init2(struct saa7134_dev *dev);
 int saa7134_tvaudio_fini(struct saa7134_dev *dev);
 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev);
 
@@ -482,10 +516,16 @@
 extern struct file_operations saa7134_dsp_fops;
 extern struct file_operations saa7134_mixer_fops;
 
-int saa7134_oss_init(struct saa7134_dev *dev);
+int saa7134_oss_init1(struct saa7134_dev *dev);
 int saa7134_oss_fini(struct saa7134_dev *dev);
 void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status);
 
+/* ----------------------------------------------------------- */
+/* saa7134-input.c                                             */
+
+int  saa7134_input_init1(struct saa7134_dev *dev);
+void saa7134_input_fini(struct saa7134_dev *dev);
+void saa7134_input_irq(struct saa7134_dev *dev);
 
 /*
  * Local variables:
diff -u linux-2.6.0-test6/include/media/saa6752hs.h linux/include/media/saa6752hs.h
--- linux-2.6.0-test6/include/media/saa6752hs.h	2003-10-06 17:48:03.000000000 +0200
+++ linux/include/media/saa6752hs.h	2003-10-06 17:48:03.000000000 +0200
@@ -0,0 +1,58 @@
+/* 
+    saa6752hs.h - definition for saa6752hs MPEG encoder
+
+    Copyright (C) 2003 Andrew de Quincey <adq@lidskialf.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _SAA6752HS_H
+#define _SAA6752HS_H
+
+enum mpeg_bitrate_mode {
+	MPEG_BITRATE_MODE_VBR = 0, /* Variable bitrate */
+	MPEG_BITRATE_MODE_CBR = 1, /* Constant bitrate */
+
+	MPEG_BITRATE_MODE_MAX
+};
+
+enum mpeg_audio_bitrate {
+	MPEG_AUDIO_BITRATE_256 = 0, /* 256 kBit/sec */
+	MPEG_AUDIO_BITRATE_384 = 1, /* 384 kBit/sec */
+    
+	MPEG_AUDIO_BITRATE_MAX
+};
+
+#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
+#define MPEG_VIDEO_MAX_BITRATE_MAX 27000
+#define MPEG_TOTAL_BITRATE_MAX 27000
+    
+struct mpeg_params {
+	enum mpeg_bitrate_mode bitrate_mode;
+	unsigned int video_target_bitrate;
+	unsigned int video_max_bitrate; // only used for VBR
+	enum mpeg_audio_bitrate audio_bitrate;
+	unsigned int total_bitrate;
+};
+
+#define MPEG_SETPARAMS             _IOW('6',100,struct mpeg_params)
+
+#endif // _SAA6752HS_H
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */

-- 
You have a new virus in /var/mail/kraxel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [patch] saa7134 driver update
@ 2003-01-08 12:15 Gerd Knorr
  0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2003-01-08 12:15 UTC (permalink / raw)
  To: Linus Torvalds, Kernel List

  Hi,

This patch updates the saa7134 driver.  It adds support for a few more
cards and includes adaptions to the video-buf.c changes sent earlier.

Please apply,

  Gerd

--- linux-2.5.54/drivers/media/video/saa7134/saa7134-cards.c	2003-01-08 10:34:58.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-cards.c	2003-01-08 10:59:59.000000000 +0100
@@ -288,6 +288,81 @@
 			.amux = LINE2,
 		},
 	},
+	[SAA7134_BOARD_KWORLD] = {
+                .name           = "Kworld/KuroutoShikou SAA7130-TVPCI",
+		.audio_clock    = 0x00187de7,
+		.tuner_type     = TUNER_PHILIPS_NTSC_M,
+                .inputs         = {{
+                        .name = name_svideo,
+                        .vmux = 8,
+                        .amux = LINE1,
+                },{
+                        .name = name_comp1,
+                        .vmux = 3,
+                        .amux = LINE1,
+                },{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = TV,
+                        .tv   = 1,
+                }},
+        },
+	[SAA7134_BOARD_CINERGY600] = {
+                .name           = "Terratec Cinergy 600 TV",
+                .audio_clock    = 0x00200000,
+                .tuner_type     = TUNER_PHILIPS_PAL,
+                .inputs         = {{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = TV,
+                        .tv   = 1,
+                },{
+                        .name = name_comp1,
+                        .vmux = 4,
+                        .amux = LINE1,
+                },{
+                        .name = name_svideo,
+                        .vmux = 8,
+                        .amux = LINE1,
+                },{
+                        .name = name_comp2, // CVideo over SVideo Connector
+                        .vmux = 0,
+                        .amux = LINE1,
+                }},
+		.radio = {
+			.name = name_radio,
+			.amux = LINE2,
+               },
+
+        },
+	[SAA7134_BOARD_MD7134] = {
+		.name           = "Medion 7134",
+		.audio_clock    = 0x00200000,
+		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
+		.need_tda9887   = 1,
+		.inputs = {{
+			.name   = name_tv,
+			.vmux   = 1,
+			.amux   = LINE2,
+			.tv     =   1,
+		},{
+			.name   = name_comp1,
+			.vmux   = 0,
+			.amux   = LINE2,
+		},{
+			.name   = name_comp2,
+			.vmux   = 3,
+			.amux   = LINE2,
+		},{
+			.name   = name_svideo,
+			.vmux   = 8,
+			.amux   = LINE2,
+		}},
+		.radio = {
+			.name   = name_radio,
+			.amux   = LINE2,
+		},
+      },
 };
 const int saa7134_bcount = (sizeof(saa7134_boards)/sizeof(struct saa7134_board));
 
@@ -320,7 +395,25 @@
                 .subdevice    = 0x1142,
                 .driver_data  = SAA7134_BOARD_CINERGY400,
         },{
-
+                .vendor       = PCI_VENDOR_ID_PHILIPS,
+                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+                .subvendor    = 0x153B,
+                .subdevice    = 0x1143,
+                .driver_data  = SAA7134_BOARD_CINERGY600,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+		.subvendor    = 0x5168,
+		.subdevice    = 0x0138,
+		.driver_data  = SAA7134_BOARD_FLYVIDEO3000,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+		.subvendor    = 0x16be,
+		.subdevice    = 0x0003,
+		.driver_data  = SAA7134_BOARD_MD7134,
+	},{
+		
 		/* --- boards without eeprom + subsystem ID --- */
                 .vendor       = PCI_VENDOR_ID_PHILIPS,
                 .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-i2c.c	2003-01-08 10:33:59.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-i2c.c	2003-01-08 10:59:59.000000000 +0100
@@ -318,6 +318,7 @@
 	return I2C_FUNC_SMBUS_EMUL;
 }
 
+
 static int attach_inform(struct i2c_client *client)
 {
         struct saa7134_dev *dev = client->adapter->algo_data;
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-oss.c	2003-01-08 10:34:28.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-oss.c	2003-01-08 10:59:59.000000000 +0100
@@ -102,11 +102,13 @@
 	/* prepare buffer */
 	if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->oss.dma)))
 		return err;
+	if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->oss.pt)))
+		goto fail1;
 	if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->oss.pt,
 					      dev->oss.dma.sglist,
 					      dev->oss.dma.sglen,
 					      0)))
-		goto fail1;
+		goto fail2;
 
 	/* sample format */
 	switch (dev->oss.afmt) {
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-ts.c	2003-01-08 10:33:53.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-ts.c	2003-01-08 10:59:59.000000000 +0100
@@ -52,21 +52,24 @@
 			   struct saa7134_buf *buf,
 			   struct saa7134_buf *next)
 {
-	unsigned long control,status;
-
+	u32 control;
+	
 	dprintk("buffer_activate [%p]\n",buf);
 	buf->vb.state = STATE_ACTIVE;
 	
-	/* dma: setup channel 5 (= TS) */
-	control = SAA7134_RS_CONTROL_BURST_16 |
-		SAA7134_RS_CONTROL_ME |
-		(buf->pt->dma >> 12);
-
-	status = saa_readl(SAA7134_IRQ_STATUS);
-	if (0 == (status & 0x100000)) {
+        /* dma: setup channel 5 (= TS) */
+        control = SAA7134_RS_CONTROL_BURST_16 |
+                SAA7134_RS_CONTROL_ME |
+                (buf->pt->dma >> 12);
+
+	if (NULL == next)
+		next = buf;
+	if (V4L2_FIELD_TOP == buf->vb.field) {
+		dprintk("[top]     buf=%p next=%p",buf,next);
 		saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(buf));
 		saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(next));
 	} else {
+		dprintk("[bottom]  buf=%p next=%p",buf,next);
 		saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next));
 		saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf));
 	}
@@ -80,7 +83,8 @@
 	return 0;
 }
 
-static int buffer_prepare(struct file *file, struct videobuf_buffer *vb)
+static int buffer_prepare(struct file *file, struct videobuf_buffer *vb,
+			  enum v4l2_field field)
 {
 	struct saa7134_dev *dev = file->private_data;
 	struct saa7134_buf *buf = (struct saa7134_buf *)vb;
@@ -116,7 +120,7 @@
 	buf->vb.state = STATE_PREPARED;
 	buf->top_seen = 0;
 	buf->activate = buffer_activate;
-	buf->vb.field = V4L2_FIELD_SEQ_TB;
+	buf->vb.field = field;
 	return 0;
 
  oops:
@@ -408,11 +412,13 @@
 		tsbufs = VIDEO_MAX_FRAME;
 
 	INIT_LIST_HEAD(&dev->ts_q.queue);
+	init_timer(&dev->ts_q.timeout);
 	dev->ts_q.timeout.function = saa7134_buffer_timeout;
 	dev->ts_q.timeout.data     = (unsigned long)(&dev->ts_q);
 	dev->ts_q.dev              = dev;
 	videobuf_queue_init(&dev->ts.ts, &ts_qops, dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			    V4L2_FIELD_ALTERNATE,
 			    sizeof(struct saa7134_buf));
 	saa7134_pgtable_alloc(dev->pci,&dev->ts.pt_ts);
 
@@ -437,11 +443,23 @@
 
 void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status)
 {
+	enum v4l2_field field;
+
 	spin_lock(&dev->slock);
 	if (dev->ts_q.curr) {
+		field = dev->video_q.curr->vb.field;
+		if (field == V4L2_FIELD_TOP) {
+			if ((status & 0x100000) != 0x100000)
+				goto done;
+		} else {
+			if ((status & 0x100000) != 0x000000)
+				goto done;
+		}
 		saa7134_buffer_finish(dev,&dev->ts_q,STATE_DONE);
 	}
 	saa7134_buffer_next(dev,&dev->ts_q);
+
+ done:
 	spin_unlock(&dev->slock);
 }
 
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-01-08 10:33:52.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-tvaudio.c	2003-01-08 10:59:59.000000000 +0100
@@ -26,6 +26,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
+#include <linux/delay.h>
 #include <linux/smp_lock.h>
 #include <asm/div64.h>
 
@@ -119,6 +120,10 @@
 
 	/* init all audio registers */
 	saa_writeb(SAA7134_AUDIO_PLL_CTRL,   0x00);
+	if (need_resched())
+		schedule();
+	else
+		udelay(10);
 		
 	saa_writeb(SAA7134_AUDIO_CLOCK0,      clock        & 0xff);
 	saa_writeb(SAA7134_AUDIO_CLOCK1,     (clock >>  8) & 0xff);
@@ -357,6 +362,7 @@
 	return value;
 }
 
+#if 0
 static void sifdebug_dump_regs(struct saa7134_dev *dev)
 {
 	print_regb(AUDIO_STATUS);
@@ -372,6 +378,7 @@
 	print_regb(SIF_SAMPLE_FREQ);
 	print_regb(ANALOG_IO_SELECT);
 }
+#endif
 
 static int tvaudio_thread(void *data)
 {
@@ -440,9 +447,8 @@
 		}
 		if (0 == carrier) {
 			/* Oops: autoscan didn't work for some reason :-/ */
-			printk("%s/audio: oops: audio carrier scan failed\n",
-			       dev->name);
-			sifdebug_dump_regs(dev);
+			printk(KERN_WARNING "%s/audio: oops: audio carrier "
+			       "scan failed\n", dev->name);
 		} else {
 			dprintk("found %s main sound carrier @ %d.%03d MHz\n",
 				dev->tvnorm->name,
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-vbi.c	2003-01-08 10:35:03.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-vbi.c	2003-01-08 10:59:59.000000000 +0100
@@ -114,7 +114,8 @@
 	return 0;
 }
 
-static int buffer_prepare(struct file *file, struct videobuf_buffer *vb)
+static int buffer_prepare(struct file *file, struct videobuf_buffer *vb,
+			  enum v4l2_field field)
 {
 	struct saa7134_fh *fh   = file->private_data;
 	struct saa7134_dev *dev = fh->dev;
@@ -158,7 +159,7 @@
 	buf->vb.state = STATE_PREPARED;
 	buf->top_seen = 0;
 	buf->activate = buffer_activate;
-	buf->vb.field = V4L2_FIELD_SEQ_TB;
+	buf->vb.field = field;
 	return 0;
 
  oops:
@@ -218,6 +219,7 @@
 int saa7134_vbi_init(struct saa7134_dev *dev)
 {
 	INIT_LIST_HEAD(&dev->vbi_q.queue);
+	init_timer(&dev->vbi_q.timeout);
 	dev->vbi_q.timeout.function = saa7134_buffer_timeout;
 	dev->vbi_q.timeout.data     = (unsigned long)(&dev->vbi_q);
 	dev->vbi_q.dev              = dev;
--- linux-2.5.54/drivers/media/video/saa7134/saa7134-video.c	2003-01-08 10:33:59.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-video.c	2003-01-08 10:59:59.000000000 +0100
@@ -133,10 +133,9 @@
 };
 #define FORMATS (sizeof(formats)/sizeof(struct saa7134_format))
 
-
 static struct saa7134_tvnorm tvnorms[] = {
 	{
-		.name          = "PAL-BGHI",
+		.name          = "PAL",
 		.id            = V4L2_STD_PAL,
 		.width         = 720,
 		.height        = 576,
@@ -154,7 +153,7 @@
 		.vbi_v_start   = 7-3,  /* FIXME */
 		.vbi_v_stop    = 22-3,
 	},{
-		.name          = "NTSC-M",
+		.name          = "NTSC",
 		.id            = V4L2_STD_NTSC,
 		.width         = 720,
 		.height        = 480,
@@ -189,9 +188,10 @@
 		.video_v_stop  = 311,
 		.vbi_v_start   = 7,
 		.vbi_v_stop    = 22,
+#if 0
 	},{
 		.name          = "AUTO",
-		.id            = -1,
+		.id            = V4L2_STD_PAL|V4L2_STD_NTSC|V4L2_STD_SECAM,
 		.width         = 768,
 		.height        = 576,
 
@@ -207,6 +207,7 @@
 		.video_v_stop  = 311,
 		.vbi_v_start   = 7,
 		.vbi_v_stop    = 22,
+#endif
 	}
 };
 #define TVNORMS (sizeof(tvnorms)/sizeof(struct saa7134_tvnorm))
@@ -825,7 +826,8 @@
 	return 0;
 }
 
-static int buffer_prepare(struct file *file, struct videobuf_buffer *vb)
+static int buffer_prepare(struct file *file, struct videobuf_buffer *vb,
+			  enum v4l2_field field)
 {
 	struct saa7134_fh *fh = file->private_data;
 	struct saa7134_dev *dev = fh->dev;
@@ -845,12 +847,12 @@
 		return -EINVAL;
 
 	dprintk("buffer_prepare [size=%dx%d,bytes=%d,fields=%s,%s]\n",
-		fh->width,fh->height,size,v4l2_field_names[fh->field],
+		fh->width,fh->height,size,v4l2_field_names[field],
 		fh->fmt->name);
 	if (buf->vb.width  != fh->width  ||
 	    buf->vb.height != fh->height ||
 	    buf->vb.size   != size       ||
-	    buf->vb.field  != fh->field  ||
+	    buf->vb.field  != field      ||
 	    buf->fmt       != fh->fmt) {
 		saa7134_dma_free(dev,buf);
 	}
@@ -859,8 +861,8 @@
 		buf->vb.width  = fh->width;
 		buf->vb.height = fh->height;
 		buf->vb.size   = size;
+		buf->vb.field  = field;
 		buf->fmt       = fh->fmt;
-		buf->vb.field  = fh->field;
 		buf->pt        = &fh->pt_cap;
 
 		err = videobuf_iolock(dev->pci,&buf->vb);
@@ -1125,6 +1127,7 @@
 	videobuf_queue_init(&fh->cap, &video_qops,
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct saa7134_buf));
 	init_MUTEX(&fh->cap.lock);
 	saa7134_pgtable_alloc(dev->pci,&fh->pt_cap);
@@ -1132,6 +1135,7 @@
 	videobuf_queue_init(&fh->vbi, &saa7134_vbi_qops,
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
+			    V4L2_FIELD_SEQ_TB,
 			    sizeof(struct saa7134_buf));
         init_MUTEX(&fh->vbi.lock);
 	saa7134_pgtable_alloc(dev->pci,&fh->pt_vbi);
@@ -1155,9 +1159,13 @@
 
 	switch (fh->type) {
 	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		if (res_locked(fh->dev,RESOURCE_VIDEO))
+			return -EBUSY;
 		return videobuf_read_one(file, saa7134_queue(fh),
 					 data, count, ppos);
 	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		if (!res_get(fh->dev,fh,RESOURCE_VBI))
+			return -EBUSY;
 		return videobuf_read_stream(file, saa7134_queue(fh),
 					    data, count, ppos, 1);
 		break;
@@ -1187,7 +1195,7 @@
                                 up(&fh->cap.lock);
                                 return POLLERR;
                         }
-                        if (0 != fh->cap.ops->buf_prepare(file,fh->cap.read_buf)) {
+                        if (0 != fh->cap.ops->buf_prepare(file,fh->cap.read_buf,fh->cap.field)) {
                                 up(&fh->cap.lock);
                                 return POLLERR;
                         }
@@ -1214,12 +1222,15 @@
 	struct saa7134_dev *dev = fh->dev;
 	unsigned long flags;
 
+	/* turn off overlay */
 	if (res_check(fh, RESOURCE_OVERLAY)) {
 		spin_lock_irqsave(&dev->slock,flags);
 		stop_preview(dev,fh);
 		spin_unlock_irqrestore(&dev->slock,flags);
 		res_free(dev,fh,RESOURCE_OVERLAY);
 	}
+
+	/* stop video capture */
 	if (res_check(fh, RESOURCE_VIDEO)) {
 		videobuf_queue_cancel(file,&fh->cap);
 		res_free(dev,fh,RESOURCE_VIDEO);
@@ -1228,10 +1239,15 @@
 		buffer_release(file,fh->cap.read_buf);
 		kfree(fh->cap.read_buf);
 	}
-	if (fh->vbi.streaming)
-		videobuf_streamoff(file,&fh->vbi);
-	if (fh->vbi.reading)
-		videobuf_read_stop(file,&fh->vbi);
+
+	/* stop vbi capture */
+	if (res_check(fh, RESOURCE_VBI)) {
+		if (fh->vbi.streaming)
+			videobuf_streamoff(file,&fh->vbi);
+		if (fh->vbi.reading)
+			videobuf_read_stop(file,&fh->vbi);
+		res_free(dev,fh,RESOURCE_VBI);
+	}
 
 	saa7134_pgtable_free(dev->pci,&fh->pt_cap);
 	saa7134_pgtable_free(dev->pci,&fh->pt_vbi);
@@ -1259,6 +1275,7 @@
 		memset(&f->fmt.pix,0,sizeof(f->fmt.pix));
 		f->fmt.pix.width        = fh->width;
 		f->fmt.pix.height       = fh->height;
+		f->fmt.pix.field        = fh->cap.field;
 		f->fmt.pix.pixelformat  = fh->fmt->fourcc;
 		f->fmt.pix.sizeimage    =
 			(fh->width*fh->height*fh->fmt->depth)/8;
@@ -1354,10 +1371,10 @@
 		if (0 != err)
 			return err;
 			
-		fh->fmt    = format_by_fourcc(f->fmt.pix.pixelformat);
-		fh->width  = f->fmt.pix.width;
-		fh->height = f->fmt.pix.height;
-		fh->field  = f->fmt.pix.field;
+		fh->fmt       = format_by_fourcc(f->fmt.pix.pixelformat);
+		fh->width     = f->fmt.pix.width;
+		fh->height    = f->fmt.pix.height;
+		fh->cap.field = f->fmt.pix.field;
 		return 0;
 	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
 		err = verify_preview(dev,&f->fmt.win);
@@ -1429,11 +1446,14 @@
 	case VIDIOC_ENUMSTD:
 	{
 		struct v4l2_standard *e = arg;
+		int i;
 
-		if (e->index < 0 || e->index >= TVNORMS)
+		i = e->index;
+		if (i < 0 || i >= TVNORMS)
 			return -EINVAL;
 		err = v4l2_video_std_construct(e, tvnorms[e->index].id,
 					       tvnorms[e->index].name);
+		e->index = i;
 		if (err < 0)
 			return err;
 		return 0;
@@ -1473,15 +1493,33 @@
 	case VIDIOC_ENUMINPUT:
 	{
 		struct v4l2_input *i = arg;
-		
-		if (i->index >= SAA7134_INPUT_MAX)
+		int n;
+
+		n = i->index;
+		if (n >= SAA7134_INPUT_MAX)
 			return -EINVAL;
 		if (NULL == card_in(dev,i->index).name)
 			return -EINVAL;
-		i->type = V4L2_INPUT_TYPE_CAMERA;
-		strcpy(i->name,card_in(dev,i->index).name);
-		if (card_in(dev,i->index).tv)
+		memset(i,0,sizeof(*i));
+		i->index = n;
+		i->type  = V4L2_INPUT_TYPE_CAMERA;
+		strcpy(i->name,card_in(dev,n).name);
+		if (card_in(dev,n).tv)
 			i->type = V4L2_INPUT_TYPE_TUNER;
+		i->audioset = 1;
+		if (n == dev->ctl_input) {
+			int v1 = saa_readb(SAA7134_STATUS_VIDEO1);
+			int v2 = saa_readb(SAA7134_STATUS_VIDEO2);
+
+			if (0 != (v1 & 0x40))
+				i->status |= V4L2_IN_ST_NO_H_LOCK;
+			if (0 != (v2 & 0x40))
+				i->status |= V4L2_IN_ST_NO_SYNC;
+			if (0 != (v2 & 0x0e))
+				i->status |= V4L2_IN_ST_MACROVISION;
+		}
+		for (n = 0; n < TVNORMS; n++)
+			i->std |= tvnorms[n].id;
 		return 0;
 	}
 	case VIDIOC_G_INPUT:
@@ -1510,6 +1548,8 @@
 		struct v4l2_tuner *t = arg;
 		int n;
 
+		if (0 != t->index)
+			return -EINVAL;
 		memset(t,0,sizeof(*t));
 		for (n = 0; n < SAA7134_INPUT_MAX; n++)
 			if (card_in(dev,n).tv)
@@ -1521,12 +1561,12 @@
 				V4L2_TUNER_CAP_LANG1 |
 				V4L2_TUNER_CAP_LANG2;
 			t->rangehigh = 0xffffffffUL;
-			if (dev->tvaudio) {
+			t->rxsubchans = -1;
+			if (dev->tvaudio)
 				t->rxsubchans = saa7134_tvaudio_getstereo
 					(dev,dev->tvaudio);
-			} else {
+			if (-1 == t->rxsubchans)
 				t->rxsubchans = V4L2_TUNER_SUB_MONO;
-			}
 #if 1
 			/* fill audmode -- FIXME: allow manual switching */
 			t->audmode = V4L2_TUNER_MODE_MONO;
@@ -1618,12 +1658,14 @@
 	case VIDIOC_ENUM_FMT:
 	{
 		struct v4l2_fmtdesc *f = arg;
+		enum v4l2_buf_type type;
 		int index;
 
-		switch (f->type) {
+		index = f->index;
+		type  = f->type;
+		switch (type) {
 		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-			index = f->index;
 			if (index < 0 || index >= FORMATS)
 				return -EINVAL;
 			if (f->type == V4L2_BUF_TYPE_VIDEO_OVERLAY &&
@@ -1631,9 +1673,19 @@
 				return -EINVAL;
 			memset(f,0,sizeof(*f));
 			f->index = index;
+			f->type  = type;
 			strncpy(f->description,formats[index].name,31);
 			f->pixelformat = formats[index].fourcc;
 			break;
+		case V4L2_BUF_TYPE_VBI_CAPTURE:
+			if (0 != index)
+				return -EINVAL;
+			memset(f,0,sizeof(*f));
+			f->index = index;
+			f->type  = type;
+			f->pixelformat = V4L2_PIX_FMT_GREY;
+			strcpy(f->description,"vbi data");
+			break;
 		default:
 			return -EINVAL;	
 		}
@@ -1898,8 +1950,8 @@
 struct video_device saa7134_video_template =
 {
 	.name          = "saa7134-video",
-	type:          VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
-	               VID_TYPE_CLIPPING|VID_TYPE_SCALES,
+	.type          = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
+	                 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
 	.hardware      = 0,
 	.fops          = &video_fops,
 	.minor         = -1,
@@ -1944,6 +1996,7 @@
 	dev->automute       = 0;
 
         INIT_LIST_HEAD(&dev->video_q.queue);
+	init_timer(&dev->video_q.timeout);
 	dev->video_q.timeout.function = saa7134_buffer_timeout;
 	dev->video_q.timeout.data     = (unsigned long)(&dev->video_q);
 	dev->video_q.dev              = dev;
@@ -1984,7 +2037,7 @@
 	int norm;
 
 	norm = saa_readb(SAA7134_STATUS_VIDEO1) & 0x03;
-	printk("%s/video: DCSDT: %s\n",dev->name,st[norm]);
+	dprintk("DCSDT: %s\n",st[norm]);
 	
 	if (0 != norm) {
 		/* wake up tvaudio audio carrier scan thread */
--- linux-2.5.54/drivers/media/video/saa7134/saa7134.h	2003-01-08 10:34:52.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134.h	2003-01-08 10:59:59.000000000 +0100
@@ -117,6 +117,9 @@
 #define SAA7134_BOARD_TVSTATION_RDS     7
 #define SAA7134_BOARD_CINERGY400	8
 #define SAA7134_BOARD_MD5044		9
+#define SAA7134_BOARD_KWORLD           10
+#define SAA7134_BOARD_CINERGY600       11
+#define SAA7134_BOARD_MD7134           12
 
 #define SAA7134_INPUT_MAX 8
 
@@ -159,7 +162,7 @@
 
 #define RESOURCE_OVERLAY       1
 #define RESOURCE_VIDEO         2
-#define RESOURCE_VBI           3
+#define RESOURCE_VBI           4
 
 #define INTERLACE_AUTO         0
 #define INTERLACE_ON           1
@@ -224,7 +227,6 @@
 	/* video capture */
 	struct saa7134_format      *fmt;
 	int                        width,height;
-	enum v4l2_field            field;
 	struct videobuf_queue      cap;
 	struct saa7134_pgtable     pt_cap;
 

-- 
Weil die späten Diskussionen nicht mal mehr den Rotwein lohnen.
				-- Wacholder in "Melanie"

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2003-10-07 11:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-17 18:51 [patch] saa7134 driver update Gerd Knorr
  -- strict thread matches above, loose matches on Subject: below --
2003-10-07 11:04 Gerd Knorr
2003-01-08 12:15 Gerd Knorr

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).