From 844f9bf1eea75ff1ac1b1552ec4cac32ba829abb Mon Sep 17 00:00:00 2001 From: Christophe Kerello Date: Wed, 27 Jun 2018 11:59:47 +0200 Subject: [PATCH] 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 Signed-off-by: Patrice Chotard --- drivers/power/regulator/stpmu1.c | 20 ++++++++++++-------- include/power/stpmu1.h | 1 + 2 files changed, 13 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; } diff --git a/include/power/stpmu1.h b/include/power/stpmu1.h index 61c58f3b70..5906fbf832 100644 --- a/include/power/stpmu1.h +++ b/include/power/stpmu1.h @@ -44,6 +44,7 @@ #define STPMU1_NVM_USER_STATUS_ERROR BIT(1) #define STPMU1_DEFAULT_START_UP_DELAY_MS 1 +#define STPMU1_DEFAULT_STOP_DELAY_MS 5 #define STPMU1_USB_BOOST_START_UP_DELAY_MS 10 enum { -- 2.39.5