浏览代码

[PATCH] v4l: msp3400 update

msp3400 update: Fix and enable "simpler" mode, some other minor fixes.

Signed-off-by: Gerd Knorr <kraxel@bytesex.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Gerd Knorr 20 年之前
父节点
当前提交
faf8b24968
共有 2 个文件被更改,包括 19 次插入11 次删除
  1. 18 10
      drivers/media/video/msp3400.c
  2. 1 1
      drivers/media/video/tvaudio.c

+ 18 - 10
drivers/media/video/msp3400.c

@@ -380,7 +380,9 @@ static void msp3400c_setvolume(struct i2c_client *client,
 	int val = 0, bal = 0;
 	int val = 0, bal = 0;
 
 
 	if (!muted) {
 	if (!muted) {
-		val = (volume * 0x7F / 65535) << 8;
+		/* 0x7f instead if 0x73 here has sound quality issues,
+		 * probably due to overmodulation + clipping ... */
+		val = (volume * 0x73 / 65535) << 8;
 	}
 	}
 	if (val) {
 	if (val) {
 		bal = (balance / 256) - 128;
 		bal = (balance / 256) - 128;
@@ -997,7 +999,13 @@ static int msp34xx_modus(int norm)
 {
 {
 	switch (norm) {
 	switch (norm) {
 	case VIDEO_MODE_PAL:
 	case VIDEO_MODE_PAL:
+#if 1
+		/* experimental: not sure this works with all chip versions */
+		return 0x7003;
+#else
+		/* previous value, try this if it breaks ... */
 		return 0x1003;
 		return 0x1003;
+#endif
 	case VIDEO_MODE_NTSC:  /* BTSC */
 	case VIDEO_MODE_NTSC:  /* BTSC */
 		return 0x2003;
 		return 0x2003;
 	case VIDEO_MODE_SECAM:
 	case VIDEO_MODE_SECAM:
@@ -1264,6 +1272,7 @@ static int msp34xxg_thread(void *data)
 	int val, std, i;
 	int val, std, i;
 
 
 	printk("msp34xxg: daemon started\n");
 	printk("msp34xxg: daemon started\n");
+	msp->source = 1; /* default */
 	for (;;) {
 	for (;;) {
 		d2printk(KERN_DEBUG "msp34xxg: thread: sleep\n");
 		d2printk(KERN_DEBUG "msp34xxg: thread: sleep\n");
 		msp34xx_sleep(msp,-1);
 		msp34xx_sleep(msp,-1);
@@ -1334,8 +1343,9 @@ static void msp34xxg_set_source(struct i2c_client *client, int source)
 
 
 	/* fix matrix mode to stereo and let the msp choose what
 	/* fix matrix mode to stereo and let the msp choose what
 	 * to output according to 'source', as recommended
 	 * to output according to 'source', as recommended
+	 * for MONO (source==0) downmixing set bit[7:0] to 0x30
 	 */
 	 */
-	int value = (source&0x07)<<8|(source==0 ? 0x00:0x20);
+	int value = (source&0x07)<<8|(source==0 ? 0x30:0x20);
 	dprintk("msp34xxg: set source to %d (0x%x)\n", source, value);
 	dprintk("msp34xxg: set source to %d (0x%x)\n", source, value);
 	msp3400c_write(client,
 	msp3400c_write(client,
 		       I2C_MSP3400C_DFP,
 		       I2C_MSP3400C_DFP,
@@ -1359,7 +1369,7 @@ static void msp34xxg_set_source(struct i2c_client *client, int source)
 	msp3400c_write(client,
 	msp3400c_write(client,
 		       I2C_MSP3400C_DEM,
 		       I2C_MSP3400C_DEM,
 		       0x22, /* a2 threshold for stereo/bilingual */
 		       0x22, /* a2 threshold for stereo/bilingual */
-		       source==0 ? 0x7f0:stereo_threshold);
+		       stereo_threshold);
 	msp->source=source;
 	msp->source=source;
 }
 }
 
 
@@ -1394,7 +1404,7 @@ static void msp34xxg_detect_stereo(struct i2c_client *client)
 static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
 static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
 {
 {
 	struct msp3400c *msp = i2c_get_clientdata(client);
 	struct msp3400c *msp = i2c_get_clientdata(client);
-	int source = 0;
+	int source;
 
 
 	switch (audmode) {
 	switch (audmode) {
 	case V4L2_TUNER_MODE_MONO:
 	case V4L2_TUNER_MODE_MONO:
@@ -1410,9 +1420,10 @@ static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
 	case V4L2_TUNER_MODE_LANG2:
 	case V4L2_TUNER_MODE_LANG2:
 		source=4; /* stereo or B */
 		source=4; /* stereo or B */
 		break;
 		break;
-	default: /* doing nothing: a safe, sane default */
+	default:
 		audmode = 0;
 		audmode = 0;
-		return;
+		source  = 1;
+		break;
 	}
 	}
 	msp->audmode = audmode;
 	msp->audmode = audmode;
 	msp34xxg_set_source(client, source);
 	msp34xxg_set_source(client, source);
@@ -1514,12 +1525,9 @@ static int msp_attach(struct i2c_adapter *adap, int addr, int kind)
 
 
 	msp->opmode = opmode;
 	msp->opmode = opmode;
 	if (OPMODE_AUTO == msp->opmode) {
 	if (OPMODE_AUTO == msp->opmode) {
-#if 0 /* seems to work for ivtv only, disable by default for now ... */
 		if (HAVE_SIMPLER(msp))
 		if (HAVE_SIMPLER(msp))
 			msp->opmode = OPMODE_SIMPLER;
 			msp->opmode = OPMODE_SIMPLER;
-		else
-#endif
-		if (HAVE_SIMPLE(msp))
+		else if (HAVE_SIMPLE(msp))
 			msp->opmode = OPMODE_SIMPLE;
 			msp->opmode = OPMODE_SIMPLE;
 		else
 		else
 			msp->opmode = OPMODE_MANUAL;
 			msp->opmode = OPMODE_MANUAL;

+ 1 - 1
drivers/media/video/tvaudio.c

@@ -991,7 +991,7 @@ static int tda9874a_initialize(struct CHIPSTATE *chip)
 {
 {
 	if (tda9874a_SIF > 2)
 	if (tda9874a_SIF > 2)
 		tda9874a_SIF = 1;
 		tda9874a_SIF = 1;
-	if (tda9874a_STD >= 8)
+	if (tda9874a_STD > 8)
 		tda9874a_STD = 0;
 		tda9874a_STD = 0;
 	if(tda9874a_AMSEL > 1)
 	if(tda9874a_AMSEL > 1)
 		tda9874a_AMSEL = 0;
 		tda9874a_AMSEL = 0;