summaryrefslogtreecommitdiff
path: root/firmware/drivers/tlv320.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/tlv320.c')
-rw-r--r--firmware/drivers/tlv320.c31
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
214void tlv320_disable_recording() 214void 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
230void tlv320_set_monitor(bool enable) 230void 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);