forked from Minki/linux
110 lines
4.2 KiB
Plaintext
110 lines
4.2 KiB
Plaintext
|
This is a place for planning the ongoing long-term work in the GPIO
|
||
|
subsystem.
|
||
|
|
||
|
|
||
|
GPIO descriptors
|
||
|
|
||
|
Starting with commit 79a9becda894 the GPIO subsystem embarked on a journey
|
||
|
to move away from the global GPIO numberspace and toward a decriptor-based
|
||
|
approach. This means that GPIO consumers, drivers and machine descriptions
|
||
|
ideally have no use or idea of the global GPIO numberspace that has/was
|
||
|
used in the inception of the GPIO subsystem.
|
||
|
|
||
|
Work items:
|
||
|
|
||
|
- Convert all GPIO device drivers to only #include <linux/gpio/driver.h>
|
||
|
|
||
|
- Convert all consumer drivers to only #include <linux/gpio/consumer.h>
|
||
|
|
||
|
- Convert all machine descriptors in "boardfiles" to only
|
||
|
#include <linux/gpio/machine.h>, the other option being to convert it
|
||
|
to a machine description such as device tree, ACPI or fwnode that
|
||
|
implicitly does not use global GPIO numbers.
|
||
|
|
||
|
- When this work is complete (will require some of the items in the
|
||
|
following ongoing work as well) we can delete the old global
|
||
|
numberspace accessors from <linux/gpio.h> and eventually delete
|
||
|
<linux/gpio.h> altogether.
|
||
|
|
||
|
|
||
|
Get rid of <linux/of_gpio.h>
|
||
|
|
||
|
This header and helpers appeared at one point when there was no proper
|
||
|
driver infrastructure for doing simpler MMIO GPIO devices and there was
|
||
|
no core support for parsing device tree GPIOs from the core library with
|
||
|
the [devm_]gpiod_get() calls we have today that will implicitly go into
|
||
|
the device tree back-end.
|
||
|
|
||
|
Work items:
|
||
|
|
||
|
- Get rid of struct of_mm_gpio_chip altogether: use the generic MMIO
|
||
|
GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
|
||
|
to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_add()
|
||
|
of_mm_gpiochip_remove() from the kernel.
|
||
|
|
||
|
- Change all consumer drivers that #include <linux/of_gpio.h> to
|
||
|
#include <linux/gpio/consumer.h> and stop doing custom parsing of the
|
||
|
GPIO lines from the device tree. This can be tricky and often ivolves
|
||
|
changing boardfiles, etc.
|
||
|
|
||
|
- Pull semantics for legacy device tree (OF) GPIO lookups into
|
||
|
gpiolib-of.c: in some cases subsystems are doing custom flags and
|
||
|
lookups for polarity inversion, open drain and what not. As we now
|
||
|
handle this with generic OF bindings, pull all legacy handling into
|
||
|
gpiolib so the library API becomes narrow and deep and handle all
|
||
|
legacy bindings internally. (See e.g. commits 6953c57ab172,
|
||
|
6a537d48461d etc)
|
||
|
|
||
|
- Delete <linux/of_gpio.h> when all the above is complete and everything
|
||
|
uses <linux/gpio/consumer.h> or <linux/gpio/driver.h> instead.
|
||
|
|
||
|
|
||
|
Collect drivers
|
||
|
|
||
|
Collect GPIO drivers from arch/* and other places that should be placed
|
||
|
in drivers/gpio/gpio-*. Augment platforms to create platform devices or
|
||
|
similar and probe a proper driver in the gpiolib subsystem.
|
||
|
|
||
|
In some cases it makes sense to create a GPIO chip from the local driver
|
||
|
for a few GPIOs. Those should stay where they are.
|
||
|
|
||
|
|
||
|
Generic MMIO GPIO
|
||
|
|
||
|
The GPIO drivers can utilize the generic MMIO helper library in many
|
||
|
cases, and the helper library should be as helpful as possible for MMIO
|
||
|
drivers. (drivers/gpio/gpio-mmio.c)
|
||
|
|
||
|
Work items:
|
||
|
|
||
|
- Look over and identify any remaining easily converted drivers and
|
||
|
dry-code conversions to MMIO GPIO for maintainers to test
|
||
|
|
||
|
- Expand the MMIO GPIO or write a new library for port-mapped I/O
|
||
|
helpers (x86 inb()/outb()) and convert port-mapped I/O drivers to use
|
||
|
this with dry-coding and sending to maintainers to test
|
||
|
|
||
|
|
||
|
GPIOLIB irqchip
|
||
|
|
||
|
The GPIOLIB irqchip is a helper irqchip for "simple cases" that should
|
||
|
try to cover any generic kind of irqchip cascaded from a GPIO.
|
||
|
|
||
|
- Look over and identify any remaining easily converted drivers and
|
||
|
dry-code conversions to gpiolib irqchip for maintainers to test
|
||
|
|
||
|
- Support generic hierarchical GPIO interrupts: these are for the
|
||
|
non-cascading case where there is one IRQ per GPIO line, there is
|
||
|
currently no common infrastructure for this.
|
||
|
|
||
|
|
||
|
Increase integration with pin control
|
||
|
|
||
|
There are already ways to use pin control as back-end for GPIO and
|
||
|
it may make sense to bring these subsystems closer. One reason for
|
||
|
creating pin control as its own subsystem was that we could avoid any
|
||
|
use of the global GPIO numbers. Once the above is complete, it may
|
||
|
make sense to simply join the subsystems into one and make pin
|
||
|
multiplexing, pin configuration, GPIO, etc selectable options in one
|
||
|
and the same pin control and GPIO subsystem.
|