Merge branch 'ib-array-bitmaps' into devel
This commit is contained in:
@@ -193,3 +193,18 @@ And the table can be added to the board code as follows::
|
||||
|
||||
The line will be hogged as soon as the gpiochip is created or - in case the
|
||||
chip was created earlier - when the hog table is registered.
|
||||
|
||||
Arrays of pins
|
||||
--------------
|
||||
In addition to requesting pins belonging to a function one by one, a device may
|
||||
also request an array of pins assigned to the function. The way those pins are
|
||||
mapped to the device determines if the array qualifies for fast bitmap
|
||||
processing. If yes, a bitmap is passed over get/set array functions directly
|
||||
between a caller and a respective .get/set_multiple() callback of a GPIO chip.
|
||||
|
||||
In order to qualify for fast bitmap processing, the pin mapping must meet the
|
||||
following requirements:
|
||||
- it must belong to the same chip as other 'fast' pins of the function,
|
||||
- its index within the function must match its hardware number within the chip.
|
||||
|
||||
Open drain and open source pins are excluded from fast bitmap output processing.
|
||||
|
@@ -109,9 +109,11 @@ For a function using multiple GPIOs all of those can be obtained with one call::
|
||||
enum gpiod_flags flags)
|
||||
|
||||
This function returns a struct gpio_descs which contains an array of
|
||||
descriptors::
|
||||
descriptors. It also contains a pointer to a gpiolib private structure which,
|
||||
if passed back to get/set array functions, may speed up I/O proocessing::
|
||||
|
||||
struct gpio_descs {
|
||||
struct gpio_array *info;
|
||||
unsigned int ndescs;
|
||||
struct gpio_desc *desc[];
|
||||
}
|
||||
@@ -323,29 +325,37 @@ The following functions get or set the values of an array of GPIOs::
|
||||
|
||||
int gpiod_get_array_value(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array);
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
int gpiod_get_raw_array_value(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array);
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
int gpiod_get_array_value_cansleep(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array);
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array);
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
|
||||
void gpiod_set_array_value(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array)
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap)
|
||||
void gpiod_set_raw_array_value(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array)
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap)
|
||||
void gpiod_set_array_value_cansleep(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array)
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap)
|
||||
void gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
int *value_array)
|
||||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap)
|
||||
|
||||
The array can be an arbitrary set of GPIOs. The functions will try to access
|
||||
GPIOs belonging to the same bank or chip simultaneously if supported by the
|
||||
@@ -356,8 +366,9 @@ accessed sequentially.
|
||||
The functions take three arguments:
|
||||
* array_size - the number of array elements
|
||||
* desc_array - an array of GPIO descriptors
|
||||
* value_array - an array to store the GPIOs' values (get) or
|
||||
an array of values to assign to the GPIOs (set)
|
||||
* array_info - optional information obtained from gpiod_array_get()
|
||||
* value_bitmap - a bitmap to store the GPIOs' values (get) or
|
||||
a bitmap of values to assign to the GPIOs (set)
|
||||
|
||||
The descriptor array can be obtained using the gpiod_get_array() function
|
||||
or one of its variants. If the group of descriptors returned by that function
|
||||
@@ -366,16 +377,25 @@ the struct gpio_descs returned by gpiod_get_array()::
|
||||
|
||||
struct gpio_descs *my_gpio_descs = gpiod_get_array(...);
|
||||
gpiod_set_array_value(my_gpio_descs->ndescs, my_gpio_descs->desc,
|
||||
my_gpio_values);
|
||||
my_gpio_descs->info, my_gpio_value_bitmap);
|
||||
|
||||
It is also possible to access a completely arbitrary array of descriptors. The
|
||||
descriptors may be obtained using any combination of gpiod_get() and
|
||||
gpiod_get_array(). Afterwards the array of descriptors has to be setup
|
||||
manually before it can be passed to one of the above functions.
|
||||
manually before it can be passed to one of the above functions. In that case,
|
||||
array_info should be set to NULL.
|
||||
|
||||
Note that for optimal performance GPIOs belonging to the same chip should be
|
||||
contiguous within the array of descriptors.
|
||||
|
||||
Still better performance may be achieved if array indexes of the descriptors
|
||||
match hardware pin numbers of a single chip. If an array passed to a get/set
|
||||
array function matches the one obtained from gpiod_get_array() and array_info
|
||||
associated with the array is also passed, the function may take a fast bitmap
|
||||
processing path, passing the value_bitmap argument directly to the respective
|
||||
.get/set_multiple() callback of the chip. That allows for utilization of GPIO
|
||||
banks as data I/O ports without much loss of performance.
|
||||
|
||||
The return value of gpiod_get_array_value() and its variants is 0 on success
|
||||
or negative on error. Note the difference to gpiod_get_value(), which returns
|
||||
0 or 1 on success to convey the GPIO value. With the array functions, the GPIO
|
||||
|
Reference in New Issue
Block a user