Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iicbus/pmic/rockchip/rk8xx_regulators.c
Context not available. | |||||
static void | static void | ||||
rk8xx_regnode_reg_to_voltage(struct rk8xx_reg_sc *sc, uint8_t val, int *uv) | rk8xx_regnode_reg_to_voltage(struct rk8xx_reg_sc *sc, uint8_t val, int *uv) | ||||
{ | { | ||||
if (val < sc->def->voltage_nstep) | struct rk8xx_softc *sc1; | ||||
*uv = sc->def->voltage_min + val * sc->def->voltage_step; | |||||
else | sc1 = device_get_softc(sc->base_dev); | ||||
*uv = sc->def->voltage_min + | if (sc1->type == RK809 || sc1->type == RK817) { | ||||
(sc->def->voltage_nstep * sc->def->voltage_step); | if (sc->def->voltage_step2) { | ||||
int change; | |||||
change = | |||||
((sc->def->voltage_min2 - sc->def->voltage_min) / | |||||
sc->def->voltage_step); | |||||
if (val > change) { | |||||
if (val < sc->def->voltage_nstep) { | |||||
*uv = sc->def->voltage_min2 + | |||||
(val - change) * | |||||
sc->def->voltage_step2; | |||||
} else | |||||
*uv = sc->def->voltage_max2; | |||||
return; | |||||
} | |||||
} | |||||
if (val < sc->def->voltage_nstep) | |||||
*uv = sc->def->voltage_min + val * sc->def->voltage_step; | |||||
else | |||||
*uv = sc->def->voltage_max; | |||||
} else { | |||||
if (val < sc->def->voltage_nstep) | |||||
*uv = sc->def->voltage_min + val * sc->def->voltage_step; | |||||
else | |||||
*uv = sc->def->voltage_min + | |||||
(sc->def->voltage_nstep * sc->def->voltage_step); | |||||
} | |||||
} | } | ||||
static int | static int | ||||
Context not available. | |||||
{ | { | ||||
uint8_t nval; | uint8_t nval; | ||||
int nstep, uvolt; | int nstep, uvolt; | ||||
struct rk8xx_softc *sc1; | |||||
sc1 = device_get_softc(sc->base_dev); | |||||
nval = 0; | nval = 0; | ||||
uvolt = sc->def->voltage_min; | uvolt = sc->def->voltage_min; | ||||
for (nstep = 0; nstep < sc->def->voltage_nstep && uvolt < min_uvolt; | for (nstep = 0; nstep < sc->def->voltage_nstep && uvolt < min_uvolt; | ||||
nstep++) { | nstep++) { | ||||
++nval; | ++nval; | ||||
uvolt += sc->def->voltage_step; | if (sc1->type == RK809 || sc1->type == RK817) { | ||||
if (sc->def->voltage_step2) { | |||||
if (uvolt < sc->def->voltage_min2) | |||||
uvolt += sc->def->voltage_step; | |||||
else | |||||
uvolt += sc->def->voltage_step2; | |||||
} else | |||||
uvolt += sc->def->voltage_step; | |||||
} else | |||||
uvolt += sc->def->voltage_step; | |||||
} | } | ||||
if (uvolt > max_uvolt) | if (uvolt > max_uvolt) | ||||
return (EINVAL); | return (EINVAL); | ||||
Context not available. | |||||
int max_uvolt, int *udelay) | int max_uvolt, int *udelay) | ||||
{ | { | ||||
struct rk8xx_reg_sc *sc; | struct rk8xx_reg_sc *sc; | ||||
uint8_t val; | uint8_t val, old; | ||||
int uvolt; | int uvolt; | ||||
struct rk8xx_softc *sc1; | |||||
sc = regnode_get_softc(regnode); | sc = regnode_get_softc(regnode); | ||||
sc1 = device_get_softc(sc->base_dev); | |||||
if (!sc->def->voltage_step) | if (!sc->def->voltage_step) | ||||
return (ENXIO); | return (ENXIO); | ||||
Context not available. | |||||
min_uvolt, | min_uvolt, | ||||
max_uvolt); | max_uvolt); | ||||
rk8xx_read(sc->base_dev, sc->def->voltage_reg, &val, 1); | rk8xx_read(sc->base_dev, sc->def->voltage_reg, &val, 1); | ||||
old = val; | |||||
if (rk8xx_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0) | if (rk8xx_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0) | ||||
return (ERANGE); | return (ERANGE); | ||||
if (sc1->type == RK809 || sc1->type == RK817) | |||||
val |= (old &= ~sc->def->voltage_mask); | |||||
rk8xx_write(sc->base_dev, sc->def->voltage_reg, &val, 1); | rk8xx_write(sc->base_dev, sc->def->voltage_reg, &val, 1); | ||||
rk8xx_read(sc->base_dev, sc->def->voltage_reg, &val, 1); | rk8xx_read(sc->base_dev, sc->def->voltage_reg, &val, 1); | ||||
Context not available. |