lkml.org 
[lkml]   [2019]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 42/62] gpiolib: never report open-drain/source lines as input to user-space
    Date
    From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

    commit 2c60e6b5c9241b24b8b523fefd3e44fb85622cda upstream.

    If the driver doesn't support open-drain/source config options, we
    emulate this behavior when setting the direction by calling
    gpiod_direction_input() if the default value is 0 (open-source) or
    1 (open-drain), thus not actively driving the line in those cases.

    This however clears the FLAG_IS_OUT bit for the GPIO line descriptor
    and makes the LINEINFO ioctl() incorrectly report this line's mode as
    'input' to user-space.

    This commit modifies the ioctl() to always set the GPIOLINE_FLAG_IS_OUT
    bit in the lineinfo structure's flags field. Since it's impossible to
    use the input mode and open-drain/source options at the same time, we
    can be sure the reported information will be correct.

    Fixes: 521a2ad6f862 ("gpio: add userspace ABI for GPIO line information")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Link: https://lore.kernel.org/r/20190806114151.17652-1-brgl@bgdev.pl
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpio/gpiolib.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/drivers/gpio/gpiolib.c
    +++ b/drivers/gpio/gpiolib.c
    @@ -971,9 +971,11 @@ static long gpio_ioctl(struct file *filp
    if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
    lineinfo.flags |= GPIOLINE_FLAG_ACTIVE_LOW;
    if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
    - lineinfo.flags |= GPIOLINE_FLAG_OPEN_DRAIN;
    + lineinfo.flags |= (GPIOLINE_FLAG_OPEN_DRAIN |
    + GPIOLINE_FLAG_IS_OUT);
    if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
    - lineinfo.flags |= GPIOLINE_FLAG_OPEN_SOURCE;
    + lineinfo.flags |= (GPIOLINE_FLAG_OPEN_SOURCE |
    + GPIOLINE_FLAG_IS_OUT);

    if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
    return -EFAULT;

    \
     
     \ /
      Last update: 2019-08-27 10:17    [W:4.233 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site