From fb373e1f50e8362ccff0db5b8818fbc0dca85b4c Mon Sep 17 00:00:00 2001 From: Szymon Dziok Date: Sat, 12 Jul 2014 16:31:44 +0000 Subject: Ak4537: Optimization of the code. Change-Id: I98e25d7177b24b277a79d8bf8d494dac26553c2c --- firmware/drivers/audio/ak4537.c | 138 ++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 76 deletions(-) diff --git a/firmware/drivers/audio/ak4537.c b/firmware/drivers/audio/ak4537.c index a42b1346d2..67ce9e3ed9 100644 --- a/firmware/drivers/audio/ak4537.c +++ b/firmware/drivers/audio/ak4537.c @@ -221,120 +221,106 @@ void audiohw_set_frequency(int fsel) } #if defined(HAVE_RECORDING) -void audiohw_set_recsrc(int source) + +void akc_disable_mic(void) { - switch(source) - { - case AUDIO_SRC_PLAYBACK: /* disable mic power supply */ #if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) akc_clear(AK4537_MIC, MPWRE); #else akc_clear(AK4537_MIC, MPWRI); #endif - /* power down ADC, mic preamp and line amp */ - akc_clear(AK4537_PM1, PMADL | PMMICL | PMIPGL); - akc_clear(AK4537_PM3, PMADR | PMMICR | PMIPGR); - - /* break ADC -> DAC connection */ - akc_clear(AK4537_MODE2, LOOP); - - break; + /* power down mic preamp */ + akc_clear(AK4537_PM1, PMMICL); + akc_clear(AK4537_PM3, PMMICR); +} -#if (INPUT_SRC_CAPS & SRC_CAP_FMRADIO) - case AUDIO_SRC_FMRADIO: - /* disable mic power supply */ +void akc_enable_mic(void) +{ + /* enable mic power supply */ #if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) - akc_clear(AK4537_MIC, MPWRE); + /* additionally select external mic */ + akc_set(AK4537_MIC, MPWRE | MSEL); #else - akc_clear(AK4537_MIC, MPWRI); + akc_set(AK4537_MIC, MPWRI); #endif - /* disable mic preamp */ - akc_clear(AK4537_PM1, PMMICL); + /* power up mic preamp */ + akc_set(AK4537_PM1, PMMICL); +} - /* Select line2 input: Radio */ - akc_set(AK4537_PM3, INL | INR); +void akc_setup_input(unsigned linesel, unsigned gcontrol) +{ + /* select line1 or line2 input */ + akc_write_masked(AK4537_PM3, linesel, INL | INR); /* route ALC output to ADC input */ akc_set(AK4537_MIC, MICAD); /* set ALC (automatic level control) to manual mode */ akc_clear(AK4537_ALC1, ALC1); - - /* set gain control to independent left & right gain */ - akc_set(AK4537_MIC, IPGAC); - - /* power up left channel input and ADC */ + /* set gain control to dependent or independent left & right */ + akc_write_masked(AK4537_MIC, gcontrol, IPGAC); + /* power up left channel ADC and line in */ akc_set(AK4537_PM1, PMADL | PMIPGL); - /* power up right channel input and ADC */ + /* power up right channel ADC and line in */ akc_set(AK4537_PM3, PMADR | PMIPGR); + /* ADC -> DAC, external data to DAC ignored */ + akc_set(AK4537_MODE2, LOOP); +} + +void audiohw_set_recsrc(int source) +{ + switch(source) + { + case AUDIO_SRC_PLAYBACK: + + /* disable microphone */ + akc_disable_mic(); + + /* power down ADC and line amp */ + akc_clear(AK4537_PM1, PMADL | PMIPGL); + akc_clear(AK4537_PM3, PMADR | PMIPGR); + + /* break ADC -> DAC connection */ + akc_clear(AK4537_MODE2, LOOP); + + break; + +#if (INPUT_SRC_CAPS & SRC_CAP_FMRADIO) + case AUDIO_SRC_FMRADIO: + + /* disable microphone */ + akc_disable_mic(); + + /* Select line2 input, set gain control to independent left & right gain */ + akc_setup_input(0xff, 0xff); /* set line in vol = 0 dB */ akc_write(AK4537_IPGAL, 0x2f); akc_write(AK4537_IPGAR, 0x2f); - /* ADC -> DAC, external data to DAC ignored */ - akc_set(AK4537_MODE2, LOOP); - break; #endif /* INPUT_SRC_CAPS & SRC_CAP_FMRADIO */ #if (INPUT_SRC_CAPS & SRC_CAP_LINEIN) case AUDIO_SRC_LINEIN: - /* disable mic power supply */ -#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) - akc_clear(AK4537_MIC, MPWRE); -#else - akc_clear(AK4537_MIC, MPWRI); -#endif - /* disable mic preamp */ - akc_clear(AK4537_PM1, PMMICL); - - /* Select line1 input */ - akc_clear(AK4537_PM3, INL | INR); - /* route ALC output to ADC input */ - akc_set(AK4537_MIC, MICAD); - /* set ALC (automatic level control) to manual mode */ - akc_clear(AK4537_ALC1, ALC1); - /* set gain control to independent left & right gain */ - akc_set(AK4537_MIC, IPGAC); + /* disable microphone */ + akc_disable_mic(); - /* power up left channel input and ADC */ - akc_set(AK4537_PM1, PMADL | PMIPGL); - /* power up right channel input and ADC */ - akc_set(AK4537_PM3, PMADR | PMIPGR); - - /* ADC -> DAC, external data to DAC ignored */ - akc_set(AK4537_MODE2, LOOP); + /* Select line1 input, set gain control to independent left & right gain */ + akc_setup_input(0x00, 0xff); break; #endif /* INPUT_SRC_CAPS & SRC_CAP_LINEIN */ #if (INPUT_SRC_CAPS & SRC_CAP_MIC) case AUDIO_SRC_MIC: - /* enable mic power supply */ -#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) - /* additionally select external mic */ - akc_set(AK4537_MIC, MPWRE | MSEL); -#else - akc_set(AK4537_MIC, MPWRI); -#endif - - /* mic out is connected to line1 input */ - akc_clear(AK4537_PM3, INL | INR); - /* route ALC output to ADC input */ - akc_set(AK4537_MIC, MICAD); - /* set ALC (automatic level control) to manual mode */ - akc_clear(AK4537_ALC1, ALC1); - /* set gain control to 'dependent' (left&right at the same time) */ - akc_clear(AK4537_MIC, IPGAC); - /* power up mic preamp, left channel ADC and line in */ - akc_set(AK4537_PM1, PMMICL | PMIPGL | PMADL); - /* power up right channel ADC and line in */ - akc_set(AK4537_PM3, PMADR | PMIPGR); + /* enable micropohone */ + akc_enable_mic(); - /* ADC -> DAC, external data to DAC ignored */ - akc_set(AK4537_MODE2, LOOP); + /* Select line1 input (mic connected), set gain control to 'dependent' */ + /* (left & right at the same time) */ + akc_setup_input(0x00, 0x00); break; #endif /* INPUT_SRC_CAPS & SRC_CAP_MIC) */ -- cgit v1.2.3