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:
parent
1367bfe31c
commit
fbc6dab938
|
|
@ -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) &&
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue