diff options
Diffstat (limited to 'Documentation/driver-api/gpio')
| -rw-r--r-- | Documentation/driver-api/gpio/board.rst | 24 | ||||
| -rw-r--r-- | Documentation/driver-api/gpio/consumer.rst | 64 | ||||
| -rw-r--r-- | Documentation/driver-api/gpio/driver.rst | 23 | ||||
| -rw-r--r-- | Documentation/driver-api/gpio/index.rst | 2 | 
4 files changed, 89 insertions, 24 deletions
diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver-api/gpio/board.rst index 2c112553df84..a0f294e2e250 100644 --- a/Documentation/driver-api/gpio/board.rst +++ b/Documentation/driver-api/gpio/board.rst @@ -193,3 +193,27 @@ 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 array must meet the +following requirements: +- pin hardware number of array member 0 must also be 0, +- pin hardware numbers of consecutive array members which belong to the same +  chip as member 0 does must also match their array indexes. + +Otherwise fast bitmap processing path is not used in order to avoid consecutive +pins which belong to the same chip but are not in hardware order being processed +separately. + +If the array applies for fast bitmap processing path, pins which belong to +different chips than member 0 does, as well as those with indexes different from +their hardware pin numbers, are excluded from the fast path, both input and +output.  Moreover, open drain and open source pins are excluded from fast bitmap +output processing. diff --git a/Documentation/driver-api/gpio/consumer.rst b/Documentation/driver-api/gpio/consumer.rst index aa03f389d41d..5e4d8aa68913 100644 --- a/Documentation/driver-api/gpio/consumer.rst +++ b/Documentation/driver-api/gpio/consumer.rst @@ -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); - -	void gpiod_set_array_value(unsigned int array_size, -				   struct gpio_desc **desc_array, -				   int *value_array) -	void gpiod_set_raw_array_value(unsigned int array_size, -				       struct gpio_desc **desc_array, -				       int *value_array) -	void gpiod_set_array_value_cansleep(unsigned int array_size, -					    struct gpio_desc **desc_array, -					    int *value_array) -	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); + +	int gpiod_set_array_value(unsigned int array_size, +				  struct gpio_desc **desc_array, +				  struct gpio_array *array_info, +				  unsigned long *value_bitmap) +	int gpiod_set_raw_array_value(unsigned int array_size, +				      struct gpio_desc **desc_array, +				      struct gpio_array *array_info, +				      unsigned long *value_bitmap) +	int gpiod_set_array_value_cansleep(unsigned int array_size, +					   struct gpio_desc **desc_array, +					   struct gpio_array *array_info, +					   unsigned long *value_bitmap) +	int gpiod_set_raw_array_value_cansleep(unsigned int array_size, +					       struct gpio_desc **desc_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 diff --git a/Documentation/driver-api/gpio/driver.rst b/Documentation/driver-api/gpio/driver.rst index cbe0242842d1..a6c14ff0c54f 100644 --- a/Documentation/driver-api/gpio/driver.rst +++ b/Documentation/driver-api/gpio/driver.rst @@ -374,7 +374,28 @@ When implementing an irqchip inside a GPIO driver, these two functions should  typically be called in the .startup() and .shutdown() callbacks from the  irqchip. -When using the gpiolib irqchip helpers, these callback are automatically +When using the gpiolib irqchip helpers, these callbacks are automatically +assigned. + + +Disabling and enabling IRQs +--------------------------- +When a GPIO is used as an IRQ signal, then gpiolib also needs to know if +the IRQ is enabled or disabled. In order to inform gpiolib about this, +a driver should call:: + +	void gpiochip_disable_irq(struct gpio_chip *chip, unsigned int offset) + +This allows drivers to drive the GPIO as an output while the IRQ is +disabled. When the IRQ is enabled again, a driver should call:: + +	void gpiochip_enable_irq(struct gpio_chip *chip, unsigned int offset) + +When implementing an irqchip inside a GPIO driver, these two functions should +typically be called in the .irq_disable() and .irq_enable() callbacks from the +irqchip. + +When using the gpiolib irqchip helpers, these callbacks are automatically  assigned.  Real-Time compliance for GPIO IRQ chips diff --git a/Documentation/driver-api/gpio/index.rst b/Documentation/driver-api/gpio/index.rst index 6a374ded1287..c5b8467f9104 100644 --- a/Documentation/driver-api/gpio/index.rst +++ b/Documentation/driver-api/gpio/index.rst @@ -38,7 +38,7 @@ Device tree support  Device-managed API  ================== -.. kernel-doc:: drivers/gpio/devres.c +.. kernel-doc:: drivers/gpio/gpiolib-devres.c     :export:  sysfs helpers  |