Index: firmware/export/wm8758.h =================================================================== --- firmware/export/wm8758.h (Revision 17261) +++ firmware/export/wm8758.h (Arbeitskopie) @@ -24,15 +24,15 @@ #define VOLUME_MIN -570 #define VOLUME_MAX 60 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP) + extern int tenthdb2master(int db); extern int tenthdb2mixer(int db); extern void audiohw_set_master_vol(int vol_l, int vol_r); extern void audiohw_set_lineout_vol(int vol_l, int vol_r); extern void audiohw_set_mixer_vol(int channel1, int channel2); -extern void audiohw_set_bass(int value); extern void audiohw_set_bass_cutoff(int value); -extern void audiohw_set_treble(int value); extern void audiohw_set_treble_cutoff(int value); extern void audiohw_set_nsorder(int order); extern void audiohw_set_sample_rate(int sampling_control); Index: firmware/export/wm8975.h =================================================================== --- firmware/export/wm8975.h (Revision 17261) +++ firmware/export/wm8975.h (Arbeitskopie) @@ -24,12 +24,12 @@ #define VOLUME_MIN -730 #define VOLUME_MAX 60 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP) + extern int tenthdb2master(int db); extern void audiohw_set_master_vol(int vol_l, int vol_r); extern void audiohw_set_lineout_vol(int vol_l, int vol_r); -extern void audiohw_set_bass(int value); -extern void audiohw_set_treble(int value); extern void audiohw_set_nsorder(int order); extern void audiohw_set_sample_rate(int sampling_control); Index: firmware/export/mas35xx.h =================================================================== --- firmware/export/mas35xx.h (Revision 17261) +++ firmware/export/mas35xx.h (Arbeitskopie) @@ -24,6 +24,8 @@ #include "config.h" +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP) + #if CONFIG_CODEC == MAS3507D #define VOLUME_MIN -780 #define VOLUME_MAX 180 Index: firmware/export/audiohw.h =================================================================== --- firmware/export/audiohw.h (Revision 17261) +++ firmware/export/audiohw.h (Arbeitskopie) @@ -23,6 +23,10 @@ #include "config.h" #include +/* define some audiohw caps */ +#define TREBLE_CAP (1 << 0) +#define BASS_CAP (1 << 1) + #ifdef HAVE_UDA1380 #include "uda1380.h" #elif defined(HAVE_WM8751) @@ -49,6 +53,17 @@ #include "tsc2100.h" #endif +/* convert caps into defines */ +#ifdef AUDIOHW_CAPS +#if (AUDIOHW_CAPS & TREBLE_CAP) +#define AUDIOHW_HAVE_TREBLE +#endif + +#if (AUDIOHW_CAPS & BASS_CAP) +#define AUDIOHW_HAVE_BASS +#endif +#endif /* AUDIOHW_CAPS */ + enum { SOUND_VOLUME = 0, SOUND_BASS, @@ -141,6 +156,26 @@ */ void audiohw_enable_output(bool enable); +#ifdef AUDIOHW_HAVE_TREBLE +/** + * Set new treble value. + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * TREBLE_CAP + */ +void audiohw_set_treble(int val); +#endif + +#ifdef AUDIOHW_HAVE_BASS +/** + * Set new bass value. + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * BASS_CAP + */ +void audiohw_set_bass(int val); +#endif + #ifdef HAVE_RECORDING /** Index: firmware/export/wm8985.h =================================================================== --- firmware/export/wm8985.h (Revision 17261) +++ firmware/export/wm8985.h (Arbeitskopie) @@ -24,15 +24,15 @@ #define VOLUME_MIN -570 #define VOLUME_MAX 60 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP) + extern int tenthdb2master(int db); extern int tenthdb2mixer(int db); extern void audiohw_set_master_vol(int vol_l, int vol_r); extern void audiohw_set_lineout_vol(int vol_l, int vol_r); extern void audiohw_set_mixer_vol(int channel1, int channel2); -extern void audiohw_set_bass(int value); extern void audiohw_set_bass_cutoff(int value); -extern void audiohw_set_treble(int value); extern void audiohw_set_treble_cutoff(int value); extern void audiohw_set_nsorder(int order); extern void audiohw_set_sample_rate(int sampling_control); Index: firmware/export/uda1380.h =================================================================== --- firmware/export/uda1380.h (Revision 17261) +++ firmware/export/uda1380.h (Arbeitskopie) @@ -24,13 +24,13 @@ #define VOLUME_MIN -840 #define VOLUME_MAX 0 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP) + extern int tenthdb2master(int db); extern int tenthdb2mixer(int db); extern void audiohw_set_master_vol(int vol_l, int vol_r); extern void audiohw_set_mixer_vol(int channel1, int channel2); -extern void audiohw_set_bass(int value); -extern void audiohw_set_treble(int value); /** * Sets frequency settings for DAC and ADC relative to MCLK Index: firmware/sound.c =================================================================== --- firmware/sound.c (Revision 17261) +++ firmware/sound.c (Arbeitskopie) @@ -352,60 +352,40 @@ { if(!audio_is_initialized) return; -#if defined(HAVE_SW_TONE_CONTROLS) + +#if defined(AUDIOHW_HAVE_BASS) + audiohw_set_bass(value); current_bass = value * 10; - dsp_callback(DSP_CALLBACK_SET_BASS, current_bass); + +#if (CONFIG_CODEC != MAS3587F) && (CONFIG_CODEC != MAS3539F) set_prescaled_volume(); -#elif (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - unsigned tmp = ((unsigned)(value * 8) & 0xff) << 8; - mas_codec_writereg(0x14, tmp); -#elif CONFIG_CODEC == MAS3507D - mas_writereg(MAS_REG_KBASS, bass_table[value+15]); +#endif + +#else /* !defined(AUDIOHW_HAVE_BASS) */ current_bass = value * 10; + dsp_callback(DSP_CALLBACK_SET_BASS, current_bass); set_prescaled_volume(); -#elif defined(HAVE_WM8751) - current_bass = value; - audiohw_set_bass(value); - set_prescaled_volume(); -#elif defined HAVE_WM8975 || defined HAVE_WM8758 || defined(HAVE_UDA1380) \ - || defined HAVE_WM8731 || defined(HAVE_WM8721) || defined(HAVE_WM8985) - current_bass = value * 10; - audiohw_set_bass(value); - set_prescaled_volume(); -#elif CONFIG_CPU == PNX0101 - /* TODO: implement for iFP */ -#endif - (void)value; +#endif } void sound_set_treble(int value) { if(!audio_is_initialized) return; -#if defined(HAVE_SW_TONE_CONTROLS) + +#if defined(AUDIOHW_HAVE_TREBLE) + audiohw_set_treble(value); current_treble = value * 10; - dsp_callback(DSP_CALLBACK_SET_TREBLE, current_treble); + +#if (CONFIG_CODEC != MAS3587F) && (CONFIG_CODEC != MAS3539F) set_prescaled_volume(); -#elif (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - unsigned tmp = ((unsigned)(value * 8) & 0xff) << 8; - mas_codec_writereg(0x15, tmp); -#elif CONFIG_CODEC == MAS3507D - mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]); +#endif + +#else /* !defined(AUDIOHW_HAVE_TREBLE) */ current_treble = value * 10; + dsp_callback(DSP_CALLBACK_SET_TREBLE, current_treble); set_prescaled_volume(); -#elif defined(HAVE_WM8751) - audiohw_set_treble(value); - current_treble = value; - set_prescaled_volume(); -#elif defined(HAVE_WM8975) || defined(HAVE_WM8758) || defined(HAVE_UDA1380) \ - || defined(HAVE_WM8731) || defined(HAVE_WM8721) || defined(HAVE_WM8985) - audiohw_set_treble(value); - current_treble = value * 10; - set_prescaled_volume(); -#elif CONFIG_CPU == PNX0101 - /* TODO: implement for iFP */ #endif - (void)value; } void sound_set_channels(int value) Index: firmware/drivers/audio/mas35xx.c =================================================================== --- firmware/drivers/audio/mas35xx.c (Revision 17261) +++ firmware/drivers/audio/mas35xx.c (Arbeitskopie) @@ -150,3 +150,23 @@ set_channel_config(); } } + +void audiohw_set_bass(int val) +{ +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + unsigned tmp = ((unsigned)(val * 8) & 0xff) << 8; + mas_codec_writereg(0x14, tmp); +#elif CONFIG_CODEC == MAS3507D + mas_writereg(MAS_REG_KBASS, bass_table[val+15]); +#endif +} + +void audiohw_set_treble(int val) +{ +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + unsigned tmp = ((unsigned)(val * 8) & 0xff) << 8; + mas_codec_writereg(0x15, tmp); +#elif CONFIG_CODEC == MAS3507D + mas_writereg(MAS_REG_KTREBLE, treble_table[val+15]); +#endif +} Index: firmware/drivers/audio/wm8751.c =================================================================== --- firmware/drivers/audio/wm8751.c (Revision 17261) +++ firmware/drivers/audio/wm8751.c (Arbeitskopie) @@ -79,7 +79,7 @@ /* -6.0db..+0db..+9.0db step 1.5db - translate -60..+0..+90 step 15 to 10..6..0 step -1. */ - value = 10 - (value + 60) / 15; + value = (10 - (value + 60) / 15) / 10; if (value == 6) value = 0xf; /* 0db -> off */