X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Fgeneric-2.6%2Fpatches-2.6.25%2F963-backport_gpio_chip_reserve.patch;fp=target%2Flinux%2Fgeneric-2.6%2Fpatches-2.6.25%2F963-backport_gpio_chip_reserve.patch;h=0000000000000000000000000000000000000000;hp=abf77c35599e14a81d4f36d417214286e1e94113;hb=c6ab1b23be796c1bbe1915ac566fe3377ae8109f;hpb=01131f5dd9f61be5a5c857152ca079f316fd7538 diff --git a/target/linux/generic-2.6/patches-2.6.25/963-backport_gpio_chip_reserve.patch b/target/linux/generic-2.6/patches-2.6.25/963-backport_gpio_chip_reserve.patch deleted file mode 100644 index abf77c3559..0000000000 --- a/target/linux/generic-2.6/patches-2.6.25/963-backport_gpio_chip_reserve.patch +++ /dev/null @@ -1,112 +0,0 @@ -From: Anton Vorontsov -Date: Mon, 28 Apr 2008 09:14:47 +0000 (-0700) -Subject: gpiochip_reserve() -X-Git-Tag: v2.6.26-rc1~847 -X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=169b6a7a6e91e1ea32136681b475cbaf2074bf35 - -gpiochip_reserve() - -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. - -[akpm@linux-foundation.org: remove unneeded __must_check] -[david-b@pacbell.net: don't export gpiochip_reserve (section fix)] -Signed-off-by: Anton Vorontsov -Signed-off-by: David Brownell -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - ---- a/drivers/gpio/gpiolib.c -+++ b/drivers/gpio/gpiolib.c -@@ -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,47 @@ 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 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; -+} -+ -+/** - * gpiochip_add() - register a gpio_chip - * @chip: the chip to register, with chip->base initialized - * Context: potentially before irqs or kmalloc will work ---- a/include/asm-generic/gpio.h -+++ b/include/asm-generic/gpio.h -@@ -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);