forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement a new, modern GPIO testing module controlled by configfs attributes instead of module parameters. The goal of this driver is to provide a replacement for gpio-mockup that will be easily extensible with new features and doesn't require reloading the module to change the setup. Signed-off-by: Bartosz Golaszewski <[email protected]> Acked-by: Linus Walleij <[email protected]>
- Loading branch information
Showing
4 changed files
with
1,732 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
.. SPDX-License-Identifier: GPL-2.0-or-later | ||
Configfs GPIO Simulator | ||
======================= | ||
|
||
The configfs GPIO Simulator (gpio-sim) provides a way to create simulated GPIO | ||
chips for testing purposes. The lines exposed by these chips can be accessed | ||
using the standard GPIO character device interface as well as manipulated | ||
using sysfs attributes. | ||
|
||
Creating simulated chips | ||
------------------------ | ||
|
||
The gpio-sim module registers a configfs subsystem called ``'gpio-sim'``. For | ||
details of the configfs filesystem, please refer to the configfs documentation. | ||
|
||
The user can create a hierarchy of configfs groups and items as well as modify | ||
values of exposed attributes. Once the chip is instantiated, this hierarchy | ||
will be translated to appropriate device properties. The general structure is: | ||
|
||
**Group:** ``/config/gpio-sim`` | ||
|
||
This is the top directory of the gpio-sim configfs tree. | ||
|
||
**Group:** ``/config/gpio-sim/gpio-device`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/dev_name`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/live`` | ||
|
||
This is a directory representing a GPIO platform device. The ``'dev_name'`` | ||
attribute is read-only and allows the user-space to read the platform device | ||
name (e.g. ``'gpio-sim.0'``). The ``'live'`` attribute allows to trigger the | ||
actual creation of the device once it's fully configured. The accepted values | ||
are: ``'1'`` to enable the simulated device and ``'0'`` to disable and tear | ||
it down. | ||
|
||
**Group:** ``/config/gpio-sim/gpio-device/gpio-bankX`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/chip_name`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/num_lines`` | ||
|
||
This group represents a bank of GPIOs under the top platform device. The | ||
``'chip_name'`` attribute is read-only and allows the user-space to read the | ||
device name of the bank device. The ``'num_lines'`` attribute allows to specify | ||
the number of lines exposed by this bank. | ||
|
||
**Group:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/name`` | ||
|
||
This group represents a single line at the offset Y. The 'name' attribute | ||
allows to set the line name as represented by the 'gpio-line-names' property. | ||
|
||
**Item:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/name`` | ||
|
||
**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/direction`` | ||
|
||
This item makes the gpio-sim module hog the associated line. The ``'name'`` | ||
attribute specifies the in-kernel consumer name to use. The ``'direction'`` | ||
attribute specifies the hog direction and must be one of: ``'input'``, | ||
``'output-high'`` and ``'output-low'``. | ||
|
||
Inside each bank directory, there's a set of attributes that can be used to | ||
configure the new chip. Additionally the user can ``mkdir()`` subdirectories | ||
inside the chip's directory that allow to pass additional configuration for | ||
specific lines. The name of those subdirectories must take the form of: | ||
``'line<offset>'`` (e.g. ``'line0'``, ``'line20'``, etc.) as the name will be | ||
used by the module to assign the config to the specific line at given offset. | ||
|
||
Once the confiuration is complete, the ``'live'`` attribute must be set to 1 in | ||
order to instantiate the chip. It can be set back to 0 to destroy the simulated | ||
chip. The module will synchronously wait for the new simulated device to be | ||
successfully probed and if this doesn't happen, writing to ``'live'`` will | ||
result in an error. | ||
|
||
Simulated GPIO chips can also be defined in device-tree. The compatible string | ||
must be: ``"gpio-simulator"``. Supported properties are: | ||
|
||
``"gpio-sim,label"`` - chip label | ||
|
||
Other standard GPIO properties (like ``"gpio-line-names"``, ``"ngpios"`` or | ||
``"gpio-hog"``) are also supported. Please refer to the GPIO documentation for | ||
details. | ||
|
||
An example device-tree code defining a GPIO simulator: | ||
|
||
.. code-block :: none | ||
gpio-sim { | ||
compatible = "gpio-simulator"; | ||
bank0 { | ||
gpio-controller; | ||
#gpio-cells = <2>; | ||
ngpios = <16>; | ||
gpio-sim,label = "dt-bank0"; | ||
gpio-line-names = "", "sim-foo", "", "sim-bar"; | ||
}; | ||
bank1 { | ||
gpio-controller; | ||
#gpio-cells = <2>; | ||
ngpios = <8>; | ||
gpio-sim,label = "dt-bank1"; | ||
line3 { | ||
gpio-hog; | ||
gpios = <3 0>; | ||
output-high; | ||
line-name = "sim-hog-from-dt"; | ||
}; | ||
}; | ||
}; | ||
Manipulating simulated lines | ||
---------------------------- | ||
|
||
Each simulated GPIO chip creates a separate sysfs group under its device | ||
directory for each exposed line | ||
(e.g. ``/sys/devices/platform/gpio-sim.X/gpiochipY/``). The name of each group | ||
is of the form: ``'sim_gpioX'`` where X is the offset of the line. Inside each | ||
group there are two attibutes: | ||
|
||
``pull`` - allows to read and set the current simulated pull setting for | ||
every line, when writing the value must be one of: ``'pull-up'``, | ||
``'pull-down'`` | ||
|
||
``value`` - allows to read the current value of the line which may be | ||
different from the pull if the line is being driven from | ||
user-space |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.