• Andrew Halaney's avatar
    regulator: core: Clean up on enable failure · c32f1ebf
    Andrew Halaney authored
    If regulator_enable() fails, enable_count is incremented still.
    A consumer, assuming no matching regulator_disable() is necessary on
    failure, will then get this error message upon regulator_put()
    since enable_count is non-zero:
    
        [    1.277418] WARNING: CPU: 3 PID: 1 at drivers/regulator/core.c:2304 _regulator_put.part.0+0x168/0x170
    
    The consumer could try to fix this in their driver by cleaning up on
    error from regulator_enable() (i.e. call regulator_disable()), but that
    results in the following since regulator_enable() failed and didn't
    increment user_count:
    
        [    1.258112] unbalanced disables for vreg_l17c
        [    1.262606] WARNING: CPU: 4 PID: 1 at drivers/regulator/core.c:2899 _regulator_disable+0xd4/0x190
    
    Fix this by decrementing enable_count upon failure to enable.
    
    With this in place, just the reason for failure to enable is printed
    as expected and developers can focus on the root cause of their issue
    instead of thinking their usage of the regulator consumer api is
    incorrect. For example, in my case:
    
        [    1.240426] vreg_l17c: invalid input voltage found
    
    Fixes: 5451781d ("regulator: core: Only count load for enabled consumers")
    Signed-off-by: default avatarAndrew Halaney <ahalaney@redhat.com>
    Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
    Reviewed-by: default avatarBrian Masney <bmasney@redhat.com>
    Link: https://lore.kernel.org/r/20220819194336.382740-1-ahalaney@redhat.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    c32f1ebf
core.c 157 KB