lkml.org 
[lkml]   [2024]   [Feb]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 19/23] gpio: add the can_sleep flag to struct gpio_device
    Date
    From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

    Duplicating the can_sleep value in GPIO device will allow us to not
    needlessly dereference the chip pointer in several places and reduce the
    number of SRCU read-only critical sections.

    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    ---
    drivers/gpio/gpiolib.c | 11 ++++++-----
    drivers/gpio/gpiolib.h | 3 +++
    2 files changed, 9 insertions(+), 5 deletions(-)

    diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
    index 95b480f01fca..2f78fa9f8dbf 100644
    --- a/drivers/gpio/gpiolib.c
    +++ b/drivers/gpio/gpiolib.c
    @@ -896,6 +896,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
    }

    gdev->ngpio = gc->ngpio;
    + gdev->can_sleep = gc->can_sleep;

    scoped_guard(mutex, &gpio_devices_lock) {
    /*
    @@ -3066,7 +3067,7 @@ int gpiod_get_raw_value(const struct gpio_desc *desc)
    {
    VALIDATE_DESC(desc);
    /* Should be using gpiod_get_raw_value_cansleep() */
    - WARN_ON(desc->gdev->chip->can_sleep);
    + WARN_ON(desc->gdev->can_sleep);
    return gpiod_get_raw_value_commit(desc);
    }
    EXPORT_SYMBOL_GPL(gpiod_get_raw_value);
    @@ -3087,7 +3088,7 @@ int gpiod_get_value(const struct gpio_desc *desc)

    VALIDATE_DESC(desc);
    /* Should be using gpiod_get_value_cansleep() */
    - WARN_ON(desc->gdev->chip->can_sleep);
    + WARN_ON(desc->gdev->can_sleep);

    value = gpiod_get_raw_value_commit(desc);
    if (value < 0)
    @@ -3360,7 +3361,7 @@ void gpiod_set_raw_value(struct gpio_desc *desc, int value)
    {
    VALIDATE_DESC_VOID(desc);
    /* Should be using gpiod_set_raw_value_cansleep() */
    - WARN_ON(desc->gdev->chip->can_sleep);
    + WARN_ON(desc->gdev->can_sleep);
    gpiod_set_raw_value_commit(desc, value);
    }
    EXPORT_SYMBOL_GPL(gpiod_set_raw_value);
    @@ -3401,7 +3402,7 @@ void gpiod_set_value(struct gpio_desc *desc, int value)
    {
    VALIDATE_DESC_VOID(desc);
    /* Should be using gpiod_set_value_cansleep() */
    - WARN_ON(desc->gdev->chip->can_sleep);
    + WARN_ON(desc->gdev->can_sleep);
    gpiod_set_value_nocheck(desc, value);
    }
    EXPORT_SYMBOL_GPL(gpiod_set_value);
    @@ -3465,7 +3466,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_array_value);
    int gpiod_cansleep(const struct gpio_desc *desc)
    {
    VALIDATE_DESC(desc);
    - return desc->gdev->chip->can_sleep;
    + return desc->gdev->can_sleep;
    }
    EXPORT_SYMBOL_GPL(gpiod_cansleep);

    diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
    index 9b7afe87f1bd..43ff4931e2c3 100644
    --- a/drivers/gpio/gpiolib.h
    +++ b/drivers/gpio/gpiolib.h
    @@ -34,6 +34,8 @@
    * @descs: array of ngpio descriptors.
    * @ngpio: the number of GPIO lines on this GPIO device, equal to the size
    * of the @descs array.
    + * @can_sleep: indicate whether the GPIO chip driver's callbacks can sleep
    + * implying that they cannot be used from atomic context
    * @base: GPIO base in the DEPRECATED global Linux GPIO numberspace, assigned
    * at device creation time.
    * @label: a descriptive name for the GPIO device, such as the part number
    @@ -64,6 +66,7 @@ struct gpio_device {
    struct gpio_desc *descs;
    int base;
    u16 ngpio;
    + bool can_sleep;
    const char *label;
    void *data;
    struct list_head list;
    --
    2.40.1

    \
     
     \ /
      Last update: 2024-05-27 14:48    [W:6.423 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site