• Stephen Warren's avatar
    pinctrl: add explicit gpio_disable_free pinmux_op · 3712a3c4
    Stephen Warren authored
    Some pinctrl drivers (Tegra at least) program a pin to be a GPIO in a
    completely different manner than they select which function to mux out of
    that pin. In order to support a single "free" pinmux_op, the driver would
    need to maintain a per-pin state of requested-for-gpio vs. requested-for-
    function. However, that's a lot of work when the core already has explicit
    separate paths for gpio request/free and function request/free.
    
    So, add a gpio_disable_free op to struct pinmux_ops, and make pin_free()
    call it when appropriate.
    
    When doing this, I noticed that when calling pin_request():
    
        !!gpio == (gpio_range != NULL)
    
    ... and so I collapsed those two parameters in both pin_request(), and
    when adding writing the new code in pin_free().
    
    Also, for pin_free():
    
        !!free_func == (gpio_range != NULL)
    
    However, I didn't want pin_free() to know about the GPIO function naming
    special case, so instead, I reworked pin_free() to always return the pin's
    previously requested function, and now pinmux_free_gpio() calls
    kfree(function). This is much more balanced with the allocation having
    been performed in pinmux_request_gpio().
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    3712a3c4
pinmux.c 29.9 KB