<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Gerd Knorr &lt;kraxel@bytesex.org&gt;

This patch allows to use switch to the second external input of the msp34xx
chips.  Also has some minor cleanups and more verbose debug info.


---

 25-akpm/drivers/media/video/msp3400.c |   47 ++++++++++++++++++----------------
 25-akpm/include/media/audiochip.h     |    2 +
 2 files changed, 28 insertions(+), 21 deletions(-)

diff -puN drivers/media/video/msp3400.c~v4l-msp3400-update drivers/media/video/msp3400.c
--- 25/drivers/media/video/msp3400.c~v4l-msp3400-update	Mon Apr  5 14:46:19 2004
+++ 25-akpm/drivers/media/video/msp3400.c	Mon Apr  5 14:46:19 2004
@@ -1384,34 +1384,30 @@ static int msp_command(struct i2c_client
 {
 	struct msp3400c *msp  = i2c_get_clientdata(client);
         __u16           *sarg = arg;
-#if 0
-	int             *iarg = (int*)arg;
-#endif
+	int scart = 0;
 
 	switch (cmd) {
 
 	case AUDC_SET_INPUT:
-		/* scart switching
-		     - IN1 is often used for external input
-		     - Hauppauge uses IN2 for the radio */
 		dprintk(KERN_DEBUG "msp34xx: AUDC_SET_INPUT(%d)\n",*sarg);
 		if (*sarg == msp-&gt;input)
 			break;
 		msp-&gt;input = *sarg;
 		switch (*sarg) {
 		case AUDIO_RADIO:
+			/* Hauppauge uses IN2 for the radio */
 			msp-&gt;mode   = MSP_MODE_FM_RADIO;
-			msp-&gt;stereo = VIDEO_SOUND_STEREO;
-			msp3400c_set_scart(client,SCART_IN2,0);
-			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
-			msp3400c_setstereo(client,msp-&gt;stereo);
+			scart       = SCART_IN2;
 			break;
-		case AUDIO_EXTERN:
+		case AUDIO_EXTERN_1:
+			/* IN1 is often used for external input ... */
 			msp-&gt;mode   = MSP_MODE_EXTERN;
-			msp-&gt;stereo = VIDEO_SOUND_STEREO;
-			msp3400c_set_scart(client,SCART_IN1,0);
-			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
-			msp3400c_setstereo(client,msp-&gt;stereo);
+			scart       = SCART_IN1;
+			break;
+		case AUDIO_EXTERN_2:
+			/* ... sometimes it is IN2 through ;) */
+			msp-&gt;mode   = MSP_MODE_EXTERN;
+			scart       = SCART_IN2;
 			break;
 		case AUDIO_TUNER:
 			msp-&gt;mode   = -1;
@@ -1422,6 +1418,12 @@ static int msp_command(struct i2c_client
 				msp3400c_set_scart(client,SCART_MUTE,0);
 			break;
 		}
+		if (scart) {
+			msp-&gt;stereo = VIDEO_SOUND_STEREO;
+			msp3400c_set_scart(client,scart,0);
+			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
+			msp3400c_setstereo(client,msp-&gt;stereo);
+		}
 		if (msp-&gt;active)
 			msp-&gt;restart = 1;
 		break;
@@ -1487,12 +1489,15 @@ static int msp_command(struct i2c_client
 		if (msp-&gt;muted)
 			va-&gt;flags |= VIDEO_AUDIO_MUTE;
 		va-&gt;volume=max(msp-&gt;left,msp-&gt;right);
-		va-&gt;balance=(32768*min(msp-&gt;left,msp-&gt;right))/
-			(va-&gt;volume ? va-&gt;volume : 1);
-		va-&gt;balance=(msp-&gt;left&lt;msp-&gt;right)?
-			(65535-va-&gt;balance) : va-&gt;balance;
-		if (0 == va-&gt;volume)
+
+		if (0 == va-&gt;volume) {
 			va-&gt;balance = 32768;
+		} else {
+			va-&gt;balance = (32768 * min(msp-&gt;left,msp-&gt;right))
+				/ va-&gt;volume;
+			va-&gt;balance = (msp-&gt;left&lt;msp-&gt;right) ?
+				(65535 - va-&gt;balance) : va-&gt;balance;
+		}
 		va-&gt;bass = msp-&gt;bass;
 		va-&gt;treble = msp-&gt;treble;
 
@@ -1530,7 +1535,7 @@ static int msp_command(struct i2c_client
 	{
 		struct video_channel *vc = arg;
 		
-		dprintk(KERN_DEBUG "msp34xx: VIDIOCSCHAN\n");
+		dprintk(KERN_DEBUG "msp34xx: VIDIOCSCHAN (norm=%d)\n",vc-&gt;norm);
 		msp-&gt;norm = vc-&gt;norm;
 		break;
 	}
diff -puN include/media/audiochip.h~v4l-msp3400-update include/media/audiochip.h
--- 25/include/media/audiochip.h~v4l-msp3400-update	Mon Apr  5 14:46:19 2004
+++ 25-akpm/include/media/audiochip.h	Mon Apr  5 14:46:19 2004
@@ -15,6 +15,8 @@
 #define AUDIO_INTERN       0x03
 #define AUDIO_OFF          0x04 
 #define AUDIO_ON           0x05
+#define AUDIO_EXTERN_1     AUDIO_EXTERN
+#define AUDIO_EXTERN_2     0x06
 #define AUDIO_MUTE         0x80
 #define AUDIO_UNMUTE       0x81
 

_
</pre></body></html>