diff options
Diffstat (limited to 'firmware/target/arm/imx233')
-rw-r--r-- | firmware/target/arm/imx233/audioout-imx233.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/audioout-imx233.c b/firmware/target/arm/imx233/audioout-imx233.c index c4b40340bc..887d9d77f7 100644 --- a/firmware/target/arm/imx233/audioout-imx233.c +++ b/firmware/target/arm/imx233/audioout-imx233.c | |||
@@ -264,6 +264,11 @@ void imx233_audioout_set_3d_effect(int val) | |||
264 | 264 | ||
265 | void imx233_audioout_enable_spkr(bool en) | 265 | void imx233_audioout_enable_spkr(bool en) |
266 | { | 266 | { |
267 | /* avoid power sequence if not needed */ | ||
268 | static bool spkr_en = false; | ||
269 | if(en == spkr_en) | ||
270 | return; | ||
271 | spkr_en = true; | ||
267 | #if IMX233_SUBTARGET >= 3780 | 272 | #if IMX233_SUBTARGET >= 3780 |
268 | if(en) | 273 | if(en) |
269 | { | 274 | { |
@@ -275,6 +280,38 @@ void imx233_audioout_enable_spkr(bool en) | |||
275 | BF_SET(AUDIOOUT_SPEAKERCTRL, MUTE); | 280 | BF_SET(AUDIOOUT_SPEAKERCTRL, MUTE); |
276 | BF_SET(AUDIOOUT_PWRDN, SPEAKER); | 281 | BF_SET(AUDIOOUT_PWRDN, SPEAKER); |
277 | } | 282 | } |
283 | #elif IMX233_SUBTARGET >= 3700 | ||
284 | /* assume speaker is wired to lineout */ | ||
285 | if(en) | ||
286 | { | ||
287 | /** 1) make sure charge capacitors are discharged */ | ||
288 | BF_WR(AUDIOOUT_LINEOUTCTRL, CHARGE_CAP, 2); | ||
289 | /** 2) set min gain, nominal vag levels and zerocross desires */ | ||
290 | /* volume is decreasing with the value in the register */ | ||
291 | BF_SET(AUDIOOUT_LINEOUTCTRL, VOLUME_LEFT); | ||
292 | BF_SET(AUDIOOUT_LINEOUTCTRL, VOLUME_RIGHT); | ||
293 | BF_SET(AUDIOOUT_LINEOUTCTRL, EN_LINEOUT_ZCD); | ||
294 | /* vag should be set to VDDIO/2, 0 is 1.725V, 15 is 1.350V, 25mV steps */ | ||
295 | int vddio; | ||
296 | imx233_power_get_regulator(REGULATOR_VDDIO, &vddio, NULL); | ||
297 | BF_WR(AUDIOOUT_LINEOUTCTRL, VAG_CTRL, 15 - (vddio / 2 - 1350) / 25); | ||
298 | /** 3) Power up lineout */ | ||
299 | BF_CLR(AUDIOOUT_PWRDN, LINEOUT); | ||
300 | /** 4) Ramp the vag */ | ||
301 | BF_WR(AUDIOOUT_LINEOUTCTRL, CHARGE_CAP, 1); | ||
302 | /** 5) Unmute */ | ||
303 | BF_CLR(AUDIOOUT_LINEOUTCTRL, MUTE); | ||
304 | /** 6) Ramp volume */ | ||
305 | BF_WR(AUDIOOUT_LINEOUTCTRL, VOLUME_LEFT, 0); | ||
306 | BF_WR(AUDIOOUT_LINEOUTCTRL, VOLUME_RIGHT, 0); | ||
307 | } | ||
308 | else | ||
309 | { | ||
310 | /** Reverse procedure */ | ||
311 | BF_SET(AUDIOOUT_LINEOUTCTRL, MUTE); | ||
312 | BF_WR(AUDIOOUT_LINEOUTCTRL, CHARGE_CAP, 2); | ||
313 | BF_SET(AUDIOOUT_PWRDN, LINEOUT); | ||
314 | } | ||
278 | #else | 315 | #else |
279 | (void) en; | 316 | (void) en; |
280 | #endif | 317 | #endif |