Skip to content

Commit

Permalink
gpio: pl061: add DT binding support
Browse files Browse the repository at this point in the history
This adds devicetree binding support to the ARM pl061 driver removing the
platform_data dependency. When DT binding is used, the gpio numbering is
assigned dynamically. For now, interrupts are not supported with DT until
irqdomains learn dynamic irq assignment.

Rather than add another case of -1, updating the driver to use NO_IRQ.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Acked-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Rob Herring authored and Grant Likely committed Oct 26, 2011
1 parent eb9ae7f commit 76c05c8
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
31 changes: 21 additions & 10 deletions drivers/gpio/gpio-pl061.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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 */
Expand All @@ -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);
Expand Down
3 changes: 1 addition & 2 deletions include/linux/amba/pl061.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ struct pl061_platform_data {
unsigned gpio_base;

/* number of the first IRQ.
* If the IRQ functionality in not desired this must be set to
* (unsigned) -1.
* If the IRQ functionality in not desired this must be set to NO_IRQ.
*/
unsigned irq_base;

Expand Down

0 comments on commit 76c05c8

Please sign in to comment.