• Dave Martin's avatar
    ARM: bL_switcher: Add switch completion callback for bL_switch_request() · 0577fee2
    Dave Martin authored
    There is no explicit way to know when a switch started via
    bL_switch_request() is complete.  This can lead to unpredictable
    behaviour when the switcher is controlled by a subsystem which
    makes dynamic decisions (such as cpufreq).
    
    The CPU PM notifier is not really suitable for signalling
    completion, because the CPU could get suspended and resumed for
    other, independent reasons while a switch request is in flight.
    Adding a whole new notifier for this seems excessive, and may tempt
    people to put heavyweight code on this path.
    
    This patch implements a new bL_switch_request_cb() function that
    allows for a per-request lightweight callback, private between the
    switcher and the caller of bL_switch_request_cb().
    
    Overlapping switches on a single CPU are considered incorrect if
    they are requested via bL_switch_request_cb() with a callback (they
    will lead to an unpredictable final state without explicit external
    synchronisation to force the requests into a particular order).
    Queuing requests robustly would be overkill because only one
    subsystem should be attempting to control the switcher at any time.
    
    Overlapping requests of this kind will be failed with -EBUSY to
    indicate that the second request won't take effect and the
    completer will never be called for it.
    
    bL_switch_request() is retained as a wrapper round the new function,
    with the old, fire-and-forget semantics.  In this case the last request
    will always win. The request may still be denied if a previous request
    with a completer is still pending.
    Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
    Signed-off-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
    0577fee2
bL_switcher.c 18.3 KB