summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio/ak4537.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/audio/ak4537.c')
-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)
221} 221}
222 222
223#if defined(HAVE_RECORDING) 223#if defined(HAVE_RECORDING)
224void audiohw_enable_recording(bool source_mic) 224void audiohw_set_recsrc(int source)
225{ 225{
226 if (source_mic) 226 switch(source)
227 { 227 {
228 /* enable mic power supply */ 228 case AUDIO_SRC_PLAYBACK:
229 /* disable mic power supply */
229#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) 230#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925)
230 /* additionally select external mic */ 231 akc_clear(AK4537_MIC, MPWRE);
231 akc_set(AK4537_MIC, MPWRE | MSEL);
232#else 232#else
233 akc_set(AK4537_MIC, MPWRI); 233 akc_clear(AK4537_MIC, MPWRI);
234#endif 234#endif
235 /* power down ADC, mic preamp and line amp */
236 akc_clear(AK4537_PM1, PMADL | PMMICL | PMIPGL);
237 akc_clear(AK4537_PM3, PMADR | PMMICR | PMIPGR);
235 238
236 /* mic out is connected to line1 input */ 239 /* break ADC -> DAC connection */
237 akc_clear(AK4537_PM3, INL | INR); 240 akc_clear(AK4537_MODE2, LOOP);
241
242 break;
243
244#if (INPUT_SRC_CAPS & SRC_CAP_FMRADIO)
245 case AUDIO_SRC_FMRADIO:
246 /* disable mic power supply */
247#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925)
248 akc_clear(AK4537_MIC, MPWRE);
249#else
250 akc_clear(AK4537_MIC, MPWRI);
251#endif
252 /* disable mic preamp */
253 akc_clear(AK4537_PM1, PMMICL);
238 254
255 /* Select line2 input: Radio */
256 akc_set(AK4537_PM3, INL | INR);
239 /* route ALC output to ADC input */ 257 /* route ALC output to ADC input */
240 akc_set(AK4537_MIC, MICAD); 258 akc_set(AK4537_MIC, MICAD);
241 /* set ALC (automatic level control) to manual mode */ 259 /* set ALC (automatic level control) to manual mode */
242 akc_clear(AK4537_ALC1, ALC1); 260 akc_clear(AK4537_ALC1, ALC1);
243 /* set gain control to 'dependent' (left&right at the same time) */ 261
244 akc_clear(AK4537_MIC, IPGAC); 262 /* set gain control to independent left & right gain */
245 /* power up mic preamp, left channel ADC and line in */ 263 akc_set(AK4537_MIC, IPGAC);
246 akc_set(AK4537_PM1, PMMICL | PMIPGL | PMADL); 264
247 /* power up right channel ADC and line in */ 265 /* power up left channel input and ADC */
266 akc_set(AK4537_PM1, PMADL | PMIPGL);
267 /* power up right channel input and ADC */
248 akc_set(AK4537_PM3, PMADR | PMIPGR); 268 akc_set(AK4537_PM3, PMADR | PMIPGR);
249 } 269
250 else 270 /* set line in vol = 0 dB */
251 { 271 akc_write(AK4537_IPGAL, 0x2f);
272 akc_write(AK4537_IPGAR, 0x2f);
273
274 /* ADC -> DAC, external data to DAC ignored */
275 akc_set(AK4537_MODE2, LOOP);
276
277 break;
278#endif /* INPUT_SRC_CAPS & SRC_CAP_FMRADIO */
279
280#if (INPUT_SRC_CAPS & SRC_CAP_LINEIN)
281 case AUDIO_SRC_LINEIN:
252 /* disable mic power supply */ 282 /* disable mic power supply */
253#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) 283#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925)
254 akc_clear(AK4537_MIC, MPWRE); 284 akc_clear(AK4537_MIC, MPWRE);
@@ -272,25 +302,44 @@ void audiohw_enable_recording(bool source_mic)
272 akc_set(AK4537_PM1, PMADL | PMIPGL); 302 akc_set(AK4537_PM1, PMADL | PMIPGL);
273 /* power up right channel input and ADC */ 303 /* power up right channel input and ADC */
274 akc_set(AK4537_PM3, PMADR | PMIPGR); 304 akc_set(AK4537_PM3, PMADR | PMIPGR);
275 }
276 /* ADC -> DAC, external data to DAC ignored */
277 akc_set(AK4537_MODE2, LOOP);
278}
279 305
280void audiohw_disable_recording(void) 306 /* ADC -> DAC, external data to DAC ignored */
281{ 307 akc_set(AK4537_MODE2, LOOP);
282 /* disable mic power supply */ 308
309 break;
310#endif /* INPUT_SRC_CAPS & SRC_CAP_LINEIN */
311
312#if (INPUT_SRC_CAPS & SRC_CAP_MIC)
313 case AUDIO_SRC_MIC:
314 /* enable mic power supply */
283#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925) 315#if defined(SAMSUNG_YH920) || defined(SAMSUNG_YH925)
284 akc_clear(AK4537_MIC, MPWRE); 316 /* additionally select external mic */
317 akc_set(AK4537_MIC, MPWRE | MSEL);
285#else 318#else
286 akc_clear(AK4537_MIC, MPWRI); 319 akc_set(AK4537_MIC, MPWRI);
287#endif 320#endif
288 /* power down ADC, mic preamp and line amp */
289 akc_clear(AK4537_PM1, PMADL | PMMICL | PMIPGL);
290 akc_clear(AK4537_PM3, PMADR | PMMICR | PMIPGR);
291 321
292 /* break ADC -> DAC connection */ 322 /* mic out is connected to line1 input */
293 akc_clear(AK4537_MODE2, LOOP); 323 akc_clear(AK4537_PM3, INL | INR);
324
325 /* route ALC output to ADC input */
326 akc_set(AK4537_MIC, MICAD);
327 /* set ALC (automatic level control) to manual mode */
328 akc_clear(AK4537_ALC1, ALC1);
329 /* set gain control to 'dependent' (left&right at the same time) */
330 akc_clear(AK4537_MIC, IPGAC);
331 /* power up mic preamp, left channel ADC and line in */
332 akc_set(AK4537_PM1, PMMICL | PMIPGL | PMADL);
333 /* power up right channel ADC and line in */
334 akc_set(AK4537_PM3, PMADR | PMIPGR);
335
336 /* ADC -> DAC, external data to DAC ignored */
337 akc_set(AK4537_MODE2, LOOP);
338
339 break;
340#endif /* INPUT_SRC_CAPS & SRC_CAP_MIC) */
341
342 } /* switch(source) */
294} 343}
295 344
296void audiohw_set_recvol(int left, int right, int type) 345void audiohw_set_recvol(int left, int right, int type)
@@ -331,9 +380,4 @@ void audiohw_set_recvol(int left, int right, int type)
331 return; 380 return;
332 } 381 }
333} 382}
334
335void audiohw_set_monitor(bool enable)
336{
337 (void)enable;
338}
339#endif /* HAVE_RECORDING */ 383#endif /* HAVE_RECORDING */