summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-02-22 20:38:40 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-02-22 20:38:40 +0100
commit1450f2658a59006113fdfc356f4f0033c0e6f691 (patch)
treebc95eb9820dad6e7933466ff496932955787094b
parentb9db3d3743927f28f4909861e899818372645344 (diff)
downloadrockbox-1450f2658a59006113fdfc356f4f0033c0e6f691.tar.gz
rockbox-1450f2658a59006113fdfc356f4f0033c0e6f691.zip
stmp3700: implement speaker support by mean of lineout
Change-Id: Ic4c8b536fde7a840d3f3f295531cc1253de6320d
-rw-r--r--firmware/target/arm/imx233/audioout-imx233.c37
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
265void imx233_audioout_enable_spkr(bool en) 265void 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