svn commit: r341385 - head/sys/arm64/rockchip
Emmanuel Vadot
manu at FreeBSD.org
Sat Dec 1 20:31:07 UTC 2018
Author: manu
Date: Sat Dec 1 20:31:05 2018
New Revision: 341385
URL: https://svnweb.freebsd.org/changeset/base/341385
Log:
arm64: rockchip: rk805: Add basic support for RK808 PMIC
RK808 PMIC is the companion chip for RK3399 SoC.
Add basic regulator support in RK805 since they are similar.
MFC after: 1 month
Modified:
head/sys/arm64/rockchip/rk805.c
head/sys/arm64/rockchip/rk805reg.h
Modified: head/sys/arm64/rockchip/rk805.c
==============================================================================
--- head/sys/arm64/rockchip/rk805.c Sat Dec 1 20:30:18 2018 (r341384)
+++ head/sys/arm64/rockchip/rk805.c Sat Dec 1 20:31:05 2018 (r341385)
@@ -51,8 +51,14 @@ __FBSDID("$FreeBSD$");
MALLOC_DEFINE(M_RK805_REG, "RK805 regulator", "RK805 power regulator");
+enum rk_pmic_type {
+ RK805 = 1,
+ RK808,
+};
+
static struct ofw_compat_data compat_data[] = {
- {"rockchip,rk805", 1},
+ {"rockchip,rk805", RK805},
+ {"rockchip,rk808", RK808},
{NULL, 0}
};
@@ -83,6 +89,7 @@ struct rk805_softc {
struct resource * res[1];
void * intrcookie;
struct intr_config_hook intr_hook;
+ enum rk_pmic_type type;
struct rk805_reg_sc **regs;
int nregs;
@@ -133,6 +140,51 @@ static struct rk805_regdef rk805_regdefs[] = {
},
};
+static struct rk805_regdef rk808_regdefs[] = {
+ {
+ .id = RK805_DCDC1,
+ .name = "DCDC_REG1",
+ .enable_reg = RK805_DCDC_EN,
+ .enable_mask = 0x1,
+ .voltage_reg = RK805_DCDC1_ON_VSEL,
+ .voltage_mask = 0x3F,
+ .voltage_min = 712500,
+ .voltage_max = 1500000,
+ .voltage_step = 12500,
+ .voltage_nstep = 64,
+ },
+ {
+ .id = RK805_DCDC2,
+ .name = "DCDC_REG2",
+ .enable_reg = RK805_DCDC_EN,
+ .enable_mask = 0x2,
+ .voltage_reg = RK805_DCDC2_ON_VSEL,
+ .voltage_mask = 0x3F,
+ .voltage_min = 712500,
+ .voltage_max = 1500000,
+ .voltage_step = 12500,
+ .voltage_nstep = 64,
+ },
+ {
+ .id = RK805_DCDC3,
+ .name = "DCDC_REG3",
+ .enable_reg = RK805_DCDC_EN,
+ .enable_mask = 0x4,
+ },
+ {
+ .id = RK805_DCDC4,
+ .name = "DCDC_REG4",
+ .enable_reg = RK805_DCDC_EN,
+ .enable_mask = 0x8,
+ .voltage_reg = RK805_DCDC4_ON_VSEL,
+ .voltage_mask = 0xF,
+ .voltage_min = 1800000,
+ .voltage_max = 3300000,
+ .voltage_step = 100000,
+ .voltage_nstep = 16,
+ },
+};
+
static int
rk805_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size)
{
@@ -226,11 +278,17 @@ rk805_regnode_set_voltage(struct regnode *regnode, int
if (!sc->def->voltage_step)
return (ENXIO);
+ rk805_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
+ printf("rk805_set_voltage: Current value for %x: %x\n", sc->def->voltage_reg, val);
if (rk805_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0)
return (ERANGE);
+ printf("rk805_set_voltage: Setting %x to %x\n", sc->def->voltage_reg, val);
rk805_write(sc->base_dev, sc->def->voltage_reg, val);
+ rk805_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
+ printf("rk805_set_voltage: Set value for %x: %x\n", sc->def->voltage_reg, val);
+
*udelay = 0;
return (0);
@@ -326,13 +384,14 @@ rk805_start(void *pdev)
sc = device_get_softc(dev);
sc->dev = dev;
- if (bootverbose) {
- err = rk805_read(dev, 0x17, data, 1);
+ /* No version register in RK808 */
+ if (bootverbose && sc->type == RK805) {
+ err = rk805_read(dev, RK805_CHIP_NAME, data, 1);
if (err != 0) {
device_printf(dev, "Cannot read chip name reg\n");
return;
}
- err = rk805_read(dev, 0x18, data + 1, 1);
+ err = rk805_read(dev, RK805_CHIP_VER, data + 1, 1);
if (err != 0) {
device_printf(dev, "Cannot read chip version reg\n");
return;
@@ -365,8 +424,17 @@ rk805_attach(device_t dev)
sc->regs = malloc(sizeof(struct rk805_reg_sc *) * sc->nregs,
M_RK805_REG, M_WAITOK | M_ZERO);
- regdefs = rk805_regdefs;
- sc->nregs = nitems(rk805_regdefs);
+ sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
+ switch (sc->type) {
+ case RK805:
+ regdefs = rk805_regdefs;
+ sc->nregs = nitems(rk805_regdefs);
+ break;
+ case RK808:
+ regdefs = rk808_regdefs;
+ sc->nregs = nitems(rk808_regdefs);
+ break;
+ }
rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators");
if (rnode > 0) {
Modified: head/sys/arm64/rockchip/rk805reg.h
==============================================================================
--- head/sys/arm64/rockchip/rk805reg.h Sat Dec 1 20:30:18 2018 (r341384)
+++ head/sys/arm64/rockchip/rk805reg.h Sat Dec 1 20:31:05 2018 (r341385)
@@ -37,6 +37,7 @@
#define RK805_OTP_VER 0x19
#define RK805_DCDC_EN 0x23
+#define RK808_LDO_EN 0x24
#define RK805_SLEEP_DCDC_EN 0x25
#define RK805_SLEEP_LDO_EN 0x26
#define RK805_LDO_EN 0x27
@@ -67,6 +68,23 @@ enum rk805_regulator {
RK805_LDO1,
RK805_LDO2,
RK805_LDO3,
+};
+
+enum rk808_regulator {
+ RK808_DCDC1,
+ RK808_DCDC2,
+ RK808_DCDC3,
+ RK808_DCDC4,
+ RK808_LDO1,
+ RK808_LDO2,
+ RK808_LDO3,
+ RK808_LDO4,
+ RK808_LDO5,
+ RK808_LDO6,
+ RK808_LDO7,
+ RK808_LDO8,
+ RK808_SWITCH1,
+ RK808_SWITCH2,
};
#endif /* _RK805REG_H_ */
More information about the svn-src-head
mailing list