[PATCH v3 00/13] Introduce configfs-based interface for gpio-aggregator

From: Koichiro Den
Date: Sun Feb 16 2025 - 07:58:44 EST


This patch series introduces a configfs-based interface to gpio-aggregator
to address limitations in the existing 'new_device' interface.

The existing 'new_device' interface has several limitations:

Issue#1. No way to determine when GPIO aggregator creation is complete.
Issue#2. No way to retrieve errors when creating a GPIO aggregator.
Issue#3. No way to trace a GPIO line of an aggregator back to its
corresponding physical device.
Issue#4. The 'new_device' echo does not indicate which virtual
gpiochip<N> was created.
Issue#5. No way to assign names to GPIO lines exported through an
aggregator.

Although Issue#1 to #3 could technically be resolved easily without
configfs, using configfs offers a streamlined, modern, and extensible
approach, especially since gpio-sim and gpio-virtuser already utilize
configfs.

This v3 patch series includes 13 patches:

Patch#1-7: Prepare for Patch#8
* #1: Prepare for the following patches.
* #2: Fix an issue that was spotted during v3 preparation.
* #3: Add gpio-pseudo.[ch] to reduce code duplications.
* #4: Update gpio-sim to use gpio-pseudo.[ch].
* #5: Update gpio-virtuser to use gpio-pseudo.[ch].
* #6: Update gpio-aggregator to use gpio-pseudo.[ch].
* #7: Add aggr_alloc() to reduce code duplication.
Patch#8: Introduce basic configfs interface. Address Issue#1 to #4.
Patch#9: Address Issue#5.
Patch#10: Prepare for Patch#11.
Patch#11: Expose devices created with sysfs to configfs.
Patch#12: Suppress deferred probe for purely configfs-based aggregators.
Patch#13: Documentation for the new configfs interface.

N.B. v3 developed based on the latest gpio/for-next as of this writing:
c88aa6829739 ("phy: mapphone-mdm6600: use gpiod_multi_set_value_cansleep")


v2->v3 changes:
- Addressed feedback from Bartosz:
* Factored out the common mechanism for synchronizing platform device
probe by adding gpio-pseudo.[ch].
* Renamed "_auto." prefix to "_sysfs." for auto-generated
configfs entries corresponding to sysfs-created devices.
* Squashed v2 Patch#3 into its predecessor.
- Addressed feedback from Geert:
* Factored out duplicate code in struct gpio_aggregator initialization
by adding gpio_alloc()/gpio_free() functions. Note that v2 Patch#7
was dropped for other reasons as mentioned below, so aggr_free() in
v3 is unrelated to the same-named function in v2.
* Removed redundant parsing of gpio-line-names and unnecessary
chip->names assignments; squashed v2 Patch#4 + v2 Patch#5 into v3
Patch#9.
* Updated to use sysfs_emit().
* Updated Kconfig (select CONFIGFS_FS).
* Fixed typos, coding style issues, missing const qualifiers, and other
minor issues.
- Resolved an issue that was spotted during v3 preparation. See Patch#2.
- Reordered resource initialization order in gpio_aggregator_init() to
both eliminate a potential race condition (as noted in the source code
comment) and simplify the code. See Patch#8. This enabled:
* Removal of v2 Patch#7.
* Merging of aggr_unregister_lines() and aggr_free_lines() into a
unified function.
- Disabled 'delete_device' functionality for devices created via configfs
for simplicity. It was mistakenly allowed in v2 and proved buggy. See
Patch #8.

RFC->v2 changes:
- Addressed feedback from Bartosz:
* Expose devices created with sysfs to configfs.
* Drop 'num_lines' attribute.
* Fix bugs and crashes.
* Organize internal symbol prefixes more cleanly.
- Split diffs for improved reviewability.
- Update kernel doc to reflect the changes.

v2: https://lore.kernel.org/all/20250203031213.399914-1-koichiro.den@xxxxxxxxxxxxx/
RFC (v1): https://lore.kernel.org/linux-gpio/20250129155525.663780-1-koichiro.den@xxxxxxxxxxxxx/T/#u


Koichiro Den (13):
gpio: aggregator: reorder functions to prepare for configfs
introduction
gpio: aggregator: protect driver attr handlers against module unload
gpio: pseudo: common helper functions for pseudo gpio devices
gpio: sim: convert to use gpio-pseudo utilities
gpio: virtuser: convert to use gpio-pseudo utilities
gpio: aggregator: convert to use gpio-pseudo utilities
gpio: aggregator: add aggr_alloc()/aggr_free()
gpio: aggregator: introduce basic configfs interface
gpio: aggregator: add 'name' attribute for custom GPIO line names
gpio: aggregator: rename 'name' to 'key' in aggr_parse()
gpio: aggregator: expose aggregator created via legacy sysfs to
configfs
gpio: aggregator: cancel deferred probe for devices created via
configfs
Documentation: gpio: document configfs interface for gpio-aggregator

.../admin-guide/gpio/gpio-aggregator.rst | 107 ++
drivers/gpio/Kconfig | 8 +
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-aggregator.c | 1129 ++++++++++++++---
drivers/gpio/gpio-pseudo.c | 86 ++
drivers/gpio/gpio-pseudo.h | 24 +
drivers/gpio/gpio-sim.c | 84 +-
drivers/gpio/gpio-virtuser.c | 73 +-
8 files changed, 1189 insertions(+), 323 deletions(-)
create mode 100644 drivers/gpio/gpio-pseudo.c
create mode 100644 drivers/gpio/gpio-pseudo.h

--
2.45.2