|
@@ -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);
|