summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/audio/ak4376.c22
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
153static void calc_volumes(int vol, int* mix, int* dig, int* sw) 153static 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)
186void ak4376_set_volume(int vol_l, int vol_r) 181void 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));