/* 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); } }
//----------------------------- 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); } }