瀏覽代碼

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 12 年之前
父節點
當前提交
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 */