powerpc/86xx: Extend GE Fanuc GPIO driver for the SBC310
authorMartyn Welch <martyn.welch@gefanuc.com>
Mon, 19 Jan 2009 11:33:34 +0000 (11:33 +0000)
committerKumar Gala <galak@kernel.crashing.org>
Thu, 29 Jan 2009 05:05:58 +0000 (23:05 -0600)
This patch adds basic support for the 6 GPIO lines found on GE Fanucs SBC310 to the GE Fanuc GPIO driver.

Signed-off-by: Martyn Welch <martyn.welch@gefanuc.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/configs/86xx/gef_sbc310_defconfig
arch/powerpc/platforms/86xx/gef_gpio.c

index 8418317289d7d2046f62b4cce3e823113829e1f3..bd236b3d915a20c98d143279b2cc9687136ca5a7 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.29-rc3
-# Wed Jan 28 23:04:04 2009
+# Wed Jan 28 23:05:34 2009
 #
 # CONFIG_PPC64 is not set
 
@@ -905,7 +905,7 @@ CONFIG_DS1682=y
 CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
 CONFIG_ARCH_REQUIRE_GPIOLIB=y
 CONFIG_GPIOLIB=y
-# CONFIG_GPIO_SYSFS is not set
+CONFIG_GPIO_SYSFS=y
 
 #
 # Memory mapped GPIO expanders:
index 85b2800f4cb71b18ec622805a98fa29c180c7355..b2ea8875adbaf02c2f30cfc4989f9697aec1a685 100644 (file)
@@ -37,8 +37,6 @@
 #define GEF_GPIO_OVERRUN       0x1C
 #define GEF_GPIO_MODE          0x20
 
-#define NUM_GPIO 19
-
 static void _gef_gpio_set(void __iomem *reg, unsigned int offset, int value)
 {
        unsigned int data;
@@ -103,10 +101,10 @@ static void gef_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 static int __init gef_gpio_init(void)
 {
        struct device_node *np;
+       int retval;
+       struct of_mm_gpio_chip *gef_gpio_chip;
 
        for_each_compatible_node(np, NULL, "gef,sbc610-gpio") {
-               int retval;
-               struct of_mm_gpio_chip *gef_gpio_chip;
 
                pr_debug("%s: Initialising GEF GPIO\n", np->full_name);
 
@@ -120,7 +118,35 @@ static int __init gef_gpio_init(void)
 
                /* Setup pointers to chip functions */
                gef_gpio_chip->of_gc.gpio_cells = 2;
-               gef_gpio_chip->of_gc.gc.ngpio = NUM_GPIO;
+               gef_gpio_chip->of_gc.gc.ngpio = 19;
+               gef_gpio_chip->of_gc.gc.direction_input = gef_gpio_dir_in;
+               gef_gpio_chip->of_gc.gc.direction_output = gef_gpio_dir_out;
+               gef_gpio_chip->of_gc.gc.get = gef_gpio_get;
+               gef_gpio_chip->of_gc.gc.set = gef_gpio_set;
+
+               /* This function adds a memory mapped GPIO chip */
+               retval = of_mm_gpiochip_add(np, gef_gpio_chip);
+               if (retval) {
+                       kfree(gef_gpio_chip);
+                       pr_err("%s: Unable to add GPIO\n", np->full_name);
+               }
+       }
+
+       for_each_compatible_node(np, NULL, "gef,sbc310-gpio") {
+
+               pr_debug("%s: Initialising GEF GPIO\n", np->full_name);
+
+               /* Allocate chip structure */
+               gef_gpio_chip = kzalloc(sizeof(*gef_gpio_chip), GFP_KERNEL);
+               if (!gef_gpio_chip) {
+                       pr_err("%s: Unable to allocate structure\n",
+                               np->full_name);
+                       continue;
+               }
+
+               /* Setup pointers to chip functions */
+               gef_gpio_chip->of_gc.gpio_cells = 2;
+               gef_gpio_chip->of_gc.gc.ngpio = 6;
                gef_gpio_chip->of_gc.gc.direction_input = gef_gpio_dir_in;
                gef_gpio_chip->of_gc.gc.direction_output = gef_gpio_dir_out;
                gef_gpio_chip->of_gc.gc.get = gef_gpio_get;