]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
regulator: fan53555: add enable_time support and soft-start times
authorHeiko Stuebner <heiko@sntech.de>
Fri, 6 Jun 2025 19:04:18 +0000 (21:04 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 16 Jun 2025 12:26:23 +0000 (13:26 +0100)
The datasheets for all the fan53555 variants (and clones using the same
interface) define so called soft start times, from enabling the regulator
until at least some percentage of the output (i.e. 92% for the rk860x
types) are available.

The regulator framework supports this with the enable_time property
but currently the fan53555 driver does not define enable_times for any
variant.

I ran into a problem with this while testing the new driver for the
Rockchip NPUs (rocket), which does runtime-pm including disabling and
enabling a rk8602 as needed. When reenabling the regulator while running
a load, fatal hangs could be observed while enabling the associated
power-domain, which the regulator supplies.

Experimentally setting the regulator to always-on, made the issue
disappear, leading to the missing delay to let power stabilize.
And as expected, setting the enable-time to a non-zero value
according to the datasheet also resolved the regulator-issue.

The datasheets in nearly all cases only specify "typical" values,
except for the fan53555 type 08. There both a typical and maximum
value are listed - 40uS apart.

For all typical values I've added 100uS to be on the safe side.
Individual details for the relevant regulators below:

- fan53526:
  The datasheet for all variants lists a typical value of 150uS, so
  make that 250uS with safety margin.
- fan53555:
  types 08 and 18 (unsupported) are given a typical enable time of 135uS
  but also a maximum of 175uS so use that value. All the other types only
  have a typical time in the datasheet of 300uS, so give a bit margin by
  setting it to 400uS.
- rk8600 + rk8602:
  Datasheet reports a typical value of 260us, so use 360uS to be safe.
- syr82x + syr83x:
  All datasheets report typical soft-start values of 300uS for these
  regulators, so use 400uS.
- tcs452x:
  Datasheet sadly does not report a soft-start time, so I've not set
  an enable-time

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patch.msgid.link/20250606190418.478633-1-heiko@sntech.de
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/fan53555.c

index bd9447dac5967a9864ff861117bb7656a91f0842..c282236959b1803e3cba8f4b9cc15e458f6e8436 100644 (file)
@@ -147,6 +147,7 @@ struct fan53555_device_info {
        unsigned int slew_mask;
        const unsigned int *ramp_delay_table;
        unsigned int n_ramp_values;
+       unsigned int enable_time;
        unsigned int slew_rate;
 };
 
@@ -282,6 +283,7 @@ static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di)
        di->slew_mask = CTL_SLEW_MASK;
        di->ramp_delay_table = slew_rates;
        di->n_ramp_values = ARRAY_SIZE(slew_rates);
+       di->enable_time = 250;
        di->vsel_count = FAN53526_NVOLTAGES;
 
        return 0;
@@ -296,10 +298,12 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
                case FAN53555_CHIP_REV_00:
                        di->vsel_min = 600000;
                        di->vsel_step = 10000;
+                       di->enable_time = 400;
                        break;
                case FAN53555_CHIP_REV_13:
                        di->vsel_min = 800000;
                        di->vsel_step = 10000;
+                       di->enable_time = 400;
                        break;
                default:
                        dev_err(di->dev,
@@ -311,13 +315,19 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
        case FAN53555_CHIP_ID_01:
        case FAN53555_CHIP_ID_03:
        case FAN53555_CHIP_ID_05:
+               di->vsel_min = 600000;
+               di->vsel_step = 10000;
+               di->enable_time = 400;
+               break;
        case FAN53555_CHIP_ID_08:
                di->vsel_min = 600000;
                di->vsel_step = 10000;
+               di->enable_time = 175;
                break;
        case FAN53555_CHIP_ID_04:
                di->vsel_min = 603000;
                di->vsel_step = 12826;
+               di->enable_time = 400;
                break;
        default:
                dev_err(di->dev,
@@ -350,6 +360,7 @@ static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di)
        di->slew_mask = CTL_SLEW_MASK;
        di->ramp_delay_table = slew_rates;
        di->n_ramp_values = ARRAY_SIZE(slew_rates);
+       di->enable_time = 360;
        di->vsel_count = FAN53555_NVOLTAGES;
 
        return 0;
@@ -372,6 +383,7 @@ static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di)
        di->slew_mask = CTL_SLEW_MASK;
        di->ramp_delay_table = slew_rates;
        di->n_ramp_values = ARRAY_SIZE(slew_rates);
+       di->enable_time = 360;
        di->vsel_count = RK8602_NVOLTAGES;
 
        return 0;
@@ -395,6 +407,7 @@ static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di)
        di->slew_mask = CTL_SLEW_MASK;
        di->ramp_delay_table = slew_rates;
        di->n_ramp_values = ARRAY_SIZE(slew_rates);
+       di->enable_time = 400;
        di->vsel_count = FAN53555_NVOLTAGES;
 
        return 0;
@@ -594,6 +607,7 @@ static int fan53555_regulator_register(struct fan53555_device_info *di,
        rdesc->ramp_mask = di->slew_mask;
        rdesc->ramp_delay_table = di->ramp_delay_table;
        rdesc->n_ramp_values = di->n_ramp_values;
+       rdesc->enable_time = di->enable_time;
        rdesc->owner = THIS_MODULE;
 
        rdev = devm_regulator_register(di->dev, &di->desc, config);