• Martin Blumenstingl's avatar
    regulator: pwm-regulator: Manage boot-on with disabled PWM channels · b3cbdcc1
    Martin Blumenstingl authored
    Odroid-C1 uses a Monolithic Power Systems MP2161 controlled via PWM for
    the VDDEE voltage supply of the Meson8b SoC. Commit 6b9352f3 ("pwm:
    meson: modify and simplify calculation in meson_pwm_get_state") results
    in my Odroid-C1 crashing with memory corruption in many different places
    (seemingly at random). It turns out that this is due to a currently not
    supported corner case.
    
    The VDDEE regulator can generate between 860mV (duty cycle of ~91%) and
    1140mV (duty cycle of 0%). We consider it to be enabled by the bootloader
    (which is why it has the regulator-boot-on flag in .dts) as well as
    being always-on (which is why it has the regulator-always-on flag in
    .dts) because the VDDEE voltage is generally required for the Meson8b
    SoC to work. The public S805 datasheet [0] states on page 17 (where "A5"
    refers to the Cortex-A5 CPU cores):
      [...] So if EE domains is shut off, A5 memory is also shut off. That
      does not matter. Before EE power domain is shut off, A5 should be shut
      off at first.
    
    It turns out that at least some bootloader versions are keeping the PWM
    output disabled. This is not a problem due to the specific design of the
    regulator: when the PWM output is disabled the output pin is pulled LOW,
    effectively achieving a 0% duty cycle (which in return means that VDDEE
    voltage is at 1140mV).
    
    The problem comes when the pwm-regulator driver tries to initialize the
    PWM output. To do so it reads the current state from the hardware, which
    is:
      period: 3666ns
      duty cycle: 3333ns (= ~91%)
      enabled: false
    Then those values are translated using the continuous voltage range to
    860mV.
    Later, when the regulator is being enabled (either by the regulator core
    due to the always-on flag or first consumer - in this case the lima
    driver for the Mali-450 GPU) the pwm-regulator driver tries to keep the
    voltage (at 860mV) and just enable the PWM output. This is when things
    start to go wrong as the typical voltage used for VDDEE is 1100mV.
    
    Commit 6b9352f3 ("pwm: meson: modify and simplify calculation in
    meson_pwm_get_state") triggers above condition as before that change
    period and duty cycle were both at 0. Since the change to the pwm-meson
    driver is considered correct the solution is to be found in the
    pwm-regulator driver. Update the duty cycle during driver probe if the
    regulator is flagged as boot-on so that a call to pwm_regulator_enable()
    (by the regulator core during initialization of a regulator flagged with
    boot-on) without any preceding call to pwm_regulator_set_voltage() does
    not change the output voltage.
    
    [0] https://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdfSigned-off-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
    Link: https://msgid.link/r/20240113224628.377993-4-martin.blumenstingl@googlemail.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    b3cbdcc1
pwm-regulator.c 11.6 KB