gpiochip_reserve()
Subsystems (2)
PATCH 2/2 gpiochip_reserve()
From: Anton Vorontsov <[email protected]>
Add a new function gpiochip_reserve() to reserve ranges of gpios that platform code has pre-allocated. That is, this marks gpio numbers which will be claimed by drivers that haven't yet been loaded, and thus are not available for dynamic gpio number allocation.
--- drivers/gpio/gpiolib.c | 51 ++++++++++++++++++++++++++++++++++++++++++--- include/asm-generic/gpio.h | 1 2 files changed, 49 insertions(+), 3 deletions(-)
drivers/gpio/gpiolib.c +48 -3
@@ -43,6 +43,7 @@ struct gpio_desc {/* flag symbols are bit numbers */ #define FLAG_REQUESTED 0#define FLAG_IS_OUT 1 +#define FLAG_RESERVED 2#ifdef CONFIG_DEBUG_FS const char *label;
@@ -88,9 +89,10 @@ static int gpiochip_find_base(int ngpio)int base = -ENOSPC ;for (i =ARCH_NR_GPIOS -1 ; i >=0 ; i--) { -struct gpio_chip *chip = gpio_desc[i].chip; +struct gpio_desc *desc = &gpio_desc[i]; +struct gpio_chip *chip = desc->chip; -if (!chip) { +if (!chip && !test_bit (FLAG_RESERVED , &desc->flags)) { spare++;if (spare == ngpio) { base = i;
@@ -98,7 +100,8 @@ static int gpiochip_find_base(int ngpio) } }else { spare =0 ; - i -= chip->ngpio -1 ; +if (chip) + i -= chip->ngpio -1 ; } }
@@ -108,6 +111,48 @@ static int gpiochip_find_base(int ngpio) }/** +* gpiochip_reserve() - reserve range of gpios to use with platform code only +* @start: starting gpio number +* @ngpio: number of gpios to reserve +* Context: platform init, potentially before irqs or kmalloc will work +* +* Returns a negative errno if any gpio within the range is already reserved +* or registered, else returns zero as a success code. Use this function +* to mark a range of gpios as unavailable for dynamic gpio number allocation, +* for example because its driver support is not yet loaded. +*/ +int __init __must_check gpiochip_reserve (int start,int ngpio) +{ +int ret =0 ; +unsigned long flags; +int i; + +if (!gpio_is_valid (start) || !gpio_is_valid (start + ngpio)) +return -EINVAL ; + +spin_lock_irqsave (&gpio_lock, flags); + +for (i = start; i < start + ngpio; i++) { +struct gpio_desc *desc = &gpio_desc[i]; + +if (desc->chip ||test_bit (FLAG_RESERVED , &desc->flags)) { + ret = -EBUSY ; + goto err; + } + +set_bit (FLAG_RESERVED , &desc->flags); + } + +pr_debug ("%s: reserved gpios from %d to %d\n" , + __func__, start, start + ngpio -1 ); +err: +spin_unlock_irqrestore (&gpio_lock, flags); + +return ret; +} +EXPORT_SYMBOL_GPL (gpiochip_reserve); + +/** * gpiochip_add() - register a gpio_chip * @chip: the chip to register, with chip->base initialized * Context: potentially before irqs or kmalloc will work
include/asm-generic/gpio.h +1 -0
@@ -74,6 +74,7 @@ struct gpio_chip {extern const char *gpiochip_is_requested (struct gpio_chip *chip,unsigned offset); +extern int __init __must_check gpiochip_reserve (int start,int ngpio);/* add/remove chips */ extern int gpiochip_add (struct gpio_chip *chip);
Quoted 1 line · On Thu, 13 Mar 2008 14:52:21 -0800 David Brownell <[email protected]> wrote:
+int
__init__must_checkgpiochip_reserve(int start, int ngpio)
I applaud the addition of __msut_check to a newly-added function of this kind, but we usually only add the tag to the declaration, not to the definition as well.
Not a lot of thought went into this, but we might as well be consistent.
drivers/gpio/gpiolib.c renamed from drivers/gpio/gpiolib.c~gpiochip_reserve-fix +1 -1
@@ -121,7 +121,7 @@ static int gpiochip_find_base(int ngpio)* to mark a range of gpios as unavailable for dynamic gpio number allocation, * for example because its driver support is not yet loaded. */ -int __init __must_check gpiochip_reserve (int start,int ngpio) +int __init gpiochip_reserve (int start,int ngpio) {int ret =0 ;unsigned long flags;
Quoted 8 lines · Andrew Morton
Quoted 1 line · On Thu, 13 Mar 2008 14:52:21 -0800 David Brownell <[email protected]> wrote:
+int
__init__must_checkgpiochip_reserve(int start, int ngpio)I applaud the addition of
__msut_checkto a newly-added function of this kind, but we usually only add the tag to the declaration, not to the definition as well.
A bit unfortunate really, given that use of ctags and friends in some editors jumps to the first definition they come across, so if the prototype is stuffed somewhere in include/, it shows the definitions from drivers or fs or wherever that doesn't have the tag.
Given it doesn't cost us anything except a few more bytes in the source code, is consistency such a bad thing?
Dave
Signature · 1 line
http://www.codemonkey.org.uk