[PATCH] Fix tm6010 audio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

I found why audio dosn't work for me and fix it.

2Stefan:
The V4L2_STD_DK has V4L2_STD_SECAM_DK but not equal 
switch-case statement not worked

you can use 
if (dev->norm & V4L2_STD_DK) { 
}

This patch fix this problem.

Other, please don't remove any workarounds without important reason.
For your chip revision it can be work but for other audio will be bad.

I can watch TV but radio not work. After start Gnomeradio I see 
VIDIOCGAUDIO incorrect
VIDIOCSAUDIO incorrect
VIDIOCSFREQ incorrect

Try found what happens with radio.

diff -r -U 3 tm6000.old/tm6000-core.c tm6000/tm6000-core.c
--- tm6000.old/tm6000-core.c	2011-08-29 14:16:01.000000000 +1000
+++ tm6000/tm6000-core.c	2011-11-08 02:31:48.000000000 +1000
@@ -640,11 +640,13 @@
 	if (dev->dev_type == TM6010) {
 		/* Audio crossbar setting, default SIF1 */
 		u8 areg_f0;
+		u8 areg_07 = 0x10;
 
 		switch (dev->rinput.amux) {
 		case TM6000_AMUX_SIF1:
 		case TM6000_AMUX_SIF2:
 			areg_f0 = 0x03;
+			areg_07 = 0x30;
 			break;
 		case TM6000_AMUX_ADC1:
 			areg_f0 = 0x00;
@@ -664,6 +666,9 @@
 		/* Set audio input crossbar */
 		tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 							areg_f0, 0x0f);
+		/* Mux overflow workaround */
+		tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+			areg_07, 0xf0);
 	} else {
 		u8 areg_eb;
 		/* Audio setting, default LINE1 */
diff -r -U 3 tm6000.old/tm6000-stds.c tm6000/tm6000-stds.c
--- tm6000.old/tm6000-stds.c	2011-08-29 14:16:01.000000000 +1000
+++ tm6000/tm6000-stds.c	2011-11-08 03:04:37.000000000 +1000
@@ -394,7 +394,14 @@
 		case V4L2_STD_SECAM_L:
 			areg_05 |= 0x00;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 |= 0x10;
 			break;
 		}
@@ -402,11 +409,23 @@
 	/* A2 */
 	case 1:
 		switch (dev->norm) {
-		case V4L2_STD_B:
-		case V4L2_STD_GH:
+		case V4L2_STD_PAL_B:
+		case V4L2_STD_PAL_B1:
+		case V4L2_STD_SECAM_B:
+		case V4L2_STD_PAL_G:
+		case V4L2_STD_PAL_H:
+		case V4L2_STD_SECAM_G:
+		case V4L2_STD_SECAM_H:
 			areg_05 = 0x05;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x09;
 			break;
 		}
@@ -414,11 +433,23 @@
 	/* NICAM */
 	case 2:
 		switch (dev->norm) {
-		case V4L2_STD_B:
-		case V4L2_STD_GH:
+		case V4L2_STD_PAL_B:
+		case V4L2_STD_PAL_B1:
+		case V4L2_STD_SECAM_B:
+		case V4L2_STD_PAL_G:
+		case V4L2_STD_PAL_H:
+		case V4L2_STD_SECAM_G:
+		case V4L2_STD_SECAM_H:
 			areg_05 = 0x07;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x06;
 			break;
 		case V4L2_STD_PAL_I:
@@ -435,7 +466,14 @@
 	case 3:
 		switch (dev->norm) {
 		/* DK3_A2 */
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x0b;
 			break;
 		/* Korea */
@@ -571,10 +609,16 @@
 		case TM6000_AMUX_ADC1:
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x00, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x10, 0xf0);
 			break;
 		case TM6000_AMUX_ADC2:
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x08, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x10, 0xf0);
 			break;
 		case TM6000_AMUX_SIF1:
 			reg_08_e2 |= 0x02;
@@ -584,6 +628,9 @@
 			tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3);
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x02, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x30, 0xf0);
 			break;
 		case TM6000_AMUX_SIF2:
 			reg_08_e2 |= 0x02;
@@ -593,6 +640,9 @@
 			tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf7);
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x02, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x30, 0xf0);
 			break;
 		default:
 			break;

Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@xxxxxxxxx>


With my best regards, Dmitry.
diff -r -U 3 tm6000.old/tm6000-core.c tm6000/tm6000-core.c
--- tm6000.old/tm6000-core.c	2011-08-29 14:16:01.000000000 +1000
+++ tm6000/tm6000-core.c	2011-11-08 02:31:48.000000000 +1000
@@ -640,11 +640,13 @@
 	if (dev->dev_type == TM6010) {
 		/* Audio crossbar setting, default SIF1 */
 		u8 areg_f0;
+		u8 areg_07 = 0x10;
 
 		switch (dev->rinput.amux) {
 		case TM6000_AMUX_SIF1:
 		case TM6000_AMUX_SIF2:
 			areg_f0 = 0x03;
+			areg_07 = 0x30;
 			break;
 		case TM6000_AMUX_ADC1:
 			areg_f0 = 0x00;
@@ -664,6 +666,9 @@
 		/* Set audio input crossbar */
 		tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 							areg_f0, 0x0f);
+		/* Mux overflow workaround */
+		tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+			areg_07, 0xf0);
 	} else {
 		u8 areg_eb;
 		/* Audio setting, default LINE1 */
diff -r -U 3 tm6000.old/tm6000-stds.c tm6000/tm6000-stds.c
--- tm6000.old/tm6000-stds.c	2011-08-29 14:16:01.000000000 +1000
+++ tm6000/tm6000-stds.c	2011-11-08 03:04:37.000000000 +1000
@@ -394,7 +394,14 @@
 		case V4L2_STD_SECAM_L:
 			areg_05 |= 0x00;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 |= 0x10;
 			break;
 		}
@@ -402,11 +409,23 @@
 	/* A2 */
 	case 1:
 		switch (dev->norm) {
-		case V4L2_STD_B:
-		case V4L2_STD_GH:
+		case V4L2_STD_PAL_B:
+		case V4L2_STD_PAL_B1:
+		case V4L2_STD_SECAM_B:
+		case V4L2_STD_PAL_G:
+		case V4L2_STD_PAL_H:
+		case V4L2_STD_SECAM_G:
+		case V4L2_STD_SECAM_H:
 			areg_05 = 0x05;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x09;
 			break;
 		}
@@ -414,11 +433,23 @@
 	/* NICAM */
 	case 2:
 		switch (dev->norm) {
-		case V4L2_STD_B:
-		case V4L2_STD_GH:
+		case V4L2_STD_PAL_B:
+		case V4L2_STD_PAL_B1:
+		case V4L2_STD_SECAM_B:
+		case V4L2_STD_PAL_G:
+		case V4L2_STD_PAL_H:
+		case V4L2_STD_SECAM_G:
+		case V4L2_STD_SECAM_H:
 			areg_05 = 0x07;
 			break;
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x06;
 			break;
 		case V4L2_STD_PAL_I:
@@ -435,7 +466,14 @@
 	case 3:
 		switch (dev->norm) {
 		/* DK3_A2 */
-		case V4L2_STD_DK:
+		case V4L2_STD_SECAM_D:
+		case V4L2_STD_SECAM_K:
+		case V4L2_STD_SECAM_K1:
+		case V4L2_STD_SECAM_DK:
+		case V4L2_STD_PAL_D:
+		case V4L2_STD_PAL_D1:
+		case V4L2_STD_PAL_K:
+		case V4L2_STD_PAL_DK:
 			areg_05 = 0x0b;
 			break;
 		/* Korea */
@@ -571,10 +609,16 @@
 		case TM6000_AMUX_ADC1:
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x00, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x10, 0xf0);
 			break;
 		case TM6000_AMUX_ADC2:
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x08, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x10, 0xf0);
 			break;
 		case TM6000_AMUX_SIF1:
 			reg_08_e2 |= 0x02;
@@ -584,6 +628,9 @@
 			tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3);
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x02, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x30, 0xf0);
 			break;
 		case TM6000_AMUX_SIF2:
 			reg_08_e2 |= 0x02;
@@ -593,6 +640,9 @@
 			tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf7);
 			tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG,
 				0x02, 0x0f);
+			/* Mux overflow workaround */
+			tm6000_set_reg_mask(dev, TM6010_REQ07_R07_OUTPUT_CONTROL,
+				0x30, 0xf0);
 			break;
 		default:
 			break;

Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@xxxxxxxxx>

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux