summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/audio/ak4537.c138
1 files 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) */