diff options
Diffstat (limited to 'firmware/drivers/audio/cs42l55.c')
-rw-r--r-- | firmware/drivers/audio/cs42l55.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/firmware/drivers/audio/cs42l55.c b/firmware/drivers/audio/cs42l55.c index 79b6d283b6..5541a26ee0 100644 --- a/firmware/drivers/audio/cs42l55.c +++ b/firmware/drivers/audio/cs42l55.c | |||
@@ -36,6 +36,8 @@ const struct sound_settings_info audiohw_settings[] = { | |||
36 | [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0}, | 36 | [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0}, |
37 | [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0}, | 37 | [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0}, |
38 | [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100}, | 38 | [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100}, |
39 | [SOUND_BASS_CUTOFF] = {"", 0, 1, 1, 4, 2}, | ||
40 | [SOUND_TREBLE_CUTOFF] = {"", 0, 1, 1, 4, 1}, | ||
39 | }; | 41 | }; |
40 | 42 | ||
41 | static int bass, treble; | 43 | static int bass, treble; |
@@ -157,24 +159,56 @@ void audiohw_enable_lineout(bool enable) | |||
157 | PWRCTL2_PDN_LINA_ALWAYS | PWRCTL2_PDN_LINB_ALWAYS); | 159 | PWRCTL2_PDN_LINA_ALWAYS | PWRCTL2_PDN_LINB_ALWAYS); |
158 | } | 160 | } |
159 | 161 | ||
162 | static void handle_dsp_power() | ||
163 | { | ||
164 | if (bass || treble) | ||
165 | { | ||
166 | cscodec_setbits(PLAYCTL, PLAYCTL_PDN_DSP, 0); | ||
167 | cscodec_setbits(BTCTL, 0, BTCTL_TCEN); | ||
168 | } | ||
169 | else | ||
170 | { | ||
171 | cscodec_setbits(BTCTL, BTCTL_TCEN, 0); | ||
172 | cscodec_setbits(PLAYCTL, 0, PLAYCTL_PDN_DSP); | ||
173 | } | ||
174 | } | ||
175 | |||
160 | void audiohw_set_bass(int value) | 176 | void audiohw_set_bass(int value) |
161 | { | 177 | { |
162 | bass = value; | 178 | bass = value; |
163 | if (bass || treble) cscodec_setbits(PLAYCTL, PLAYCTL_PDN_DSP, 0); | 179 | handle_dsp_power(); |
164 | else cscodec_setbits(PLAYCTL, 0, PLAYCTL_PDN_DSP); | ||
165 | if (value >= -105 && value <= 120) | 180 | if (value >= -105 && value <= 120) |
166 | cscodec_setbits(TONECTL, TONECTL_BASS_MASK, | 181 | cscodec_setbits(TONECTL, TONECTL_BASS_MASK, |
167 | (value / 15) << TONECTL_BASS_SHIFT); | 182 | (8 - value / 15) << TONECTL_BASS_SHIFT); |
168 | } | 183 | } |
169 | 184 | ||
170 | void audiohw_set_treble(int value) | 185 | void audiohw_set_treble(int value) |
171 | { | 186 | { |
172 | treble = value; | 187 | treble = value; |
173 | if (bass || treble) cscodec_setbits(PLAYCTL, PLAYCTL_PDN_DSP, 0); | 188 | handle_dsp_power(); |
174 | else cscodec_setbits(PLAYCTL, 0, PLAYCTL_PDN_DSP); | ||
175 | if (value >= -105 && value <= 120) | 189 | if (value >= -105 && value <= 120) |
176 | cscodec_setbits(TONECTL, TONECTL_TREB_MASK, | 190 | cscodec_setbits(TONECTL, TONECTL_TREB_MASK, |
177 | (value / 15) << TONECTL_TREB_SHIFT); | 191 | (8 - value / 15) << TONECTL_TREB_SHIFT); |
192 | } | ||
193 | |||
194 | void audiohw_set_bass_cutoff(int value) | ||
195 | { | ||
196 | cscodec_setbits(BTCTL, BTCTL_BASSCF_MASK, | ||
197 | (value - 1) << BTCTL_BASSCF_SHIFT); | ||
198 | } | ||
199 | |||
200 | void audiohw_set_treble_cutoff(int value) | ||
201 | { | ||
202 | cscodec_setbits(BTCTL, BTCTL_TREBCF_MASK, | ||
203 | (value - 1) << BTCTL_TREBCF_SHIFT); | ||
204 | } | ||
205 | |||
206 | void audiohw_set_prescaler(int value) | ||
207 | { | ||
208 | cscodec_setbits(MSTAVOL, MSTAVOL_VOLUME_MASK, | ||
209 | (-value / 5) << MSTAVOL_VOLUME_SHIFT); | ||
210 | cscodec_setbits(MSTBVOL, MSTBVOL_VOLUME_MASK, | ||
211 | (-value / 5) << MSTBVOL_VOLUME_SHIFT); | ||
178 | } | 212 | } |
179 | 213 | ||
180 | /* Nice shutdown of CS42L55 codec */ | 214 | /* Nice shutdown of CS42L55 codec */ |