summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-03-08 18:21:44 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-03-08 18:51:54 +0100
commit9fe368792369fc5b81e752328ae80062bce56201 (patch)
treed20d03069a9e54cb6778321c07b0210c4fae2fc1
parent4b2f59b3db7d378a42dfebd39e4e3b4ccc8280f8 (diff)
downloadrockbox-9fe368792369fc5b81e752328ae80062bce56201.tar.gz
rockbox-9fe368792369fc5b81e752328ae80062bce56201.zip
imx233: fix regulator code on stmp3700
For some reason the power subsystem needs to know the relationship between the VDD{D,A,IO} and uses a weird register to do so. Change-Id: I7fcc75f6cc0460b4997914986deda7ca544a4940
-rw-r--r--firmware/target/arm/imx233/power-imx233.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/power-imx233.c b/firmware/target/arm/imx233/power-imx233.c
index 0a4482fa08..c374644c0b 100644
--- a/firmware/target/arm/imx233/power-imx233.c
+++ b/firmware/target/arm/imx233/power-imx233.c
@@ -355,6 +355,19 @@ void imx233_power_get_regulator(enum imx233_regulator_t reg, unsigned *value_mv,
355 *brownout_mv = 0; 355 *brownout_mv = 0;
356} 356}
357 357
358#if IMX233_SUBTARGET >= 3700 && IMX233_SUBTARGET < 3780
359static void update_dcfuncv(void)
360{
361 int vddd, vdda, vddio;
362 imx233_power_get_regulator(REGULATOR_VDDD, &vddd, NULL);
363 imx233_power_get_regulator(REGULATOR_VDDA, &vdda, NULL);
364 imx233_power_get_regulator(REGULATOR_VDDIO, &vddio, NULL);
365 // assume Li-Ion, to divide by 6.25, do *100 and /625
366 HW_POWER_DCFUNCV = BF_OR2(POWER_DCFUNCV, VDDIO(((vddio - vdda) * 100) / 625),
367 VDDD(((vdda - vddd) * 100) / 625));
368}
369#endif
370
358void imx233_power_set_regulator(enum imx233_regulator_t reg, unsigned value_mv, 371void imx233_power_set_regulator(enum imx233_regulator_t reg, unsigned value_mv,
359 unsigned brownout_mv) 372 unsigned brownout_mv)
360{ 373{
@@ -393,6 +406,10 @@ void imx233_power_set_regulator(enum imx233_regulator_t reg, unsigned value_mv,
393 if(!BF_RD(POWER_STS, DC1_OK) || !BF_RD(POWER_STS, DC2_OK)) 406 if(!BF_RD(POWER_STS, DC1_OK) || !BF_RD(POWER_STS, DC2_OK))
394 panicf("regulator %d: failed to stabilize", reg); 407 panicf("regulator %d: failed to stabilize", reg);
395#endif 408#endif
409 /* On STMP37xx, we need to update the weird HW_POWER_DCFUNCV register */
410#if IMX233_SUBTARGET >= 3700 && IMX233_SUBTARGET < 3780
411 update_dcfuncv();
412#endif
396} 413}
397 414
398// offset is -1,0 or 1 415// offset is -1,0 or 1