All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gerd Knorr <kraxel@bytesex.org>
To: Andrew Morton <akpm@osdl.org>,
	Kernel List <linux-kernel@vger.kernel.org>
Subject: [patch 4/4] v4l: saa7134 driver update
Date: Tue, 31 Aug 2004 17:31:21 +0200	[thread overview]
Message-ID: <20040831153121.GA15718@bytesex> (raw)

  Hi,

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

 * i2c cleanups (i2c_add_driver return value, add __init & __exit).
 * fix radio tuning (last update broke this ...).
 * adds support for new tv cards.
 * add config info for the tda9887 (thus this one depends on the tuner
   update patch mailed earlier).
 * add configuration help printk's for some cards, for stuff which can't
   be autodetected.
 * make automute switchable via v4l2 API, without driver reload.

please apply,

  Gerd

diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa6752hs.c linux/drivers/media/video/saa7134/saa6752hs.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa6752hs.c	2004-08-25 16:13:46.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa6752hs.c	2004-08-25 18:20:58.763393636 +0200
@@ -387,13 +387,12 @@ static struct i2c_client client_template
         .driver     = &driver,
 };
 
-static int saa6752hs_init_module(void)
+static int __init saa6752hs_init_module(void)
 {
-	i2c_add_driver(&driver);
-	return 0;
+	return i2c_add_driver(&driver);
 }
 
-static void saa6752hs_cleanup_module(void)
+static void __exit saa6752hs_cleanup_module(void)
 {
 	i2c_del_driver(&driver);
 }
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-cards.c linux/drivers/media/video/saa7134/saa7134-cards.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-cards.c	2004-08-25 16:13:17.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-cards.c	2004-08-25 18:20:58.768392701 +0200
@@ -154,6 +154,26 @@ struct saa7134_board saa7134_boards[] = 
 			.gpio = 0x8000,
 		},
 	},
+	[SAA7134_BOARD_FLYTVPLATINUM] = {
+		/* "Arnaud Quette" <aquette@free.fr> */
+		.name           = "LifeView FlyTV Platinum",
+		.audio_clock    = 0x00200000,
+		.tuner_type     = TUNER_PHILIPS_SECAM,
+		.inputs         = {{
+			.name = name_tv,
+			.vmux = 1,
+			.amux = LINE2,
+			.tv   = 1,
+		},{
+			.name = name_comp1,
+			.vmux = 0,
+			.amux = LINE2,
+		},{
+			.name = name_svideo,
+			.vmux = 8,
+			.amux = LINE2,
+		}},
+	},
 	[SAA7134_BOARD_EMPRESS] = {
 		/* "Gert Vervoort" <gert.vervoort@philips.com> */
 		.name		= "EMPRESS",
@@ -177,7 +197,6 @@ struct saa7134_board saa7134_boards[] = 
 			.name = name_radio,
 			.amux = LINE2,
 		},
-		.i2s_rate  = 48000,
 		.has_ts    = 1,
 		.video_out = CCIR656,
 	},
@@ -243,7 +262,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name		= "KNC One TV-Station RDS / Typhoon TV Tuner RDS",
 		.audio_clock	= 0x00200000,
 		.tuner_type	= TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs         = {{
 			.name = name_tv,
 			.vmux = 1,
@@ -278,7 +297,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name		= "KNC One TV-Station DVR",
 		.audio_clock	= 0x00200000,
 		.tuner_type	= TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887	= 1,
+		.tda9887_conf	= TDA9887_PRESENT,
 		.gpiomask	= 0x820000,
 		.inputs		= {{
 			.name = name_tv,
@@ -302,7 +321,6 @@ struct saa7134_board saa7134_boards[] = 
 			.amux = LINE2,
 			.gpio = 0x20000,
 		},
-		.i2s_rate	= 48000,
 		.has_ts		= 1,
 		.video_out	= CCIR656,
 	},
@@ -333,7 +351,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name           = "Medion 5044",
 		.audio_clock    = 0x00187de7, // was: 0x00200000,
 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs         = {{
 			.name = name_tv,
 			.vmux = 1,
@@ -414,7 +432,7 @@ struct saa7134_board saa7134_boards[] = 
 		//.audio_clock    = 0x00200000,
 		.audio_clock    = 0x00187de7,
 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs = {{
 			.name   = name_tv,
 			.vmux   = 1,
@@ -440,7 +458,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name           = "Typhoon TV+Radio 90031",
 		.audio_clock    = 0x00200000,
 		.tuner_type     = TUNER_PHILIPS_PAL,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs         = {{
 			.name   = name_tv,
 			.vmux   = 1,
@@ -503,7 +521,7 @@ struct saa7134_board saa7134_boards[] = 
                 .name           = "ASUS TV-FM 7134",
                 .audio_clock    = 0x00187de7,
                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
-                .need_tda9887   = 1,
+                .tda9887_conf   = TDA9887_PRESENT,
                 .inputs         = {{
                         .name = name_tv,
                         .vmux = 1,
@@ -607,7 +625,6 @@ struct saa7134_board saa7134_boards[] = 
 			.vmux = 8,
 			.amux = LINE1,
 		}},
-		.i2s_rate  = 48000,
 		.has_ts    = 1,
 		.video_out = CCIR656,
 	},
@@ -666,7 +683,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name           = "AverMedia M156 / Medion 2819",
 		.audio_clock    = 0x00187de7,
 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs         = {{
 			.name = name_tv,
 			.vmux = 1,
@@ -709,7 +726,6 @@ struct saa7134_board saa7134_boards[] = 
 			.amux = LINE2,
 			.tv   = 1,
 		}},
-		.i2s_rate  = 48000,
 		.has_ts    = 1,
 		.video_out = CCIR656,
         },
@@ -719,7 +735,7 @@ struct saa7134_board saa7134_boards[] = 
 		// probably wrong, the 7133 one is the NTSC version ...
 		// .tuner_type     = TUNER_PHILIPS_FM1236_MK3
                 .tuner_type     = TUNER_LG_NTSC_NEW_TAPC,
-                .need_tda9887   = 1,
+                .tda9887_conf   = TDA9887_PRESENT,
                 .inputs         = {{
                         .name = name_tv,
                         .vmux = 1,
@@ -743,7 +759,7 @@ struct saa7134_board saa7134_boards[] = 
                 .name           = "Pinnacle PCTV Stereo (saa7134)",
                 .audio_clock    = 0x00187de7,
                 .tuner_type     = TUNER_MT2032,
-                .need_tda9887   = 1,
+                .tda9887_conf   = TDA9887_PRESENT,
                 .inputs         = {{
                         .name = name_tv,
                         .vmux = 3,
@@ -957,7 +973,7 @@ struct saa7134_board saa7134_boards[] = 
 		.name           = "AverMedia 305",
 		.audio_clock    = 0x00187de7,
 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
-		.need_tda9887   = 1,
+		.tda9887_conf   = TDA9887_PRESENT,
 		.inputs         = {{
 			.name = name_tv,
 			.vmux = 1,
@@ -989,7 +1005,7 @@ struct saa7134_board saa7134_boards[] = 
   		.name           = "UPMOST PURPLE TV",
   		.audio_clock    = 0x00187de7,
   		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
-  		.need_tda9887   = 1,
+  		.tda9887_conf   = TDA9887_PRESENT,
   		.inputs         = {{
   			.name = name_tv,
   			.vmux = 7,
@@ -1000,7 +1016,7 @@ struct saa7134_board saa7134_boards[] = 
   			.vmux = 7,
   			.amux = LINE1,
   		}},
-          },
+	},
 	[SAA7134_BOARD_ITEMS_MTV005] = {
 		/* Norman Jonas <normanjonas@arcor.de> */
 		.name           = "Items MuchTV Plus / IT-005",
@@ -1025,6 +1041,56 @@ struct saa7134_board saa7134_boards[] = 
 			.amux = LINE2,
 		},
 	},
+	[SAA7134_BOARD_CINERGY200] = {
+		.name           = "Terratec Cinergy 200 TV",
+		.audio_clock    = 0x00200000,
+		.tuner_type     = TUNER_PHILIPS_PAL,
+		.inputs         = {{
+       			.name = name_tv,
+			.vmux = 1,
+			.amux = LINE2,
+			.gpio = 0x0000,
+			.tv   = 1,
+		}},
+		.mute = {
+			 .name = name_mute,
+			 .amux = LINE2,
+		},
+	},
+	[SAA7134_BOARD_VIDEOMATE_TV_PVR] = {
+		/* Alain St-Denis <alain@topaze.homeip.net> */
+		.name           = "Compro VideoMate TV PVR/FM",
+		.audio_clock    = 0x00187de7,
+		.tuner_type     = TUNER_PHILIPS_NTSC_M,
+		.gpiomask	= 0x808c0080,
+                .inputs         = {{
+                        .name = name_svideo,
+                        .vmux = 8,
+                        .amux = LINE1,
+			.gpio = 0x00080
+                },{
+                        .name = name_comp1,
+                        .vmux = 3,
+                        .amux = LINE1,
+			.gpio = 0x00080
+                },{
+                        .name = name_tv,
+                        .vmux = 1,
+                        .amux = LINE2,
+                        .tv   = 1,
+			.gpio = 0x00080
+                }},
+		.radio = {
+			 .name = name_radio,
+			 .amux = LINE2,
+			.gpio = 0x80000
+		 },
+		.mute = {
+			.name = name_mute,
+                        .amux = LINE2,
+			.gpio = 0x40000,
+		},
+        },
 };
 const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
 
@@ -1088,6 +1154,12 @@ struct pci_device_id saa7134_pci_tbl[] =
 		.driver_data  = SAA7134_BOARD_FLYVIDEO2000,
         },{
 		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7135,
+		.subvendor    = 0x5168,
+		.subdevice    = 0x0212,
+		.driver_data  = SAA7134_BOARD_FLYTVPLATINUM,
+        },{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
 		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
 		.subvendor    = 0x16be,
 		.subdevice    = 0x0003,
@@ -1219,6 +1291,19 @@ struct pci_device_id saa7134_pci_tbl[] =
                 .subvendor    = 0x12ab,
                 .subdevice    = 0x0800,
  		.driver_data  = SAA7133_BOARD_UPMOST_PURPLE_TV,
+	},{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7130,
+		.subvendor    = 0x153B,
+		.subdevice    = 0x1152,
+		.driver_data  = SAA7134_BOARD_CINERGY200,
+		
+ 	},{
+		.vendor       = PCI_VENDOR_ID_PHILIPS,
+		.device       = PCI_DEVICE_ID_PHILIPS_SAA7130,
+                .subvendor    = 0x185b,
+                .subdevice    = 0xc100,
+		.driver_data  = SAA7134_BOARD_VIDEOMATE_TV_PVR,
 		
  	},{
 		/* --- boards without eeprom + subsystem ID --- */
@@ -1297,6 +1382,7 @@ static struct {
 static void board_flyvideo(struct saa7134_dev *dev)
 {
 #if 0
+	/* non-working attempt to detect the correct tuner type ... */
 	u32 value;
 	int index;
 
@@ -1307,6 +1393,10 @@ static void board_flyvideo(struct saa713
 	       fly_list[index].tuner_type);
 	dev->tuner_type = fly_list[index].tuner_type;
 #endif
+	printk("%s: there are different flyvideo cards with different tuners\n"
+	       "%s: out there, you might have to use the tuner=<nr> insmod\n"
+	       "%s: option to override the default value.\n",
+	       dev->name, dev->name, dev->name);
 }
 
 /* ----------------------------------------------------------- */
@@ -1321,8 +1411,10 @@ int saa7134_board_init(struct saa7134_de
 	switch (dev->board) {
 	case SAA7134_BOARD_FLYVIDEO2000:
 	case SAA7134_BOARD_FLYVIDEO3000:
-		board_flyvideo(dev);
 		dev->has_remote = 1;
+		/* fall throuth */
+	case SAA7134_BOARD_FLYTVPLATINUM:
+		board_flyvideo(dev);
 		break;
 	case SAA7134_BOARD_CINERGY400:
 	case SAA7134_BOARD_CINERGY600:
@@ -1333,6 +1425,12 @@ int saa7134_board_init(struct saa7134_de
 	case SAA7134_BOARD_AVACSSMARTTV:
 		dev->has_remote = 1;
 		break;
+	case SAA7134_BOARD_MD5044:
+		printk("%s: seems there are two different versions of the MD5044\n"
+		       "%s: (with the same ID) out there.  If sound doesn't work for\n"
+		       "%s: you try the audio_clock_override=0x200000 insmod option.\n",
+		       dev->name,dev->name,dev->name);
+		break;
 	}
 	return 0;
 }
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-core.c linux/drivers/media/video/saa7134/saa7134-core.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-core.c	2004-08-25 16:11:53.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-core.c	2004-08-25 18:20:58.771392140 +0200
@@ -868,7 +868,8 @@ static int __devinit saa7134_initdev(str
 		must_configure_manually();
 		dev->board = SAA7134_BOARD_UNKNOWN;
 	}
-	dev->tuner_type = saa7134_boards[dev->board].tuner_type;
+	dev->tuner_type   = saa7134_boards[dev->board].tuner_type;
+	dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
 	if (UNSET != tuner[saa7134_devcount])
 		dev->tuner_type = tuner[saa7134_devcount];
         printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
@@ -919,7 +920,7 @@ static int __devinit saa7134_initdev(str
 	/* load i2c helpers */
 	if (TUNER_ABSENT != dev->tuner_type)
 		request_module("tuner");
-	if (saa7134_boards[dev->board].need_tda9887)
+	if (dev->tda9887_conf)
 		request_module("tda9887");
   	if (card_has_ts(dev))
 		request_module("saa6752hs");
@@ -949,7 +950,7 @@ static int __devinit saa7134_initdev(str
 			       dev->name);
 			goto fail4;
 		}
-		printk(KERN_INFO "%s: registered device video%d [ts]\n",
+		printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
 		       dev->name,dev->ts_dev->minor & 0x1f);
 	}
 	
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-i2c.c linux/drivers/media/video/saa7134/saa7134-i2c.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-i2c.c	2004-08-25 16:11:21.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-i2c.c	2004-08-25 18:20:58.773391767 +0200
@@ -327,8 +327,10 @@ static int attach_inform(struct i2c_clie
 {
         struct saa7134_dev *dev = client->adapter->algo_data;
 	int tuner = dev->tuner_type;
+	int conf  = dev->tda9887_conf;
 
 	saa7134_i2c_call_clients(dev,TUNER_SET_TYPE,&tuner);
+	saa7134_i2c_call_clients(dev,TDA9887_SET_CONFIG,&conf);
         return 0;
 }
 
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-input.c linux/drivers/media/video/saa7134/saa7134-input.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-input.c	2004-08-25 16:12:58.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-input.c	2004-08-25 18:20:58.775391393 +0200
@@ -158,7 +158,7 @@ static IR_KEYTAB_TYPE eztv_codes[IR_KEYT
         [ 13 ] = KEY_KP7,
         [ 14 ] = KEY_KP8,
         [ 15 ] = KEY_KP9,
-
+ 
         [ 42 ] = KEY_VOLUMEUP,
         [ 17 ] = KEY_VOLUMEDOWN,
         [ 24 ] = KEY_CHANNELUP,      // CH.tracking up
@@ -172,13 +172,13 @@ static IR_KEYTAB_TYPE avacssmart_codes[I
         [ 30 ] = KEY_POWER,		// power
 	[ 28 ] = KEY_SEARCH,		// scan
         [  7 ] = KEY_SELECT,		// source
-
+        
 	[ 22 ] = KEY_VOLUMEUP,
 	[ 20 ] = KEY_VOLUMEDOWN,
         [ 31 ] = KEY_CHANNELUP,
 	[ 23 ] = KEY_CHANNELDOWN,
 	[ 24 ] = KEY_MUTE,
-
+	
 	[  2 ] = KEY_KP0,
         [  1 ] = KEY_KP1,
         [ 11 ] = KEY_KP2,
@@ -190,21 +190,21 @@ static IR_KEYTAB_TYPE avacssmart_codes[I
         [ 10 ] = KEY_KP8,
 	[ 18 ] = KEY_KP9,
 	[ 16 ] = KEY_KPDOT,
-
+	
 	[  3 ] = KEY_TUNER,		// tv/fm
         [  4 ] = KEY_REWIND,		// fm tuning left or function left
         [ 12 ] = KEY_FORWARD,		// fm tuning right or function right
-
+        
 	[  0 ] = KEY_RECORD,
         [  8 ] = KEY_STOP,
         [ 17 ] = KEY_PLAY,
-
+	
 	[ 25 ] = KEY_ZOOM,
 	[ 14 ] = KEY_MENU,		// function
 	[ 19 ] = KEY_AGAIN,		// recall
 	[ 29 ] = KEY_RESTART,		// reset
-
-// FIXME
+    
+// FIXME    
 	[ 13 ] = KEY_F21,		// mts
         [ 15 ] = KEY_F22,		// min
 	[ 26 ] = KEY_F23,		// freeze
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-oss.c linux/drivers/media/video/saa7134/saa7134-oss.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-oss.c	2004-08-25 16:12:14.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-oss.c	2004-08-25 18:21:43.806972184 +0200
@@ -776,8 +776,6 @@ int saa7134_oss_init1(struct saa7134_dev
 	dev->oss.rate = 32000;
 	if (oss_rate)
 		dev->oss.rate = oss_rate;
-	if (saa7134_boards[dev->board].i2s_rate)
-		dev->oss.rate = saa7134_boards[dev->board].i2s_rate;
 	dev->oss.rate = (dev->oss.rate > 40000) ? 48000 : 32000;
 
 	/* mixer */
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-ts.c linux/drivers/media/video/saa7134/saa7134-ts.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-ts.c	2004-08-25 16:10:54.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-ts.c	2004-08-25 18:20:58.778390832 +0200
@@ -411,7 +411,7 @@ static int ts_do_ioctl(struct inode *ino
 
 	case MPEG_SETPARAMS:
 		return ts_init_encoder(dev, arg);
-
+		
 	default:
 		return -ENOIOCTLCMD;
 	}
@@ -481,7 +481,7 @@ int saa7134_ts_init1(struct saa7134_dev 
 	saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
 	saa_writeb(SAA7134_TS_DMA0, ((ts_nr_packets-1)&0xff));
 	saa_writeb(SAA7134_TS_DMA1, (((ts_nr_packets-1)>>8)&0xff));
-	saa_writeb(SAA7134_TS_DMA2, ((((ts_nr_packets-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */
+	saa_writeb(SAA7134_TS_DMA2, ((((ts_nr_packets-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */	 
  
 	return 0;
 }
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-tvaudio.c linux/drivers/media/video/saa7134/saa7134-tvaudio.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-tvaudio.c	2004-08-25 16:10:49.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-tvaudio.c	2004-08-25 18:20:58.781390271 +0200
@@ -166,7 +166,7 @@ static void tvaudio_init(struct saa7134_
 
 	if (UNSET != audio_clock_override)
 	        clock = audio_clock_override;
-
+	
 	/* init all audio registers */
 	saa_writeb(SAA7134_AUDIO_PLL_CTRL,   0x00);
 	if (need_resched())
@@ -361,13 +361,13 @@ static int tvaudio_checkcarrier(struct s
 		if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
 			return -1;
 		left = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
-
+		
 		tvaudio_setcarrier(dev,scan->carr+90,scan->carr+90);
 		saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
 		if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
 			return -1;
 		right = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
-
+		
 		left >>= 16;
 		right >>= 16;
 		value = left > right ? left - right : right - left;
@@ -504,7 +504,8 @@ static int tvaudio_thread(void *data)
 		dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
 		dev->tvaudio  = NULL;
 		tvaudio_init(dev);
-		dev->automute = 1;
+		if (dev->ctl_automute)
+			dev->automute = 1;
 		mute_input_7134(dev);
 
 		/* give the tuner some time */
@@ -758,11 +759,11 @@ static int tvaudio_thread_ddep(void *dat
 	if (UNSET != audio_clock_override)
 		clock = audio_clock_override;
 	saa_writel(0x598 >> 2, clock);
-
+	
 	/* unmute */
 	saa_dsp_writel(dev, 0x474 >> 2, 0x00);
 	saa_dsp_writel(dev, 0x450 >> 2, 0x00);
-
+	
 	for (;;) {
 		tvaudio_sleep(dev,-1);
 		if (dev->thread.shutdown || signal_pending(current))
@@ -924,8 +925,9 @@ int saa7134_tvaudio_init2(struct saa7134
 	int (*my_thread)(void *data) = NULL;
 
 	/* enable I2S audio output */
-	if (saa7134_boards[dev->board].i2s_rate) {
-		int i2sform = (32000 == saa7134_boards[dev->board].i2s_rate) ? 0x00 : 0x01;
+	if (saa7134_boards[dev->board].has_ts) {
+		int i2sform = (48000 == dev->oss.rate)
+			? 0x01 : 0x00;
 		
 		/* enable I2S output */
 		saa_writeb(SAA7134_I2S_OUTPUT_SELECT,  0x80); 
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-video.c linux/drivers/media/video/saa7134/saa7134-video.c
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134-video.c	2004-08-25 16:11:22.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134-video.c	2004-08-25 18:20:58.786389337 +0200
@@ -272,7 +272,8 @@ static struct saa7134_tvnorm tvnorms[] =
 #define V4L2_CID_PRIVATE_INVERT      (V4L2_CID_PRIVATE_BASE + 0)
 #define V4L2_CID_PRIVATE_Y_ODD       (V4L2_CID_PRIVATE_BASE + 1)
 #define V4L2_CID_PRIVATE_Y_EVEN      (V4L2_CID_PRIVATE_BASE + 2)
-#define V4L2_CID_PRIVATE_LASTP1      (V4L2_CID_PRIVATE_BASE + 3)
+#define V4L2_CID_PRIVATE_AUTOMUTE    (V4L2_CID_PRIVATE_BASE + 3)
+#define V4L2_CID_PRIVATE_LASTP1      (V4L2_CID_PRIVATE_BASE + 4)
 
 static const struct v4l2_queryctrl no_ctrl = {
 	.name  = "42",
@@ -356,6 +357,13 @@ static const struct v4l2_queryctrl video
 		.maximum       = 128,
 		.default_value = 0,
 		.type          = V4L2_CTRL_TYPE_INTEGER,
+	},{
+		.id            = V4L2_CID_PRIVATE_AUTOMUTE,
+		.name          = "automute",
+		.minimum       = 0,
+		.maximum       = 1,
+		.default_value = 1,
+		.type          = V4L2_CTRL_TYPE_BOOLEAN,
 	}
 };
 static const unsigned int CTRLS = ARRAY_SIZE(video_ctrls);
@@ -433,10 +441,11 @@ void res_free(struct saa7134_dev *dev, s
 
 static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
 {
-	int luma_control,sync_control,mux;
+	int luma_control,sync_control,mux,nosignal;
 
 	dprintk("set tv norm = %s\n",norm->name);
 	dev->tvnorm = norm;
+        nosignal = (0 == (saa_readb(SAA7134_STATUS_VIDEO1) & 0x03));
 
 	mux = card_in(dev,dev->ctl_input).vmux;
 	luma_control = norm->luma_control;
@@ -444,7 +453,7 @@ static void set_tvnorm(struct saa7134_de
 
 	if (mux > 5)
 		luma_control |= 0x80; /* svideo */
-	if (noninterlaced)
+	if (noninterlaced || nosignal)
 		sync_control |= 0x20;
 
 	/* setup cropping */
@@ -593,7 +602,7 @@ static void set_size(struct saa7134_dev 
 	v_start = dev->crop_current.top/2;
 	h_stop  = (dev->crop_current.left + dev->crop_current.width -1);
 	v_stop  = (dev->crop_current.top + dev->crop_current.height -1)/2;
-
+	
 	saa_writeb(SAA7134_VIDEO_H_START1(task), h_start &  0xff);
 	saa_writeb(SAA7134_VIDEO_H_START2(task), h_start >> 8);
 	saa_writeb(SAA7134_VIDEO_H_STOP1(task),  h_stop  &  0xff);
@@ -1043,6 +1052,9 @@ static int get_control(struct saa7134_de
 	case V4L2_CID_PRIVATE_Y_ODD:
 		c->value = dev->ctl_y_odd;
 		break;
+	case V4L2_CID_PRIVATE_AUTOMUTE:
+		c->value = dev->ctl_automute;
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -1118,6 +1130,17 @@ static int set_control(struct saa7134_de
 		dev->ctl_y_odd = c->value;
 		restart_overlay = 1;
 		break;
+	case V4L2_CID_PRIVATE_AUTOMUTE:
+		dev->ctl_automute = c->value;
+		if (dev->tda9887_conf) {
+			if (dev->ctl_automute)
+				dev->tda9887_conf |= TDA9887_AUTOMUTE;
+			else
+				dev->tda9887_conf &= ~TDA9887_AUTOMUTE;
+			saa7134_i2c_call_clients(dev, TDA9887_SET_CONFIG,
+						 &dev->tda9887_conf);
+		}
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -1731,7 +1754,7 @@ static int video_do_ioctl(struct inode *
 	case VIDIOC_G_CROP:
 	{
 		struct v4l2_crop * crop = arg;
-
+		
 		if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
 		    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
 			return -EINVAL;
@@ -1742,7 +1765,7 @@ static int video_do_ioctl(struct inode *
 	{
 		struct v4l2_crop *crop = arg;
 		struct v4l2_rect *b = &dev->crop_bounds;
-
+		
 		if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
 		    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
 			return -EINVAL;
@@ -1762,7 +1785,7 @@ static int video_do_ioctl(struct inode *
 			crop->c.top = b->top + b->height;
 		if (crop->c.height > b->top - crop->c.top + b->height)
 			crop->c.height = b->top - crop->c.top + b->height;
-
+		
 		if (crop->c.left < b->left)
 			crop->c.top = b->left;
 		if (crop->c.left > b->left + b->width)
@@ -1820,7 +1843,7 @@ static int video_do_ioctl(struct inode *
 		struct v4l2_frequency *f = arg;
 
 		memset(f,0,sizeof(*f));
-		f->type = V4L2_TUNER_ANALOG_TV;
+		f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
 		f->frequency = dev->ctl_freq;
 		return 0;
 	}
@@ -1830,7 +1853,9 @@ static int video_do_ioctl(struct inode *
 
 		if (0 != f->tuner)
 			return -EINVAL;
-		if (V4L2_TUNER_ANALOG_TV != f->type)
+		if (0 == fh->radio && V4L2_TUNER_ANALOG_TV != f->type)
+			return -EINVAL;
+		if (1 == fh->radio && V4L2_TUNER_RADIO != f->type)
 			return -EINVAL;
 		down(&dev->lock);
 		dev->ctl_freq = f->frequency;
@@ -2096,7 +2121,7 @@ static int radio_do_ioctl(struct inode *
 
 #ifdef V4L2_I2C_CLIENTS
 		saa7134_i2c_call_clients(dev,VIDIOC_G_TUNER,t);
-#else
+#else		
 		{
 			struct video_tuner vt;
 			memset(&vt,0,sizeof(vt));
@@ -2244,9 +2269,12 @@ int saa7134_video_init1(struct saa7134_d
 	dev->ctl_hue        = ctrl_by_id(V4L2_CID_HUE)->default_value;
 	dev->ctl_saturation = ctrl_by_id(V4L2_CID_SATURATION)->default_value;
 	dev->ctl_volume     = ctrl_by_id(V4L2_CID_AUDIO_VOLUME)->default_value;
+	dev->ctl_mute       = ctrl_by_id(V4L2_CID_AUDIO_MUTE)->default_value;
+	dev->ctl_invert     = ctrl_by_id(V4L2_CID_PRIVATE_INVERT)->default_value;
+	dev->ctl_automute   = ctrl_by_id(V4L2_CID_PRIVATE_AUTOMUTE)->default_value;
 
-	dev->ctl_invert     = 0;
-	dev->ctl_mute       = 1;
+	if (dev->tda9887_conf && dev->ctl_automute)
+		dev->tda9887_conf |= TDA9887_AUTOMUTE;
 	dev->automute       = 0;
 
         INIT_LIST_HEAD(&dev->video_q.queue);
@@ -2300,10 +2328,14 @@ void saa7134_irq_video_intl(struct saa71
 	if (0 != norm) {
 		/* wake up tvaudio audio carrier scan thread */
 		saa7134_tvaudio_do_scan(dev);
+		if (!noninterlaced)
+			saa_clearb(SAA7134_SYNC_CTRL, 0x20);
 	} else {
 		/* no video signal -> mute audio */
-		dev->automute = 1;
+		if (dev->ctl_automute)
+			dev->automute = 1;
 		saa7134_tvaudio_setmute(dev);
+		saa_setb(SAA7134_SYNC_CTRL, 0x20);
 	}
 }
 
diff -up linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134.h linux/drivers/media/video/saa7134/saa7134.h
--- linux-2.6.9-rc1/drivers/media/video/saa7134/saa7134.h	2004-08-25 16:12:54.000000000 +0200
+++ linux/drivers/media/video/saa7134/saa7134.h	2004-08-25 18:20:58.789388776 +0200
@@ -156,6 +156,9 @@ struct saa7134_format {
 #define SAA7134_BOARD_AVERMEDIA_305    35
 #define SAA7133_BOARD_UPMOST_PURPLE_TV 36
 #define SAA7134_BOARD_ITEMS_MTV005     37
+#define SAA7134_BOARD_CINERGY200       38
+#define SAA7134_BOARD_FLYTVPLATINUM    39
+#define SAA7134_BOARD_VIDEOMATE_TV_PVR 40
 
 #define SAA7134_INPUT_MAX 8
 
@@ -178,13 +181,12 @@ struct saa7134_board {
 	struct saa7134_input    mute;
 	
 	/* peripheral I/O */
-	unsigned int            i2s_rate;
 	unsigned int            has_ts;
 	enum saa7134_video_out  video_out;
 
 	/* i2c chip info */
 	unsigned int            tuner_type;
-	unsigned int            need_tda9887:1;
+	unsigned int            tda9887_conf;
 };
 
 #define card_has_radio(dev)   (NULL != saa7134_boards[dev->board].radio.name)
@@ -362,6 +364,7 @@ struct saa7134_dev {
 	/* config info */
 	unsigned int               board;
 	unsigned int               tuner_type;
+	unsigned int               tda9887_conf;
 	unsigned int               gpio_value;
 
 	/* i2c i/o */
@@ -397,12 +400,13 @@ struct saa7134_dev {
 	int                        ctl_mirror;
 	int                        ctl_y_odd;
 	int                        ctl_y_even;
-
+	int                        ctl_automute;
+	
 	/* crop */
 	struct v4l2_rect           crop_bounds;
 	struct v4l2_rect           crop_defrect;
 	struct v4l2_rect           crop_current;
-
+	
 	/* other global state info */
 	unsigned int               automute;
 	struct saa7134_thread      thread;

-- 
return -ENOSIG;

                 reply	other threads:[~2004-08-31 15:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040831153121.GA15718@bytesex \
    --to=kraxel@bytesex.org \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.