Documentation: gpio: describe uAPI behaviour for unsupported config
authorKent Gibson <warthog618@gmail.com>
Tue, 23 Jan 2024 13:38:28 +0000 (21:38 +0800)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 25 Jan 2024 08:42:25 +0000 (09:42 +0100)
The existing uAPI documentation does not adequately describe how the kernel
handles the case where the underlying hardware or driver does not support
the requested configuration.

Add a Configuration Support section describing that behaviour to both the
v1 and v2 documentation, and better document the errors returned where the
requested configuration cannot be supported.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Documentation/userspace-api/gpio/error-codes.rst
Documentation/userspace-api/gpio/gpio-get-lineevent-ioctl.rst
Documentation/userspace-api/gpio/gpio-get-linehandle-ioctl.rst
Documentation/userspace-api/gpio/gpio-handle-set-config-ioctl.rst
Documentation/userspace-api/gpio/gpio-v2-get-line-ioctl.rst
Documentation/userspace-api/gpio/gpio-v2-line-set-config-ioctl.rst

index edf01f2cf9d26858a26b866423ff4f7b55dbee03..6bf2948990cdccf1d3469fc022dc7ddbbb425e2b 100644 (file)
@@ -65,7 +65,8 @@ GPIO Error Codes
 
     -  - ``ENXIO``
 
-       -  No device corresponding to this device special file exists.
+       -  Typically returned when a feature requiring interrupt support was
+          requested, but the line does not support interrupts.
 
 .. note::
 
index 7d0b932925c6b97f5922d8ca174a69ff0e5f7274..09a9254f38cffd042f745df2921e8cd217bf27b2 100644 (file)
@@ -48,6 +48,12 @@ to its default state.
 
 Requesting a line already in use is an error (**EBUSY**).
 
+Requesting edge detection on a line that does not support interrupts is an
+error (**ENXIO**).
+
+As with the :ref:`line handle<gpio-get-linehandle-config-support>`, the
+bias configuration is best effort.
+
 Closing the ``chip_fd`` has no effect on existing line events.
 
 Configuration Rules
index c8256afe306ee91c017df869f07e4c3f43cbb793..9112a9d31174f79dd4cbe809057c651898651ebe 100644 (file)
@@ -76,6 +76,45 @@ If no bias flags are set then the bias configuration is not changed.
 
 Requesting an invalid configuration is an error (**EINVAL**).
 
+
+.. _gpio-get-linehandle-config-support:
+
+Configuration Support
+---------------------
+
+Where the requested configuration is not directly supported by the underlying
+hardware and driver, the kernel applies one of these approaches:
+
+ - reject the request
+ - emulate the feature in software
+ - treat the feature as best effort
+
+The approach applied depends on whether the feature can reasonably be emulated
+in software, and the impact on the hardware and userspace if the feature is not
+supported.
+The approach applied for each feature is as follows:
+
+==============   ===========
+Feature          Approach
+==============   ===========
+Bias             best effort
+Direction        reject
+Drive            emulate
+==============   ===========
+
+Bias is treated as best effort to allow userspace to apply the same
+configuration for platforms that support internal bias as those that require
+external bias.
+Worst case the line floats rather than being biased as expected.
+
+Drive is emulated by switching the line to an input when the line should not
+be driven.
+
+In all cases, the configuration reported by gpio-get-lineinfo-ioctl.rst
+is the requested configuration, not the resulting hardware configuration.
+Userspace cannot determine if a feature is supported in hardware, is
+emulated, or is best effort.
+
 Return Value
 ============
 
index 8f1e748dccc85d0810670d59a8ae43ed112dccc8..d002a84681acf902cb567be77018a83d26137dc9 100644 (file)
@@ -41,12 +41,13 @@ line or introducing potential glitches.
 
 The configuration applies to all requested lines.
 
-The same :ref:`gpio-get-linehandle-config-rules` that apply when requesting the
+The same :ref:`gpio-get-linehandle-config-rules` and
+:ref:`gpio-get-linehandle-config-support` that apply when requesting the
 lines also apply when updating the line configuration.
 
 The motivating use case for this command is changing direction of
 bi-directional lines between input and output, but it may be used more
-generally move lines seamlessly from one configuration state to another.
+generally to move lines seamlessly from one configuration state to another.
 
 To only change the value of output lines, use
 gpio-handle-set-line-values-ioctl.rst.
index d76e614c83434b0207923af0cb39ed6c6a16bca6..56b975801b6af02e9cc213cb7c97f479fdc19c24 100644 (file)
@@ -74,7 +74,8 @@ If no bias flags are set then the bias configuration is not changed.
 
 The edge flags, ``GPIO_V2_LINE_FLAG_EDGE_xxx``, require
 ``GPIO_V2_LINE_FLAG_INPUT`` to be set and may be combined to detect both rising
-and falling edges.
+and falling edges.  Requesting edge detection from a line that does not support
+it is an error (**ENXIO**).
 
 Only one event clock flag, ``GPIO_V2_LINE_FLAG_EVENT_CLOCK_xxx``, may be set.
 If none are set then the event clock defaults to ``CLOCK_MONOTONIC``.
@@ -86,11 +87,61 @@ The :c:type:`debounce_period_us<gpio_v2_line_attribute>` attribute may only
 be applied to lines with ``GPIO_V2_LINE_FLAG_INPUT`` set. When set, debounce
 applies to both the values returned by gpio-v2-line-get-values-ioctl.rst and
 the edges returned by gpio-v2-line-event-read.rst.  If not
-supported directly by hardware, the debouncing is performed in software by the
-kernel.
+supported directly by hardware, debouncing is emulated in software by the
+kernel.  Requesting debounce on a line that supports neither debounce in
+hardware nor interrupts, as required for software emulation, is an error
+(**ENXIO**).
 
 Requesting an invalid configuration is an error (**EINVAL**).
 
+.. _gpio-v2-get-line-config-support:
+
+Configuration Support
+---------------------
+
+Where the requested configuration is not directly supported by the underlying
+hardware and driver, the kernel applies one of these approaches:
+
+ - reject the request
+ - emulate the feature in software
+ - treat the feature as best effort
+
+The approach applied depends on whether the feature can reasonably be emulated
+in software, and the impact on the hardware and userspace if the feature is not
+supported.
+The approach applied for each feature is as follows:
+
+==============   ===========
+Feature          Approach
+==============   ===========
+Bias             best effort
+Debounce         emulate
+Direction        reject
+Drive            emulate
+Edge Detection   reject
+==============   ===========
+
+Bias is treated as best effort to allow userspace to apply the same
+configuration for platforms that support internal bias as those that require
+external bias.
+Worst case the line floats rather than being biased as expected.
+
+Debounce is emulated by applying a filter to hardware interrupts on the line.
+An edge event is generated after an edge is detected and the line remains
+stable for the debounce period.
+The event timestamp corresponds to the end of the debounce period.
+
+Drive is emulated by switching the line to an input when the line should not
+be actively driven.
+
+Edge detection requires interrupt support, and is rejected if that is not
+supported. Emulation by polling can still be performed from userspace.
+
+In all cases, the configuration reported by gpio-v2-get-lineinfo-ioctl.rst
+is the requested configuration, not the resulting hardware configuration.
+Userspace cannot determine if a feature is supported in hardware, is
+emulated, or is best effort.
+
 Return Value
 ============
 
index 126c2626ba6baea1951ea4c0f89a5ef5a1577a31..9b942a8a53ca9ab938eca9e072a1d873c19a617d 100644 (file)
@@ -37,7 +37,8 @@ line or introducing potential glitches.
 
 The new configuration must specify the configuration of all requested lines.
 
-The same :ref:`gpio-v2-get-line-config-rules` that apply when requesting the lines
+The same :ref:`gpio-v2-get-line-config-rules` and
+:ref:`gpio-v2-get-line-config-support` that apply when requesting the lines
 also apply when updating the line configuration.
 
 The motivating use case for this command is changing direction of