summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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