};
AMS_PDATA_INIT(sd0, NULL, 700000, 1400000, 1, 1, 1, AS3722_EXT_CONTROL_ENABLE2);
-AMS_PDATA_INIT(sd1, NULL, 700000, 1350000, 1, 1, 1, AS3722_EXT_CONTROL_ENABLE1);
+AMS_PDATA_INIT(sd1, NULL, 700000, 1350000, 1, 1, 1, 0);
AMS_PDATA_INIT(sd2, NULL, 1350000, 1350000, 1, 1, 1, 0);
AMS_PDATA_INIT(sd4, NULL, 1050000, 1050000, 1, 1, 1, AS3722_EXT_CONTROL_ENABLE1);
AMS_PDATA_INIT(sd5, NULL, 1800000, 1800000, 1, 1, 1, 0);
struct as3722_regulators *as3722_regs = dev_get_drvdata(dev);
struct as3722_regulator_config_data *reg_config;
int ret;
+ u32 val;
+
+ /* Enable SD1 external control before entering suspend */
+ reg_config = &as3722_regs->reg_config_data[AS3722_REGULATOR_ID_SD1];
+ val = AS3722_EXT_CONTROL_ENABLE1 << (ffs(
+ as3722_reg_lookup[AS3722_REGULATOR_ID_SD1].
+ sleep_ctrl_mask) - 1);
+ ret = as3722_update_bits(as3722_regs->as3722, AS3722_ENABLE_CTRL1_REG,
+ AS3722_SD1_EXT_ENABLE_MASK,
+ val);
+ if (ret < 0) {
+ dev_err(dev, "Reg 0x%02x write failed: %d\n",
+ AS3722_ENABLE_CTRL1_REG, ret);
+ return ret;
+ }
reg_config = &as3722_regs->reg_config_data[AS3722_REGULATOR_ID_LDO3];
if (reg_config->enable_tracking &&
reg_config->disable_tracking_suspend) {
struct as3722_regulators *as3722_regs = dev_get_drvdata(dev);
struct as3722_regulator_config_data *reg_config;
int ret;
+ u32 val;
+ /* Disable SD1 external control after resuming to have a
+ * proper shutdown sequence
+ */
+ ret = as3722_update_bits(as3722_regs->as3722, AS3722_ENABLE_CTRL1_REG,
+ AS3722_SD1_EXT_ENABLE_MASK, 0);
+ if (ret < 0) {
+ dev_err(dev, "Reg 0x%02x write failed: %d\n",
+ AS3722_ENABLE_CTRL1_REG, ret);
+ return ret;
+ }
reg_config = &as3722_regs->reg_config_data[AS3722_REGULATOR_ID_LDO3];
if (reg_config->enable_tracking &&
reg_config->disable_tracking_suspend) {