diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/audio/as3514.c | 85 |
1 files changed, 46 insertions, 39 deletions
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c index 11adddc0f1..9255828f75 100644 --- a/firmware/drivers/audio/as3514.c +++ b/firmware/drivers/audio/as3514.c | |||
@@ -38,12 +38,29 @@ | |||
38 | * as3543 , as used in the as3525v2 targets | 38 | * as3543 , as used in the as3525v2 targets |
39 | */ | 39 | */ |
40 | 40 | ||
41 | #if CONFIG_CPU == AS3525 | ||
41 | /* AMS Sansas based on the AS3525 use the LINE2 input for the analog radio | 42 | /* AMS Sansas based on the AS3525 use the LINE2 input for the analog radio |
42 | signal instead of LINE1 */ | 43 | signal instead of LINE1 */ |
43 | #if CONFIG_CPU == AS3525 | 44 | #define AS3514_LINE_IN_R AS3514_LINE_IN2_R |
44 | #define LINE_INPUT 2 | 45 | #define AS3514_LINE_IN_L AS3514_LINE_IN2_L |
45 | #else | 46 | #define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2 |
46 | #define LINE_INPUT 1 | 47 | #define AUDIOSET1_LIN_on AUDIOSET1_LIN2_on |
48 | |||
49 | #elif CONFIG_CPU == AS3525v2 | ||
50 | /* There is only 1 pair of registers on AS3543, the line input is selectable in | ||
51 | LINE_IN_R register */ | ||
52 | #define AS3514_LINE_IN_R AS3514_LINE_IN1_R | ||
53 | #define AS3514_LINE_IN_L AS3514_LINE_IN1_L | ||
54 | #define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2 | ||
55 | #define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on | ||
56 | |||
57 | #else /* PP use line1 */ | ||
58 | |||
59 | #define AS3514_LINE_IN_R AS3514_LINE_IN1_R | ||
60 | #define AS3514_LINE_IN_L AS3514_LINE_IN1_L | ||
61 | #define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN1 | ||
62 | #define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on | ||
63 | |||
47 | #endif | 64 | #endif |
48 | 65 | ||
49 | const struct sound_settings_info audiohw_settings[] = { | 66 | const struct sound_settings_info audiohw_settings[] = { |
@@ -177,22 +194,22 @@ void audiohw_preinit(void) | |||
177 | as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_off); | 194 | as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_off); |
178 | #endif | 195 | #endif |
179 | 196 | ||
180 | #if CONFIG_CPU != AS3525v2 | 197 | #ifdef HAVE_AS3543 |
198 | as3514_clear(AS3543_DAC_IF, 0x80); | ||
199 | as3514_set(AS3514_LINE_IN1_R, LINE_IN_R_LINE_SELECT); /* Line 2 */ | ||
200 | #else | ||
181 | /* Mute and disable speaker */ | 201 | /* Mute and disable speaker */ |
182 | as3514_write(AS3514_LSP_OUT_R, LSP_OUT_R_SP_OVC_TO_256MS | 0x00); | 202 | as3514_write(AS3514_LSP_OUT_R, LSP_OUT_R_SP_OVC_TO_256MS | 0x00); |
183 | as3514_write(AS3514_LSP_OUT_L, LSP_OUT_L_SP_MUTE | 0x00); | 203 | as3514_write(AS3514_LSP_OUT_L, LSP_OUT_L_SP_MUTE | 0x00); |
184 | #else | ||
185 | as3514_clear(AS3543_DAC_IF, 0x80); | ||
186 | as3514_set(AS3514_LINE_IN1_R, 1<<6); // Select Line-in 2 | ||
187 | #endif | 204 | #endif |
188 | 205 | ||
189 | #if CONFIG_CPU != AS3525v2 | 206 | #ifdef HAVE_AS3543 |
207 | as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC | | ||
208 | 0x00); | ||
209 | #else | ||
190 | /* Set headphone over-current to 0, Min volume */ | 210 | /* Set headphone over-current to 0, Min volume */ |
191 | as3514_write(AS3514_HPH_OUT_R, | 211 | as3514_write(AS3514_HPH_OUT_R, |
192 | HPH_OUT_R_HP_OVC_TO_0MS | 0x00); | 212 | HPH_OUT_R_HP_OVC_TO_0MS | 0x00); |
193 | #else | ||
194 | as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC | | ||
195 | 0x00); | ||
196 | #endif | 213 | #endif |
197 | /* Headphone ON, MUTE, Min volume */ | 214 | /* Headphone ON, MUTE, Min volume */ |
198 | as3514_write(AS3514_HPH_OUT_L, | 215 | as3514_write(AS3514_HPH_OUT_L, |
@@ -211,8 +228,10 @@ void audiohw_preinit(void) | |||
211 | 228 | ||
212 | /* M1_Sup_off */ | 229 | /* M1_Sup_off */ |
213 | as3514_set(AS3514_MIC1_L, MIC1_L_M1_SUP_off); | 230 | as3514_set(AS3514_MIC1_L, MIC1_L_M1_SUP_off); |
231 | #ifndef HAVE_AS3543 | ||
214 | /* M2_Sup_off */ | 232 | /* M2_Sup_off */ |
215 | as3514_set(AS3514_MIC2_L, MIC2_L_M2_SUP_off); | 233 | as3514_set(AS3514_MIC2_L, MIC2_L_M2_SUP_off); |
234 | #endif | ||
216 | } | 235 | } |
217 | 236 | ||
218 | void audiohw_postinit(void) | 237 | void audiohw_postinit(void) |
@@ -257,12 +276,8 @@ void audiohw_set_master_vol(int vol_l, int vol_r) | |||
257 | as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK); | 276 | as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK); |
258 | as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK); | 277 | as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK); |
259 | #if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN) | 278 | #if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN) |
260 | as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : | 279 | as3514_write_masked(AS3514_LINE_IN_R, mix_r, AS3514_VOL_MASK); |
261 | AS3514_LINE_IN2_R, | 280 | as3514_write_masked(AS3514_LINE_IN_L, mix_l, AS3514_VOL_MASK); |
262 | mix_r, AS3514_VOL_MASK); | ||
263 | as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_L : | ||
264 | AS3514_LINE_IN2_L, | ||
265 | mix_l, AS3514_VOL_MASK); | ||
266 | #endif | 281 | #endif |
267 | as3514_write_masked(AS3514_HPH_OUT_R, hph_r, AS3514_VOL_MASK); | 282 | as3514_write_masked(AS3514_HPH_OUT_R, hph_r, AS3514_VOL_MASK); |
268 | as3514_write_masked(AS3514_HPH_OUT_L, hph_l, AS3514_VOL_MASK); | 283 | as3514_write_masked(AS3514_HPH_OUT_L, hph_l, AS3514_VOL_MASK); |
@@ -278,13 +293,13 @@ void audiohw_mute(bool mute) | |||
278 | { | 293 | { |
279 | if (mute) { | 294 | if (mute) { |
280 | as3514_set(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); | 295 | as3514_set(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); |
281 | #if CONFIG_CPU == AS3525v2 | 296 | #ifdef HAVE_AS3543 |
282 | as3514_set(AS3543_DAC_IF, 0x80); | 297 | as3514_set(AS3543_DAC_IF, 0x80); |
283 | #endif | 298 | #endif |
284 | 299 | ||
285 | } else { | 300 | } else { |
286 | as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); | 301 | as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); |
287 | #if CONFIG_CPU == AS3525v2 | 302 | #ifdef HAVE_AS3543 |
288 | as3514_clear(AS3543_DAC_IF, 0x80); | 303 | as3514_clear(AS3543_DAC_IF, 0x80); |
289 | #endif | 304 | #endif |
290 | } | 305 | } |
@@ -307,7 +322,7 @@ void audiohw_close(void) | |||
307 | as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON); | 322 | as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON); |
308 | as3514_write(AS3514_AUDIOSET1, 0x0); | 323 | as3514_write(AS3514_AUDIOSET1, 0x0); |
309 | 324 | ||
310 | #if CONFIG_CPU == AS3525v2 | 325 | #ifdef HAVE_AS3543 |
311 | as3514_set(AS3543_DAC_IF, 0x80); | 326 | as3514_set(AS3543_DAC_IF, 0x80); |
312 | #endif | 327 | #endif |
313 | 328 | ||
@@ -336,15 +351,11 @@ void audiohw_enable_recording(bool source_mic) | |||
336 | as3514_clear(AS3514_MIC1_R, MIC1_R_M1_AGC_off); | 351 | as3514_clear(AS3514_MIC1_R, MIC1_R_M1_AGC_off); |
337 | } else { | 352 | } else { |
338 | /* ADCmux = Line_IN1 or Line_IN2 */ | 353 | /* ADCmux = Line_IN1 or Line_IN2 */ |
339 | as3514_write_masked(AS3514_ADC_R, | 354 | as3514_write_masked(AS3514_ADC_R, ADC_R_ADCMUX_LINE_IN, |
340 | (LINE_INPUT == 1) ? ADC_R_ADCMUX_LINE_IN1 : | ||
341 | ADC_R_ADCMUX_LINE_IN2, | ||
342 | ADC_R_ADCMUX); | 355 | ADC_R_ADCMUX); |
343 | 356 | ||
344 | /* LIN1_or LIN2 on, rest off */ | 357 | /* LIN1_or LIN2 on, rest off */ |
345 | as3514_write_masked(AS3514_AUDIOSET1, | 358 | as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on, |
346 | (LINE_INPUT == 1) ? AUDIOSET1_LIN1_on : | ||
347 | AUDIOSET1_LIN2_on, | ||
348 | AUDIOSET1_INPUT_MASK); | 359 | AUDIOSET1_INPUT_MASK); |
349 | } | 360 | } |
350 | 361 | ||
@@ -422,16 +433,12 @@ void audiohw_set_monitor(bool enable) | |||
422 | { | 433 | { |
423 | if (enable) { | 434 | if (enable) { |
424 | /* select either LIN1 or LIN2 */ | 435 | /* select either LIN1 or LIN2 */ |
425 | as3514_write_masked(AS3514_AUDIOSET1, | 436 | as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on, |
426 | (LINE_INPUT == 1) ? | ||
427 | AUDIOSET1_LIN1_on : AUDIOSET1_LIN2_on, | ||
428 | AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); | 437 | AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); |
429 | as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : AS3514_LINE_IN2_R, | 438 | as3514_set(AS3514_LINE_IN_R, LINE_IN1_R_LI1R_MUTE_off); |
430 | LINE_IN1_R_LI1R_MUTE_off); | 439 | as3514_set(AS3514_LINE_IN_L, LINE_IN1_L_LI1L_MUTE_off); |
431 | as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_L : AS3514_LINE_IN2_L, | ||
432 | LINE_IN1_L_LI1L_MUTE_off); | ||
433 | 440 | ||
434 | #if CONFIG_CPU == AS3525v2 | 441 | #ifdef HAVE_AS3543 |
435 | as3514_write_masked(AS3514_HPH_OUT_R, | 442 | as3514_write_masked(AS3514_HPH_OUT_R, |
436 | HPH_OUT_R_HP_OUT_LINE, HPH_OUT_R_HP_OUT_MASK); | 443 | HPH_OUT_R_HP_OUT_LINE, HPH_OUT_R_HP_OUT_MASK); |
437 | #endif | 444 | #endif |
@@ -440,12 +447,12 @@ void audiohw_set_monitor(bool enable) | |||
440 | /* turn off both LIN1 and LIN2 */ | 447 | /* turn off both LIN1 and LIN2 */ |
441 | as3514_clear(AS3514_LINE_IN1_R, LINE_IN1_R_LI1R_MUTE_off); | 448 | as3514_clear(AS3514_LINE_IN1_R, LINE_IN1_R_LI1R_MUTE_off); |
442 | as3514_clear(AS3514_LINE_IN1_L, LINE_IN1_L_LI1L_MUTE_off); | 449 | as3514_clear(AS3514_LINE_IN1_L, LINE_IN1_L_LI1L_MUTE_off); |
443 | #if CONFIG_CPU != AS3525v2 /* not in as3543 */ | 450 | #ifdef HAVE_AS3543 |
444 | as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off); | ||
445 | as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off); | ||
446 | #else | ||
447 | as3514_write_masked(AS3514_HPH_OUT_R, | 451 | as3514_write_masked(AS3514_HPH_OUT_R, |
448 | HPH_OUT_R_HP_OUT_DAC, HPH_OUT_R_HP_OUT_MASK); | 452 | HPH_OUT_R_HP_OUT_DAC, HPH_OUT_R_HP_OUT_MASK); |
453 | #else | ||
454 | as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off); | ||
455 | as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off); | ||
449 | #endif | 456 | #endif |
450 | as3514_clear(AS3514_AUDIOSET1, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); | 457 | as3514_clear(AS3514_AUDIOSET1, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); |
451 | } | 458 | } |