• Maciej Purski's avatar
    regulator: core: Add voltage balancing mechanism · c054c6c7
    Maciej Purski authored
    On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
    different devices on the board are supplied by different regulators
    with non-fixed voltages. If one of these devices temporarily requires
    higher voltage, there might occur a situation that the spread between
    two devices' voltages is so high, that there is a risk of changing
    'high' and 'low' states on the interconnection between devices powered
    by those regulators.
    
    Introduce new function regulator_balance_voltage(), which
    keeps max_spread constraint fulfilled between a group of coupled
    regulators. It should be called if a regulator changes its
    voltage or after disabling or enabling. Disabled regulators should
    follow changes of the enabled ones, but their consumers' demands
    shouldn't be taken into account while calculating voltage of other
    coupled regulators.
    
    Find voltages, which are closest to suiting all the consumers' demands,
    while fulfilling max_spread constraint, keeping the following rules:
    - if one regulator is about to rise its voltage, rise others
      voltages in order to keep the max_spread
    - if a regulator, which has caused rising other regulators, is
      lowered, lower other regulators if possible
    - if one regulator is about to lower its voltage, but it hasn't caused
      rising other regulators, change its voltage so that it doesn't break the
      max_spread
    
    Change regulators' voltages step by step, keeping max_spread constraint
    fulfilled all the time. Function regulator_get_optimal_voltage()
    should find the best possible change for the regulator, which doesn't
    break max_spread constraint. In function regulator_balance_voltage()
    optimize number of steps by finding highest voltage difference on
    each iteration.
    
    If a regulator, which is about to change its voltage, is not coupled,
    method regulator_get_optimal_voltage() should simply return the lowest
    voltage fulfilling consumers' demands.
    
    Coupling should be checked only if the system is in PM_SUSPEND_ON state.
    Signed-off-by: default avatarMaciej Purski <m.purski@samsung.com>
    Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    c054c6c7
core.c 130 KB