ret = _regulator_enable(rdev);
mutex_unlock(&rdev->mutex);
- if (ret != 0 && rdev->supply)
+ if (rdev->supply &&
+ (ret || rdev->constraints->disable_parent_after_enable)) {
+ rdev_info(rdev, "Disabling parent\n");
regulator_disable(rdev->supply);
-
+ }
return ret;
}
EXPORT_SYMBOL_GPL(regulator_enable);
ret = _regulator_disable(rdev);
mutex_unlock(&rdev->mutex);
- if (ret == 0 && rdev->supply)
- regulator_disable(rdev->supply);
+ if (ret == 0 && rdev->supply) {
+ if (!rdev->constraints->disable_parent_after_enable)
+ regulator_disable(rdev->supply);
+ }
return ret;
}
ret = of_property_read_u32(np, "regulator-init-mode", &pval);
if (!ret)
constraints->initial_mode = pval;
+ if (of_find_property(np, "regulator-disable-parent-after-enable", NULL))
+ constraints->disable_parent_after_enable = true;
}
/**
unsigned apply_uV:1; /* apply uV constraint if min == max */
unsigned boot_off:1; /* bootloader/firmware disabled regulator */
unsigned int ignore_current_constraint_init:1;
+ unsigned disable_parent_after_enable:1; /* SW based overcurrent protection */
};
/**