[GIT PULL] gpio: updates for v6.9-rc1

From: Bartosz Golaszewski
Date: Mon Mar 11 2024 - 06:26:10 EST


From: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx>

Linus,

Here's the main (and most likely the only) pull-request from the GPIO subsystem
for the next release.

The biggest feature is the locking overhaul. Up until now the synchronization
in the GPIO subsystem was broken. There was a single spinlock "protecting"
multiple data structures but doing it wrong (as evidenced by several places
where it would be released when a sleeping function was called and then
reacquired without checking the protected state).

We tried to use an RW semaphore before but the main issue with GPIO is that
we have drivers implementing the interfaces in both sleeping and non-sleeping
ways as well as user-facing interfaces that can be called both from process as
well as atomic contexts. Both ends converge in the same code paths that can use
neither spinlocks nor mutexes. The only reasonable way out is to use SRCU and
go mostly lockless. To that end: we add several SRCU structs in relevant places
and use them to assure consistency between API calls together with atomic reads
and writes of GPIO descriptor flags where it makes sense.

This code has spent several weeks in next and has received several fixes in the
first week or two after which it stabilized nicely. The GPIO subsystem is now
resilient to providers being suddenly unbound. We managed to also remove the
existing character device RW semaphore and the obsolete global spinlock.

Other than the locking rework we have one new driver (for Chromebook EC), much
appreciated documentation improvements from Kent and the regular driver
improvements, DT-bindings updates and GPIOLIB core tweaks.

Details are in the signed tag. Please pull.

Best regards,
Bartosz Golaszewski

The following changes since commit 90d35da658da8cff0d4ecbb5113f5fac9d00eb72:

Linux 6.8-rc7 (2024-03-03 13:02:52 -0800)

are available in the Git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git tags/gpio-updates-for-v6.9-rc1

for you to fetch changes up to 8636f19c2d1f8199b27b4559d9caa115b3011f06:

gpio: sysfs: repair export returning -EPERM on 1st attempt (2024-03-08 10:32:00 +0100)

----------------------------------------------------------------
gpio updates for v6.9

Serialization rework:
- use SRCU to serialize access to the global GPIO device list, to GPIO device
structs themselves and to GPIO descriptors
- make the GPIO subsystem resilient to the GPIO providers being unbound while
the API calls are in progress
- don't dereference the SRCU-protected chip pointer if the information we need
can be obtained from the GPIO device structure
- move some of the information contained in struct gpio_chip to struct
gpio_device to further reduce the need to dereference the former
- pass the GPIO device struct instead of the GPIO chip to sysfs callback to,
again, reduce the need for accessing the latter
- get GPIO descriptors from the GPIO device, not from the chip for the same
reason
- allow for mostly lockless operation of the GPIO driver API: assure
consistency with SRCU and atomic operations
- remove the global GPIO spinlock
- remove the character device RW semaphore

Core GPIOLIB:
- constify pointers in GPIO API where applicable
- unify the GPIO counting APIs for ACPI and OF
- provide a macro for iterating over all GPIOs, not only the ones that are
requested
- remove leftover typedefs
- pass the consumer device to GPIO core in devm_fwnode_gpiod_get_index() for
improved logging
- constify the GPIO bus type
- don't warn about removing GPIO chips with descriptors still held by users as
we can now handle this situation gracefully
- remove unused logging helpers
- unexport functions that are only used internally in the GPIO subsystem
- set the device type (assign the relevant struct device_type) for GPIO devices

New drivers:
- add the ChromeOS EC GPIO driver

Driver improvements:
- allow building gpio-vf610 with COMPILE_TEST as well as disabling it in
menuconfig (before it was always built for i.MX cofigs)
- count the number of EICs using the device properties instead of hard-coding
it in gpio-eic-sprd
- improve the device naming, extend the debugfs output and add lockdep asserts
to gpio-sim

DT bindings:
- document the 'label' property for gpio-pca9570
- convert aspeed,ast2400-gpio bindings to DT schema
- disallow unevaluated properties for gpio-mvebu
- document a new model in renesas,rcar-gpio

Documentation:
- improve the character device kerneldocs in user-space headers
- add proper documentation for the character device uAPI (both v1 and v2)
- move the sysfs and gpio-mockup docs into the "obsolete" section
- improve naming consistency for GPIO terms
- clarify the line values description for sysfs
- minor docs improvements
- improve the driver API contract for setting GPIO direction
- mark unsafe APIs as deprecated in kerneldocs and suggest replacements

Other:
- remove an obsolete test from selftests

----------------------------------------------------------------
Alexander Sverdlin (1):
gpio: sysfs: repair export returning -EPERM on 1st attempt

Andrew Jeffery (1):
dt-bindings: gpio: aspeed,ast2400-gpio: Convert to DT schema

Andy Shevchenko (3):
gpio: of: Make of_gpio_get_count() take firmware node as a parameter
gpio: acpi: Make acpi_gpio_count() take firmware node as a parameter
gpiolib: Deduplicate cleanup for-loop in gpiochip_add_data_with_key()

Bartosz Golaszewski (43):
gpio: legacy: mark old interfaces as deprecated in kernel docs
gpio: cdev: remove leftover function pointer typedefs
gpio: unexport GPIO irq domain functions only used internally
gpio: improve the API contract for setting direction
gpio: set device type for GPIO chips
Merge tag 'v6.8-rc4' into gpio/for-next
gpio: protect the list of GPIO devices with SRCU
gpio: of: assign and read the hog pointer atomically
gpio: remove unused logging helpers
gpio: provide and use gpiod_get_label()
gpio: don't set label from irq helpers
gpio: add SRCU infrastructure to struct gpio_desc
gpio: protect the descriptor label with SRCU
gpio: sysfs: use gpio_device_find() to iterate over existing devices
gpio: remove gpio_lock
gpio: reinforce desc->flags handling
gpio: remove unneeded code from gpio_device_get_desc()
gpio: sysfs: extend the critical section for unregistering sysfs devices
gpio: sysfs: pass the GPIO device - not chip - to sysfs callbacks
gpio: cdev: replace gpiochip_get_desc() with gpio_device_get_desc()
gpio: cdev: don't access gdev->chip if it's not needed
gpio: sysfs: don't access gdev->chip if it's not needed
gpio: don't dereference gdev->chip in gpiochip_setup_dev()
gpio: reduce the functionality of validate_desc()
gpio: remove unnecessary checks from gpiod_to_chip()
gpio: add the can_sleep flag to struct gpio_device
gpio: add SRCU infrastructure to struct gpio_device
gpio: protect the pointer to gpio_chip in gpio_device with SRCU
gpio: remove the RW semaphore from the GPIO device
gpio: mark unsafe gpio_chip manipulators as deprecated
gpio: initialize descriptor SRCU structure before adding OF-based chips
gpio: take the SRCU read lock in gpiod_hog()
gpio: cdev: use correct pointer accessors with SRCU
gpio: use srcu_dereference() with SRCU-protected pointers
gpio: don't let lockdep complain about inherently dangerous RCU usage
gpio: sysfs: fix inverted pointer logic
gpio: cdev: fix a NULL-pointer dereference with DEBUG enabled
gpio: sim: add lockdep asserts
gpio: sim: delimit the fwnode name with a ":" when generating labels
gpio: don't warn about removing GPIO chips with active users anymore
gpio: provide for_each_hwgpio()
gpio: sim: use for_each_hwgpio()
Merge tag 'v6.8-rc7' into gpio/for-next

Geert Uytterhoeven (1):
dt-bindings: gpio: renesas,rcar-gpio: Add r8a779h0 support

Kent Gibson (20):
gpio: uapi: improve description of fd fields
gpio: uapi: clarify hte references
gpio: uapi: drop trailing period from one sentence descriptions
gpio: uapi: document possible values of gpioevent_data.id
gpio: uapi: clarify using v2 rather than v1
Documentation: gpio: add chardev userspace API documentation
Documentation: ABI: update gpio-cdev to reference chardev.rst
Documentation: ABI: update sysfs-gpio to reference gpio-cdev
Documentation: gpio: move sysfs into an obsolete section
Documentation: gpio: update sysfs documentation to reference new chardev doc
Documentation: gpio: add chardev v1 userspace API documentation
Documentation: gpio: capitalize GPIO in index title
Documentation: gpio: document gpio-mockup as obsoleted by gpio-sim
Documentation: gpio: move gpio-mockup into obsolete section
MAINTAINERS: add Documentation/userspace-api/gpio/ to GPIO UAPI section
Documentation: gpio: describe uAPI behaviour for unsupported config
Documentation: gpio: clarify sysfs line values are logical
Documentation: gpio: consistently use logical line value terminology
gpio: uapi: clarify default_values being logical
selftest: gpio: remove obsolete gpio-mockup test

Krzysztof Kozlowski (3):
gpio: constify opaque pointer in gpio_device_find() match function
gpio: constify opaque pointer "data" in gpio_device_find()
gpio: constify of_phandle_args in of_find_gpio_device_by_xlate()

Martin Kaiser (2):
gpio: vf610: allow disabling the vf610 driver
gpio: vf610: enable COMPILE_TEST

Michal Simek (1):
dt-bindings: gpio: pca9570: Add label property

Ricardo B. Marliere (1):
gpio: gpiolib: make gpio_bus_type const

Rob Herring (1):
dt-bindings: gpio: mvebu: Fix "unevaluatedProperties" to be false

Stephen Boyd (2):
gpio: Add ChromeOS EC GPIO driver
gpiolib: Pass consumer device through to core in devm_fwnode_gpiod_get_index()

Wenhua Lin (1):
gpio: eic-sprd: Optimize the calculation method of eic number

Xiaolei Wang (1):
gpio: fix memory leak in gpiod_request_commit()

Documentation/ABI/obsolete/sysfs-gpio | 4 +-
Documentation/ABI/testing/gpio-cdev | 9 +-
Documentation/admin-guide/gpio/gpio-mockup.rst | 8 +
Documentation/admin-guide/gpio/index.rst | 6 +-
Documentation/admin-guide/gpio/obsolete.rst | 13 +
.../bindings/gpio/aspeed,ast2400-gpio.yaml | 148 ++++
.../devicetree/bindings/gpio/gpio-aspeed.txt | 39 -
.../devicetree/bindings/gpio/gpio-mvebu.yaml | 2 +-
.../devicetree/bindings/gpio/gpio-pca9570.yaml | 3 +
.../bindings/gpio/renesas,rcar-gpio.yaml | 1 +
Documentation/driver-api/gpio/consumer.rst | 10 +-
Documentation/userspace-api/gpio/chardev.rst | 116 +++
Documentation/userspace-api/gpio/chardev_v1.rst | 131 +++
Documentation/userspace-api/gpio/error-codes.rst | 79 ++
.../userspace-api/gpio/gpio-get-chipinfo-ioctl.rst | 41 +
.../gpio/gpio-get-lineevent-ioctl.rst | 84 ++
.../gpio/gpio-get-linehandle-ioctl.rst | 125 +++
.../userspace-api/gpio/gpio-get-lineinfo-ioctl.rst | 54 ++
.../gpio/gpio-get-lineinfo-unwatch-ioctl.rst | 49 ++
.../gpio/gpio-get-lineinfo-watch-ioctl.rst | 74 ++
.../gpio/gpio-handle-get-line-values-ioctl.rst | 56 ++
.../gpio/gpio-handle-set-config-ioctl.rst | 63 ++
.../gpio/gpio-handle-set-line-values-ioctl.rst | 48 +
.../gpio/gpio-lineevent-data-read.rst | 84 ++
.../gpio/gpio-lineinfo-changed-read.rst | 87 ++
.../userspace-api/gpio/gpio-v2-get-line-ioctl.rst | 152 ++++
.../gpio/gpio-v2-get-lineinfo-ioctl.rst | 50 ++
.../gpio/gpio-v2-get-lineinfo-watch-ioctl.rst | 67 ++
.../userspace-api/gpio/gpio-v2-line-event-read.rst | 83 ++
.../gpio/gpio-v2-line-get-values-ioctl.rst | 51 ++
.../gpio/gpio-v2-line-set-config-ioctl.rst | 58 ++
.../gpio/gpio-v2-line-set-values-ioctl.rst | 47 +
.../gpio/gpio-v2-lineinfo-changed-read.rst | 81 ++
Documentation/userspace-api/gpio/index.rst | 18 +
Documentation/userspace-api/gpio/obsolete.rst | 11 +
.../{admin-guide => userspace-api}/gpio/sysfs.rst | 31 +-
Documentation/userspace-api/index.rst | 1 +
MAINTAINERS | 1 +
drivers/gpio/Kconfig | 15 +-
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-cros-ec.c | 209 +++++
drivers/gpio/gpio-eic-sprd.c | 10 +-
drivers/gpio/gpio-sim.c | 49 +-
drivers/gpio/gpiolib-acpi.c | 15 +-
drivers/gpio/gpiolib-acpi.h | 5 +-
drivers/gpio/gpiolib-cdev.c | 96 +-
drivers/gpio/gpiolib-devres.c | 2 +-
drivers/gpio/gpiolib-legacy.c | 12 +
drivers/gpio/gpiolib-of.c | 29 +-
drivers/gpio/gpiolib-of.h | 6 +-
drivers/gpio/gpiolib-sysfs.c | 152 ++--
drivers/gpio/gpiolib.c | 973 +++++++++++----------
drivers/gpio/gpiolib.h | 95 +-
include/linux/gpio/driver.h | 42 +-
include/uapi/linux/gpio.h | 63 +-
tools/testing/selftests/gpio/gpio-mockup.sh | 9 +-
56 files changed, 2995 insertions(+), 773 deletions(-)
create mode 100644 Documentation/admin-guide/gpio/obsolete.rst
create mode 100644 Documentation/devicetree/bindings/gpio/aspeed,ast2400-gpio.yaml
delete mode 100644 Documentation/devicetree/bindings/gpio/gpio-aspeed.txt
create mode 100644 Documentation/userspace-api/gpio/chardev.rst
create mode 100644 Documentation/userspace-api/gpio/chardev_v1.rst
create mode 100644 Documentation/userspace-api/gpio/error-codes.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-chipinfo-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-lineevent-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-linehandle-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-lineinfo-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-lineinfo-unwatch-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-get-lineinfo-watch-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-handle-get-line-values-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-handle-set-config-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-handle-set-line-values-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-lineevent-data-read.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-lineinfo-changed-read.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-get-line-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-get-lineinfo-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-get-lineinfo-watch-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-line-event-read.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-line-get-values-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-line-set-config-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-line-set-values-ioctl.rst
create mode 100644 Documentation/userspace-api/gpio/gpio-v2-lineinfo-changed-read.rst
create mode 100644 Documentation/userspace-api/gpio/index.rst
create mode 100644 Documentation/userspace-api/gpio/obsolete.rst
rename Documentation/{admin-guide => userspace-api}/gpio/sysfs.rst (87%)
create mode 100644 drivers/gpio/gpio-cros-ec.c