Commit 3b5560c8 authored by Samuel Holland's avatar Samuel Holland Committed by Bartosz Golaszewski

gpio: sifive: Get the parent IRQ's domain from its irq_data

Do not parse the devicetree again when the data is already available
from the IRQ subsystem. This follows the example of the ThunderX and
X-Gene GPIO drivers. The ngpio check is needed to avoid a possible
out-of-bounds read.
Signed-off-by: default avatarSamuel Holland <samuel.holland@sifive.com>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 1cd9cee7
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/of_irq.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -182,8 +181,6 @@ static const struct regmap_config sifive_gpio_regmap_config = { ...@@ -182,8 +181,6 @@ static const struct regmap_config sifive_gpio_regmap_config = {
static int sifive_gpio_probe(struct platform_device *pdev) static int sifive_gpio_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *node = pdev->dev.of_node;
struct device_node *irq_parent;
struct irq_domain *parent; struct irq_domain *parent;
struct gpio_irq_chip *girq; struct gpio_irq_chip *girq;
struct sifive_gpio *chip; struct sifive_gpio *chip;
...@@ -204,24 +201,22 @@ static int sifive_gpio_probe(struct platform_device *pdev) ...@@ -204,24 +201,22 @@ static int sifive_gpio_probe(struct platform_device *pdev)
if (IS_ERR(chip->regs)) if (IS_ERR(chip->regs))
return PTR_ERR(chip->regs); return PTR_ERR(chip->regs);
irq_parent = of_irq_find_parent(node);
if (!irq_parent) {
dev_err(dev, "no IRQ parent node\n");
return -ENODEV;
}
parent = irq_find_host(irq_parent);
of_node_put(irq_parent);
if (!parent) {
dev_err(dev, "no IRQ parent domain\n");
return -ENODEV;
}
for (ngpio = 0; ngpio < SIFIVE_GPIO_MAX; ngpio++) { for (ngpio = 0; ngpio < SIFIVE_GPIO_MAX; ngpio++) {
ret = platform_get_irq_optional(pdev, ngpio); ret = platform_get_irq_optional(pdev, ngpio);
if (ret < 0) if (ret < 0)
break; break;
chip->irq_number[ngpio] = ret; chip->irq_number[ngpio] = ret;
} }
if (!ngpio) {
dev_err(dev, "no IRQ found\n");
return -ENODEV;
}
/*
* The check above ensures at least one parent IRQ is valid.
* Assume all parent IRQs belong to the same domain.
*/
parent = irq_get_irq_data(chip->irq_number[0])->domain;
ret = bgpio_init(&chip->gc, dev, 4, ret = bgpio_init(&chip->gc, dev, 4,
chip->base + SIFIVE_GPIO_INPUT_VAL, chip->base + SIFIVE_GPIO_INPUT_VAL,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment