arch/arm64/Kconfig.platforms | 1 + drivers/gpio/Kconfig | 17 ++ drivers/gpio/Makefile | 2 + drivers/gpio/gpio-shared-proxy.c | 328 ++++++++++++++++++++++++++ drivers/gpio/gpio-wcd934x.c | 2 +- drivers/gpio/gpiolib-shared.c | 481 +++++++++++++++++++++++++++++++++++++++ drivers/gpio/gpiolib-shared.h | 71 ++++++ drivers/gpio/gpiolib.c | 50 +++- drivers/gpio/gpiolib.h | 1 + include/linux/string.h | 2 + lib/string.c | 19 ++ lib/tests/string_kunit.c | 13 ++ sound/soc/codecs/wsa881x.c | 3 +- sound/soc/codecs/wsa883x.c | 7 +- 14 files changed, 980 insertions(+), 17 deletions(-)
Here's a functional RFC for improving the handling of shared GPIOs in
linux.
Problem statement: GPIOs are implemented as a strictly exclusive
resource in the kernel but there are lots of platforms on which single
pin is shared by multiple devices which don't communicate so need some
way of properly sharing access to a GPIO. What we have now is the
GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and
doesn't do any locking or arbitration of access - it literally just hand
the same GPIO descriptor to all interested users.
The proposed solution is composed of three major parts: the high-level,
shared GPIO proxy driver that arbitrates access to the shared pin and
exposes a regular GPIO chip interface to consumers, a low-level shared
GPIOLIB module that scans firmware nodes and creates auxiliary devices
that attach to the proxy driver and finally a set of core GPIOLIB
changes that plug the former into the GPIO lookup path.
The changes are implemented in a way that allows to seamlessly compile
out any code related to sharing GPIOs for systems that don't need it.
The practical use-case for this are the powerdown GPIOs shared by
speakers on Qualcomm db845c platform, however I have also extensively
tested it using gpio-virtuser on arm64 qemu with various DT
configurations.
I'm Cc'ing some people that may help with reviewing/be interested in
this: OF maintainers (because the main target are OF systems initially),
Mark Brown because most users of GPIOD_FLAGS_BIT_NONEXCLUSIVE live
in audio or regulator drivers and one of the goals of this series is
dropping the hand-crafted GPIO enable counting via struct
regulator_enable_gpio in regulator core), Andy and Mika because I'd like
to also cover ACPI (even though I don't know about any ACPI platform that
would need this at the moment, I think it makes sense to make the
solution complete), Dmitry (same thing but for software nodes), Mani
(because you have a somewhat related use-case for the PERST# signal and
I'd like to hear your input on whether this is something you can use or
maybe it needs a separate, implicit gpio-perst driver similar to what
Krzysztof did for reset-gpios) and Greg (because I mentioned this to you
last week in person and I also use the auxiliary bus for the proxy
devices).
First patch in the series is a bugfix targetting stable, I'm surprised
nobody noticed the lockdep splat yet. The second adds a library function
I use in a later patch. All remaining patches implement or use the
shared GPIO support.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
Bartosz Golaszewski (9):
gpio: wcd934x: mark the GPIO controller as sleeping
string: provide strends()
gpiolib: define GPIOD_FLAG_SHARED
gpiolib: implement low-level, shared GPIO support
gpio: shared-proxy: implement the shared GPIO proxy driver
gpiolib: support shared GPIOs in core subsystem code
arm64: select HAVE_SHARED_GPIOS for ARCH_QCOM
ASoC: wsa881x: drop GPIOD_FLAGS_BIT_NONEXCLUSIVE flag from GPIO lookup
ASoC: wsa883x: drop GPIOD_FLAGS_BIT_NONEXCLUSIVE flag from GPIO lookup
arch/arm64/Kconfig.platforms | 1 +
drivers/gpio/Kconfig | 17 ++
drivers/gpio/Makefile | 2 +
drivers/gpio/gpio-shared-proxy.c | 328 ++++++++++++++++++++++++++
drivers/gpio/gpio-wcd934x.c | 2 +-
drivers/gpio/gpiolib-shared.c | 481 +++++++++++++++++++++++++++++++++++++++
drivers/gpio/gpiolib-shared.h | 71 ++++++
drivers/gpio/gpiolib.c | 50 +++-
drivers/gpio/gpiolib.h | 1 +
include/linux/string.h | 2 +
lib/string.c | 19 ++
lib/tests/string_kunit.c | 13 ++
sound/soc/codecs/wsa881x.c | 3 +-
sound/soc/codecs/wsa883x.c | 7 +-
14 files changed, 980 insertions(+), 17 deletions(-)
---
base-commit: b46f7370d4a0f0b55f05b854e73b2a90dff41e1b
change-id: 20250908-gpio-shared-67ec352884b6
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
On Wed, Sep 24, 2025 at 4:51 PM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > Here's a functional RFC for improving the handling of shared GPIOs in > linux. > > Problem statement: GPIOs are implemented as a strictly exclusive > resource in the kernel but there are lots of platforms on which single > pin is shared by multiple devices which don't communicate so need some > way of properly sharing access to a GPIO. What we have now is the > GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and > doesn't do any locking or arbitration of access - it literally just hand > the same GPIO descriptor to all interested users. > > The proposed solution is composed of three major parts: the high-level, > shared GPIO proxy driver that arbitrates access to the shared pin and > exposes a regular GPIO chip interface to consumers, a low-level shared > GPIOLIB module that scans firmware nodes and creates auxiliary devices > that attach to the proxy driver and finally a set of core GPIOLIB > changes that plug the former into the GPIO lookup path. > > The changes are implemented in a way that allows to seamlessly compile > out any code related to sharing GPIOs for systems that don't need it. > > The practical use-case for this are the powerdown GPIOs shared by > speakers on Qualcomm db845c platform, however I have also extensively > tested it using gpio-virtuser on arm64 qemu with various DT > configurations. > > I'm Cc'ing some people that may help with reviewing/be interested in > this: OF maintainers (because the main target are OF systems initially), > Mark Brown because most users of GPIOD_FLAGS_BIT_NONEXCLUSIVE live > in audio or regulator drivers and one of the goals of this series is > dropping the hand-crafted GPIO enable counting via struct > regulator_enable_gpio in regulator core), Andy and Mika because I'd like > to also cover ACPI (even though I don't know about any ACPI platform that > would need this at the moment, I think it makes sense to make the > solution complete), Dmitry (same thing but for software nodes), Mani > (because you have a somewhat related use-case for the PERST# signal and > I'd like to hear your input on whether this is something you can use or > maybe it needs a separate, implicit gpio-perst driver similar to what > Krzysztof did for reset-gpios) and Greg (because I mentioned this to you > last week in person and I also use the auxiliary bus for the proxy > devices). > > First patch in the series is a bugfix targetting stable, I'm surprised > nobody noticed the lockdep splat yet. The second adds a library function > I use in a later patch. All remaining patches implement or use the > shared GPIO support. > Mark, I was working on extending this series with patches that make the regulator subsystem aware of shared GPIOs managed by GPIOLIB. I admit that after our previous discussions I was under the impression that the regulator core not only manages the enable count of the underlying non-exclusive GPIOs but also emits the relevant REGULATOR_EVENT_ENABLE/DISABLE notifications for GPIO-driven regulators when the physical pin actually gets enabled/disabled respectively. Upon a closer inspection it turns out that this is not the case - the ENABLE/DISABLE events are emitted when the *logical* regulator is enabled/disabled even if this does not involve a change in the state of the shared pin. Example: the tlv320aic3x.c codec driver may use a fixed regulator that uses a shared GPIO pin. The regulator in question may get disabled but its GPIO might not change state as it's still enabled by a different regulator. The driver will still see the disable event and put the codec in reset. I'm not saying this behavior is incorrect, I'm just mentioning it as I thought that there's a need for some GPIO descriptor notifier that allows to signal the actual change in value to users but it doesn't seem to be the case if we just want to maintain the current behavior. The only change we need to support the existing NONEXCLUSIVE flag and the new shared GPIOs at the same time - until we convert all users - is providing gpiod_is_shared() and just making regulator core skip the descriptor comparison and referencing via struct regulator_enable_gpio if it sees that a GPIO descriptor is shared. I will post a v2 early next week. Bartosz
On Fri, Oct 17, 2025 at 07:26:51PM +0200, Bartosz Golaszewski wrote: > Upon a closer inspection it turns out that this is not the case - the > ENABLE/DISABLE events are emitted when the *logical* regulator is > enabled/disabled even if this does not involve a change in the state > of the shared pin. It really should be the actual physical state change that triggers the event.
On Fri, Oct 17, 2025 at 7:32 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Oct 17, 2025 at 07:26:51PM +0200, Bartosz Golaszewski wrote: > > > Upon a closer inspection it turns out that this is not the case - the > > ENABLE/DISABLE events are emitted when the *logical* regulator is > > enabled/disabled even if this does not involve a change in the state > > of the shared pin. > > It really should be the actual physical state change that triggers the > event. I guess so, but this would require some non-trivial rework of the regulator core. We'd need some list of deferred notifications stored in memory for when the physical state actually changes. Bartosz
On Mon, Oct 20, 2025 at 11:41:52AM +0200, Bartosz Golaszewski wrote: > On Fri, Oct 17, 2025 at 7:32 PM Mark Brown <broonie@kernel.org> wrote: > > It really should be the actual physical state change that triggers the > > event. > I guess so, but this would require some non-trivial rework of the > regulator core. We'd need some list of deferred notifications stored > in memory for when the physical state actually changes. I'm not sure I see the need for deferred notifications? We'd need to go round all the users whenever a physical change to the GPIO happens but it's not clear what we'd need to store beyond the list of users?
On Tue, Oct 21, 2025 at 4:08 PM Mark Brown <broonie@kernel.org> wrote: > > On Mon, Oct 20, 2025 at 11:41:52AM +0200, Bartosz Golaszewski wrote: > > On Fri, Oct 17, 2025 at 7:32 PM Mark Brown <broonie@kernel.org> wrote: > > > > It really should be the actual physical state change that triggers the > > > event. > > > I guess so, but this would require some non-trivial rework of the > > regulator core. We'd need some list of deferred notifications stored > > in memory for when the physical state actually changes. > > I'm not sure I see the need for deferred notifications? We'd need to go > round all the users whenever a physical change to the GPIO happens but > it's not clear what we'd need to store beyond the list of users? In my mind I was thinking that we only need to send the notifications to users who already enabled/disabled the regulator too but you're right, it seems like a loop over the relevant pins should be enough. In any case: this is outside the scope of this series but I'll see if it's easy enough to add separately. Bartosz
On Tue, Oct 21, 2025 at 04:42:11PM +0200, Bartosz Golaszewski wrote: > On Tue, Oct 21, 2025 at 4:08 PM Mark Brown <broonie@kernel.org> wrote: > > I'm not sure I see the need for deferred notifications? We'd need to go > > round all the users whenever a physical change to the GPIO happens but > > it's not clear what we'd need to store beyond the list of users? > In my mind I was thinking that we only need to send the notifications > to users who already enabled/disabled the regulator too but you're > right, it seems like a loop over the relevant pins should be enough. Ah, great - yeah, I'd expect notifications either way just to be on the safe side. > In any case: this is outside the scope of this series but I'll see if > it's easy enough to add separately. Yes, definitely outside the scope of the series. If you do something that'd be great but no pressure.
On 9/24/25 3:51 PM, Bartosz Golaszewski wrote: > Here's a functional RFC for improving the handling of shared GPIOs in > linux. > > Problem statement: GPIOs are implemented as a strictly exclusive > resource in the kernel but there are lots of platforms on which single > pin is shared by multiple devices which don't communicate so need some > way of properly sharing access to a GPIO. What we have now is the > GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and > doesn't do any locking or arbitration of access - it literally just hand > the same GPIO descriptor to all interested users. Isn't the main issue here is about not using a correct framework around to the gpios that driver uses. ex: the codec usecase that you are refering in this is using gpio to reset the line, instead of using a proper gpio-reset control. same with some of the gpio-muxes. the problem is fixed once such direct users of gpio are move their correct frameworks. Am not sure adding a abstraction with-in gpio framework is right solution, But I do agree that NONEXCLUSIVE flags should disappear and users that are using this should be moved to correct frameworks where they belong. --srini > > The proposed solution is composed of three major parts: the high-level, > shared GPIO proxy driver that arbitrates access to the shared pin and > exposes a regular GPIO chip interface to consumers, a low-level shared > GPIOLIB module that scans firmware nodes and creates auxiliary devices > that attach to the proxy driver and finally a set of core GPIOLIB > changes that plug the former into the GPIO lookup path. > > The changes are implemented in a way that allows to seamlessly compile > out any code related to sharing GPIOs for systems that don't need it. > > The practical use-case for this are the powerdown GPIOs shared by > speakers on Qualcomm db845c platform, however I have also extensively > tested it using gpio-virtuser on arm64 qemu with various DT > configurations. > > I'm Cc'ing some people that may help with reviewing/be interested in > this: OF maintainers (because the main target are OF systems initially), > Mark Brown because most users of GPIOD_FLAGS_BIT_NONEXCLUSIVE live > in audio or regulator drivers and one of the goals of this series is > dropping the hand-crafted GPIO enable counting via struct > regulator_enable_gpio in regulator core), Andy and Mika because I'd like > to also cover ACPI (even though I don't know about any ACPI platform that > would need this at the moment, I think it makes sense to make the > solution complete), Dmitry (same thing but for software nodes), Mani > (because you have a somewhat related use-case for the PERST# signal and > I'd like to hear your input on whether this is something you can use or > maybe it needs a separate, implicit gpio-perst driver similar to what > Krzysztof did for reset-gpios) and Greg (because I mentioned this to you > last week in person and I also use the auxiliary bus for the proxy > devices). > > First patch in the series is a bugfix targetting stable, I'm surprised > nobody noticed the lockdep splat yet. The second adds a library function > I use in a later patch. All remaining patches implement or use the > shared GPIO support. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- > Bartosz Golaszewski (9): > gpio: wcd934x: mark the GPIO controller as sleeping > string: provide strends() > gpiolib: define GPIOD_FLAG_SHARED > gpiolib: implement low-level, shared GPIO support > gpio: shared-proxy: implement the shared GPIO proxy driver > gpiolib: support shared GPIOs in core subsystem code > arm64: select HAVE_SHARED_GPIOS for ARCH_QCOM > ASoC: wsa881x: drop GPIOD_FLAGS_BIT_NONEXCLUSIVE flag from GPIO lookup > ASoC: wsa883x: drop GPIOD_FLAGS_BIT_NONEXCLUSIVE flag from GPIO lookup > > arch/arm64/Kconfig.platforms | 1 + > drivers/gpio/Kconfig | 17 ++ > drivers/gpio/Makefile | 2 + > drivers/gpio/gpio-shared-proxy.c | 328 ++++++++++++++++++++++++++ > drivers/gpio/gpio-wcd934x.c | 2 +- > drivers/gpio/gpiolib-shared.c | 481 +++++++++++++++++++++++++++++++++++++++ > drivers/gpio/gpiolib-shared.h | 71 ++++++ > drivers/gpio/gpiolib.c | 50 +++- > drivers/gpio/gpiolib.h | 1 + > include/linux/string.h | 2 + > lib/string.c | 19 ++ > lib/tests/string_kunit.c | 13 ++ > sound/soc/codecs/wsa881x.c | 3 +- > sound/soc/codecs/wsa883x.c | 7 +- > 14 files changed, 980 insertions(+), 17 deletions(-) > --- > base-commit: b46f7370d4a0f0b55f05b854e73b2a90dff41e1b > change-id: 20250908-gpio-shared-67ec352884b6 > > Best regards,
On Sat, Oct 04, 2025 at 02:31:16PM +0100, Srinivas Kandagatla wrote: > Isn't the main issue here is about not using a correct framework around > to the gpios that driver uses. ex: the codec usecase that you are > refering in this is using gpio to reset the line, instead of using a > proper gpio-reset control. same with some of the gpio-muxes. the problem > is fixed once such direct users of gpio are move their correct frameworks. It's common to have GPIO controls for other things, mutes for example.
On 10/6/25 1:19 PM, Mark Brown wrote: > On Sat, Oct 04, 2025 at 02:31:16PM +0100, Srinivas Kandagatla wrote: > >> Isn't the main issue here is about not using a correct framework around >> to the gpios that driver uses. ex: the codec usecase that you are >> refering in this is using gpio to reset the line, instead of using a >> proper gpio-reset control. same with some of the gpio-muxes. the problem >> is fixed once such direct users of gpio are move their correct frameworks. > > It's common to have GPIO controls for other things, mutes for example. Ofcourse, but this aggregation logic which is specific to the use-case should not live in gpio subsystem which makes the whole solution fragile and abused.
On Sat, Oct 4, 2025 at 3:32 PM Srinivas Kandagatla <srini@kernel.org> wrote: > On 9/24/25 3:51 PM, Bartosz Golaszewski wrote: > > Here's a functional RFC for improving the handling of shared GPIOs in > > linux. > > > > Problem statement: GPIOs are implemented as a strictly exclusive > > resource in the kernel but there are lots of platforms on which single > > pin is shared by multiple devices which don't communicate so need some > > way of properly sharing access to a GPIO. What we have now is the > > GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and > > doesn't do any locking or arbitration of access - it literally just hand > > the same GPIO descriptor to all interested users. > > Isn't the main issue here is about not using a correct framework around > to the gpios that driver uses. ex: the codec usecase that you are > refering in this is using gpio to reset the line, instead of using a > proper gpio-reset control. same with some of the gpio-muxes. the problem > is fixed once such direct users of gpio are move their correct frameworks. > If they were called "reset-gpios" then we could (and should) use Krzysztof's reset-gpio driver here, but we have many cases where that's not the case and the names (and implied functions) are arbitrary. In the case addressed in this series, the GPIOs are called "powerdown". The second big user of nonexclusive GPIOs are fixed regulators where the line isn't called "reset" either. There are also various other uses sprinkled all over the kernel for which no good abstraction exists or can even be designed in a generic way. > Am not sure adding a abstraction with-in gpio framework is right > solution, But I do agree that NONEXCLUSIVE flags should disappear and > users that are using this should be moved to correct frameworks where > they belong. > I'm open to suggestions but DT maintainers have not been particularly fond of creating "virtual" devices to accommodate driver implementations. Bartosz
On 10/6/25 12:55 PM, Bartosz Golaszewski wrote: > On Sat, Oct 4, 2025 at 3:32 PM Srinivas Kandagatla <srini@kernel.org> wrote: >> On 9/24/25 3:51 PM, Bartosz Golaszewski wrote: >>> Here's a functional RFC for improving the handling of shared GPIOs in >>> linux. >>> >>> Problem statement: GPIOs are implemented as a strictly exclusive >>> resource in the kernel but there are lots of platforms on which single >>> pin is shared by multiple devices which don't communicate so need some >>> way of properly sharing access to a GPIO. What we have now is the >>> GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and >>> doesn't do any locking or arbitration of access - it literally just hand >>> the same GPIO descriptor to all interested users. >> >> Isn't the main issue here is about not using a correct framework around >> to the gpios that driver uses. ex: the codec usecase that you are >> refering in this is using gpio to reset the line, instead of using a >> proper gpio-reset control. same with some of the gpio-muxes. the problem >> is fixed once such direct users of gpio are move their correct frameworks. >> > > If they were called "reset-gpios" then we could (and should) use > Krzysztof's reset-gpio driver here, but we have many cases where > that's not the case and the names (and implied functions) are Yes, these codec drivers are due to be moved to use reset-gpios. --srini > arbitrary. In the case addressed in this series, the GPIOs are called > "powerdown". The second big user of nonexclusive GPIOs are fixed > regulators where the line isn't called "reset" either. There are also > various other uses sprinkled all over the kernel for which no good > abstraction exists or can even be designed in a generic way. > >> Am not sure adding a abstraction with-in gpio framework is right >> solution, But I do agree that NONEXCLUSIVE flags should disappear and >> users that are using this should be moved to correct frameworks where >> they belong. >> > > I'm open to suggestions but DT maintainers have not been particularly > fond of creating "virtual" devices to accommodate driver > implementations. > > Bartosz
On Mon, Oct 6, 2025 at 11:55 PM Srinivas Kandagatla <srini@kernel.org> wrote: > > > > > If they were called "reset-gpios" then we could (and should) use > > Krzysztof's reset-gpio driver here, but we have many cases where > > that's not the case and the names (and implied functions) are > > Yes, these codec drivers are due to be moved to use reset-gpios. > You will still need to keep support for the current "powerdown-gpios" property in existing device tree sources so that doesn't change anything. And what about shared pins other than reset? 'dc-gpios' for display, other 'powerdown' instances, 'enable-gpios', all kinds of uncommon names like: `dlg,cs`, `wlf,ldo2ena`, `speaker-enable`, `maxim,enable`? It's not likely we will create a separate abstraction for each of them. What I'm proposing is a sane, catch-all mechanism for shared GPIOs that right now use a rather wonky hack. Also: the drivers have no business knowing that they request GPIOs that can be shared. This is why I want to hide it inside GPIOLIB. Bartosz
On Tue, Oct 07, 2025 at 03:13:29PM +0200, Bartosz Golaszewski wrote: > On Mon, Oct 6, 2025 at 11:55 PM Srinivas Kandagatla <srini@kernel.org> wrote: > > Yes, these codec drivers are due to be moved to use reset-gpios. ... > anything. And what about shared pins other than reset? 'dc-gpios' for > display, other 'powerdown' instances, 'enable-gpios', all kinds of > uncommon names like: `dlg,cs`, `wlf,ldo2ena`, `speaker-enable`, > `maxim,enable`? It's not likely we will create a separate abstraction Many of which, crucially, don't actually reset the device.
On Tue, Oct 7, 2025 at 3:18 PM Mark Brown <broonie@kernel.org> wrote: > > On Tue, Oct 07, 2025 at 03:13:29PM +0200, Bartosz Golaszewski wrote: > > On Mon, Oct 6, 2025 at 11:55 PM Srinivas Kandagatla <srini@kernel.org> wrote: > > > > Yes, these codec drivers are due to be moved to use reset-gpios. > > ... > > > anything. And what about shared pins other than reset? 'dc-gpios' for > > display, other 'powerdown' instances, 'enable-gpios', all kinds of > > uncommon names like: `dlg,cs`, `wlf,ldo2ena`, `speaker-enable`, > > `maxim,enable`? It's not likely we will create a separate abstraction > > Many of which, crucially, don't actually reset the device. That's my point. While the function of a `reset-gpios` is quite clear, these are not. Bartosz
Hi Bartosz, I see the big picture of this plan! One quick comment: On Wed, Sep 24, 2025 at 4:51 PM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > I'm Cc'ing some people that may help with reviewing/be interested in > this: OF maintainers (because the main target are OF systems initially), > Mark Brown because most users of GPIOD_FLAGS_BIT_NONEXCLUSIVE live > in audio or regulator drivers and one of the goals of this series is > dropping the hand-crafted GPIO enable counting via struct > regulator_enable_gpio in regulator core), ...and that is what I thought as well, so: > arm64: select HAVE_SHARED_GPIOS for ARCH_QCOM why would we be selecting this per-subarch? What will happen is that CONFIG_REGULATOR will select it and since everyone and their dog is using regulator, what will happen is that every system will have this enabled, and every GPIO access on every system will be proxied and then this better be fast. Two things come to mind, and I bet you have thought of them already: 1. Footprint: all systems using regulators will now have to compile in all this code as well. 2. Performance, I didn't quite get it if every GPIO on the system will be proxied through a layer of indirection if you select HAVE_SHARED_GPIOS but that would not be good, since some users are in fastpath such as IRQ handlers, and the old way of sharing GPIOs would just affect pins that are actually shared. I don't know of a good generic solution for (2) to be honest, last resort would be something like runtime patching of calls when a GPIO becomes shared and that is really advanced but maybe necessary to get a performant and generic solution. Yours, Linus Walleij
Replying to self so Bartosz don't have to tell me off... On Wed, Oct 1, 2025 at 10:49 AM Linus Walleij <linus.walleij@linaro.org> wrote: > and every GPIO access on every system will be proxied > and then this better be fast. What about I read the code before I talk :/ Inspecting patch 4/9 it is clear that only GPIOs that actually need to be proxied are proxied. > Two things come to mind, and I bet you have thought of > them already: > > 1. Footprint: all systems using regulators will now have > to compile in all this code as well. This still holds. It could be a concern if it's a lot of code. > 2. Performance, I didn't quite get it if every GPIO on the > system will be proxied through a layer of indirection > if you select HAVE_SHARED_GPIOS > but that would not be good, since some users are in > fastpath such as IRQ handlers, and the old way of > sharing GPIOs would just affect pins that are actually > shared. It is clear from patch 4/9 that this only affects GPIOs that are actually shared, and those tend to not be performance-critical so this concern is moot. Yours, Linus Walleij
On Wed, 1 Oct 2025 12:53:07 +0200, Linus Walleij <linus.walleij@linaro.org> said: > Replying to self so Bartosz don't have to tell me off... > > On Wed, Oct 1, 2025 at 10:49 AM Linus Walleij <linus.walleij@linaro.org> wrote: > >> and every GPIO access on every system will be proxied >> and then this better be fast. > > What about I read the code before I talk :/ > > Inspecting patch 4/9 it is clear that only GPIOs that actually > need to be proxied are proxied. > >> Two things come to mind, and I bet you have thought of >> them already: >> >> 1. Footprint: all systems using regulators will now have >> to compile in all this code as well. > > This still holds. It could be a concern if it's a lot of code. It depends on how we implement this. If we just rip out the enable counting from regulator core entirely, then it would be transparent from the regulator's point of view and each platform could still select the new option as required. However there's the issue of regulator consumers who need to know when something changes on a regulator and to that end subscribe to the regulator notifer. Regulator core knows then it actually changes the GPIO so it emits the event. There are several ways to approach it but the best one seems to be: allow to subscribe for a per-descriptor event notifier (implementation details may include: only actually creating the notifier for shared GPIOs), and be notified about an actual change in value and then propagate it to regulator users. This would still be transparent and allow us to select HAVE_SHARED_GPIOS on a per-arch basis. Bartosz > >> 2. Performance, I didn't quite get it if every GPIO on the >> system will be proxied through a layer of indirection >> if you select HAVE_SHARED_GPIOS >> but that would not be good, since some users are in >> fastpath such as IRQ handlers, and the old way of >> sharing GPIOs would just affect pins that are actually >> shared. > > It is clear from patch 4/9 that this only affects GPIOs > that are actually shared, and those tend to not be > performance-critical so this concern is moot. > > Yours, > Linus Walleij >
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
On Wed, 24 Sep 2025 16:51:28 +0200, Bartosz Golaszewski wrote:
> Here's a functional RFC for improving the handling of shared GPIOs in
> linux.
>
> Problem statement: GPIOs are implemented as a strictly exclusive
> resource in the kernel but there are lots of platforms on which single
> pin is shared by multiple devices which don't communicate so need some
> way of properly sharing access to a GPIO. What we have now is the
> GPIOD_FLAGS_BIT_NONEXCLUSIVE flag which was introduced as a hack and
> doesn't do any locking or arbitration of access - it literally just hand
> the same GPIO descriptor to all interested users.
>
> [...]
I'm picking this one up for fixes as it addresses a locking bug.
[1/9] gpio: wcd934x: mark the GPIO controller as sleeping
https://git.kernel.org/brgl/linux/c/83d314fac266a3d9de61e4a4490c4f2eafc86b05
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
© 2016 - 2026 Red Hat, Inc.