summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio/wm8731.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/audio/wm8731.c')
-rw-r--r--firmware/drivers/audio/wm8731.c55
1 files changed, 18 insertions, 37 deletions
diff --git a/firmware/drivers/audio/wm8731.c b/firmware/drivers/audio/wm8731.c
index 71050454f3..3689a28f31 100644
--- a/firmware/drivers/audio/wm8731.c
+++ b/firmware/drivers/audio/wm8731.c
@@ -37,22 +37,6 @@
37#include "wmcodec.h" 37#include "wmcodec.h"
38#include "sound.h" 38#include "sound.h"
39 39
40
41const struct sound_settings_info audiohw_settings[] = {
42 [SOUND_VOLUME] = {"dB", 0, 1, -74, 6, -25},
43 /* HAVE_SW_TONE_CONTROLS */
44 [SOUND_BASS] = {"dB", 0, 1, -24, 24, 0},
45 [SOUND_TREBLE] = {"dB", 0, 1, -24, 24, 0},
46 [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0},
47 [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0},
48 [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100},
49#if defined(HAVE_WM8731) && defined(HAVE_RECORDING)
50 [SOUND_LEFT_GAIN] = {"dB", 1, 1, 0, 31, 23},
51 [SOUND_RIGHT_GAIN] = {"dB", 1, 1, 0, 31, 23},
52 [SOUND_MIC_GAIN] = {"dB", 1, 1, 0, 1, 0},
53#endif
54};
55
56/* Init values/shadows 40/* Init values/shadows
57 * Ignore bit 8 since that only specifies "both" for updating 41 * Ignore bit 8 since that only specifies "both" for updating
58 * gains - "RESET" (15h) not included */ 42 * gains - "RESET" (15h) not included */
@@ -109,22 +93,6 @@ static void wmc_write_masked(int reg, unsigned bits, unsigned mask)
109 wmc_write(reg, (wmc_regs[reg] & ~mask) | (bits & mask)); 93 wmc_write(reg, (wmc_regs[reg] & ~mask) | (bits & mask));
110} 94}
111 95
112/* convert tenth of dB volume (-730..60) to master volume register value */
113int tenthdb2master(int db)
114{
115 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
116 /* 1111111 == +6dB (0x7f) */
117 /* 1111001 == 0dB (0x79) */
118 /* 0110000 == -73dB (0x30 */
119 /* 0101111 == mute (0x2f) */
120
121 if (db < VOLUME_MIN) {
122 return 0x2f;
123 } else {
124 return((db/10)+0x30+73);
125 }
126}
127
128int sound_val2phys(int setting, int value) 96int sound_val2phys(int setting, int value)
129{ 97{
130 int result; 98 int result;
@@ -148,6 +116,21 @@ int sound_val2phys(int setting, int value)
148 return result; 116 return result;
149} 117}
150 118
119/* convert tenth of dB volume (-730..60) to master volume register value */
120static int vol_tenthdb2hw(int db)
121{
122 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
123 /* 1111111 == +6dB (0x7f) */
124 /* 1111001 == 0dB (0x79) */
125 /* 0110000 == -73dB (0x30) */
126 /* 0101111 == mute (0x2f) */
127 if (db < VOLUME_MIN) {
128 return 0x2f;
129 } else {
130 return((db/10)+0x30+73);
131 }
132}
133
151static void audiohw_mute(bool mute) 134static void audiohw_mute(bool mute)
152{ 135{
153 if (mute) { 136 if (mute) {
@@ -207,13 +190,11 @@ void audiohw_postinit(void)
207#endif 190#endif
208} 191}
209 192
210void audiohw_set_master_vol(int vol_l, int vol_r) 193void audiohw_set_volume(int vol_l, int vol_r)
211{ 194{
212 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */ 195 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
213 /* 1111111 == +6dB */ 196 vol_l = vol_tenthdb2hw(vol_l);
214 /* 1111001 == 0dB */ 197 vol_r = vol_tenthdb2hw(vol_r);
215 /* 0110000 == -73dB */
216 /* 0101111 == mute (0x2f) */
217 wmc_write_masked(LOUTVOL, vol_l, WMC_OUT_VOL_MASK); 198 wmc_write_masked(LOUTVOL, vol_l, WMC_OUT_VOL_MASK);
218 wmc_write_masked(ROUTVOL, vol_r, WMC_OUT_VOL_MASK); 199 wmc_write_masked(ROUTVOL, vol_r, WMC_OUT_VOL_MASK);
219} 200}