dm: regulator: support regulator set suspend state

support parse regulator standard property:
	regulator-off-in-suspend;
	regulator-suspend-microvolt;

Change-Id: I59bf60b28293e891b4d2817462efb36447c46887
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2017-11-27 16:02:07 +08:00 committed by Kever Yang
parent 1367bfe31c
commit fbc6dab938
2 changed files with 65 additions and 0 deletions

View File

@ -55,6 +55,23 @@ int regulator_set_value(struct udevice *dev, int uV)
return ops->set_value(dev, uV);
}
int regulator_set_suspend_value(struct udevice *dev, int uV)
{
const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
struct dm_regulator_uclass_platdata *uc_pdata;
uc_pdata = dev_get_uclass_platdata(dev);
if (uc_pdata->min_uV != -ENODATA && uV < uc_pdata->min_uV)
return -EINVAL;
if (uc_pdata->max_uV != -ENODATA && uV > uc_pdata->max_uV)
return -EINVAL;
if (!ops || !ops->set_suspend_value)
return -ENOSYS;
return ops->set_suspend_value(dev, uV);
}
/*
* To be called with at most caution as there is no check
* before setting the actual voltage value.
@ -116,6 +133,16 @@ int regulator_set_enable(struct udevice *dev, bool enable)
return ops->set_enable(dev, enable);
}
int regulator_set_suspend_enable(struct udevice *dev, bool enable)
{
const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
if (!ops || !ops->set_suspend_enable)
return -ENOSYS;
return ops->set_suspend_enable(dev, enable);
}
int regulator_get_mode(struct udevice *dev)
{
const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
@ -181,6 +208,11 @@ int regulator_autoset(struct udevice *dev)
int ret = 0;
uc_pdata = dev_get_uclass_platdata(dev);
ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on);
if (!ret && uc_pdata->suspend_on)
ret = regulator_set_suspend_value(dev, uc_pdata->suspend_uV);
if (!uc_pdata->always_on && !uc_pdata->boot_on)
return -EMEDIUMTYPE;
@ -306,6 +338,7 @@ static int regulator_post_bind(struct udevice *dev)
static int regulator_pre_probe(struct udevice *dev)
{
struct dm_regulator_uclass_platdata *uc_pdata;
ofnode node;
uc_pdata = dev_get_uclass_platdata(dev);
if (!uc_pdata)
@ -323,6 +356,16 @@ static int regulator_pre_probe(struct udevice *dev)
uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on");
uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on");
node = dev_read_subnode(dev, "regulator-state-mem");
if (ofnode_valid(node)) {
uc_pdata->suspend_on = !ofnode_read_bool(node, "regulator-off-in-suspend");
if (ofnode_read_u32(node, "regulator-suspend-microvolt", &uc_pdata->suspend_uV))
uc_pdata->suspend_uV = uc_pdata->max_uA;
} else {
uc_pdata->suspend_on = true;
uc_pdata->suspend_uV = uc_pdata->max_uA;
}
/* Those values are optional (-ENODATA if unset) */
if ((uc_pdata->min_uV != -ENODATA) &&
(uc_pdata->max_uV != -ENODATA) &&

View File

@ -176,6 +176,8 @@ struct dm_regulator_uclass_platdata {
int flags;
u8 ctrl_reg;
u8 volt_reg;
bool suspend_on;
u32 suspend_uV;
};
/* Regulator device operations */
@ -191,6 +193,7 @@ struct dm_regulator_ops {
*/
int (*get_value)(struct udevice *dev);
int (*set_value)(struct udevice *dev, int uV);
int (*set_suspend_value)(struct udevice *dev, int uV);
/**
* The regulator output current function calls operates on a micro Amps.
@ -215,6 +218,7 @@ struct dm_regulator_ops {
*/
int (*get_enable)(struct udevice *dev);
int (*set_enable)(struct udevice *dev, bool enable);
int (*set_suspend_enable)(struct udevice *dev, bool enable);
/**
* The 'get/set_mode()' function calls should operate on a driver-
@ -260,6 +264,15 @@ int regulator_get_value(struct udevice *dev);
*/
int regulator_set_value(struct udevice *dev, int uV);
/**
* regulator_set_suspend_value: set the suspend microvoltage value of a given regulator.
*
* @dev - pointer to the regulator device
* @uV - the output suspend value to set [micro Volts]
* @return - 0 on success or -errno val if fails
*/
int regulator_set_suspend_value(struct udevice *dev, int uV);
/**
* regulator_set_value_force: set the microvoltage value of a given regulator
* without any min-,max condition check
@ -304,6 +317,15 @@ int regulator_get_enable(struct udevice *dev);
*/
int regulator_set_enable(struct udevice *dev, bool enable);
/**
* regulator_set_suspend_enable: set regulator suspend enable state
*
* @dev - pointer to the regulator device
* @enable - set true or false
* @return - 0 on success or -errno val if fails
*/
int regulator_set_suspend_enable(struct udevice *dev, bool enable);
/**
* regulator_get_mode: get active operation mode id of a given regulator
*