[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1fb6fe78-c71a-4658-b396-f48fa4a4b7f7@oss.qualcomm.com>
Date: Wed, 21 Jan 2026 16:37:55 +0530
From: Ravi Hothi <ravi.hothi@....qualcomm.com>
To: Bartosz Golaszewski <bartosz.golaszewski@....qualcomm.com>,
Linus Walleij <linusw@...nel.org>,
Bartosz Golaszewski <brgl@...nel.org>
Cc: Srinivas Kandagatla <srini@...nel.org>, linux-gpio@...r.kernel.org,
linux-kernel@...r.kernel.org,
Mohammad Rafi Shaik <mohs@....qualcomm.com>,
Ravi Hothi <raviravi@....qualcomm.com>
Subject: Re: [PATCH] gpio: shared: propagate configuration to pinctrl
On 1/20/2026 9:19 PM, Bartosz Golaszewski wrote:
> Just toggling the descriptor's "requested" flag is not enough. We need
> to properly request it in order to potentially propagate any
> configuration to pinctrl via the .request() callback.
>
> We must not take the reference to the device at this point (the device
> is not ready but we're also requesting the device's own descriptor) so
> make the _commit() variants of request and free functions available to
> GPIO core in order to use them instead of their regular counterparts.
>
> This fixes an audio issue reported on one of the Qualcomm platforms.
Thanks for the patch, Issue got fixed now.
Tested-by: Ravi Hothi <ravi.hothi@....qualcomm.com>
Regards,
Ravi Hothi
>
> Fixes: a060b8c511ab ("gpiolib: implement low-level, shared GPIO support")
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@....qualcomm.com>
> ---
> drivers/gpio/gpiolib-shared.c | 16 +++++++++++-----
> drivers/gpio/gpiolib.c | 4 ++--
> drivers/gpio/gpiolib.h | 2 ++
> 3 files changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpio/gpiolib-shared.c b/drivers/gpio/gpiolib-shared.c
> index 17343fdc9758..9e6544203439 100644
> --- a/drivers/gpio/gpiolib-shared.c
> +++ b/drivers/gpio/gpiolib-shared.c
> @@ -515,7 +515,7 @@ int gpio_device_setup_shared(struct gpio_device *gdev)
> {
> struct gpio_shared_entry *entry;
> struct gpio_shared_ref *ref;
> - unsigned long *flags;
> + struct gpio_desc *desc;
> int ret;
>
> list_for_each_entry(entry, &gpio_shared_list, list) {
> @@ -543,15 +543,17 @@ int gpio_device_setup_shared(struct gpio_device *gdev)
> if (list_count_nodes(&entry->refs) <= 1)
> continue;
>
> - flags = &gdev->descs[entry->offset].flags;
> + desc = &gdev->descs[entry->offset];
>
> - __set_bit(GPIOD_FLAG_SHARED, flags);
> + __set_bit(GPIOD_FLAG_SHARED, &desc->flags);
> /*
> * Shared GPIOs are not requested via the normal path. Make
> * them inaccessible to anyone even before we register the
> * chip.
> */
> - __set_bit(GPIOD_FLAG_REQUESTED, flags);
> + ret = gpiod_request_commit(desc, "shared");
> + if (ret)
> + return ret;
>
> pr_debug("GPIO %u owned by %s is shared by multiple consumers\n",
> entry->offset, gpio_device_get_label(gdev));
> @@ -562,8 +564,10 @@ int gpio_device_setup_shared(struct gpio_device *gdev)
> ref->con_id ?: "(none)");
>
> ret = gpio_shared_make_adev(gdev, entry, ref);
> - if (ret)
> + if (ret) {
> + gpiod_free_commit(desc);
> return ret;
> + }
> }
> }
>
> @@ -579,6 +583,8 @@ void gpio_device_teardown_shared(struct gpio_device *gdev)
> if (!device_match_fwnode(&gdev->dev, entry->fwnode))
> continue;
>
> + gpiod_free_commit(&gdev->descs[entry->offset]);
> +
> list_for_each_entry(ref, &entry->refs, list) {
> guard(mutex)(&ref->lock);
>
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index fe2d107b0a84..1578cf3a8c74 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -2453,7 +2453,7 @@ EXPORT_SYMBOL_GPL(gpiochip_remove_pin_ranges);
> * on each other, and help provide better diagnostics in debugfs.
> * They're called even less than the "set direction" calls.
> */
> -static int gpiod_request_commit(struct gpio_desc *desc, const char *label)
> +int gpiod_request_commit(struct gpio_desc *desc, const char *label)
> {
> unsigned int offset;
> int ret;
> @@ -2515,7 +2515,7 @@ int gpiod_request(struct gpio_desc *desc, const char *label)
> return ret;
> }
>
> -static void gpiod_free_commit(struct gpio_desc *desc)
> +void gpiod_free_commit(struct gpio_desc *desc)
> {
> unsigned long flags;
>
> diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
> index 77f6f2936dc2..3abb90385829 100644
> --- a/drivers/gpio/gpiolib.h
> +++ b/drivers/gpio/gpiolib.h
> @@ -244,7 +244,9 @@ DEFINE_CLASS(gpio_chip_guard,
> struct gpio_desc *desc)
>
> int gpiod_request(struct gpio_desc *desc, const char *label);
> +int gpiod_request_commit(struct gpio_desc *desc, const char *label);
> void gpiod_free(struct gpio_desc *desc);
> +void gpiod_free_commit(struct gpio_desc *desc);
>
> static inline int gpiod_request_user(struct gpio_desc *desc, const char *label)
> {
Powered by blists - more mailing lists