From: Gerd Knorr 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->input) break; msp->input = *sarg; switch (*sarg) { case AUDIO_RADIO: + /* Hauppauge uses IN2 for the radio */ msp->mode = MSP_MODE_FM_RADIO; - msp->stereo = VIDEO_SOUND_STEREO; - msp3400c_set_scart(client,SCART_IN2,0); - msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900); - msp3400c_setstereo(client,msp->stereo); + scart = SCART_IN2; break; - case AUDIO_EXTERN: + case AUDIO_EXTERN_1: + /* IN1 is often used for external input ... */ msp->mode = MSP_MODE_EXTERN; - msp->stereo = VIDEO_SOUND_STEREO; - msp3400c_set_scart(client,SCART_IN1,0); - msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900); - msp3400c_setstereo(client,msp->stereo); + scart = SCART_IN1; + break; + case AUDIO_EXTERN_2: + /* ... sometimes it is IN2 through ;) */ + msp->mode = MSP_MODE_EXTERN; + scart = SCART_IN2; break; case AUDIO_TUNER: msp->mode = -1; @@ -1422,6 +1418,12 @@ static int msp_command(struct i2c_client msp3400c_set_scart(client,SCART_MUTE,0); break; } + if (scart) { + msp->stereo = VIDEO_SOUND_STEREO; + msp3400c_set_scart(client,scart,0); + msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900); + msp3400c_setstereo(client,msp->stereo); + } if (msp->active) msp->restart = 1; break; @@ -1487,12 +1489,15 @@ static int msp_command(struct i2c_client if (msp->muted) va->flags |= VIDEO_AUDIO_MUTE; va->volume=max(msp->left,msp->right); - va->balance=(32768*min(msp->left,msp->right))/ - (va->volume ? va->volume : 1); - va->balance=(msp->leftright)? - (65535-va->balance) : va->balance; - if (0 == va->volume) + + if (0 == va->volume) { va->balance = 32768; + } else { + va->balance = (32768 * min(msp->left,msp->right)) + / va->volume; + va->balance = (msp->leftright) ? + (65535 - va->balance) : va->balance; + } va->bass = msp->bass; va->treble = msp->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->norm); msp->norm = vc->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 _