gpio: Fix ngpio in gpio-xilinx driver
authorGernot Vormayr <gvormayr@gmail.com>
Tue, 23 Sep 2014 22:58:45 +0000 (00:58 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 24 Sep 2014 11:37:38 +0000 (13:37 +0200)
If one adds gpio-controller; to the chip in the devicetree, then
initialization fails with 'gpiochip_find_base: cannot find free range',
because ngpio is 0. This patch fixes the bug.

This version includes the suggestions from Linus Walleij.

Tested on ml507 board.

Signed-off-by: Gernot Vormayr <gvormayr@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-xilinx.c

index 12481867daf11e8fa580df58e266225d9e332ade..ba18b06c9a21e8249c46f784a26993a365980370 100644 (file)
@@ -197,6 +197,7 @@ static int xgpio_of_probe(struct device_node *np)
        struct xgpio_instance *chip;
        int status = 0;
        const u32 *tree_info;
+       u32 ngpio;
 
        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (!chip)
@@ -211,12 +212,13 @@ static int xgpio_of_probe(struct device_node *np)
        /* Update GPIO direction shadow register with default value */
        of_property_read_u32(np, "xlnx,tri-default", &chip->gpio_dir);
 
-       /* By default assume full GPIO controller */
-       chip->mmchip.gc.ngpio = 32;
-
-       /* Check device node and parent device node for device width */
-       of_property_read_u32(np, "xlnx,gpio-width",
-                             (u32 *)&chip->mmchip.gc.ngpio);
+       /*
+        * Check device node and parent device node for device width
+        * and assume default width of 32
+        */
+       if (of_property_read_u32(np, "xlnx,gpio-width", &ngpio))
+               ngpio = 32;
+       chip->mmchip.gc.ngpio = (u16)ngpio;
 
        spin_lock_init(&chip->gpio_lock);
 
@@ -258,12 +260,13 @@ static int xgpio_of_probe(struct device_node *np)
                /* Update GPIO direction shadow register with default value */
                of_property_read_u32(np, "xlnx,tri-default-2", &chip->gpio_dir);
 
-               /* By default assume full GPIO controller */
-               chip->mmchip.gc.ngpio = 32;
-
-               /* Check device node and parent device node for device width */
-               of_property_read_u32(np, "xlnx,gpio2-width",
-                                    (u32 *)&chip->mmchip.gc.ngpio);
+               /*
+                * Check device node and parent device node for device width
+                * and assume default width of 32
+                */
+               if (of_property_read_u32(np, "xlnx,gpio2-width", &ngpio))
+                       ngpio = 32;
+               chip->mmchip.gc.ngpio = (u16)ngpio;
 
                spin_lock_init(&chip->gpio_lock);