Cc: Alessandro Rubini <rub...@unipv.it>
Acked-by: Michael Brandt <michael.bra...@stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vinc...@stericsson.com>
---
 drivers/gpio/nomadik_gpio.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/drivers/gpio/nomadik_gpio.c b/drivers/gpio/nomadik_gpio.c
index 670b684..d084235 100644
--- a/drivers/gpio/nomadik_gpio.c
+++ b/drivers/gpio/nomadik_gpio.c
@@ -45,6 +45,11 @@ enum gpio_registers {
 
 static inline unsigned long gpio_to_base(int gpio)
 {
+       if ((gpio / 32) >= ARRAY_SIZE(gpio_base)) {
+               printf("nomadik-gpio: invalid gpio %d\n", gpio);
+               return 0;
+       }
+
        return gpio_base[gpio / 32];
 }
 
@@ -59,6 +64,9 @@ void nmk_gpio_af(int gpio, int alternate_function)
        u32 bit = gpio_to_bit(gpio);
        u32 afunc, bfunc;
 
+       if (!base)
+               return;
+
        /* alternate function is 0..3, with one bit per register */
        afunc = readl(base + GPIO_AFSLA) & ~bit;
        bfunc = readl(base + GPIO_AFSLB) & ~bit;
@@ -73,6 +81,9 @@ void nmk_gpio_dir(int gpio, int dir)
        unsigned long base = gpio_to_base(gpio);
        u32 bit = gpio_to_bit(gpio);
 
+       if (!base)
+               return;
+
        if (dir)
                writel(bit, base + GPIO_DIRS);
        else
@@ -84,6 +95,9 @@ void nmk_gpio_set(int gpio, int val)
        unsigned long base = gpio_to_base(gpio);
        u32 bit = gpio_to_bit(gpio);
 
+       if (!base)
+               return;
+
        if (val)
                writel(bit, base + GPIO_DATS);
        else
@@ -95,5 +109,8 @@ int nmk_gpio_get(int gpio)
        unsigned long base = gpio_to_base(gpio);
        u32 bit = gpio_to_bit(gpio);
 
+       if (!base)
+               return -1;
+
        return readl(base + GPIO_DAT) & bit;
 }
-- 
1.7.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to