diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/audio/ak4376.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/firmware/drivers/audio/ak4376.c b/firmware/drivers/audio/ak4376.c index 11714b210d..8206bcf7e0 100644 --- a/firmware/drivers/audio/ak4376.c +++ b/firmware/drivers/audio/ak4376.c | |||
@@ -83,11 +83,11 @@ void ak4376_open(void) | |||
83 | ak4376_set_pdn_pin(1); | 83 | ak4376_set_pdn_pin(1); |
84 | mdelay(1); | 84 | mdelay(1); |
85 | 85 | ||
86 | static const int init_config[] = { | 86 | static const uint8_t init_config[] = { |
87 | /* Ensure HPRHZ, HPLHZ are 0 */ | 87 | /* Ensure HPRHZ, HPLHZ are 0 */ |
88 | AK4376_REG_OUTPUT_MODE, 0x00, | 88 | AK4376_REG_OUTPUT_MODE, 0x00, |
89 | /* Mute all volume controls */ | 89 | /* Mute all volume controls */ |
90 | AK4376_REG_MIXER, 0x00, | 90 | AK4376_REG_MIXER, AK4376_MIX_LCH | (AK4376_MIX_RCH << 4), |
91 | AK4376_REG_LCH_VOLUME, 0x80, | 91 | AK4376_REG_LCH_VOLUME, 0x80, |
92 | AK4376_REG_RCH_VOLUME, 0x00, | 92 | AK4376_REG_RCH_VOLUME, 0x00, |
93 | AK4376_REG_AMP_VOLUME, 0x00, | 93 | AK4376_REG_AMP_VOLUME, 0x00, |
@@ -150,14 +150,9 @@ static int round_step_up(int x, int step) | |||
150 | return x - rem; | 150 | return x - rem; |
151 | } | 151 | } |
152 | 152 | ||
153 | static void calc_volumes(int vol, int* mix, int* dig, int* sw) | 153 | static void calc_volumes(int vol, int* dig, int* sw) |
154 | { | 154 | { |
155 | /* Mixer can divide by 2, which gives an extra -6 dB adjustment */ | 155 | /* Apply digital volume */ |
156 | if(vol < AK4376_DIG_VOLUME_MIN) { | ||
157 | *mix |= AK4376_MIX_HALF; | ||
158 | vol += 60; | ||
159 | } | ||
160 | |||
161 | *dig = round_step_up(vol, AK4376_DIG_VOLUME_STEP); | 156 | *dig = round_step_up(vol, AK4376_DIG_VOLUME_STEP); |
162 | *dig = MIN(*dig, AK4376_DIG_VOLUME_MAX); | 157 | *dig = MIN(*dig, AK4376_DIG_VOLUME_MAX); |
163 | *dig = MAX(*dig, AK4376_DIG_VOLUME_MIN); | 158 | *dig = MAX(*dig, AK4376_DIG_VOLUME_MIN); |
@@ -186,8 +181,8 @@ static int amp_vol_to_hw(int vol) | |||
186 | void ak4376_set_volume(int vol_l, int vol_r) | 181 | void ak4376_set_volume(int vol_l, int vol_r) |
187 | { | 182 | { |
188 | int amp; | 183 | int amp; |
189 | int mix_l = AK4376_MIX_LCH, dig_l, sw_l; | 184 | int dig_l, sw_l; |
190 | int mix_r = AK4376_MIX_RCH, dig_r, sw_r; | 185 | int dig_r, sw_r; |
191 | 186 | ||
192 | if(vol_l <= AK4376_MIN_VOLUME && vol_r <= AK4376_MIN_VOLUME) { | 187 | if(vol_l <= AK4376_MIN_VOLUME && vol_r <= AK4376_MIN_VOLUME) { |
193 | /* Special case for full mute */ | 188 | /* Special case for full mute */ |
@@ -202,11 +197,10 @@ void ak4376_set_volume(int vol_l, int vol_r) | |||
202 | amp = MAX(amp, AK4376_AMP_VOLUME_MIN); | 197 | amp = MAX(amp, AK4376_AMP_VOLUME_MIN); |
203 | 198 | ||
204 | /* Other controls are stereo */ | 199 | /* Other controls are stereo */ |
205 | calc_volumes(vol_l - amp, &mix_l, &dig_l, &sw_l); | 200 | calc_volumes(vol_l - amp, &dig_l, &sw_l); |
206 | calc_volumes(vol_r - amp, &mix_r, &dig_r, &sw_r); | 201 | calc_volumes(vol_r - amp, &dig_r, &sw_r); |
207 | } | 202 | } |
208 | 203 | ||
209 | ak4376_write(AK4376_REG_MIXER, (mix_l & 0xf) | ((mix_r & 0xf) << 4)); | ||
210 | ak4376_write(AK4376_REG_LCH_VOLUME, dig_vol_to_hw(dig_l) | (1 << 7)); | 204 | ak4376_write(AK4376_REG_LCH_VOLUME, dig_vol_to_hw(dig_l) | (1 << 7)); |
211 | ak4376_write(AK4376_REG_RCH_VOLUME, dig_vol_to_hw(dig_r)); | 205 | ak4376_write(AK4376_REG_RCH_VOLUME, dig_vol_to_hw(dig_r)); |
212 | ak4376_write(AK4376_REG_AMP_VOLUME, amp_vol_to_hw(amp)); | 206 | ak4376_write(AK4376_REG_AMP_VOLUME, amp_vol_to_hw(amp)); |