summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorChristophe Kerello <christophe.kerello@st.com>2018-06-27 11:59:47 +0200
committerTom Rini <trini@konsulko.com>2018-07-19 16:31:36 -0400
commit844f9bf1eea75ff1ac1b1552ec4cac32ba829abb (patch)
treea41a6ea207bba4ce6f2f4a5150468f1e71cd1792 /drivers/power
parenta1b2faed7cbaf23d4af8a629c4db1bebb8e99d1b (diff)
power: regulator: stpmu1: add power off delay
This patch adds a delay when regulators are disabled. This delay is set to 5 ms to cover all use cases. The worst use case actually seen is during a SD card power cycle. Signed-off-by: Christophe Kerello <christophe.kerello@st.com> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/regulator/stpmu1.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/power/regulator/stpmu1.c b/drivers/power/regulator/stpmu1.c
index 2dedb80acc..6eb2420b6b 100644
--- a/drivers/power/regulator/stpmu1.c
+++ b/drivers/power/regulator/stpmu1.c
@@ -183,6 +183,8 @@ static int stpmu1_buck_get_enable(struct udevice *dev)
static int stpmu1_buck_set_enable(struct udevice *dev, bool enable)
{
struct dm_regulator_uclass_platdata *uc_pdata;
+ int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
+ STPMU1_DEFAULT_STOP_DELAY_MS;
int ret, uv;
/* if regulator is already in the wanted state, nothing to do */
@@ -199,8 +201,7 @@ static int stpmu1_buck_set_enable(struct udevice *dev, bool enable)
ret = pmic_clrsetbits(dev->parent,
STPMU1_BUCKX_CTRL_REG(dev->driver_data - 1),
STPMU1_BUCK_EN, enable ? STPMU1_BUCK_EN : 0);
- if (enable)
- mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+ mdelay(delay);
return ret;
}
@@ -361,6 +362,8 @@ static int stpmu1_ldo_get_enable(struct udevice *dev)
static int stpmu1_ldo_set_enable(struct udevice *dev, bool enable)
{
struct dm_regulator_uclass_platdata *uc_pdata;
+ int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
+ STPMU1_DEFAULT_STOP_DELAY_MS;
int ret, uv;
/* if regulator is already in the wanted state, nothing to do */
@@ -377,8 +380,7 @@ static int stpmu1_ldo_set_enable(struct udevice *dev, bool enable)
ret = pmic_clrsetbits(dev->parent,
STPMU1_LDOX_CTRL_REG(dev->driver_data - 1),
STPMU1_LDO_EN, enable ? STPMU1_LDO_EN : 0);
- if (enable)
- mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+ mdelay(delay);
return ret;
}
@@ -489,6 +491,8 @@ static int stpmu1_vref_ddr_get_enable(struct udevice *dev)
static int stpmu1_vref_ddr_set_enable(struct udevice *dev, bool enable)
{
+ int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
+ STPMU1_DEFAULT_STOP_DELAY_MS;
int ret;
/* if regulator is already in the wanted state, nothing to do */
@@ -497,8 +501,7 @@ static int stpmu1_vref_ddr_set_enable(struct udevice *dev, bool enable)
ret = pmic_clrsetbits(dev->parent, STPMU1_VREF_CTRL_REG,
STPMU1_VREF_EN, enable ? STPMU1_VREF_EN : 0);
- if (enable)
- mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+ mdelay(delay);
return ret;
}
@@ -610,6 +613,8 @@ static int stpmu1_pwr_sw_get_enable(struct udevice *dev)
static int stpmu1_pwr_sw_set_enable(struct udevice *dev, bool enable)
{
uint mask = 1 << dev->driver_data;
+ int delay = enable ? STPMU1_DEFAULT_START_UP_DELAY_MS :
+ STPMU1_DEFAULT_STOP_DELAY_MS;
int ret;
ret = pmic_reg_read(dev->parent, STPMU1_USB_CTRL_REG);
@@ -633,8 +638,7 @@ static int stpmu1_pwr_sw_set_enable(struct udevice *dev, bool enable)
ret = pmic_clrsetbits(dev->parent, STPMU1_USB_CTRL_REG,
mask, enable ? mask : 0);
- if (enable)
- mdelay(STPMU1_DEFAULT_START_UP_DELAY_MS);
+ mdelay(delay);
return ret;
}