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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux