summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio/cs42l55.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/audio/cs42l55.c')
-rw-r--r--firmware/drivers/audio/cs42l55.c46
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
41static int bass, treble; 43static 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
162static 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
160void audiohw_set_bass(int value) 176void 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
170void audiohw_set_treble(int value) 185void 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
194void audiohw_set_bass_cutoff(int value)
195{
196 cscodec_setbits(BTCTL, BTCTL_BASSCF_MASK,
197 (value - 1) << BTCTL_BASSCF_SHIFT);
198}
199
200void audiohw_set_treble_cutoff(int value)
201{
202 cscodec_setbits(BTCTL, BTCTL_TREBCF_MASK,
203 (value - 1) << BTCTL_TREBCF_SHIFT);
204}
205
206void 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 */