Merge branch 'for_3.2/gpio-cleanup' of git://gitorious.org/khilman/linux-omap-pm...
[pandora-kernel.git] / drivers / gpio / gpio-pl061.c
index 2c5a18f..093c90b 100644 (file)
@@ -118,7 +118,7 @@ static int pl061_to_irq(struct gpio_chip *gc, unsigned offset)
 {
        struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
 
-       if (chip->irq_base == (unsigned) -1)
+       if (chip->irq_base == NO_IRQ)
                return -EINVAL;
 
        return chip->irq_base + offset;
@@ -246,6 +246,18 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
        if (chip == NULL)
                return -ENOMEM;
 
+       pdata = dev->dev.platform_data;
+       if (pdata) {
+               chip->gc.base = pdata->gpio_base;
+               chip->irq_base = pdata->irq_base;
+       } else if (dev->dev.of_node) {
+               chip->gc.base = -1;
+               chip->irq_base = NO_IRQ;
+       } else {
+               ret = -ENODEV;
+               goto free_mem;
+       }
+
        if (!request_mem_region(dev->res.start,
                                resource_size(&dev->res), "pl061")) {
                ret = -EBUSY;
@@ -267,14 +279,11 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
        chip->gc.get = pl061_get_value;
        chip->gc.set = pl061_set_value;
        chip->gc.to_irq = pl061_to_irq;
-       chip->gc.base = pdata->gpio_base;
        chip->gc.ngpio = PL061_GPIO_NR;
        chip->gc.label = dev_name(&dev->dev);
        chip->gc.dev = &dev->dev;
        chip->gc.owner = THIS_MODULE;
 
-       chip->irq_base = pdata->irq_base;
-
        ret = gpiochip_add(&chip->gc);
        if (ret)
                goto iounmap;
@@ -283,7 +292,7 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
         * irq_chip support
         */
 
-       if (chip->irq_base == (unsigned) -1)
+       if (chip->irq_base == NO_IRQ)
                return 0;
 
        writeb(0, chip->base + GPIOIE); /* disable irqs */
@@ -307,11 +316,13 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
        list_add(&chip->list, chip_list);
 
        for (i = 0; i < PL061_GPIO_NR; i++) {
-               if (pdata->directions & (1 << i))
-                       pl061_direction_output(&chip->gc, i,
-                                       pdata->values & (1 << i));
-               else
-                       pl061_direction_input(&chip->gc, i);
+               if (pdata) {
+                       if (pdata->directions & (1 << i))
+                               pl061_direction_output(&chip->gc, i,
+                                               pdata->values & (1 << i));
+                       else
+                               pl061_direction_input(&chip->gc, i);
+               }
 
                irq_set_chip_and_handler(i + chip->irq_base, &pl061_irqchip,
                                         handle_simple_irq);