Documentation: gpio: document configfs interface for gpio-aggregator
BugLink: https://bugs.launchpad.net/bugs/2103496 Add documentation for the newly added configfs-based interface for GPIO aggregator. Signed-off-by: Koichiro Den<koichiro.den@canonical.com> Link:https://lore.kernel.org/r/20250407043019.4105613-9-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski<bartosz.golaszewski@linaro.org> (cherry picked from commit 10f94d092bba9ab08004c624c604e976e6e3cd22 linux-next) Signed-off-by: Koichiro Den<koichiro.den@canonical.com> Acked-by: Jacob Martin <jacob.martin@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
committed by
Stefan Bader
parent
6df515d885
commit
0dcb7677bb
@@ -69,6 +69,113 @@ write-only attribute files in sysfs.
|
||||
$ echo gpio-aggregator.0 > delete_device
|
||||
|
||||
|
||||
Aggregating GPIOs using Configfs
|
||||
--------------------------------
|
||||
|
||||
**Group:** ``/config/gpio-aggregator``
|
||||
|
||||
This is the root directory of the gpio-aggregator configfs tree.
|
||||
|
||||
**Group:** ``/config/gpio-aggregator/<example-name>``
|
||||
|
||||
This directory represents a GPIO aggregator device. You can assign any
|
||||
name to ``<example-name>`` (e.g. ``agg0``), except names starting with
|
||||
``_sysfs`` prefix, which are reserved for auto-generated configfs
|
||||
entries corresponding to devices created via Sysfs.
|
||||
|
||||
**Attribute:** ``/config/gpio-aggregator/<example-name>/live``
|
||||
|
||||
The ``live`` attribute allows to trigger the actual creation of the device
|
||||
once it's fully configured. Accepted values are:
|
||||
|
||||
* ``1``, ``yes``, ``true`` : enable the virtual device
|
||||
* ``0``, ``no``, ``false`` : disable the virtual device
|
||||
|
||||
**Attribute:** ``/config/gpio-aggregator/<example-name>/dev_name``
|
||||
|
||||
The read-only ``dev_name`` attribute exposes the name of the device as it
|
||||
will appear in the system on the platform bus (e.g. ``gpio-aggregator.0``).
|
||||
This is useful for identifying a character device for the newly created
|
||||
aggregator. If it's ``gpio-aggregator.0``,
|
||||
``/sys/devices/platform/gpio-aggregator.0/gpiochipX`` path tells you that the
|
||||
GPIO device id is ``X``.
|
||||
|
||||
You must create subdirectories for each virtual line you want to
|
||||
instantiate, named exactly as ``line0``, ``line1``, ..., ``lineY``, when
|
||||
you want to instantiate ``Y+1`` (Y >= 0) lines. Configure all lines before
|
||||
activating the device by setting ``live`` to 1.
|
||||
|
||||
**Group:** ``/config/gpio-aggregator/<example-name>/<lineY>/``
|
||||
|
||||
This directory represents a GPIO line to include in the aggregator.
|
||||
|
||||
**Attribute:** ``/config/gpio-aggregator/<example-name>/<lineY>/key``
|
||||
|
||||
**Attribute:** ``/config/gpio-aggregator/<example-name>/<lineY>/offset``
|
||||
|
||||
The default values after creating the ``<lineY>`` directory are:
|
||||
|
||||
* ``key`` : <empty>
|
||||
* ``offset`` : -1
|
||||
|
||||
``key`` must always be explicitly configured, while ``offset`` depends.
|
||||
Two configuration patterns exist for each ``<lineY>``:
|
||||
|
||||
(a). For lookup by GPIO line name:
|
||||
|
||||
* Set ``key`` to the line name.
|
||||
* Ensure ``offset`` remains -1 (the default).
|
||||
|
||||
(b). For lookup by GPIO chip name and the line offset within the chip:
|
||||
|
||||
* Set ``key`` to the chip name.
|
||||
* Set ``offset`` to the line offset (0 <= ``offset`` < 65535).
|
||||
|
||||
**Attribute:** ``/config/gpio-aggregator/<example-name>/<lineY>/name``
|
||||
|
||||
The ``name`` attribute sets a custom name for lineY. If left unset, the
|
||||
line will remain unnamed.
|
||||
|
||||
Once the configuration is done, the ``'live'`` attribute must be set to 1
|
||||
in order to instantiate the aggregator device. It can be set back to 0 to
|
||||
destroy the virtual device. The module will synchronously wait for the new
|
||||
aggregator device to be successfully probed and if this doesn't happen, writing
|
||||
to ``'live'`` will result in an error. This is a different behaviour from the
|
||||
case when you create it using sysfs ``new_device`` interface.
|
||||
|
||||
.. note::
|
||||
|
||||
For aggregators created via Sysfs, the configfs entries are
|
||||
auto-generated and appear as ``/config/gpio-aggregator/_sysfs.<N>/``. You
|
||||
cannot add or remove line directories with mkdir(2)/rmdir(2). To modify
|
||||
lines, you must use the "delete_device" interface to tear down the
|
||||
existing device and reconfigure it from scratch. However, you can still
|
||||
toggle the aggregator with the ``live`` attribute and adjust the
|
||||
``key``, ``offset``, and ``name`` attributes for each line when ``live``
|
||||
is set to 0 by hand (i.e. it's not waiting for deferred probe).
|
||||
|
||||
Sample configuration commands
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
# Create a directory for an aggregator device
|
||||
$ mkdir /sys/kernel/config/gpio-aggregator/agg0
|
||||
|
||||
# Configure each line
|
||||
$ mkdir /sys/kernel/config/gpio-aggregator/agg0/line0
|
||||
$ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line0/key
|
||||
$ echo 6 > /sys/kernel/config/gpio-aggregator/agg0/line0/offset
|
||||
$ echo test0 > /sys/kernel/config/gpio-aggregator/agg0/line0/name
|
||||
$ mkdir /sys/kernel/config/gpio-aggregator/agg0/line1
|
||||
$ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line1/key
|
||||
$ echo 7 > /sys/kernel/config/gpio-aggregator/agg0/line1/offset
|
||||
$ echo test1 > /sys/kernel/config/gpio-aggregator/agg0/line1/name
|
||||
|
||||
# Activate the aggregator device
|
||||
$ echo 1 > /sys/kernel/config/gpio-aggregator/agg0/live
|
||||
|
||||
|
||||
Generic GPIO Driver
|
||||
-------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user