V4L/DVB (10278): cx18: Fix bad audio in first analog capture.
authorAndy Walls <awalls@radix.net>
Mon, 5 Jan 2009 00:51:17 +0000 (21:51 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:25 +0000 (12:42 -0300)
Normalize the APU state before the second firmware load so that audio
for the first analog capture is correct.

Many thanks to Conexant for supporting me in finding a solution for this
problem.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-driver.c
drivers/media/video/cx18/cx18-mailbox.c
drivers/media/video/cx18/cx23418.h

index 7e455fd..e161d29 100644 (file)
@@ -1043,8 +1043,21 @@ int cx18_init_on_first_open(struct cx18 *cx)
        }
        set_bit(CX18_F_I_LOADED_FW, &cx->i_flags);
 
-       /* Init the firmware twice to work around a silicon bug
-        * transport related. */
+       /*
+        * Init the firmware twice to work around a silicon bug
+        * with the digital TS.
+        *
+        * The second firmware load requires us to normalize the APU state,
+        * or the audio for the first analog capture will be badly incorrect.
+        *
+        * I can't seem to call APU_RESETAI and have it succeed without the
+        * APU capturing audio, so we start and stop it here to do the reset
+        */
+
+       /* MPEG Encoding, 224 kbps, MPEG Layer II, 48 ksps */
+       cx18_vapi(cx, CX18_APU_START, 2, CX18_APU_ENCODING_METHOD_MPEG|0xb9, 0);
+       cx18_vapi(cx, CX18_APU_RESETAI, 0);
+       cx18_vapi(cx, CX18_APU_STOP, 1, CX18_APU_ENCODING_METHOD_MPEG);
 
        fw_retry_count = 3;
        while (--fw_retry_count > 0) {
index 89c0331..2226e57 100644 (file)
@@ -83,6 +83,8 @@ static const struct cx18_api_info api_info[] = {
        API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK,                 0),
        API_ENTRY(CPU, CX18_CPU_DE_SET_MDL,                     API_FAST),
        API_ENTRY(CPU, CX18_CPU_DE_RELEASE_MDL,                 API_SLOW),
+       API_ENTRY(APU, CX18_APU_START,                          0),
+       API_ENTRY(APU, CX18_APU_STOP,                           0),
        API_ENTRY(APU, CX18_APU_RESETAI,                        0),
        API_ENTRY(CPU, CX18_CPU_DEBUG_PEEK32,                   0),
        API_ENTRY(0, 0,                                         0),
index 601f3a2..9956abf 100644 (file)
 #define APU_CMD_MASK                           0x10000000
 #define APU_CMD_MASK_ACK                       (APU_CMD_MASK | 0x80000000)
 
+#define CX18_APU_ENCODING_METHOD_MPEG          (0 << 28)
+#define CX18_APU_ENCODING_METHOD_AC3           (1 << 28)
+
+/* Description: Command APU to start audio
+   IN[0] - audio parameters (same as CX18_CPU_SET_AUDIO_PARAMETERS?)
+   IN[1] - caller buffer address, or 0
+   ReturnCode - ??? */
+#define CX18_APU_START                         (APU_CMD_MASK | 0x01)
+
+/* Description: Command APU to stop audio
+   IN[0] - encoding method to stop
+   ReturnCode - ??? */
+#define CX18_APU_STOP                          (APU_CMD_MASK | 0x02)
+
+/* Description: Command APU to reset the AI
+   ReturnCode - ??? */
 #define CX18_APU_RESETAI                       (APU_CMD_MASK | 0x05)
 
 /* Description: This command indicates that a Memory Descriptor List has been