gpio: define gpio_is_valid()
[pandora-kernel.git] / drivers / gpio / gpiolib.c
index d8db2f8..623fcd9 100644 (file)
@@ -68,6 +68,9 @@ static void gpio_ensure_requested(struct gpio_desc *desc)
        if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
                pr_warning("GPIO-%d autorequested\n", (int)(desc - gpio_desc));
                desc_set_label(desc, "[auto]");
+               if (!try_module_get(desc->chip->owner))
+                       pr_err("GPIO-%d: module can't be gotten \n",
+                                       (int)(desc - gpio_desc));
        }
 }
 
@@ -96,7 +99,7 @@ int gpiochip_add(struct gpio_chip *chip)
         * dynamic allocation.  We don't currently support that.
         */
 
-       if (chip->base < 0 || (chip->base  + chip->ngpio) >= ARCH_NR_GPIOS) {
+       if (chip->base < 0 || !gpio_is_valid(chip->base  + chip->ngpio)) {
                status = -EINVAL;
                goto fail;
        }
@@ -171,12 +174,15 @@ int gpio_request(unsigned gpio, const char *label)
 
        spin_lock_irqsave(&gpio_lock, flags);
 
-       if (gpio >= ARCH_NR_GPIOS)
+       if (!gpio_is_valid(gpio))
                goto done;
        desc = &gpio_desc[gpio];
        if (desc->chip == NULL)
                goto done;
 
+       if (!try_module_get(desc->chip->owner))
+               goto done;
+
        /* NOTE:  gpio_request() can be called in early boot,
         * before IRQs are enabled.
         */
@@ -184,8 +190,10 @@ int gpio_request(unsigned gpio, const char *label)
        if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
                desc_set_label(desc, label ? : "?");
                status = 0;
-       } else
+       } else {
                status = -EBUSY;
+               module_put(desc->chip->owner);
+       }
 
 done:
        if (status)
@@ -201,7 +209,7 @@ void gpio_free(unsigned gpio)
        unsigned long           flags;
        struct gpio_desc        *desc;
 
-       if (gpio >= ARCH_NR_GPIOS) {
+       if (!gpio_is_valid(gpio)) {
                WARN_ON(extra_checks);
                return;
        }
@@ -209,9 +217,10 @@ void gpio_free(unsigned gpio)
        spin_lock_irqsave(&gpio_lock, flags);
 
        desc = &gpio_desc[gpio];
-       if (desc->chip && test_and_clear_bit(FLAG_REQUESTED, &desc->flags))
+       if (desc->chip && test_and_clear_bit(FLAG_REQUESTED, &desc->flags)) {
                desc_set_label(desc, NULL);
-       else
+               module_put(desc->chip->owner);
+       } else
                WARN_ON(extra_checks);
 
        spin_unlock_irqrestore(&gpio_lock, flags);
@@ -236,7 +245,7 @@ const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset)
 {
        unsigned gpio = chip->base + offset;
 
-       if (gpio >= ARCH_NR_GPIOS || gpio_desc[gpio].chip != chip)
+       if (!gpio_is_valid(gpio) || gpio_desc[gpio].chip != chip)
                return NULL;
        if (test_bit(FLAG_REQUESTED, &gpio_desc[gpio].flags) == 0)
                return NULL;
@@ -267,7 +276,7 @@ int gpio_direction_input(unsigned gpio)
 
        spin_lock_irqsave(&gpio_lock, flags);
 
-       if (gpio >= ARCH_NR_GPIOS)
+       if (!gpio_is_valid(gpio))
                goto fail;
        chip = desc->chip;
        if (!chip || !chip->get || !chip->direction_input)
@@ -305,7 +314,7 @@ int gpio_direction_output(unsigned gpio, int value)
 
        spin_lock_irqsave(&gpio_lock, flags);
 
-       if (gpio >= ARCH_NR_GPIOS)
+       if (!gpio_is_valid(gpio))
                goto fail;
        chip = desc->chip;
        if (!chip || !chip->set || !chip->direction_output)
@@ -522,7 +531,7 @@ static int gpiolib_show(struct seq_file *s, void *unused)
 
        /* REVISIT this isn't locked against gpio_chip removal ... */
 
-       for (gpio = 0; gpio < ARCH_NR_GPIOS; gpio++) {
+       for (gpio = 0; gpio_is_valid(gpio); gpio++) {
                if (chip == gpio_desc[gpio].chip)
                        continue;
                chip = gpio_desc[gpio].chip;