+CC mmc/rockchip folks > Am 17.07.2022 um 13:39 schrieb Christian Kohlschütter <christian@xxxxxxxxxxxxxxxx>: > > This is _somewhat_ related to "[PATCH] regulator: core: Fix off-on-delay-us for always-on/boot-on regulators" > That other patch is the right solution for my specific problem, and no further fixes are necessary. > > This change fixes an attempted "bandage" solution (adding an "off-on-delay-us") that we had initially tried to no avail. > While the cleanup not only reduces complexity, it may also prevent future code changes reintroducing the non-delayed cycling after registration. > > from arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi: > vcc3v0_sd: vcc3v0-sd { > compatible = "regulator-fixed"; > enable-active-high; > gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>; > pinctrl-names = "default"; > pinctrl-0 = <&sdmmc0_pwr_h>; > regulator-always-on; // prevents setting last_off upon registration > off-on-delay-us = <500000>; // would not be honored upon regulator_register > regulator-min-microvolt = <3000000>; > regulator-max-microvolt = <3000000>; > regulator-name = "vcc3v0_sd"; > vin-supply = <&vcc3v3_sys>; > }; > >> Am 17.07.2022 um 13:30 schrieb Christian Kohlschuetter <christian@xxxxxxxxxxxxxxxxx>: >> >> Regulators marked with "regulator-always-on" or "regulator-boot-on" >> as well as an "off-on-delay-us", may run into cycling issues that are >> hard to detect. >> >> This is caused by the "last_off" state not being initialized in this >> case. >> >> Fix the "last_off" initialization by setting it to the current kernel >> time upon initialization, regardless of always_on/boot_on state. >> >> Signed-off-by: Christian Kohlschütter <christian@xxxxxxxxxxxxxxxx> >> --- >> drivers/regulator/core.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c >> index c4d844ffad7a..48ed33ad48c8 100644 >> --- a/drivers/regulator/core.c >> +++ b/drivers/regulator/core.c >> @@ -1522,6 +1522,9 @@ static int set_machine_constraints(struct regulator_dev *rdev) >> } >> } >> >> + if (rdev->desc->off_on_delay) >> + rdev->last_off = ktime_get(); >> + >> /* If the constraints say the regulator should be on at this point >> * and we have control then make sure it is enabled. >> */ >> @@ -1549,8 +1552,6 @@ static int set_machine_constraints(struct regulator_dev *rdev) >> >> if (rdev->constraints->always_on) >> rdev->use_count++; >> - } else if (rdev->desc->off_on_delay) { >> - rdev->last_off = ktime_get(); >> } >> >> print_constraints(rdev); >> -- >> 2.36.1 >> >> > > > > -- > Dr. Christian Kohlschütter > > >