Message ID | 1443611693-23722-3-git-send-email-p.marczak@samsung.com |
---|---|
State | Accepted |
Delegated to: | Simon Glass |
Headers | show |
On 30 September 2015 at 12:14, Przemyslaw Marczak <p.marczak@samsung.com> wrote: > After rework in lib/fdtdec.c, the function fdtdec_get_addr() > doesn't work for nodes with #size-cells property set to 0. > > To get GPIO's 'reg' property, the code should use one of: > fdtdec_get_addr_size_auto_no/parent() function. > > Fortunately dm core provides a function to get the property. > > This commit reworks function gpio_exynos_bind(), to properly > use dev_get_addr() for GPIO device. > > This prevents setting a wrong base register for Exynos GPIOs. > > Tested on: Odroid U3/X2, Trats, Trats2, Odroid XU3, Snow (by Simon). > > Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> > Acked-by: Stephen Warren <swarren@nvidia.com> > Acked-by: Simon Glass <sjg@chromium.org> > Tested-by: Simon Glass <sjg@chromium.org> > --- > Changes V2: > - add acked-by > Changes V3: > - add acked-by and tested-by Simon > --- > drivers/gpio/s5p_gpio.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) Applied to u-boot-fdt, thanks!
diff --git a/drivers/gpio/s5p_gpio.c b/drivers/gpio/s5p_gpio.c index 17fcfbf..0f22b23 100644 --- a/drivers/gpio/s5p_gpio.c +++ b/drivers/gpio/s5p_gpio.c @@ -341,18 +341,22 @@ static int gpio_exynos_bind(struct udevice *parent) plat = calloc(1, sizeof(*plat)); if (!plat) return -ENOMEM; - reg = fdtdec_get_addr(blob, node, "reg"); - if (reg != FDT_ADDR_T_NONE) - bank = (struct s5p_gpio_bank *)((ulong)base + reg); - plat->bank = bank; - plat->bank_name = fdt_get_name(blob, node, NULL); - debug("dev at %p: %s\n", bank, plat->bank_name); + plat->bank_name = fdt_get_name(blob, node, NULL); ret = device_bind(parent, parent->driver, - plat->bank_name, plat, -1, &dev); + plat->bank_name, plat, -1, &dev); if (ret) return ret; + dev->of_offset = node; + + reg = dev_get_addr(dev); + if (reg != FDT_ADDR_T_NONE) + bank = (struct s5p_gpio_bank *)((ulong)base + reg); + + plat->bank = bank; + + debug("dev at %p: %s\n", bank, plat->bank_name); } return 0;