Просмотр исходного кода

gpio: devm_gpio_* support should not depend on GPIOLIB

Some architectures (e.g. blackfin) provide gpio API without requiring
GPIOLIB support (ARCH_WANT_OPTIONAL_GPIOLIB).  devm_gpio_* functions
should also work for these architectures, since they do not really
depend on GPIOLIB.

Add a new option GPIO_DEVRES (enabled by default) to control the build
of devres.c.  It also removes the empty version of devm_gpio_*
functions for !GENERIC_GPIO build from linux/gpio.h, and moves the
function declarations from asm-generic/gpio.h into linux/gpio.h.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Shawn Guo 13 лет назад
Родитель
Сommit
6a89a314ab
4 измененных файлов с 13 добавлено и 27 удалено
  1. 3 0
      drivers/gpio/Kconfig
  2. 2 1
      drivers/gpio/Makefile
  3. 0 6
      include/asm-generic/gpio.h
  4. 8 20
      include/linux/gpio.h

+ 3 - 0
drivers/gpio/Kconfig

@@ -30,6 +30,9 @@ config ARCH_REQUIRE_GPIOLIB
 	  Selecting this from the architecture code will cause the gpiolib
 	  Selecting this from the architecture code will cause the gpiolib
 	  code to always get built in.
 	  code to always get built in.
 
 
+config GPIO_DEVRES
+	def_bool y
+	depends on HAS_IOMEM
 
 
 
 
 menuconfig GPIOLIB
 menuconfig GPIOLIB

+ 2 - 1
drivers/gpio/Makefile

@@ -2,7 +2,8 @@
 
 
 ccflags-$(CONFIG_DEBUG_GPIO)	+= -DDEBUG
 ccflags-$(CONFIG_DEBUG_GPIO)	+= -DDEBUG
 
 
-obj-$(CONFIG_GPIOLIB)		+= gpiolib.o devres.o
+obj-$(CONFIG_GPIO_DEVRES)	+= devres.o
+obj-$(CONFIG_GPIOLIB)		+= gpiolib.o
 obj-$(CONFIG_OF_GPIO)		+= gpiolib-of.o
 obj-$(CONFIG_OF_GPIO)		+= gpiolib-of.o
 obj-$(CONFIG_GPIO_ACPI)		+= gpiolib-acpi.o
 obj-$(CONFIG_GPIO_ACPI)		+= gpiolib-acpi.o
 
 

+ 0 - 6
include/asm-generic/gpio.h

@@ -192,12 +192,6 @@ extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *labe
 extern int gpio_request_array(const struct gpio *array, size_t num);
 extern int gpio_request_array(const struct gpio *array, size_t num);
 extern void gpio_free_array(const struct gpio *array, size_t num);
 extern void gpio_free_array(const struct gpio *array, size_t num);
 
 
-/* bindings for managed devices that want to request gpios */
-int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
-int devm_gpio_request_one(struct device *dev, unsigned gpio,
-			  unsigned long flags, const char *label);
-void devm_gpio_free(struct device *dev, unsigned int gpio);
-
 #ifdef CONFIG_GPIO_SYSFS
 #ifdef CONFIG_GPIO_SYSFS
 
 
 /*
 /*

+ 8 - 20
include/linux/gpio.h

@@ -94,24 +94,12 @@ static inline int gpio_request(unsigned gpio, const char *label)
 	return -ENOSYS;
 	return -ENOSYS;
 }
 }
 
 
-static inline int devm_gpio_request(struct device *dev, unsigned gpio,
-				    const char *label)
-{
-	return -ENOSYS;
-}
-
 static inline int gpio_request_one(unsigned gpio,
 static inline int gpio_request_one(unsigned gpio,
 					unsigned long flags, const char *label)
 					unsigned long flags, const char *label)
 {
 {
 	return -ENOSYS;
 	return -ENOSYS;
 }
 }
 
 
-static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
-					unsigned long flags, const char *label)
-{
-	return -ENOSYS;
-}
-
 static inline int gpio_request_array(const struct gpio *array, size_t num)
 static inline int gpio_request_array(const struct gpio *array, size_t num)
 {
 {
 	return -ENOSYS;
 	return -ENOSYS;
@@ -125,14 +113,6 @@ static inline void gpio_free(unsigned gpio)
 	WARN_ON(1);
 	WARN_ON(1);
 }
 }
 
 
-static inline void devm_gpio_free(struct device *dev, unsigned gpio)
-{
-	might_sleep();
-
-	/* GPIO can never have been requested */
-	WARN_ON(1);
-}
-
 static inline void gpio_free_array(const struct gpio *array, size_t num)
 static inline void gpio_free_array(const struct gpio *array, size_t num)
 {
 {
 	might_sleep();
 	might_sleep();
@@ -248,4 +228,12 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 
 
 #endif /* ! CONFIG_GENERIC_GPIO */
 #endif /* ! CONFIG_GENERIC_GPIO */
 
 
+struct device;
+
+/* bindings for managed devices that want to request gpios */
+int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
+int devm_gpio_request_one(struct device *dev, unsigned gpio,
+			  unsigned long flags, const char *label);
+void devm_gpio_free(struct device *dev, unsigned int gpio);
+
 #endif /* __LINUX_GPIO_H */
 #endif /* __LINUX_GPIO_H */