예제 #1
0
/* turn on/off nicam + stereo */
static void msp3400c_setstereo(bktr_ptr_t client, int mode)
{
	static char *strmode[] = { "0", "mono", "stereo", "3",
				   "lang1", "5", "6", "7", "lang2" };
	struct msp3400c *msp = client->msp3400c_info;
	int nicam=0; /* channel source: FM/AM or nicam */
	int src=0;

	/* switch demodulator */
	switch (msp->mode) {
	case MSP_MODE_FM_TERRA:
		dprintk("msp3400: FM setstereo: %s\n",strmode[mode]);
		msp3400c_setcarrier(client,msp->second,msp->main);
		switch (mode) {
		case VIDEO_SOUND_STEREO:
			msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3001);
			break;
		case VIDEO_SOUND_MONO:
		case VIDEO_SOUND_LANG1:
		case VIDEO_SOUND_LANG2:
			msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3000);
			break;
		}
		break;
	case MSP_MODE_FM_SAT:
		dprintk("msp3400: SAT setstereo: %s\n",strmode[mode]);
		switch (mode) {
		case VIDEO_SOUND_MONO:
			msp3400c_setcarrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
			break;
		case VIDEO_SOUND_STEREO:
			msp3400c_setcarrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02));
			break;
		case VIDEO_SOUND_LANG1:
			msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
			break;
		case VIDEO_SOUND_LANG2:
			msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
			break;
		}
		break;
	case MSP_MODE_FM_NICAM1:
	case MSP_MODE_FM_NICAM2:
	case MSP_MODE_AM_NICAM:
		dprintk("msp3400: NICAM setstereo: %s\n",strmode[mode]);
		msp3400c_setcarrier(client,msp->second,msp->main);
		if (msp->nicam_on)
			nicam=0x0100;
		break;
	case MSP_MODE_BTSC:
		dprintk("msp3400: BTSC setstereo: %s\n",strmode[mode]);
		nicam=0x0300;
		break;
	case MSP_MODE_EXTERN:
		dprintk("msp3400: extern setstereo: %s\n",strmode[mode]);
		nicam = 0x0200;
		break;
	case MSP_MODE_FM_RADIO:
		dprintk("msp3400: FM-Radio setstereo: %s\n",strmode[mode]);
		break;
	default:
		dprintk("msp3400: mono setstereo\n");
		return;
	}

	/* switch audio */
	switch (mode) {
	case VIDEO_SOUND_STEREO:
		src = 0x0020 | nicam;
#if 0 
		/* spatial effect */
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x0005,0x4000);
#endif
		break;
	case VIDEO_SOUND_MONO:
		if (msp->mode == MSP_MODE_AM_NICAM) {
			dprintk("msp3400: switching to AM mono\n");
			/* AM mono decoding is handled by tuner, not MSP chip */
			/* SCART switching control register */
			msp3400c_set_scart(client,SCART_MONO,0);
			src = 0x0200;
			break;
		}
	case VIDEO_SOUND_LANG1:
		src = 0x0000 | nicam;
		break;
	case VIDEO_SOUND_LANG2:
		src = 0x0010 | nicam;
		break;
	}
	dprintk("msp3400: setstereo final source/matrix = 0x%x\n", src);

	if (client->dolby) {
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,0x0520);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,0x0620);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src);
	} else {
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,src);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,src);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src);
		msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src);
	}
}
예제 #2
0
파일: msp3400.c 프로젝트: OS2World/DRV-BT32
//----------------------------- msp3400c_setstereo -----------------------------
static void msp3400c_setstereo(struct i2c_client *client, int mode)
{
 /*
 static char *strmode[16] = {
#if __GNUC__ >= 3
      [ 0 ... 15 ]           = "invalid",
#endif
  [ VIDEO_SOUND_MONO ]   = "mono",
  [ VIDEO_SOUND_STEREO ] = "stereo",
  [ VIDEO_SOUND_LANG1  ] = "lang1",
  [ VIDEO_SOUND_LANG2  ] = "lang2",
 };
 */
 struct msp3400c *msp = (struct msp3400c*) i2c_get_clientdata(client);
 int nicam=0; /* channel source: FM/AM or nicam */
 int src=0;
 /* switch demodulator */
 switch (msp->mode)
 {
  case MSP_MODE_FM_TERRA:
   CPK(dprintk(KERN_DEBUG "msp3400: FM setstereo: %s\n",strmode[mode]));
   msp3400c_setcarrier(client,msp->second,msp->main);
   switch (mode)
   {
    case VIDEO_SOUND_STEREO:
     msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3001);
     break;
    case VIDEO_SOUND_MONO:
    case VIDEO_SOUND_LANG1:
    case VIDEO_SOUND_LANG2:
     msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3000);
     break;
   }
   break;
  case MSP_MODE_FM_SAT:
   CPK(dprintk(KERN_DEBUG "msp3400: SAT setstereo: %s\n",strmode[mode]));
   switch (mode)
   {
    case VIDEO_SOUND_MONO:
     msp3400c_setcarrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
     break;
    case VIDEO_SOUND_STEREO:
     msp3400c_setcarrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02));
     break;
    case VIDEO_SOUND_LANG1:
     msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
     break;
    case VIDEO_SOUND_LANG2:
     msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
     break;
   }
   break;
  case MSP_MODE_FM_NICAM1:
  case MSP_MODE_FM_NICAM2:
  case MSP_MODE_AM_NICAM:
   CPK(dprintk(KERN_DEBUG "msp3400: NICAM setstereo: %s\n",strmode[mode]));
   msp3400c_setcarrier(client,msp->second,msp->main);
   if (msp->nicam_on)
    nicam=0x0100;
   break;
  case MSP_MODE_BTSC:
   CPK(dprintk(KERN_DEBUG "msp3400: BTSC setstereo: %s\n",strmode[mode]));
   nicam=0x0300;
   break;
  case MSP_MODE_EXTERN:
   CPK(dprintk(KERN_DEBUG "msp3400: extern setstereo: %s\n",strmode[mode]));
   nicam = 0x0200;
   break;
  case MSP_MODE_FM_RADIO:
   CPK(dprintk(KERN_DEBUG "msp3400: FM-Radio setstereo: %s\n",strmode[mode]));
   break;
  default:
   CPK(dprintk(KERN_DEBUG "msp3400: mono setstereo\n"));
   return;
 }
 /* switch audio */
 switch (mode)
 {
  case VIDEO_SOUND_STEREO:
   src = 0x0020 | nicam;
#if 0
   /* spatial effect */
   msp3400c_write(client,I2C_MSP3400C_DFP, 0x0005,0x4000);
#endif
   break;
  case VIDEO_SOUND_MONO:
   if (msp->mode == MSP_MODE_AM_NICAM)
   {
    CPK(dprintk("msp3400: switching to AM mono\n"));
    /* AM mono decoding is handled by tuner, not MSP chip */
    /* SCART switching control register */
    msp3400c_set_scart(client,SCART_MONO,0);
    src = 0x0200;
    break;
   }
  case VIDEO_SOUND_LANG1:
   src = 0x0000 | nicam;
   break;
  case VIDEO_SOUND_LANG2:
   src = 0x0010 | nicam;
   break;
 }
 CPK(dprintk(KERN_DEBUG "msp3400: setstereo final source/matrix = 0x%x\n", src));
 if (dolby)
 {
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,0x0520);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,0x0620);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src);
 }
 else
 {
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,src);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,src);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src);
  msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src);
 }
}