|
@@ -1813,6 +1813,31 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
|
|
|
|
|
|
trace_regulator_enable(rdev_get_name(rdev));
|
|
|
|
|
|
+ if (rdev->desc->off_on_delay) {
|
|
|
+ /* if needed, keep a distance of off_on_delay from last time
|
|
|
+ * this regulator was disabled.
|
|
|
+ */
|
|
|
+ unsigned long start_jiffy = jiffies;
|
|
|
+ unsigned long intended, max_delay, remaining;
|
|
|
+
|
|
|
+ max_delay = usecs_to_jiffies(rdev->desc->off_on_delay);
|
|
|
+ intended = rdev->last_off_jiffy + max_delay;
|
|
|
+
|
|
|
+ if (time_before(start_jiffy, intended)) {
|
|
|
+ /* calc remaining jiffies to deal with one-time
|
|
|
+ * timer wrapping.
|
|
|
+ * in case of multiple timer wrapping, either it can be
|
|
|
+ * detected by out-of-range remaining, or it cannot be
|
|
|
+ * detected and we gets a panelty of
|
|
|
+ * _regulator_enable_delay().
|
|
|
+ */
|
|
|
+ remaining = intended - start_jiffy;
|
|
|
+ if (remaining <= max_delay)
|
|
|
+ _regulator_enable_delay(
|
|
|
+ jiffies_to_usecs(remaining));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (rdev->ena_pin) {
|
|
|
ret = regulator_ena_gpio_ctrl(rdev, true);
|
|
|
if (ret < 0)
|
|
@@ -1925,6 +1950,12 @@ static int _regulator_do_disable(struct regulator_dev *rdev)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /* cares about last_off_jiffy only if off_on_delay is required by
|
|
|
+ * device.
|
|
|
+ */
|
|
|
+ if (rdev->desc->off_on_delay)
|
|
|
+ rdev->last_off_jiffy = jiffies;
|
|
|
+
|
|
|
trace_regulator_disable_complete(rdev_get_name(rdev));
|
|
|
|
|
|
return 0;
|