Message ID | 1411031032-20649-1-git-send-email-gvormayr@gmail.com |
---|---|
State | Not Applicable, archived |
Headers | show |
On Thu, Sep 18, 2014 at 11:03 AM, Gernot Vormayr <gvormayr@gmail.com> wrote: > 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. > > Tested on ml507 board. > > Signed-off-by: Gernot Vormayr <gvormayr@gmail.com> > --- > drivers/gpio/gpio-xilinx.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c > index 1248186..4606ad2 100644 > --- a/drivers/gpio/gpio-xilinx.c > +++ b/drivers/gpio/gpio-xilinx.c > @@ -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) > @@ -215,8 +216,9 @@ static int xgpio_of_probe(struct device_node *np) > chip->mmchip.gc.ngpio = 32; Delete that line ^ > > /* Check device node and parent device node for device width */ > - of_property_read_u32(np, "xlnx,gpio-width", > - (u32 *)&chip->mmchip.gc.ngpio); > + status = of_property_read_u32(np, "xlnx,gpio-width", &ngpio); > + if (status == 0) > + chip->mmchip.gc.ngpio = (u16)ngpio; Rewrite like this: if (of_property_read_u32(np, "xlnx,gpio-width", &ngpio)) ngpio = 32; chip->mmchip.gc.ngpio = (u16)ngpio; > > spin_lock_init(&chip->gpio_lock); > > @@ -262,8 +264,9 @@ static int xgpio_of_probe(struct device_node *np) > 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); > + status = of_property_read_u32(np, "xlnx,gpio2-width", &ngpio); > + if (status == 0) > + chip->mmchip.gc.ngpio = (u16)ngpio; Same comment. The fact that the same code appears in two places tells us something is not quite right. Can you look into consolidating this (in a separate patch)? Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Sep 23, 2014 at 5:38 PM, Linus Walleij <linus.walleij@linaro.org> wrote: > > The fact that the same code appears in two places tells us something > is not quite right. Can you look into consolidating this (in a separate > patch)? Well, I already thought about that, but since the second time is for the second part of a dual gpio, which has different device tree property names, the only way of consolidating that I can think of right now would be to create a function that takes the property names. If you think that's ok, I can try to come up with something. Cheers, Gernot Vormayr -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c index 1248186..4606ad2 100644 --- a/drivers/gpio/gpio-xilinx.c +++ b/drivers/gpio/gpio-xilinx.c @@ -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) @@ -215,8 +216,9 @@ static int xgpio_of_probe(struct device_node *np) 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); + status = of_property_read_u32(np, "xlnx,gpio-width", &ngpio); + if (status == 0) + chip->mmchip.gc.ngpio = (u16)ngpio; spin_lock_init(&chip->gpio_lock); @@ -262,8 +264,9 @@ static int xgpio_of_probe(struct device_node *np) 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); + status = of_property_read_u32(np, "xlnx,gpio2-width", &ngpio); + if (status == 0) + chip->mmchip.gc.ngpio = (u16)ngpio; spin_lock_init(&chip->gpio_lock);
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. Tested on ml507 board. Signed-off-by: Gernot Vormayr <gvormayr@gmail.com> --- drivers/gpio/gpio-xilinx.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)