Blackfin arch: refine the gpio check
authorMike Frysinger <vapier.adi@gmail.com>
Tue, 28 Oct 2008 08:16:29 +0000 (16:16 +0800)
committerBryan Wu <cooloney@kernel.org>
Tue, 28 Oct 2008 08:16:29 +0000 (16:16 +0800)
refine the gpio check in peripheral_request() so that it only
checks pins that can be used as both GPIO and a peripheral

Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/kernel/bfin_gpio.c

index 96090268e00744998179567ef5d001a1b5cd046f..3e698d651f17b46dcc839f8533b01069a5844e26 100644 (file)
@@ -881,13 +881,13 @@ int peripheral_request(unsigned short per, const char *label)
        if (!(per & P_DEFINED))
                return -ENODEV;
 
        if (!(per & P_DEFINED))
                return -ENODEV;
 
-       if (check_gpio(ident))
-               return -EINVAL;
-
        local_irq_save(flags);
 
        local_irq_save(flags);
 
-       /* Can't do GPIO and peripheral at the same time */
-       if (unlikely(reserved_gpio_map[gpio_bank(ident)] & gpio_bit(ident))) {
+       /* If a pin can be muxed as either GPIO or peripheral, make
+        * sure it is not already a GPIO pin when we request it.
+        */
+       if (unlikely(!check_gpio(ident) &&
+           reserved_gpio_map[gpio_bank(ident)] & gpio_bit(ident))) {
                dump_stack();
                printk(KERN_ERR
                       "%s: Peripheral %d is already reserved as GPIO by %s !\n",
                dump_stack();
                printk(KERN_ERR
                       "%s: Peripheral %d is already reserved as GPIO by %s !\n",