[PATCH] v4l: CX88 updates and card additions

- Remove $Id CVS logs for V4L files
- add ioctl indirection via cx88_ioctl_hook and cx88_ioctl_translator to
  cx88-blackbird.c.
- declare the indirection hooks from cx88-blackbird.c.
- dcprintk macro which uses core instead of dev->core on cx88-video.c.
- replace dev->core occurances with core on cx88-video.c.
- CodingStyle fixes.
- MaxInput replaced by a define.
- cx8801 structures moved from cx88.h.
- The output_mode needs to be set for the Hauppauge Nova-T DVB-T
  for versions after 2.6.12.
- Corrected GPIO values for cx88 cards #28 & #31 for s-video and composite.
- Updated DViCO FusionHDTV5 Gold & added DVB support.
- Fixed DViCO FusionHDTV 3 Gold-Q GPIO.
- Some clean up in cx88-tvaudio.c
- replaced hex values when writing to AUD_CTL to EN_xx for better reading.
- Allow select by hand between Mono, Lang1, Lang2 and Stereo for BTSC.
- Support for stereo NICAM and BTSC improved.
- Broken stereo check removed.
- Added support for remote control to Cinergy DVBT-1400.
- local var renamed from rc5 to a better name (ircode).
- LGDT330X QAM lock bug fixes.
- Some reorg: move some bits to struct cx88_core, factor out common ioctl's
  to cx88_do_ioctl.
- Get rid of '//' comments, replace them with #if 0 and /**/.
- Minor clean-ups: remove dcprintk and replace all instances of "dev->core"
  with "core".
- Added some registers to control PCI controller at CX2388x chips.
- New tuner standby API.
- Small mpeg fixes and cleanups for blackbird.
- fix mpeg packet size & count
- add VIDIOC_QUERYCAP ioctl for the mpeg stream
- return more information in struct v4l2_format
- fix default window height
- small cleanups

Signed-off-by: Uli Luckas <luckas@musoft.de>
Signed-off-by: Torsten Seeboth <Torsten.Seeboth@t-online.de>
Signed-off-by: Nickolay V. Shmyrev <nshmyrev@yandex.ru>
Signed-off-by: Michael Krufky <mkrufky@m1k.net>
Signed-off-by: Patrick Boettcher <patrick.boettcher@desy.de>
Signed-off-by: Catalin Climov <catalin@climov.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c
index 91207f1..2765ace 100644
--- a/drivers/media/video/cx88/cx88-tvaudio.c
+++ b/drivers/media/video/cx88/cx88-tvaudio.c
@@ -1,5 +1,4 @@
 /*
-    $Id: cx88-tvaudio.c,v 1.37 2005/07/07 13:58:38 mchehab Exp $
 
     cx88x-audio.c - Conexant CX23880/23881 audio downstream driver driver
 
@@ -121,25 +120,19 @@
 }
 
 static void set_audio_start(struct cx88_core *core,
-			    u32 mode, u32 ctl)
+			u32 mode)
 {
 	// mute
 	cx_write(AUD_VOL_CTL,       (1 << 6));
 
-	//  increase level of input by 12dB
-//	cx_write(AUD_AFE_12DB_EN,   0x0001);
-	cx_write(AUD_AFE_12DB_EN,   0x0000);
-
 	// start programming
 	cx_write(AUD_CTL,           0x0000);
 	cx_write(AUD_INIT,          mode);
 	cx_write(AUD_INIT_LD,       0x0001);
 	cx_write(AUD_SOFT_RESET,    0x0001);
-
-	cx_write(AUD_CTL,           ctl);
 }
 
-static void set_audio_finish(struct cx88_core *core)
+static void set_audio_finish(struct cx88_core *core, u32 ctl)
 {
 	u32 volume;
 
@@ -154,25 +147,25 @@
 		cx_write(AUD_I2SOUTPUTCNTL, 1);
 		cx_write(AUD_I2SCNTL, 0);
 		//cx_write(AUD_APB_IN_RATE_ADJ, 0);
+	} else {
+	ctl |= EN_DAC_ENABLE;
+	cx_write(AUD_CTL, ctl);
 	}
 
-	// finish programming
+	/* finish programming */
 	cx_write(AUD_SOFT_RESET, 0x0000);
 
-	// start audio processing
-	cx_set(AUD_CTL, EN_DAC_ENABLE);
-
-	// unmute
+	/* unmute */
 	volume = cx_sread(SHADOW_AUD_VOL_CTL);
 	cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, volume);
 }
 
 /* ----------------------------------------------------------- */
 
-static void set_audio_standard_BTSC(struct cx88_core *core, unsigned int sap)
+static void set_audio_standard_BTSC(struct cx88_core *core, unsigned int sap, u32 mode)
 {
 	static const struct rlist btsc[] = {
-		/* from dscaler */
+	{ AUD_AFE_12DB_EN,             0x00000001 },
 		{ AUD_OUT1_SEL,                0x00000013 },
 		{ AUD_OUT1_SHIFT,              0x00000000 },
 		{ AUD_POLY0_DDS_CONSTANT,      0x0012010c },
@@ -206,9 +199,10 @@
 		{ AUD_RDSI_SHIFT,              0x00000000 },
 		{ AUD_RDSQ_SHIFT,              0x00000000 },
 		{ AUD_POLYPH80SCALEFAC,        0x00000003 },
-                { /* end of list */ },
+		{ /* end of list */ },
 	};
 	static const struct rlist btsc_sap[] = {
+	{ AUD_AFE_12DB_EN,             0x00000001 },
 		{ AUD_DBX_IN_GAIN,             0x00007200 },
 		{ AUD_DBX_WBE_GAIN,            0x00006200 },
 		{ AUD_DBX_SE_GAIN,             0x00006200 },
@@ -259,371 +253,400 @@
 		{ AUD_RDSI_SHIFT,              0x00000000 },
 		{ AUD_RDSQ_SHIFT,              0x00000000 },
 		{ AUD_POLYPH80SCALEFAC,        0x00000003 },
-                { /* end of list */ },
+		{ /* end of list */ },
 	};
 
-	// dscaler: exactly taken from driver,
-	// dscaler: don't know why to set EN_FMRADIO_EN_RDS
+	mode |= EN_FMRADIO_EN_RDS;
+
 	if (sap) {
 		dprintk("%s SAP (status: unknown)\n",__FUNCTION__);
-		set_audio_start(core, 0x0001,
-				EN_FMRADIO_EN_RDS | EN_BTSC_FORCE_SAP);
+	set_audio_start(core, SEL_SAP);
 		set_audio_registers(core, btsc_sap);
+		set_audio_finish(core, mode);
 	} else {
 		dprintk("%s (status: known-good)\n",__FUNCTION__);
-		set_audio_start(core, 0x0001,
-				EN_FMRADIO_EN_RDS | EN_BTSC_AUTO_STEREO);
+	set_audio_start(core, SEL_BTSC);
 		set_audio_registers(core, btsc);
+		set_audio_finish(core, mode);
 	}
-	set_audio_finish(core);
 }
 
 
 static void set_audio_standard_NICAM_L(struct cx88_core *core, int stereo)
 {
-        /* This is probably weird..
-         * Let's operate and find out. */
+	/* This is probably weird..
+	* Let's operate and find out. */
 
-        static const struct rlist nicam_l_mono[] = {
-                { AUD_ERRLOGPERIOD_R,     0x00000064 },
-                { AUD_ERRINTRPTTHSHLD1_R, 0x00000FFF },
-                { AUD_ERRINTRPTTHSHLD2_R, 0x0000001F },
-                { AUD_ERRINTRPTTHSHLD3_R, 0x0000000F },
+	static const struct rlist nicam_l_mono[] = {
+		{ AUD_ERRLOGPERIOD_R,     0x00000064 },
+		{ AUD_ERRINTRPTTHSHLD1_R, 0x00000FFF },
+		{ AUD_ERRINTRPTTHSHLD2_R, 0x0000001F },
+		{ AUD_ERRINTRPTTHSHLD3_R, 0x0000000F },
 
-                { AUD_PDF_DDS_CNST_BYTE2, 0x48 },
-                { AUD_PDF_DDS_CNST_BYTE1, 0x3D },
-                { AUD_QAM_MODE,           0x00 },
-                { AUD_PDF_DDS_CNST_BYTE0, 0xf5 },
-                { AUD_PHACC_FREQ_8MSB,    0x3a },
-                { AUD_PHACC_FREQ_8LSB,    0x4a },
+		{ AUD_PDF_DDS_CNST_BYTE2, 0x48 },
+		{ AUD_PDF_DDS_CNST_BYTE1, 0x3D },
+		{ AUD_QAM_MODE,           0x00 },
+		{ AUD_PDF_DDS_CNST_BYTE0, 0xf5 },
+		{ AUD_PHACC_FREQ_8MSB,    0x3a },
+		{ AUD_PHACC_FREQ_8LSB,    0x4a },
 
-                { AUD_DEEMPHGAIN_R, 0x6680 },
-                { AUD_DEEMPHNUMER1_R, 0x353DE },
-                { AUD_DEEMPHNUMER2_R, 0x1B1 },
-                { AUD_DEEMPHDENOM1_R, 0x0F3D0 },
-                { AUD_DEEMPHDENOM2_R, 0x0 },
-                { AUD_FM_MODE_ENABLE, 0x7 },
-                { AUD_POLYPH80SCALEFAC, 0x3 },
-                { AUD_AFE_12DB_EN, 0x1 },
-                { AAGC_GAIN, 0x0 },
-                { AAGC_HYST, 0x18 },
-                { AAGC_DEF, 0x20 },
-                { AUD_DN0_FREQ, 0x0 },
-                { AUD_POLY0_DDS_CONSTANT, 0x0E4DB2 },
-                { AUD_DCOC_0_SRC, 0x21 },
-                { AUD_IIR1_0_SEL, 0x0 },
-                { AUD_IIR1_0_SHIFT, 0x7 },
-                { AUD_IIR1_1_SEL, 0x2 },
-                { AUD_IIR1_1_SHIFT, 0x0 },
-                { AUD_DCOC_1_SRC, 0x3 },
-                { AUD_DCOC1_SHIFT, 0x0 },
-                { AUD_DCOC_PASS_IN, 0x0 },
-                { AUD_IIR1_2_SEL, 0x23 },
-                { AUD_IIR1_2_SHIFT, 0x0 },
-                { AUD_IIR1_3_SEL, 0x4 },
-                { AUD_IIR1_3_SHIFT, 0x7 },
-                { AUD_IIR1_4_SEL, 0x5 },
-                { AUD_IIR1_4_SHIFT, 0x7 },
-                { AUD_IIR3_0_SEL, 0x7 },
-                { AUD_IIR3_0_SHIFT, 0x0 },
-                { AUD_DEEMPH0_SRC_SEL, 0x11 },
-                { AUD_DEEMPH0_SHIFT, 0x0 },
-                { AUD_DEEMPH0_G0, 0x7000 },
-                { AUD_DEEMPH0_A0, 0x0 },
-                { AUD_DEEMPH0_B0, 0x0 },
-                { AUD_DEEMPH0_A1, 0x0 },
-                { AUD_DEEMPH0_B1, 0x0 },
-                { AUD_DEEMPH1_SRC_SEL, 0x11 },
-                { AUD_DEEMPH1_SHIFT, 0x0 },
-                { AUD_DEEMPH1_G0, 0x7000 },
-                { AUD_DEEMPH1_A0, 0x0 },
-                { AUD_DEEMPH1_B0, 0x0 },
-                { AUD_DEEMPH1_A1, 0x0 },
-                { AUD_DEEMPH1_B1, 0x0 },
-                { AUD_OUT0_SEL, 0x3F },
-                { AUD_OUT1_SEL, 0x3F },
-                { AUD_DMD_RA_DDS, 0x0F5C285 },
-                { AUD_PLL_INT, 0x1E },
-                { AUD_PLL_DDS, 0x0 },
-                { AUD_PLL_FRAC, 0x0E542 },
+		{ AUD_DEEMPHGAIN_R, 0x6680 },
+		{ AUD_DEEMPHNUMER1_R, 0x353DE },
+		{ AUD_DEEMPHNUMER2_R, 0x1B1 },
+		{ AUD_DEEMPHDENOM1_R, 0x0F3D0 },
+		{ AUD_DEEMPHDENOM2_R, 0x0 },
+		{ AUD_FM_MODE_ENABLE, 0x7 },
+		{ AUD_POLYPH80SCALEFAC, 0x3 },
+		{ AUD_AFE_12DB_EN, 0x1 },
+		{ AAGC_GAIN, 0x0 },
+		{ AAGC_HYST, 0x18 },
+		{ AAGC_DEF, 0x20 },
+		{ AUD_DN0_FREQ, 0x0 },
+		{ AUD_POLY0_DDS_CONSTANT, 0x0E4DB2 },
+		{ AUD_DCOC_0_SRC, 0x21 },
+		{ AUD_IIR1_0_SEL, 0x0 },
+		{ AUD_IIR1_0_SHIFT, 0x7 },
+		{ AUD_IIR1_1_SEL, 0x2 },
+		{ AUD_IIR1_1_SHIFT, 0x0 },
+		{ AUD_DCOC_1_SRC, 0x3 },
+		{ AUD_DCOC1_SHIFT, 0x0 },
+		{ AUD_DCOC_PASS_IN, 0x0 },
+		{ AUD_IIR1_2_SEL, 0x23 },
+		{ AUD_IIR1_2_SHIFT, 0x0 },
+		{ AUD_IIR1_3_SEL, 0x4 },
+		{ AUD_IIR1_3_SHIFT, 0x7 },
+		{ AUD_IIR1_4_SEL, 0x5 },
+		{ AUD_IIR1_4_SHIFT, 0x7 },
+		{ AUD_IIR3_0_SEL, 0x7 },
+		{ AUD_IIR3_0_SHIFT, 0x0 },
+		{ AUD_DEEMPH0_SRC_SEL, 0x11 },
+		{ AUD_DEEMPH0_SHIFT, 0x0 },
+		{ AUD_DEEMPH0_G0, 0x7000 },
+		{ AUD_DEEMPH0_A0, 0x0 },
+		{ AUD_DEEMPH0_B0, 0x0 },
+		{ AUD_DEEMPH0_A1, 0x0 },
+		{ AUD_DEEMPH0_B1, 0x0 },
+		{ AUD_DEEMPH1_SRC_SEL, 0x11 },
+		{ AUD_DEEMPH1_SHIFT, 0x0 },
+		{ AUD_DEEMPH1_G0, 0x7000 },
+		{ AUD_DEEMPH1_A0, 0x0 },
+		{ AUD_DEEMPH1_B0, 0x0 },
+		{ AUD_DEEMPH1_A1, 0x0 },
+		{ AUD_DEEMPH1_B1, 0x0 },
+		{ AUD_OUT0_SEL, 0x3F },
+		{ AUD_OUT1_SEL, 0x3F },
+		{ AUD_DMD_RA_DDS, 0x0F5C285 },
+		{ AUD_PLL_INT, 0x1E },
+		{ AUD_PLL_DDS, 0x0 },
+		{ AUD_PLL_FRAC, 0x0E542 },
 
-                // setup QAM registers
-                { AUD_RATE_ADJ1,      0x00000100 },
-                { AUD_RATE_ADJ2,      0x00000200 },
-                { AUD_RATE_ADJ3,      0x00000300 },
-                { AUD_RATE_ADJ4,      0x00000400 },
-                { AUD_RATE_ADJ5,      0x00000500 },
-                { AUD_RATE_THRES_DMD, 0x000000C0 },
-                { /* end of list */ },
-        };
+		// setup QAM registers
+		{ AUD_RATE_ADJ1,      0x00000100 },
+		{ AUD_RATE_ADJ2,      0x00000200 },
+		{ AUD_RATE_ADJ3,      0x00000300 },
+		{ AUD_RATE_ADJ4,      0x00000400 },
+		{ AUD_RATE_ADJ5,      0x00000500 },
+		{ AUD_RATE_THRES_DMD, 0x000000C0 },
+		{ /* end of list */ },
+	};
 
-        static const struct rlist nicam_l[] = {
-                // setup QAM registers
-                { AUD_RATE_ADJ1, 0x00000060 },
-                { AUD_RATE_ADJ2, 0x000000F9 },
-                { AUD_RATE_ADJ3, 0x000001CC },
-                { AUD_RATE_ADJ4, 0x000002B3 },
-                { AUD_RATE_ADJ5, 0x00000726 },
-                { AUD_DEEMPHDENOM1_R, 0x0000F3D0 },
-                { AUD_DEEMPHDENOM2_R, 0x00000000 },
-                { AUD_ERRLOGPERIOD_R, 0x00000064 },
-                { AUD_ERRINTRPTTHSHLD1_R, 0x00000FFF },
-                { AUD_ERRINTRPTTHSHLD2_R, 0x0000001F },
-                { AUD_ERRINTRPTTHSHLD3_R, 0x0000000F },
-                { AUD_POLYPH80SCALEFAC, 0x00000003 },
-                { AUD_DMD_RA_DDS, 0x00C00000 },
-                { AUD_PLL_INT, 0x0000001E },
-                { AUD_PLL_DDS, 0x00000000 },
-                { AUD_PLL_FRAC, 0x0000E542 },
-                { AUD_START_TIMER, 0x00000000 },
-                { AUD_DEEMPHNUMER1_R, 0x000353DE },
-                { AUD_DEEMPHNUMER2_R, 0x000001B1 },
-                { AUD_PDF_DDS_CNST_BYTE2, 0x06 },
-                { AUD_PDF_DDS_CNST_BYTE1, 0x82 },
-                { AUD_QAM_MODE, 0x05 },
-                { AUD_PDF_DDS_CNST_BYTE0, 0x12 },
-                { AUD_PHACC_FREQ_8MSB, 0x34 },
-                { AUD_PHACC_FREQ_8LSB, 0x4C },
-                { AUD_DEEMPHGAIN_R, 0x00006680 },
-                { AUD_RATE_THRES_DMD, 0x000000C0  },
-                { /* end of list */ },
-        } ;
-        dprintk("%s (status: devel), stereo : %d\n",__FUNCTION__,stereo);
+	static const struct rlist nicam_l[] = {
+		// setup QAM registers
+		{ AUD_RATE_ADJ1, 0x00000060 },
+		{ AUD_RATE_ADJ2, 0x000000F9 },
+		{ AUD_RATE_ADJ3, 0x000001CC },
+		{ AUD_RATE_ADJ4, 0x000002B3 },
+		{ AUD_RATE_ADJ5, 0x00000726 },
+		{ AUD_DEEMPHDENOM1_R, 0x0000F3D0 },
+		{ AUD_DEEMPHDENOM2_R, 0x00000000 },
+		{ AUD_ERRLOGPERIOD_R, 0x00000064 },
+		{ AUD_ERRINTRPTTHSHLD1_R, 0x00000FFF },
+		{ AUD_ERRINTRPTTHSHLD2_R, 0x0000001F },
+		{ AUD_ERRINTRPTTHSHLD3_R, 0x0000000F },
+		{ AUD_POLYPH80SCALEFAC, 0x00000003 },
+		{ AUD_DMD_RA_DDS, 0x00C00000 },
+		{ AUD_PLL_INT, 0x0000001E },
+		{ AUD_PLL_DDS, 0x00000000 },
+		{ AUD_PLL_FRAC, 0x0000E542 },
+		{ AUD_START_TIMER, 0x00000000 },
+		{ AUD_DEEMPHNUMER1_R, 0x000353DE },
+		{ AUD_DEEMPHNUMER2_R, 0x000001B1 },
+		{ AUD_PDF_DDS_CNST_BYTE2, 0x06 },
+		{ AUD_PDF_DDS_CNST_BYTE1, 0x82 },
+		{ AUD_QAM_MODE, 0x05 },
+		{ AUD_PDF_DDS_CNST_BYTE0, 0x12 },
+		{ AUD_PHACC_FREQ_8MSB, 0x34 },
+		{ AUD_PHACC_FREQ_8LSB, 0x4C },
+		{ AUD_DEEMPHGAIN_R, 0x00006680 },
+		{ AUD_RATE_THRES_DMD, 0x000000C0  },
+		{ /* end of list */ },
+	} ;
+	dprintk("%s (status: devel), stereo : %d\n",__FUNCTION__,stereo);
 
-        if (!stereo) {
-		/* AM mono sound */
-                set_audio_start(core, 0x0004,
-				0x100c /* FIXME again */);
-                set_audio_registers(core, nicam_l_mono);
-        } else {
-                set_audio_start(core, 0x0010,
-				0x1924 /* FIXME again */);
-                set_audio_registers(core, nicam_l);
-        }
-        set_audio_finish(core);
-
+	if (!stereo) {
+	/* AM Mono */
+		set_audio_start(core, SEL_A2);
+		set_audio_registers(core, nicam_l_mono);
+	set_audio_finish(core, EN_A2_FORCE_MONO1);
+	} else {
+	/* Nicam Stereo */
+		set_audio_start(core, SEL_NICAM);
+		set_audio_registers(core, nicam_l);
+	set_audio_finish(core, 0x1924); /* FIXME */
+	}
 }
 
 static void set_audio_standard_PAL_I(struct cx88_core *core, int stereo)
 {
        static const struct rlist pal_i_fm_mono[] = {
-            {AUD_ERRLOGPERIOD_R,       0x00000064},
-            {AUD_ERRINTRPTTHSHLD1_R,   0x00000fff},
-            {AUD_ERRINTRPTTHSHLD2_R,   0x0000001f},
-            {AUD_ERRINTRPTTHSHLD3_R,   0x0000000f},
-            {AUD_PDF_DDS_CNST_BYTE2,   0x06},
-            {AUD_PDF_DDS_CNST_BYTE1,   0x82},
-            {AUD_PDF_DDS_CNST_BYTE0,   0x12},
-            {AUD_QAM_MODE,             0x05},
-            {AUD_PHACC_FREQ_8MSB,      0x3a},
-            {AUD_PHACC_FREQ_8LSB,      0x93},
-            {AUD_DMD_RA_DDS,           0x002a4f2f},
-            {AUD_PLL_INT,              0x0000001e},
-            {AUD_PLL_DDS,              0x00000004},
-            {AUD_PLL_FRAC,             0x0000e542},
-            {AUD_RATE_ADJ1,            0x00000100},
-            {AUD_RATE_ADJ2,            0x00000200},
-            {AUD_RATE_ADJ3,            0x00000300},
-            {AUD_RATE_ADJ4,            0x00000400},
-            {AUD_RATE_ADJ5,            0x00000500},
-            {AUD_THR_FR,               0x00000000},
-            {AUD_PILOT_BQD_1_K0,       0x0000755b},
-            {AUD_PILOT_BQD_1_K1,       0x00551340},
-            {AUD_PILOT_BQD_1_K2,       0x006d30be},
-            {AUD_PILOT_BQD_1_K3,       0xffd394af},
-            {AUD_PILOT_BQD_1_K4,       0x00400000},
-            {AUD_PILOT_BQD_2_K0,       0x00040000},
-            {AUD_PILOT_BQD_2_K1,       0x002a4841},
-            {AUD_PILOT_BQD_2_K2,       0x00400000},
-            {AUD_PILOT_BQD_2_K3,       0x00000000},
-            {AUD_PILOT_BQD_2_K4,       0x00000000},
-            {AUD_MODE_CHG_TIMER,       0x00000060},
-            {AUD_AFE_12DB_EN,          0x00000001},
-            {AAGC_HYST,                0x0000000a},
-            {AUD_CORDIC_SHIFT_0,       0x00000007},
-            {AUD_CORDIC_SHIFT_1,       0x00000007},
-            {AUD_C1_UP_THR,            0x00007000},
-            {AUD_C1_LO_THR,            0x00005400},
-            {AUD_C2_UP_THR,            0x00005400},
-            {AUD_C2_LO_THR,            0x00003000},
-            {AUD_DCOC_0_SRC,           0x0000001a},
-            {AUD_DCOC0_SHIFT,          0x00000000},
-            {AUD_DCOC_0_SHIFT_IN0,     0x0000000a},
-            {AUD_DCOC_0_SHIFT_IN1,     0x00000008},
-            {AUD_DCOC_PASS_IN,         0x00000003},
-            {AUD_IIR3_0_SEL,           0x00000021},
-            {AUD_DN2_AFC,              0x00000002},
-            {AUD_DCOC_1_SRC,           0x0000001b},
-            {AUD_DCOC1_SHIFT,          0x00000000},
-            {AUD_DCOC_1_SHIFT_IN0,     0x0000000a},
-            {AUD_DCOC_1_SHIFT_IN1,     0x00000008},
-            {AUD_IIR3_1_SEL,           0x00000023},
-            {AUD_DN0_FREQ,             0x000035a3},
-            {AUD_DN2_FREQ,             0x000029c7},
-            {AUD_CRDC0_SRC_SEL,        0x00000511},
-            {AUD_IIR1_0_SEL,           0x00000001},
-            {AUD_IIR1_1_SEL,           0x00000000},
-            {AUD_IIR3_2_SEL,           0x00000003},
-            {AUD_IIR3_2_SHIFT,         0x00000000},
-            {AUD_IIR3_0_SEL,           0x00000002},
-            {AUD_IIR2_0_SEL,           0x00000021},
-            {AUD_IIR2_0_SHIFT,         0x00000002},
-            {AUD_DEEMPH0_SRC_SEL,      0x0000000b},
-            {AUD_DEEMPH1_SRC_SEL,      0x0000000b},
-            {AUD_POLYPH80SCALEFAC,     0x00000001},
-            {AUD_START_TIMER,          0x00000000},
-            { /* end of list */ },
+	{AUD_ERRLOGPERIOD_R,       0x00000064},
+	{AUD_ERRINTRPTTHSHLD1_R,   0x00000fff},
+	{AUD_ERRINTRPTTHSHLD2_R,   0x0000001f},
+	{AUD_ERRINTRPTTHSHLD3_R,   0x0000000f},
+	{AUD_PDF_DDS_CNST_BYTE2,   0x06},
+	{AUD_PDF_DDS_CNST_BYTE1,   0x82},
+	{AUD_PDF_DDS_CNST_BYTE0,   0x12},
+	{AUD_QAM_MODE,             0x05},
+	{AUD_PHACC_FREQ_8MSB,      0x3a},
+	{AUD_PHACC_FREQ_8LSB,      0x93},
+	{AUD_DMD_RA_DDS,           0x002a4f2f},
+	{AUD_PLL_INT,              0x0000001e},
+	{AUD_PLL_DDS,              0x00000004},
+	{AUD_PLL_FRAC,             0x0000e542},
+	{AUD_RATE_ADJ1,            0x00000100},
+	{AUD_RATE_ADJ2,            0x00000200},
+	{AUD_RATE_ADJ3,            0x00000300},
+	{AUD_RATE_ADJ4,            0x00000400},
+	{AUD_RATE_ADJ5,            0x00000500},
+	{AUD_THR_FR,               0x00000000},
+	{AUD_PILOT_BQD_1_K0,       0x0000755b},
+	{AUD_PILOT_BQD_1_K1,       0x00551340},
+	{AUD_PILOT_BQD_1_K2,       0x006d30be},
+	{AUD_PILOT_BQD_1_K3,       0xffd394af},
+	{AUD_PILOT_BQD_1_K4,       0x00400000},
+	{AUD_PILOT_BQD_2_K0,       0x00040000},
+	{AUD_PILOT_BQD_2_K1,       0x002a4841},
+	{AUD_PILOT_BQD_2_K2,       0x00400000},
+	{AUD_PILOT_BQD_2_K3,       0x00000000},
+	{AUD_PILOT_BQD_2_K4,       0x00000000},
+	{AUD_MODE_CHG_TIMER,       0x00000060},
+	{AUD_AFE_12DB_EN,          0x00000001},
+	{AAGC_HYST,                0x0000000a},
+	{AUD_CORDIC_SHIFT_0,       0x00000007},
+	{AUD_CORDIC_SHIFT_1,       0x00000007},
+	{AUD_C1_UP_THR,            0x00007000},
+	{AUD_C1_LO_THR,            0x00005400},
+	{AUD_C2_UP_THR,            0x00005400},
+	{AUD_C2_LO_THR,            0x00003000},
+	{AUD_DCOC_0_SRC,           0x0000001a},
+	{AUD_DCOC0_SHIFT,          0x00000000},
+	{AUD_DCOC_0_SHIFT_IN0,     0x0000000a},
+	{AUD_DCOC_0_SHIFT_IN1,     0x00000008},
+	{AUD_DCOC_PASS_IN,         0x00000003},
+	{AUD_IIR3_0_SEL,           0x00000021},
+	{AUD_DN2_AFC,              0x00000002},
+	{AUD_DCOC_1_SRC,           0x0000001b},
+	{AUD_DCOC1_SHIFT,          0x00000000},
+	{AUD_DCOC_1_SHIFT_IN0,     0x0000000a},
+	{AUD_DCOC_1_SHIFT_IN1,     0x00000008},
+	{AUD_IIR3_1_SEL,           0x00000023},
+	{AUD_DN0_FREQ,             0x000035a3},
+	{AUD_DN2_FREQ,             0x000029c7},
+	{AUD_CRDC0_SRC_SEL,        0x00000511},
+	{AUD_IIR1_0_SEL,           0x00000001},
+	{AUD_IIR1_1_SEL,           0x00000000},
+	{AUD_IIR3_2_SEL,           0x00000003},
+	{AUD_IIR3_2_SHIFT,         0x00000000},
+	{AUD_IIR3_0_SEL,           0x00000002},
+	{AUD_IIR2_0_SEL,           0x00000021},
+	{AUD_IIR2_0_SHIFT,         0x00000002},
+	{AUD_DEEMPH0_SRC_SEL,      0x0000000b},
+	{AUD_DEEMPH1_SRC_SEL,      0x0000000b},
+	{AUD_POLYPH80SCALEFAC,     0x00000001},
+	{AUD_START_TIMER,          0x00000000},
+	{ /* end of list */ },
        };
 
        static const struct rlist pal_i_nicam[] = {
-           { AUD_RATE_ADJ1,           0x00000010 },
-           { AUD_RATE_ADJ2,           0x00000040 },
-           { AUD_RATE_ADJ3,           0x00000100 },
-           { AUD_RATE_ADJ4,           0x00000400 },
-           { AUD_RATE_ADJ5,           0x00001000 },
-	   //     { AUD_DMD_RA_DDS,          0x00c0d5ce },
-	   { AUD_DEEMPHGAIN_R,        0x000023c2 },
-	   { AUD_DEEMPHNUMER1_R,      0x0002a7bc },
-	   { AUD_DEEMPHNUMER2_R,      0x0003023e },
-	   { AUD_DEEMPHDENOM1_R,      0x0000f3d0 },
-	   { AUD_DEEMPHDENOM2_R,      0x00000000 },
-	   { AUD_DEEMPHDENOM2_R,      0x00000000 },
-	   { AUD_ERRLOGPERIOD_R,      0x00000fff },
-	   { AUD_ERRINTRPTTHSHLD1_R,  0x000003ff },
-	   { AUD_ERRINTRPTTHSHLD2_R,  0x000000ff },
-	   { AUD_ERRINTRPTTHSHLD3_R,  0x0000003f },
-	   { AUD_POLYPH80SCALEFAC,    0x00000003 },
-	   { AUD_PDF_DDS_CNST_BYTE2,  0x06 },
-	   { AUD_PDF_DDS_CNST_BYTE1,  0x82 },
-	   { AUD_PDF_DDS_CNST_BYTE0,  0x16 },
-	   { AUD_QAM_MODE,            0x05 },
-	   { AUD_PDF_DDS_CNST_BYTE0,  0x12 },
-	   { AUD_PHACC_FREQ_8MSB,     0x3a },
-	   { AUD_PHACC_FREQ_8LSB,     0x93 },
-            { /* end of list */ },
-        };
+	{ AUD_RATE_ADJ1,           0x00000010 },
+	{ AUD_RATE_ADJ2,           0x00000040 },
+	{ AUD_RATE_ADJ3,           0x00000100 },
+	{ AUD_RATE_ADJ4,           0x00000400 },
+	{ AUD_RATE_ADJ5,           0x00001000 },
+	//     { AUD_DMD_RA_DDS,          0x00c0d5ce },
+	{ AUD_DEEMPHGAIN_R,        0x000023c2 },
+	{ AUD_DEEMPHNUMER1_R,      0x0002a7bc },
+	{ AUD_DEEMPHNUMER2_R,      0x0003023e },
+	{ AUD_DEEMPHDENOM1_R,      0x0000f3d0 },
+	{ AUD_DEEMPHDENOM2_R,      0x00000000 },
+	{ AUD_DEEMPHDENOM2_R,      0x00000000 },
+	{ AUD_ERRLOGPERIOD_R,      0x00000fff },
+	{ AUD_ERRINTRPTTHSHLD1_R,  0x000003ff },
+	{ AUD_ERRINTRPTTHSHLD2_R,  0x000000ff },
+	{ AUD_ERRINTRPTTHSHLD3_R,  0x0000003f },
+	{ AUD_POLYPH80SCALEFAC,    0x00000003 },
+	{ AUD_PDF_DDS_CNST_BYTE2,  0x06 },
+	{ AUD_PDF_DDS_CNST_BYTE1,  0x82 },
+	{ AUD_PDF_DDS_CNST_BYTE0,  0x16 },
+	{ AUD_QAM_MODE,            0x05 },
+	{ AUD_PDF_DDS_CNST_BYTE0,  0x12 },
+	{ AUD_PHACC_FREQ_8MSB,     0x3a },
+	{ AUD_PHACC_FREQ_8LSB,     0x93 },
+	{ /* end of list */ },
+	};
 
-        dprintk("%s (status: devel), stereo : %d\n",__FUNCTION__,stereo);
+	dprintk("%s (status: devel), stereo : %d\n",__FUNCTION__,stereo);
 
-        if (!stereo) {
-		// FM mono
-		set_audio_start(core, 0x0004, EN_DMTRX_SUMDIFF | EN_A2_FORCE_MONO1);
+	if (!stereo) {
+	/* FM Mono */
+	set_audio_start(core, SEL_A2);
 		set_audio_registers(core, pal_i_fm_mono);
-        } else {
-		// Nicam Stereo
-		set_audio_start(core, 0x0010, EN_DMTRX_LR | EN_DMTRX_BYPASS | EN_NICAM_AUTO_STEREO);
+		set_audio_finish(core, EN_DMTRX_SUMDIFF | EN_A2_FORCE_MONO1);
+	} else {
+	/* Nicam Stereo */
+	set_audio_start(core, SEL_NICAM);
 		set_audio_registers(core, pal_i_nicam);
-        }
-        set_audio_finish(core);
+		set_audio_finish(core, EN_DMTRX_LR | EN_DMTRX_BYPASS | EN_NICAM_AUTO_STEREO);
+	}
 }
 
-static void set_audio_standard_A2(struct cx88_core *core)
+static void set_audio_standard_A2(struct cx88_core *core, u32 mode)
 {
-	/* from dscaler cvs */
 	static const struct rlist a2_common[] = {
-		{ AUD_PDF_DDS_CNST_BYTE2,     0x06 },
-		{ AUD_PDF_DDS_CNST_BYTE1,     0x82 },
-		{ AUD_PDF_DDS_CNST_BYTE0,     0x12 },
-		{ AUD_QAM_MODE,		      0x05 },
-		{ AUD_PHACC_FREQ_8MSB,	      0x34 },
-		{ AUD_PHACC_FREQ_8LSB,	      0x4c },
+	{AUD_ERRLOGPERIOD_R,            0x00000064},
+	{AUD_ERRINTRPTTHSHLD1_R,        0x00000fff},
+	{AUD_ERRINTRPTTHSHLD2_R,        0x0000001f},
+	{AUD_ERRINTRPTTHSHLD3_R,        0x0000000f},
+	{AUD_PDF_DDS_CNST_BYTE2,        0x06},
+	{AUD_PDF_DDS_CNST_BYTE1,        0x82},
+	{AUD_PDF_DDS_CNST_BYTE0,        0x12},
+	{AUD_QAM_MODE,                  0x05},
+	{AUD_PHACC_FREQ_8MSB,           0x34},
+	{AUD_PHACC_FREQ_8LSB,           0x4c},
+	{AUD_RATE_ADJ1,                 0x00000100},
+	{AUD_RATE_ADJ2,                 0x00000200},
+	{AUD_RATE_ADJ3,                 0x00000300},
+	{AUD_RATE_ADJ4,                 0x00000400},
+	{AUD_RATE_ADJ5,                 0x00000500},
+	{AUD_THR_FR,                    0x00000000},
+	{AAGC_HYST,                     0x0000001a},
+	{AUD_PILOT_BQD_1_K0,            0x0000755b},
+	{AUD_PILOT_BQD_1_K1,            0x00551340},
+	{AUD_PILOT_BQD_1_K2,            0x006d30be},
+	{AUD_PILOT_BQD_1_K3,            0xffd394af},
+	{AUD_PILOT_BQD_1_K4,            0x00400000},
+	{AUD_PILOT_BQD_2_K0,            0x00040000},
+	{AUD_PILOT_BQD_2_K1,            0x002a4841},
+	{AUD_PILOT_BQD_2_K2,            0x00400000},
+	{AUD_PILOT_BQD_2_K3,            0x00000000},
+	{AUD_PILOT_BQD_2_K4,            0x00000000},
+	{AUD_MODE_CHG_TIMER,            0x00000040},
+	{AUD_AFE_12DB_EN,               0x00000001},
+	{AUD_CORDIC_SHIFT_0,            0x00000007},
+	{AUD_CORDIC_SHIFT_1,            0x00000007},
+	{AUD_DEEMPH0_G0,                0x00000380},
+	{AUD_DEEMPH1_G0,                0x00000380},
+	{AUD_DCOC_0_SRC,                0x0000001a},
+	{AUD_DCOC0_SHIFT,               0x00000000},
+	{AUD_DCOC_0_SHIFT_IN0,          0x0000000a},
+	{AUD_DCOC_0_SHIFT_IN1,          0x00000008},
+	{AUD_DCOC_PASS_IN,              0x00000003},
+	{AUD_IIR3_0_SEL,                0x00000021},
+	{AUD_DN2_AFC,                   0x00000002},
+	{AUD_DCOC_1_SRC,                0x0000001b},
+	{AUD_DCOC1_SHIFT,               0x00000000},
+	{AUD_DCOC_1_SHIFT_IN0,          0x0000000a},
+	{AUD_DCOC_1_SHIFT_IN1,          0x00000008},
+	{AUD_IIR3_1_SEL,                0x00000023},
+	{AUD_RDSI_SEL,                  0x00000017},
+	{AUD_RDSI_SHIFT,                0x00000000},
+	{AUD_RDSQ_SEL,                  0x00000017},
+	{AUD_RDSQ_SHIFT,                0x00000000},
+	{AUD_PLL_INT,                   0x0000001e},
+	{AUD_PLL_DDS,                   0x00000000},
+	{AUD_PLL_FRAC,                  0x0000e542},
+	{AUD_POLYPH80SCALEFAC,          0x00000001},
+	{AUD_START_TIMER,               0x00000000},
+	{ /* end of list */ },
+	};
 
-		{ AUD_RATE_ADJ1,	0x00001000 },
-		{ AUD_RATE_ADJ2,	0x00002000 },
-		{ AUD_RATE_ADJ3,	0x00003000 },
-		{ AUD_RATE_ADJ4,	0x00004000 },
-		{ AUD_RATE_ADJ5,	0x00005000 },
-		{ AUD_THR_FR,		0x00000000 },
-		{ AAGC_HYST,		0x0000001a },
-		{ AUD_PILOT_BQD_1_K0,	0x0000755b },
-		{ AUD_PILOT_BQD_1_K1,	0x00551340 },
-		{ AUD_PILOT_BQD_1_K2,	0x006d30be },
-		{ AUD_PILOT_BQD_1_K3,	0xffd394af },
-		{ AUD_PILOT_BQD_1_K4,	0x00400000 },
-		{ AUD_PILOT_BQD_2_K0,	0x00040000 },
-		{ AUD_PILOT_BQD_2_K1,	0x002a4841 },
-		{ AUD_PILOT_BQD_2_K2,	0x00400000 },
-		{ AUD_PILOT_BQD_2_K3,	0x00000000 },
-		{ AUD_PILOT_BQD_2_K4,	0x00000000 },
-		{ AUD_MODE_CHG_TIMER,	0x00000040 },
-		{ AUD_START_TIMER,	0x00000200 },
-		{ AUD_AFE_12DB_EN,	0x00000000 },
-		{ AUD_CORDIC_SHIFT_0,	0x00000007 },
-		{ AUD_CORDIC_SHIFT_1,	0x00000007 },
-		{ AUD_DEEMPH0_G0,	0x00000380 },
-		{ AUD_DEEMPH1_G0,	0x00000380 },
-		{ AUD_DCOC_0_SRC,	0x0000001a },
-		{ AUD_DCOC0_SHIFT,	0x00000000 },
-		{ AUD_DCOC_0_SHIFT_IN0,	0x0000000a },
-		{ AUD_DCOC_0_SHIFT_IN1,	0x00000008 },
-		{ AUD_DCOC_PASS_IN,	0x00000003 },
-		{ AUD_IIR3_0_SEL,	0x00000021 },
-		{ AUD_DN2_AFC,		0x00000002 },
-		{ AUD_DCOC_1_SRC,	0x0000001b },
-		{ AUD_DCOC1_SHIFT,	0x00000000 },
-		{ AUD_DCOC_1_SHIFT_IN0,	0x0000000a },
-		{ AUD_DCOC_1_SHIFT_IN1,	0x00000008 },
-		{ AUD_IIR3_1_SEL,	0x00000023 },
-		{ AUD_RDSI_SEL,		0x00000017 },
-		{ AUD_RDSI_SHIFT,	0x00000000 },
-		{ AUD_RDSQ_SEL,		0x00000017 },
-		{ AUD_RDSQ_SHIFT,	0x00000000 },
-		{ AUD_POLYPH80SCALEFAC,	0x00000001 },
-
+	static const struct rlist a2_bg[] = {
+	{AUD_DMD_RA_DDS,                0x002a4f2f},
+	{AUD_C1_UP_THR,                 0x00007000},
+	{AUD_C1_LO_THR,                 0x00005400},
+	{AUD_C2_UP_THR,                 0x00005400},
+	{AUD_C2_LO_THR,                 0x00003000},
 		{ /* end of list */ },
 	};
 
-	static const struct rlist a2_table1[] = {
-		// PAL-BG
-		{ AUD_DMD_RA_DDS,	0x002a73bd },
-		{ AUD_C1_UP_THR,	0x00007000 },
-		{ AUD_C1_LO_THR,	0x00005400 },
-		{ AUD_C2_UP_THR,	0x00005400 },
-		{ AUD_C2_LO_THR,	0x00003000 },
+	static const struct rlist a2_dk[] = {
+	{AUD_DMD_RA_DDS,                0x002a4f2f},
+	{AUD_C1_UP_THR,                 0x00007000},
+	{AUD_C1_LO_THR,                 0x00005400},
+	{AUD_C2_UP_THR,                 0x00005400},
+	{AUD_C2_LO_THR,                 0x00003000},
+	{AUD_DN0_FREQ,                  0x00003a1c},
+	{AUD_DN2_FREQ,                  0x0000d2e0},
 		{ /* end of list */ },
 	};
-	static const struct rlist a2_table2[] = {
-		// PAL-DK
-		{ AUD_DMD_RA_DDS,	0x002a73bd },
-		{ AUD_C1_UP_THR,	0x00007000 },
-		{ AUD_C1_LO_THR,	0x00005400 },
-		{ AUD_C2_UP_THR,	0x00005400 },
-		{ AUD_C2_LO_THR,	0x00003000 },
-		{ AUD_DN0_FREQ,		0x00003a1c },
-		{ AUD_DN2_FREQ,		0x0000d2e0 },
-		{ /* end of list */ },
-	};
-	static const struct rlist a2_table3[] = {
-		// unknown, probably NTSC-M
-		{ AUD_DMD_RA_DDS,	0x002a2873 },
-		{ AUD_C1_UP_THR,	0x00003c00 },
-		{ AUD_C1_LO_THR,	0x00003000 },
-		{ AUD_C2_UP_THR,	0x00006000 },
-		{ AUD_C2_LO_THR,	0x00003c00 },
-		{ AUD_DN0_FREQ,		0x00002836 },
-		{ AUD_DN1_FREQ,		0x00003418 },
-		{ AUD_DN2_FREQ,		0x000029c7 },
-		{ AUD_POLY0_DDS_CONSTANT, 0x000a7540 },
+/* unknown, probably NTSC-M */
+	static const struct rlist a2_m[] = {
+	{AUD_DMD_RA_DDS,                0x002a0425},
+	{AUD_C1_UP_THR,                 0x00003c00},
+	{AUD_C1_LO_THR,                 0x00003000},
+	{AUD_C2_UP_THR,                 0x00006000},
+	{AUD_C2_LO_THR,                 0x00003c00},
+	{AUD_DEEMPH0_A0,                0x00007a80},
+	{AUD_DEEMPH1_A0,                0x00007a80},
+	{AUD_DEEMPH0_G0,                0x00001200},
+	{AUD_DEEMPH1_G0,                0x00001200},
+	{AUD_DN0_FREQ,                  0x0000283b},
+	{AUD_DN1_FREQ,                  0x00003418},
+	{AUD_DN2_FREQ,                  0x000029c7},
+	{AUD_POLY0_DDS_CONSTANT,        0x000a7540},
 		{ /* end of list */ },
 	};
 
-	set_audio_start(core, 0x0004, EN_DMTRX_SUMDIFF | EN_A2_AUTO_STEREO);
+	static const struct rlist a2_deemph50[] = {
+	{AUD_DEEMPH0_G0,                0x00000380},
+	{AUD_DEEMPH1_G0,                0x00000380},
+	{AUD_DEEMPHGAIN_R,              0x000011e1},
+	{AUD_DEEMPHNUMER1_R,            0x0002a7bc},
+	{AUD_DEEMPHNUMER2_R,            0x0003023c},
+	{ /* end of list */ },
+	};
+
+	static const struct rlist a2_deemph75[] = {
+	{AUD_DEEMPH0_G0,                0x00000480},
+	{AUD_DEEMPH1_G0,                0x00000480},
+	{AUD_DEEMPHGAIN_R,              0x00009000},
+	{AUD_DEEMPHNUMER1_R,            0x000353de},
+	{AUD_DEEMPHNUMER2_R,            0x000001b1},
+		{ /* end of list */ },
+	};
+
+	set_audio_start(core, SEL_A2);
 	set_audio_registers(core, a2_common);
 	switch (core->tvaudio) {
 	case WW_A2_BG:
 		dprintk("%s PAL-BG A2 (status: known-good)\n",__FUNCTION__);
-		set_audio_registers(core, a2_table1);
+	set_audio_registers(core, a2_bg);
+	set_audio_registers(core, a2_deemph50);
 		break;
 	case WW_A2_DK:
 		dprintk("%s PAL-DK A2 (status: known-good)\n",__FUNCTION__);
-		set_audio_registers(core, a2_table2);
+	set_audio_registers(core, a2_dk);
+	set_audio_registers(core, a2_deemph50);
 		break;
 	case WW_A2_M:
 		dprintk("%s NTSC-M A2 (status: unknown)\n",__FUNCTION__);
-		set_audio_registers(core, a2_table3);
+	set_audio_registers(core, a2_m);
+	set_audio_registers(core, a2_deemph75);
 		break;
 	};
-	set_audio_finish(core);
+
+	mode |= EN_FMRADIO_EN_RDS | EN_DMTRX_SUMDIFF;
+	set_audio_finish(core, mode);
 }
 
 static void set_audio_standard_EIAJ(struct cx88_core *core)
@@ -635,9 +658,9 @@
 	};
 	dprintk("%s (status: unknown)\n",__FUNCTION__);
 
-	set_audio_start(core, 0x0002, EN_EIAJ_AUTO_STEREO);
+	set_audio_start(core, SEL_EIAJ);
 	set_audio_registers(core, eiaj);
-	set_audio_finish(core);
+	set_audio_finish(core, EN_EIAJ_AUTO_STEREO);
 }
 
 static void set_audio_standard_FM(struct cx88_core *core, enum cx88_deemph_type deemph)
@@ -683,7 +706,7 @@
 	};
 
 	dprintk("%s (status: unknown)\n",__FUNCTION__);
-	set_audio_start(core, 0x0020, EN_FMRADIO_AUTO_STEREO);
+	set_audio_start(core, SEL_FMRADIO);
 
 	switch (deemph)
 	{
@@ -700,7 +723,7 @@
 			break;
 	}
 
-	set_audio_finish(core);
+	set_audio_finish(core, EN_FMRADIO_AUTO_STEREO);
 }
 
 /* ----------------------------------------------------------- */
@@ -709,7 +732,7 @@
 {
 	switch (core->tvaudio) {
 	case WW_BTSC:
-		set_audio_standard_BTSC(core,0);
+		set_audio_standard_BTSC(core, 0, EN_BTSC_AUTO_STEREO);
 		break;
 	case WW_NICAM_BGDKL:
 		set_audio_standard_NICAM_L(core,0);
@@ -720,7 +743,7 @@
 	case WW_A2_BG:
 	case WW_A2_DK:
 	case WW_A2_M:
-		set_audio_standard_A2(core);
+	set_audio_standard_A2(core, EN_A2_FORCE_MONO1);
 		break;
 	case WW_EIAJ:
 		set_audio_standard_EIAJ(core);
@@ -734,7 +757,7 @@
 	case WW_NONE:
 	default:
 		printk("%s/0: unknown tv audio mode [%d]\n",
-		       core->name, core->tvaudio);
+		core->name, core->tvaudio);
 		break;
 	}
 	return;
@@ -769,6 +792,13 @@
 			aud_ctl_names[cx_read(AUD_CTL) & 63]);
 	core->astat = reg;
 
+/* TODO
+       Reading from AUD_STATUS is not enough
+       for auto-detecting sap/dual-fm/nicam.
+       Add some code here later.
+*/
+
+# if 0
 	t->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_SAP |
 		V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
 	t->rxsubchans = V4L2_TUNER_SUB_MONO;
@@ -779,7 +809,7 @@
 		t->capability = V4L2_TUNER_CAP_STEREO |
 			V4L2_TUNER_CAP_SAP;
 		t->rxsubchans = V4L2_TUNER_SUB_STEREO;
- 		if (1 == pilot) {
+		if (1 == pilot) {
 			/* SAP */
 			t->rxsubchans |= V4L2_TUNER_SUB_SAP;
 		}
@@ -787,13 +817,13 @@
 	case WW_A2_BG:
 	case WW_A2_DK:
 	case WW_A2_M:
- 		if (1 == pilot) {
+		if (1 == pilot) {
 			/* stereo */
 			t->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
 			if (0 == mode)
 				t->audmode = V4L2_TUNER_MODE_STEREO;
 		}
- 		if (2 == pilot) {
+		if (2 == pilot) {
 			/* dual language -- FIXME */
 			t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
 			t->audmode = V4L2_TUNER_MODE_LANG1;
@@ -805,16 +835,17 @@
 			t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
 		}
 		break;
-        case WW_SYSTEM_L_AM:
-                if (0x0 == mode && !(cx_read(AUD_INIT) & 0x04)) {
-                        t->audmode = V4L2_TUNER_MODE_STEREO;
+	case WW_SYSTEM_L_AM:
+		if (0x0 == mode && !(cx_read(AUD_INIT) & 0x04)) {
+			t->audmode = V4L2_TUNER_MODE_STEREO;
 			t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
 		}
-                break ;
+		break ;
 	default:
 		/* nothing */
 		break;
 	}
+# endif
 	return;
 }
 
@@ -835,16 +866,16 @@
 	case WW_BTSC:
 		switch (mode) {
 		case V4L2_TUNER_MODE_MONO:
-			ctl  = EN_BTSC_FORCE_MONO;
-			mask = 0x3f;
+			set_audio_standard_BTSC(core, 0, EN_BTSC_FORCE_MONO);
 			break;
-		case V4L2_TUNER_MODE_SAP:
-			ctl  = EN_BTSC_FORCE_SAP;
-			mask = 0x3f;
+		case V4L2_TUNER_MODE_LANG1:
+			set_audio_standard_BTSC(core, 0, EN_BTSC_AUTO_STEREO);
+			break;
+		case V4L2_TUNER_MODE_LANG2:
+			set_audio_standard_BTSC(core, 1, EN_BTSC_FORCE_SAP);
 			break;
 		case V4L2_TUNER_MODE_STEREO:
-			ctl  = EN_BTSC_AUTO_STEREO;
-			mask = 0x3f;
+			set_audio_standard_BTSC(core, 0, EN_BTSC_FORCE_STEREO);
 			break;
 		}
 		break;
@@ -854,16 +885,13 @@
 		switch (mode) {
 		case V4L2_TUNER_MODE_MONO:
 		case V4L2_TUNER_MODE_LANG1:
-			ctl  = EN_A2_FORCE_MONO1;
-			mask = 0x3f;
+		set_audio_standard_A2(core, EN_A2_FORCE_MONO1);
 			break;
 		case V4L2_TUNER_MODE_LANG2:
-			ctl  = EN_A2_AUTO_MONO2;
-			mask = 0x3f;
+		set_audio_standard_A2(core, EN_A2_FORCE_MONO2);
 			break;
 		case V4L2_TUNER_MODE_STEREO:
-			ctl  = EN_A2_AUTO_STEREO | EN_DMTRX_SUMR;
-			mask = 0x8bf;
+		set_audio_standard_A2(core, EN_A2_FORCE_STEREO);
 			break;
 		}
 		break;