summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio
diff options
context:
space:
mode:
authorSzymon Dziok <b0hoon@o2.pl>2014-06-17 23:13:15 +0000
committerSzymon Dziok <b0hoon@o2.pl>2014-06-18 18:06:17 +0000
commiteacd76cb80db12adcce74980e69d116911a8cde7 (patch)
tree239344e3f9053a75eeab4253f39f6b1dae749aa6 /firmware/drivers/audio
parent0c3dca1f33596cb10345601de32d681ed6ece972 (diff)
Radio and radio recording for Samsung YH-920.
There is no simple method to detect radio through the 3-wire interface, so it's not implemented for the YH-925 for now. YH-920 always has a radio. Change-Id: Iea484d752915fcd40dbbbd7dbbf13e81aaf548db
Diffstat (limited to 'firmware/drivers/audio')
-rw-r--r--firmware/drivers/audio/ak4537.c114
1 files changed, 79 insertions, 35 deletions
diff --git a/firmware/drivers/audio/ak4537.c b/firmware/drivers/audio/ak4537.c
index bea3dc7019..a42b1346d2 100644
--- a/firmware/drivers/audio/ak4537.c
+++ b/firmware/drivers/audio/ak4537.c
@@ -221,34 +221,64 @@ void audiohw_set_frequency(int fsel)
}
#if defined(HAVE_RECORDING)
-void audiohw_enable_recording(bool source_mic)
+void audiohw_set_recsrc(int source)
{
- if (source_mic)
+ switch(source)
{
- /* enable mic power supply */
+ case AUDIO_SRC_PLAYBACK:
+ /* disable mic power supply */
#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925)
- /* additionally select external mic */
- akc_set(AK4537_MIC, MPWRE | MSEL);
+ akc_clear(AK4537_MIC, MPWRE);
#else
- akc_set(AK4537_MIC, MPWRI);
+ 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);
- /* mic out is connected to line1 input */
- akc_clear(AK4537_PM3, INL | INR);
+ /* break ADC -> DAC connection */
+ akc_clear(AK4537_MODE2, LOOP);
+
+ break;
+
+#if (INPUT_SRC_CAPS & SRC_CAP_FMRADIO)
+ case AUDIO_SRC_FMRADIO:
+ /* 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 line2 input: Radio */
+ akc_set(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 */
+
+ /* set gain control to independent left & right gain */
+ akc_set(AK4537_MIC, IPGAC);
+
+ /* 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);
- }
- else
- {
+
+ /* 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);
@@ -272,25 +302,44 @@ void audiohw_enable_recording(bool source_mic)
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);
-}
-void audiohw_disable_recording(void)
-{
- /* disable mic power supply */
+ /* ADC -> DAC, external data to DAC ignored */
+ akc_set(AK4537_MODE2, LOOP);
+
+ 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)
- 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
- /* 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);
+ /* 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);
+
+ /* ADC -> DAC, external data to DAC ignored */
+ akc_set(AK4537_MODE2, LOOP);
+
+ break;
+#endif /* INPUT_SRC_CAPS & SRC_CAP_MIC) */
+
+ } /* switch(source) */
}
void audiohw_set_recvol(int left, int right, int type)
@@ -331,9 +380,4 @@ void audiohw_set_recvol(int left, int right, int type)
return;
}
}
-
-void audiohw_set_monitor(bool enable)
-{
- (void)enable;
-}
#endif /* HAVE_RECORDING */