diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/tlv320.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/firmware/drivers/tlv320.c b/firmware/drivers/tlv320.c index 5be7facdd2..abce31ef81 100644 --- a/firmware/drivers/tlv320.c +++ b/firmware/drivers/tlv320.c | |||
@@ -51,13 +51,13 @@ void tlv320_write_reg(unsigned reg, unsigned value) | |||
51 | 51 | ||
52 | /* The register address is the high 7 bits and the data the low 9 bits */ | 52 | /* The register address is the high 7 bits and the data the low 9 bits */ |
53 | data[0] = (reg << 1) | ((value >> 8) & 1); | 53 | data[0] = (reg << 1) | ((value >> 8) & 1); |
54 | data[1] = value; | 54 | data[1] = value; |
55 | 55 | ||
56 | if (i2c_write(I2C_IFACE_0, TLV320_ADDR, data, 2) != 2) | 56 | if (i2c_write(I2C_IFACE_0, TLV320_ADDR, data, 2) != 2) |
57 | { | 57 | { |
58 | logf("tlv320 error reg=0x%x", reg); | 58 | logf("tlv320 error reg=0x%x", reg); |
59 | return; | 59 | return; |
60 | } | 60 | } |
61 | 61 | ||
62 | tlv320_regs[reg] = value; | 62 | tlv320_regs[reg] = value; |
63 | } | 63 | } |
@@ -135,19 +135,19 @@ void tlv320_set_recvol(int left, int right, int type) | |||
135 | if (type == AUDIO_GAIN_MIC) | 135 | if (type == AUDIO_GAIN_MIC) |
136 | { | 136 | { |
137 | unsigned value_aap = tlv320_regs[REG_AAP]; | 137 | unsigned value_aap = tlv320_regs[REG_AAP]; |
138 | 138 | ||
139 | if (left) | 139 | if (left) |
140 | value_aap |= AAP_MICB; /* Enable mic boost (20dB) */ | 140 | value_aap |= AAP_MICB; /* Enable mic boost (20dB) */ |
141 | else | 141 | else |
142 | value_aap &= ~AAP_MICB; | 142 | value_aap &= ~AAP_MICB; |
143 | 143 | ||
144 | tlv320_write_reg(REG_AAP, value_aap); | 144 | tlv320_write_reg(REG_AAP, value_aap); |
145 | 145 | ||
146 | } | 146 | } |
147 | else if (type == AUDIO_GAIN_LINEIN) | 147 | else if (type == AUDIO_GAIN_LINEIN) |
148 | { | 148 | { |
149 | tlv320_write_reg(REG_LLIV, LLIV_LIV(left)); | 149 | tlv320_write_reg(REG_LLIV, LLIV_LIV(left)); |
150 | tlv320_write_reg(REG_RLIV, RLIV_RIV(right)); | 150 | tlv320_write_reg(REG_RLIV, RLIV_RIV(right)); |
151 | } | 151 | } |
152 | } | 152 | } |
153 | 153 | ||
@@ -190,11 +190,11 @@ void tlv320_enable_recording(bool source_mic) | |||
190 | { | 190 | { |
191 | unsigned value_daif = tlv320_regs[REG_DAIF]; | 191 | unsigned value_daif = tlv320_regs[REG_DAIF]; |
192 | unsigned value_aap, value_pc; | 192 | unsigned value_aap, value_pc; |
193 | 193 | ||
194 | if (source_mic) | 194 | if (source_mic) |
195 | { | 195 | { |
196 | /* select MIC and enable mic boost (20 dB) */ | 196 | /* select MIC and enable mic boost (20 dB) */ |
197 | value_aap = AAP_DAC | AAP_INSEL | AAP_MICB; | 197 | value_aap = AAP_DAC | AAP_INSEL | AAP_MICB; |
198 | value_pc = PC_LINE; /* power down LINE */ | 198 | value_pc = PC_LINE; /* power down LINE */ |
199 | } | 199 | } |
200 | else | 200 | else |
@@ -207,10 +207,10 @@ void tlv320_enable_recording(bool source_mic) | |||
207 | tlv320_write_reg(REG_AAP, value_aap); | 207 | tlv320_write_reg(REG_AAP, value_aap); |
208 | 208 | ||
209 | /* Enable MASTER mode (start sending I2S data to the CPU) */ | 209 | /* Enable MASTER mode (start sending I2S data to the CPU) */ |
210 | value_daif |= DAIF_MS; | 210 | value_daif |= DAIF_MS; |
211 | tlv320_write_reg(REG_DAIF, value_daif); | 211 | tlv320_write_reg(REG_DAIF, value_daif); |
212 | } | 212 | } |
213 | 213 | ||
214 | void tlv320_disable_recording() | 214 | void tlv320_disable_recording() |
215 | { | 215 | { |
216 | unsigned value_pc = tlv320_regs[REG_PC]; | 216 | unsigned value_pc = tlv320_regs[REG_PC]; |
@@ -219,12 +219,12 @@ void tlv320_disable_recording() | |||
219 | 219 | ||
220 | value_daif &= ~DAIF_MS; /* disable MASTER mode */ | 220 | value_daif &= ~DAIF_MS; /* disable MASTER mode */ |
221 | tlv320_write_reg(REG_DAIF, value_daif); | 221 | tlv320_write_reg(REG_DAIF, value_daif); |
222 | 222 | ||
223 | value_aap |= AAP_MICM; /* mute MIC */ | 223 | value_aap |= AAP_MICM; /* mute MIC */ |
224 | tlv320_write_reg(REG_PC, value_aap); | 224 | tlv320_write_reg(REG_PC, value_aap); |
225 | 225 | ||
226 | value_pc |= PC_ADC | PC_MIC | PC_LINE; /* ADC, MIC and LINE off */ | 226 | value_pc |= PC_ADC | PC_MIC | PC_LINE; /* ADC, MIC and LINE off */ |
227 | tlv320_write_reg(REG_PC, value_pc); | 227 | tlv320_write_reg(REG_PC, value_pc); |
228 | } | 228 | } |
229 | 229 | ||
230 | void tlv320_set_monitor(bool enable) | 230 | void tlv320_set_monitor(bool enable) |
@@ -233,13 +233,14 @@ void tlv320_set_monitor(bool enable) | |||
233 | 233 | ||
234 | if (enable) | 234 | if (enable) |
235 | { | 235 | { |
236 | value_aap = AAP_BYPASS | AAP_MICM; | 236 | /* Keep DAC on to allow mixing of voice with analog audio */ |
237 | value_pc = PC_DAC | PC_ADC | PC_MIC; /* DAC, ADC and MIC off */ | 237 | value_aap = AAP_DAC | AAP_BYPASS | AAP_MICM; |
238 | value_pc = PC_ADC | PC_MIC; /* ADC and MIC off */ | ||
238 | } | 239 | } |
239 | else | 240 | else |
240 | { | 241 | { |
241 | value_aap = AAP_DAC | AAP_MICM; | 242 | value_aap = AAP_DAC | AAP_MICM; |
242 | value_pc = PC_ADC | PC_MIC | PC_LINE; /* ADC, MIC and LINE off */ | 243 | value_pc = PC_ADC | PC_MIC | PC_LINE; /* ADC, MIC and LINE off */ |
243 | } | 244 | } |
244 | 245 | ||
245 | tlv320_write_reg(REG_AAP, value_aap); | 246 | tlv320_write_reg(REG_AAP, value_aap); |