gpio: Move DT support code into drivers/gpio
authorGrant Likely <grant.likely@secretlab.ca>
Sat, 7 Apr 2012 20:31:33 +0000 (14:31 -0600)
committerGrant Likely <grant.likely@secretlab.ca>
Sat, 7 Apr 2012 20:35:28 +0000 (14:35 -0600)
The code in drivers/of/gpio.c isn't shared by any other subsystem since it
is all gpiolib specific.  drivers/gpio is a better place to maintain these
functions.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Linus Walleij <linus.walleij@stericsson.com>
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/gpiolib-of.c [new file with mode: 0644]
drivers/of/Kconfig
drivers/of/Makefile
drivers/of/gpio.c [deleted file]

index e6862f1..1042c3f 100644 (file)
@@ -37,6 +37,10 @@ menuconfig GPIOLIB
 
 if GPIOLIB
 
+config OF_GPIO
+       def_bool y
+       depends on OF && !SPARC
+
 config DEBUG_GPIO
        bool "Debug GPIO calls"
        depends on DEBUG_KERNEL
index 007f54b..1c2f6c0 100644 (file)
@@ -3,6 +3,7 @@
 ccflags-$(CONFIG_DEBUG_GPIO)   += -DDEBUG
 
 obj-$(CONFIG_GPIOLIB)          += gpiolib.o devres.o
+obj-$(CONFIG_OF_GPIO)          += gpiolib-of.o
 
 # Device drivers. Generally keep list sorted alphabetically
 obj-$(CONFIG_GPIO_GENERIC)     += gpio-generic.o
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
new file mode 100644 (file)
index 0000000..bba8121
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * OF helpers for the GPIO API
+ *
+ * Copyright (c) 2007-2008  MontaVista Software, Inc.
+ *
+ * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_gpio.h>
+#include <linux/slab.h>
+
+/**
+ * of_get_named_gpio_flags() - Get a GPIO number and flags to use with GPIO API
+ * @np:                device node to get GPIO from
+ * @propname:  property name containing gpio specifier(s)
+ * @index:     index of the GPIO
+ * @flags:     a flags pointer to fill in
+ *
+ * Returns GPIO number to use with Linux generic GPIO API, or one of the errno
+ * value on the error condition. If @flags is not NULL the function also fills
+ * in flags for the GPIO.
+ */
+int of_get_named_gpio_flags(struct device_node *np, const char *propname,
+                           int index, enum of_gpio_flags *flags)
+{
+       int ret;
+       struct gpio_chip *gc;
+       struct of_phandle_args gpiospec;
+
+       ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
+                                        &gpiospec);
+       if (ret) {
+               pr_debug("%s: can't parse gpios property\n", __func__);
+               goto err0;
+       }
+
+       gc = of_node_to_gpiochip(gpiospec.np);
+       if (!gc) {
+               pr_debug("%s: gpio controller %s isn't registered\n",
+                        np->full_name, gpiospec.np->full_name);
+               ret = -ENODEV;
+               goto err1;
+       }
+
+       if (gpiospec.args_count != gc->of_gpio_n_cells) {
+               pr_debug("%s: wrong #gpio-cells for %s\n",
+                        np->full_name, gpiospec.np->full_name);
+               ret = -EINVAL;
+               goto err1;
+       }
+
+       /* .xlate might decide to not fill in the flags, so clear it. */
+       if (flags)
+               *flags = 0;
+
+       ret = gc->of_xlate(gc, &gpiospec, flags);
+       if (ret < 0)
+               goto err1;
+
+       ret += gc->base;
+err1:
+       of_node_put(gpiospec.np);
+err0:
+       pr_debug("%s exited with status %d\n", __func__, ret);
+       return ret;
+}
+EXPORT_SYMBOL(of_get_named_gpio_flags);
+
+/**
+ * of_gpio_named_count - Count GPIOs for a device
+ * @np:                device node to count GPIOs for
+ * @propname:  property name containing gpio specifier(s)
+ *
+ * The function returns the count of GPIOs specified for a node.
+ *
+ * Note that the empty GPIO specifiers counts too. For example,
+ *
+ * gpios = <0
+ *          &pio1 1 2
+ *          0
+ *          &pio2 3 4>;
+ *
+ * defines four GPIOs (so this function will return 4), two of which
+ * are not specified.
+ */
+unsigned int of_gpio_named_count(struct device_node *np, const char* propname)
+{
+       unsigned int cnt = 0;
+
+       do {
+               int ret;
+
+               ret = of_parse_phandle_with_args(np, propname, "#gpio-cells",
+                                                cnt, NULL);
+               /* A hole in the gpios = <> counts anyway. */
+               if (ret < 0 && ret != -EEXIST)
+                       break;
+       } while (++cnt);
+
+       return cnt;
+}
+EXPORT_SYMBOL(of_gpio_named_count);
+
+/**
+ * of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
+ * @gc:                pointer to the gpio_chip structure
+ * @np:                device node of the GPIO chip
+ * @gpio_spec: gpio specifier as found in the device tree
+ * @flags:     a flags pointer to fill in
+ *
+ * This is simple translation function, suitable for the most 1:1 mapped
+ * gpio chips. This function performs only one sanity check: whether gpio
+ * is less than ngpios (that is specified in the gpio_chip).
+ */
+int of_gpio_simple_xlate(struct gpio_chip *gc,
+                        const struct of_phandle_args *gpiospec, u32 *flags)
+{
+       /*
+        * We're discouraging gpio_cells < 2, since that way you'll have to
+        * write your own xlate function (that will have to retrive the GPIO
+        * number and the flags from a single gpio cell -- this is possible,
+        * but not recommended).
+        */
+       if (gc->of_gpio_n_cells < 2) {
+               WARN_ON(1);
+               return -EINVAL;
+       }
+
+       if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
+               return -EINVAL;
+
+       if (gpiospec->args[0] > gc->ngpio)
+               return -EINVAL;
+
+       if (flags)
+               *flags = gpiospec->args[1];
+
+       return gpiospec->args[0];
+}
+EXPORT_SYMBOL(of_gpio_simple_xlate);
+
+/**
+ * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank)
+ * @np:                device node of the GPIO chip
+ * @mm_gc:     pointer to the of_mm_gpio_chip allocated structure
+ *
+ * To use this function you should allocate and fill mm_gc with:
+ *
+ * 1) In the gpio_chip structure:
+ *    - all the callbacks
+ *    - of_gpio_n_cells
+ *    - of_xlate callback (optional)
+ *
+ * 3) In the of_mm_gpio_chip structure:
+ *    - save_regs callback (optional)
+ *
+ * If succeeded, this function will map bank's memory and will
+ * do all necessary work for you. Then you'll able to use .regs
+ * to manage GPIOs from the callbacks.
+ */
+int of_mm_gpiochip_add(struct device_node *np,
+                      struct of_mm_gpio_chip *mm_gc)
+{
+       int ret = -ENOMEM;
+       struct gpio_chip *gc = &mm_gc->gc;
+
+       gc->label = kstrdup(np->full_name, GFP_KERNEL);
+       if (!gc->label)
+               goto err0;
+
+       mm_gc->regs = of_iomap(np, 0);
+       if (!mm_gc->regs)
+               goto err1;
+
+       gc->base = -1;
+
+       if (mm_gc->save_regs)
+               mm_gc->save_regs(mm_gc);
+
+       mm_gc->gc.of_node = np;
+
+       ret = gpiochip_add(gc);
+       if (ret)
+               goto err2;
+
+       return 0;
+err2:
+       iounmap(mm_gc->regs);
+err1:
+       kfree(gc->label);
+err0:
+       pr_err("%s: GPIO chip registration failed with status %d\n",
+              np->full_name, ret);
+       return ret;
+}
+EXPORT_SYMBOL(of_mm_gpiochip_add);
+
+void of_gpiochip_add(struct gpio_chip *chip)
+{
+       if ((!chip->of_node) && (chip->dev))
+               chip->of_node = chip->dev->of_node;
+
+       if (!chip->of_node)
+               return;
+
+       if (!chip->of_xlate) {
+               chip->of_gpio_n_cells = 2;
+               chip->of_xlate = of_gpio_simple_xlate;
+       }
+
+       of_node_get(chip->of_node);
+}
+
+void of_gpiochip_remove(struct gpio_chip *chip)
+{
+       if (chip->of_node)
+               of_node_put(chip->of_node);
+}
+
+/* Private function for resolving node pointer to gpio_chip */
+static int of_gpiochip_is_match(struct gpio_chip *chip, const void *data)
+{
+       return chip->of_node == data;
+}
+
+struct gpio_chip *of_node_to_gpiochip(struct device_node *np)
+{
+       return gpiochip_find(np, of_gpiochip_is_match);
+}
index 8e84ce9..ce00d11 100644 (file)
@@ -51,12 +51,6 @@ config OF_IRQ
 config OF_DEVICE
        def_bool y
 
-config OF_GPIO
-       def_bool y
-       depends on GPIOLIB && !SPARC
-       help
-         OpenFirmware GPIO accessors
-
 config OF_I2C
        def_tristate I2C
        depends on I2C && !SPARC
index aa90e60..aff2c62 100644 (file)
@@ -4,7 +4,6 @@ obj-$(CONFIG_OF_PROMTREE) += pdt.o
 obj-$(CONFIG_OF_ADDRESS)  += address.o
 obj-$(CONFIG_OF_IRQ)    += irq.o
 obj-$(CONFIG_OF_DEVICE) += device.o platform.o
-obj-$(CONFIG_OF_GPIO)   += gpio.o
 obj-$(CONFIG_OF_I2C)   += of_i2c.o
 obj-$(CONFIG_OF_NET)   += of_net.o
 obj-$(CONFIG_OF_SPI)   += of_spi.o
diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c
deleted file mode 100644 (file)
index bba8121..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * OF helpers for the GPIO API
- *
- * Copyright (c) 2007-2008  MontaVista Software, Inc.
- *
- * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#include <linux/device.h>
-#include <linux/errno.h>
-#include <linux/module.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/of_gpio.h>
-#include <linux/slab.h>
-
-/**
- * of_get_named_gpio_flags() - Get a GPIO number and flags to use with GPIO API
- * @np:                device node to get GPIO from
- * @propname:  property name containing gpio specifier(s)
- * @index:     index of the GPIO
- * @flags:     a flags pointer to fill in
- *
- * Returns GPIO number to use with Linux generic GPIO API, or one of the errno
- * value on the error condition. If @flags is not NULL the function also fills
- * in flags for the GPIO.
- */
-int of_get_named_gpio_flags(struct device_node *np, const char *propname,
-                           int index, enum of_gpio_flags *flags)
-{
-       int ret;
-       struct gpio_chip *gc;
-       struct of_phandle_args gpiospec;
-
-       ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
-                                        &gpiospec);
-       if (ret) {
-               pr_debug("%s: can't parse gpios property\n", __func__);
-               goto err0;
-       }
-
-       gc = of_node_to_gpiochip(gpiospec.np);
-       if (!gc) {
-               pr_debug("%s: gpio controller %s isn't registered\n",
-                        np->full_name, gpiospec.np->full_name);
-               ret = -ENODEV;
-               goto err1;
-       }
-
-       if (gpiospec.args_count != gc->of_gpio_n_cells) {
-               pr_debug("%s: wrong #gpio-cells for %s\n",
-                        np->full_name, gpiospec.np->full_name);
-               ret = -EINVAL;
-               goto err1;
-       }
-
-       /* .xlate might decide to not fill in the flags, so clear it. */
-       if (flags)
-               *flags = 0;
-
-       ret = gc->of_xlate(gc, &gpiospec, flags);
-       if (ret < 0)
-               goto err1;
-
-       ret += gc->base;
-err1:
-       of_node_put(gpiospec.np);
-err0:
-       pr_debug("%s exited with status %d\n", __func__, ret);
-       return ret;
-}
-EXPORT_SYMBOL(of_get_named_gpio_flags);
-
-/**
- * of_gpio_named_count - Count GPIOs for a device
- * @np:                device node to count GPIOs for
- * @propname:  property name containing gpio specifier(s)
- *
- * The function returns the count of GPIOs specified for a node.
- *
- * Note that the empty GPIO specifiers counts too. For example,
- *
- * gpios = <0
- *          &pio1 1 2
- *          0
- *          &pio2 3 4>;
- *
- * defines four GPIOs (so this function will return 4), two of which
- * are not specified.
- */
-unsigned int of_gpio_named_count(struct device_node *np, const char* propname)
-{
-       unsigned int cnt = 0;
-
-       do {
-               int ret;
-
-               ret = of_parse_phandle_with_args(np, propname, "#gpio-cells",
-                                                cnt, NULL);
-               /* A hole in the gpios = <> counts anyway. */
-               if (ret < 0 && ret != -EEXIST)
-                       break;
-       } while (++cnt);
-
-       return cnt;
-}
-EXPORT_SYMBOL(of_gpio_named_count);
-
-/**
- * of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
- * @gc:                pointer to the gpio_chip structure
- * @np:                device node of the GPIO chip
- * @gpio_spec: gpio specifier as found in the device tree
- * @flags:     a flags pointer to fill in
- *
- * This is simple translation function, suitable for the most 1:1 mapped
- * gpio chips. This function performs only one sanity check: whether gpio
- * is less than ngpios (that is specified in the gpio_chip).
- */
-int of_gpio_simple_xlate(struct gpio_chip *gc,
-                        const struct of_phandle_args *gpiospec, u32 *flags)
-{
-       /*
-        * We're discouraging gpio_cells < 2, since that way you'll have to
-        * write your own xlate function (that will have to retrive the GPIO
-        * number and the flags from a single gpio cell -- this is possible,
-        * but not recommended).
-        */
-       if (gc->of_gpio_n_cells < 2) {
-               WARN_ON(1);
-               return -EINVAL;
-       }
-
-       if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
-               return -EINVAL;
-
-       if (gpiospec->args[0] > gc->ngpio)
-               return -EINVAL;
-
-       if (flags)
-               *flags = gpiospec->args[1];
-
-       return gpiospec->args[0];
-}
-EXPORT_SYMBOL(of_gpio_simple_xlate);
-
-/**
- * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank)
- * @np:                device node of the GPIO chip
- * @mm_gc:     pointer to the of_mm_gpio_chip allocated structure
- *
- * To use this function you should allocate and fill mm_gc with:
- *
- * 1) In the gpio_chip structure:
- *    - all the callbacks
- *    - of_gpio_n_cells
- *    - of_xlate callback (optional)
- *
- * 3) In the of_mm_gpio_chip structure:
- *    - save_regs callback (optional)
- *
- * If succeeded, this function will map bank's memory and will
- * do all necessary work for you. Then you'll able to use .regs
- * to manage GPIOs from the callbacks.
- */
-int of_mm_gpiochip_add(struct device_node *np,
-                      struct of_mm_gpio_chip *mm_gc)
-{
-       int ret = -ENOMEM;
-       struct gpio_chip *gc = &mm_gc->gc;
-
-       gc->label = kstrdup(np->full_name, GFP_KERNEL);
-       if (!gc->label)
-               goto err0;
-
-       mm_gc->regs = of_iomap(np, 0);
-       if (!mm_gc->regs)
-               goto err1;
-
-       gc->base = -1;
-
-       if (mm_gc->save_regs)
-               mm_gc->save_regs(mm_gc);
-
-       mm_gc->gc.of_node = np;
-
-       ret = gpiochip_add(gc);
-       if (ret)
-               goto err2;
-
-       return 0;
-err2:
-       iounmap(mm_gc->regs);
-err1:
-       kfree(gc->label);
-err0:
-       pr_err("%s: GPIO chip registration failed with status %d\n",
-              np->full_name, ret);
-       return ret;
-}
-EXPORT_SYMBOL(of_mm_gpiochip_add);
-
-void of_gpiochip_add(struct gpio_chip *chip)
-{
-       if ((!chip->of_node) && (chip->dev))
-               chip->of_node = chip->dev->of_node;
-
-       if (!chip->of_node)
-               return;
-
-       if (!chip->of_xlate) {
-               chip->of_gpio_n_cells = 2;
-               chip->of_xlate = of_gpio_simple_xlate;
-       }
-
-       of_node_get(chip->of_node);
-}
-
-void of_gpiochip_remove(struct gpio_chip *chip)
-{
-       if (chip->of_node)
-               of_node_put(chip->of_node);
-}
-
-/* Private function for resolving node pointer to gpio_chip */
-static int of_gpiochip_is_match(struct gpio_chip *chip, const void *data)
-{
-       return chip->of_node == data;
-}
-
-struct gpio_chip *of_node_to_gpiochip(struct device_node *np)
-{
-       return gpiochip_find(np, of_gpiochip_is_match);
-}