V4L/DVB (3663): Fix msp3400c wait time and better audio mode fallbacks

- The wait time until the first time the audio mode was detected was
  1+5=6 seconds instead of just 1 second (wrong statement order).
  msp3400c specific bug.
- Implemented audio mode fallback for msp3400c/d just like the msp3400g
  does automatically. E.g. fallback to stereo if no second language exists,
  etc.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c
index c3984ea..2ee596d 100644
--- a/drivers/media/video/msp3400-kthreads.c
+++ b/drivers/media/video/msp3400-kthreads.c
@@ -228,6 +228,7 @@
 	char *modestr = (state->audmode >= 0 && state->audmode < 5) ?
 		strmode[state->audmode] : "unknown";
 	int src = 0;	/* channel source: FM/AM, nicam or SCART */
+	int audmode = state->audmode;
 
 	if (state->opmode == OPMODE_AUTOSELECT) {
 		/* this method would break everything, let's make sure
@@ -239,11 +240,22 @@
 		return;
 	}
 
+	/* If no second language is available, switch to the first language */
+	if ((audmode == V4L2_TUNER_MODE_LANG2 ||
+	     audmode == V4L2_TUNER_MODE_LANG1_LANG2) &&
+	    !(state->rxsubchans & V4L2_TUNER_SUB_LANG2))
+		audmode = V4L2_TUNER_MODE_LANG1;
+	/* switch to stereo for stereo transmission, otherwise
+	   keep first language */
+	if (audmode == V4L2_TUNER_MODE_LANG1 &&
+	    (state->rxsubchans & V4L2_TUNER_SUB_STEREO))
+		audmode = V4L2_TUNER_MODE_STEREO;
+
 	/* switch demodulator */
 	switch (state->mode) {
 	case MSP_MODE_FM_TERRA:
 		v4l_dbg(1, msp_debug, client, "FM set_audmode: %s\n", modestr);
-		switch (state->audmode) {
+		switch (audmode) {
 		case V4L2_TUNER_MODE_STEREO:
 			msp_write_dsp(client, 0x000e, 0x3001);
 			break;
@@ -257,7 +269,7 @@
 		break;
 	case MSP_MODE_FM_SAT:
 		v4l_dbg(1, msp_debug, client, "SAT set_audmode: %s\n", modestr);
-		switch (state->audmode) {
+		switch (audmode) {
 		case V4L2_TUNER_MODE_MONO:
 			msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
 			break;
@@ -296,7 +308,7 @@
 	}
 
 	/* switch audio */
-	switch (state->audmode) {
+	switch (audmode) {
 	case V4L2_TUNER_MODE_STEREO:
 	case V4L2_TUNER_MODE_LANG1_LANG2:
 		src |= 0x0020;
@@ -314,10 +326,6 @@
 			src = 0x0030;
 		break;
 	case V4L2_TUNER_MODE_LANG1:
-		/* switch to stereo for stereo transmission, otherwise
-		   keep first language */
-		if (state->rxsubchans & V4L2_TUNER_SUB_STEREO)
-			src |= 0x0020;
 		break;
 	case V4L2_TUNER_MODE_LANG2:
 		src |= 0x0010;
@@ -612,9 +620,9 @@
 		if (msp_sleep(state, 1000))
 			goto restart;
 		while (state->watch_stereo) {
+			watch_stereo(client);
 			if (msp_sleep(state, 5000))
 				goto restart;
-			watch_stereo(client);
 		}
 	}
 	v4l_dbg(1, msp_debug, client, "thread: exit\n");