aboutsummaryrefslogtreecommitdiff
path: root/src/soc/rockchip/rk3288/rk808.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/rockchip/rk3288/rk808.c')
-rw-r--r--src/soc/rockchip/rk3288/rk808.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/soc/rockchip/rk3288/rk808.c b/src/soc/rockchip/rk3288/rk808.c
index 50df96d591..48cfa8603e 100644
--- a/src/soc/rockchip/rk3288/rk808.c
+++ b/src/soc/rockchip/rk3288/rk808.c
@@ -22,12 +22,15 @@
#include <device/i2c.h>
#include <stdint.h>
#include <stdlib.h>
+#include <delay.h>
#include "rk808.h"
#define RK808_ADDR 0x1b
#define DCDC_EN 0x23
#define LDO_EN 0x24
+#define BUCK1SEL 0x2f
+#define BUCK4SEL 0x38
#define LDO_ONSEL(i) (0x39 + 2 * i)
#define LDO_SLPSEL(i) (0x3a + 2 * i)
@@ -56,12 +59,12 @@ void rk808_configure_ldo(uint8_t bus, int ldo, int millivolts)
case 4:
case 5:
case 8:
- vsel = millivolts / 100 - 18;
+ vsel = div_round_up(millivolts, 100) - 18;
break;
case 3:
case 6:
case 7:
- vsel = millivolts / 100 - 8;
+ vsel = div_round_up(millivolts, 100) - 8;
break;
default:
die("Unknown LDO index!");
@@ -71,3 +74,29 @@ void rk808_configure_ldo(uint8_t bus, int ldo, int millivolts)
rk808_clrsetbits(bus, LDO_ONSEL(ldo), 0x1f, vsel);
rk808_clrsetbits(bus, LDO_EN, 0, 1 << (ldo - 1));
}
+
+void rk808_configure_buck(uint8_t bus, int buck, int millivolts)
+{
+ uint8_t vsel;
+ uint8_t buck_reg;
+
+ switch (buck) {
+ case 1:
+ case 2:
+ /*base on 725mv, use 25mv step */
+ vsel = (div_round_up(millivolts, 25) - 29) * 2 + 1;
+ assert(vsel <= 0x3f);
+ buck_reg = BUCK1SEL + 4 * (buck - 1);
+ break;
+ case 4:
+ vsel = div_round_up(millivolts, 100) - 18;
+ assert(vsel <= 0xf);
+ buck_reg = BUCK4SEL;
+ break;
+ default:
+ die("fault buck index!");
+ }
+ rk808_clrsetbits(bus, buck_reg, 0x3f, vsel);
+ rk808_clrsetbits(bus, DCDC_EN, 0, 1 << (buck - 1));
+ udelay(225);/* Must wait for voltage to stabilize */
+}