summaryrefslogtreecommitdiff
path: root/firmware/sound.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/sound.c')
-rw-r--r--firmware/sound.c72
1 files changed, 58 insertions, 14 deletions
diff --git a/firmware/sound.c b/firmware/sound.c
index 110c2c91b8..a039cca609 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -28,6 +28,8 @@
28#include "uda1380.h" 28#include "uda1380.h"
29#elif defined(HAVE_WM8975) 29#elif defined(HAVE_WM8975)
30#include "wm8975.h" 30#include "wm8975.h"
31#elif defined(HAVE_WM8758)
32#include "wm8758.h"
31#elif defined(HAVE_TLV320) 33#elif defined(HAVE_TLV320)
32#include "tlv320.h" 34#include "tlv320.h"
33#endif 35#endif
@@ -71,6 +73,10 @@ static const struct sound_settings_info sound_settings_table[] = {
71 [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume}, 73 [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume},
72 [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass}, 74 [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass},
73 [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble}, 75 [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble},
76#elif defined(HAVE_WM8758)
77 [SOUND_VOLUME] = {"dB", 0, 1, -57, 6, -25, sound_set_volume},
78 [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass},
79 [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble},
74#else /* MAS3507D */ 80#else /* MAS3507D */
75 [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, 81 [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume},
76 [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, 82 [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass},
@@ -276,7 +282,8 @@ static int tenthdb2mixer(int db)
276 return -db * 2 / 5; 282 return -db * 2 / 5;
277} 283}
278 284
279#elif defined(HAVE_WM8975) /* volume/balance/treble/bass interdependency */ 285#elif defined(HAVE_WM8975)
286/* volume/balance/treble/bass interdependency */
280#define VOLUME_MIN -730 287#define VOLUME_MIN -730
281#define VOLUME_MAX 60 288#define VOLUME_MAX 60
282 289
@@ -290,9 +297,43 @@ static int tenthdb2master(int db)
290 /* 0101111 == mute (0x2f) */ 297 /* 0101111 == mute (0x2f) */
291 298
292 if (db <= -730) { 299 if (db <= -730) {
293 return 0x2f; 300 return 0x0;
294 } else { 301 } else {
295 return((db/10)+74+0x2f); 302 return((db/10)+73+0x2f);
303 }
304}
305
306/* convert tenth of dB volume (-780..0) to mixer volume register value */
307static int tenthdb2mixer(int db)
308{
309 if (db < -660) /* 1.5 dB steps */
310 return (2640 - db) / 15;
311 else if (db < -600) /* 0.75 dB steps */
312 return (990 - db) * 2 / 15;
313 else if (db < -460) /* 0.5 dB steps */
314 return (460 - db) / 5;
315 else /* 0.25 dB steps */
316 return -db * 2 / 5;
317}
318
319#elif defined(HAVE_WM8758)
320/* volume/balance/treble/bass interdependency */
321#define VOLUME_MIN -730
322#define VOLUME_MAX 60
323
324/* convert tenth of dB volume (-730..60) to master volume register value */
325static int tenthdb2master(int db)
326{
327 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
328 /* 1111111 == +6dB (0x7f) */
329 /* 1111001 == 0dB (0x79) */
330 /* 0110000 == -73dB (0x30 */
331 /* 0101111 == mute (0x2f) */
332
333 if (db <= -570) {
334 return 0x0;
335 } else {
336 return((db/10)+57);
296 } 337 }
297} 338}
298 339
@@ -311,7 +352,8 @@ static int tenthdb2mixer(int db)
311 352
312#endif 353#endif
313 354
314#if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 355#if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \
356 defined HAVE_WM8975 || defined HAVE_WM8758
315 /* volume/balance/treble/bass interdependency main part */ 357 /* volume/balance/treble/bass interdependency main part */
316#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) 358#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
317 359
@@ -341,8 +383,8 @@ static void set_prescaled_volume(void)
341 mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); 383 mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]);
342#elif defined(HAVE_UDA1380) 384#elif defined(HAVE_UDA1380)
343 uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); 385 uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale));
344#elif defined(HAVE_WM8975) 386#elif defined(HAVE_WM8975) || defined(HAVE_WM8758)
345 wm8975_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); 387 wmcodec_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale));
346#endif 388#endif
347 389
348 if (current_volume == VOLUME_MIN) 390 if (current_volume == VOLUME_MIN)
@@ -367,8 +409,8 @@ static void set_prescaled_volume(void)
367 dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); 409 dac_volume(tenthdb2reg(l), tenthdb2reg(r), false);
368#elif defined(HAVE_UDA1380) 410#elif defined(HAVE_UDA1380)
369 uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); 411 uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r));
370#elif defined(HAVE_WM8975) 412#elif defined(HAVE_WM8975) || defined(HAVE_WM8758)
371 wm8975_set_master_vol(tenthdb2master(l), tenthdb2master(r)); 413 wmcodec_set_master_vol(tenthdb2master(l), tenthdb2master(r));
372#endif 414#endif
373} 415}
374#endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ 416#endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */
@@ -468,7 +510,8 @@ void sound_set_volume(int value)
468#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 510#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
469 unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; 511 unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8;
470 mas_codec_writereg(0x10, tmp); 512 mas_codec_writereg(0x10, tmp);
471#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 513#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \
514 defined HAVE_WM8975 || defined HAVE_WM8758
472 current_volume = value * 10; /* tenth of dB */ 515 current_volume = value * 10; /* tenth of dB */
473 set_prescaled_volume(); 516 set_prescaled_volume();
474#elif CONFIG_CPU == PNX0101 517#elif CONFIG_CPU == PNX0101
@@ -484,7 +527,8 @@ void sound_set_balance(int value)
484#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 527#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
485 unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; 528 unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8;
486 mas_codec_writereg(0x11, tmp); 529 mas_codec_writereg(0x11, tmp);
487#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || defined HAVE_WM8975 530#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || \
531 defined HAVE_WM8975 || defined HAVE_WM8758
488 current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ 532 current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */
489 set_prescaled_volume(); 533 set_prescaled_volume();
490#elif CONFIG_CPU == PNX0101 534#elif CONFIG_CPU == PNX0101
@@ -508,9 +552,9 @@ void sound_set_bass(int value)
508 uda1380_set_bass(value >> 1); 552 uda1380_set_bass(value >> 1);
509 current_bass = value * 10; 553 current_bass = value * 10;
510 set_prescaled_volume(); 554 set_prescaled_volume();
511#elif defined(HAVE_WM8975) 555#elif defined HAVE_WM8975 || defined HAVE_WM8758
512 current_bass = value * 10; 556 current_bass = value * 10;
513 wm8975_set_bass(value); 557 wmcodec_set_bass(value);
514 set_prescaled_volume(); 558 set_prescaled_volume();
515#elif CONFIG_CPU == PNX0101 559#elif CONFIG_CPU == PNX0101
516 /* TODO: implement for iFP */ 560 /* TODO: implement for iFP */
@@ -533,8 +577,8 @@ void sound_set_treble(int value)
533 uda1380_set_treble(value >> 1); 577 uda1380_set_treble(value >> 1);
534 current_treble = value * 10; 578 current_treble = value * 10;
535 set_prescaled_volume(); 579 set_prescaled_volume();
536#elif defined(HAVE_WM8975) 580#elif defined(HAVE_WM8975) || defined(HAVE_WM8758)
537 wm8975_set_treble(value); 581 wmcodec_set_treble(value);
538 current_treble = value * 10; 582 current_treble = value * 10;
539 set_prescaled_volume(); 583 set_prescaled_volume();
540#elif CONFIG_CPU == PNX0101 584#elif CONFIG_CPU == PNX0101