diff options
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.c | 17 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-mailbox.c | 2 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx23418.h | 16 |
3 files changed, 33 insertions, 2 deletions
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 7e455fdcf774..e161d29beb70 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -1043,8 +1043,21 @@ int cx18_init_on_first_open(struct cx18 *cx) | |||
1043 | } | 1043 | } |
1044 | set_bit(CX18_F_I_LOADED_FW, &cx->i_flags); | 1044 | set_bit(CX18_F_I_LOADED_FW, &cx->i_flags); |
1045 | 1045 | ||
1046 | /* Init the firmware twice to work around a silicon bug | 1046 | /* |
1047 | * transport related. */ | 1047 | * Init the firmware twice to work around a silicon bug |
1048 | * with the digital TS. | ||
1049 | * | ||
1050 | * The second firmware load requires us to normalize the APU state, | ||
1051 | * or the audio for the first analog capture will be badly incorrect. | ||
1052 | * | ||
1053 | * I can't seem to call APU_RESETAI and have it succeed without the | ||
1054 | * APU capturing audio, so we start and stop it here to do the reset | ||
1055 | */ | ||
1056 | |||
1057 | /* MPEG Encoding, 224 kbps, MPEG Layer II, 48 ksps */ | ||
1058 | cx18_vapi(cx, CX18_APU_START, 2, CX18_APU_ENCODING_METHOD_MPEG|0xb9, 0); | ||
1059 | cx18_vapi(cx, CX18_APU_RESETAI, 0); | ||
1060 | cx18_vapi(cx, CX18_APU_STOP, 1, CX18_APU_ENCODING_METHOD_MPEG); | ||
1048 | 1061 | ||
1049 | fw_retry_count = 3; | 1062 | fw_retry_count = 3; |
1050 | while (--fw_retry_count > 0) { | 1063 | while (--fw_retry_count > 0) { |
diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c index 89c033112e1f..2226e5791e99 100644 --- a/drivers/media/video/cx18/cx18-mailbox.c +++ b/drivers/media/video/cx18/cx18-mailbox.c | |||
@@ -83,6 +83,8 @@ static const struct cx18_api_info api_info[] = { | |||
83 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0), | 83 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0), |
84 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST), | 84 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST), |
85 | API_ENTRY(CPU, CX18_CPU_DE_RELEASE_MDL, API_SLOW), | 85 | API_ENTRY(CPU, CX18_CPU_DE_RELEASE_MDL, API_SLOW), |
86 | API_ENTRY(APU, CX18_APU_START, 0), | ||
87 | API_ENTRY(APU, CX18_APU_STOP, 0), | ||
86 | API_ENTRY(APU, CX18_APU_RESETAI, 0), | 88 | API_ENTRY(APU, CX18_APU_RESETAI, 0), |
87 | API_ENTRY(CPU, CX18_CPU_DEBUG_PEEK32, 0), | 89 | API_ENTRY(CPU, CX18_CPU_DEBUG_PEEK32, 0), |
88 | API_ENTRY(0, 0, 0), | 90 | API_ENTRY(0, 0, 0), |
diff --git a/drivers/media/video/cx18/cx23418.h b/drivers/media/video/cx18/cx23418.h index 601f3a2ab742..9956abf576c5 100644 --- a/drivers/media/video/cx18/cx23418.h +++ b/drivers/media/video/cx18/cx23418.h | |||
@@ -56,6 +56,22 @@ | |||
56 | #define APU_CMD_MASK 0x10000000 | 56 | #define APU_CMD_MASK 0x10000000 |
57 | #define APU_CMD_MASK_ACK (APU_CMD_MASK | 0x80000000) | 57 | #define APU_CMD_MASK_ACK (APU_CMD_MASK | 0x80000000) |
58 | 58 | ||
59 | #define CX18_APU_ENCODING_METHOD_MPEG (0 << 28) | ||
60 | #define CX18_APU_ENCODING_METHOD_AC3 (1 << 28) | ||
61 | |||
62 | /* Description: Command APU to start audio | ||
63 | IN[0] - audio parameters (same as CX18_CPU_SET_AUDIO_PARAMETERS?) | ||
64 | IN[1] - caller buffer address, or 0 | ||
65 | ReturnCode - ??? */ | ||
66 | #define CX18_APU_START (APU_CMD_MASK | 0x01) | ||
67 | |||
68 | /* Description: Command APU to stop audio | ||
69 | IN[0] - encoding method to stop | ||
70 | ReturnCode - ??? */ | ||
71 | #define CX18_APU_STOP (APU_CMD_MASK | 0x02) | ||
72 | |||
73 | /* Description: Command APU to reset the AI | ||
74 | ReturnCode - ??? */ | ||
59 | #define CX18_APU_RESETAI (APU_CMD_MASK | 0x05) | 75 | #define CX18_APU_RESETAI (APU_CMD_MASK | 0x05) |
60 | 76 | ||
61 | /* Description: This command indicates that a Memory Descriptor List has been | 77 | /* Description: This command indicates that a Memory Descriptor List has been |