We can get hwirq number of the gpio by its irq_data->hwirq so that we don't
need to add more macros for different platforms. This patch is tested in
SiFive Unleashed board and SiFive Unmatched board.

Signed-off-by: Greentime Hu <greentime...@sifive.com>
Reviewed-by: Yash Shah <yash.s...@sifive.com>
---
 drivers/gpio/gpio-sifive.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpio/gpio-sifive.c b/drivers/gpio/gpio-sifive.c
index c54dd08f2cbf..e8cd8741dbae 100644
--- a/drivers/gpio/gpio-sifive.c
+++ b/drivers/gpio/gpio-sifive.c
@@ -29,7 +29,6 @@
 #define SIFIVE_GPIO_OUTPUT_XOR 0x40
 
 #define SIFIVE_GPIO_MAX                32
-#define SIFIVE_GPIO_IRQ_OFFSET 7
 
 struct sifive_gpio {
        void __iomem            *base;
@@ -37,7 +36,7 @@ struct sifive_gpio {
        struct regmap           *regs;
        unsigned long           irq_state;
        unsigned int            trigger[SIFIVE_GPIO_MAX];
-       unsigned int            irq_parent[SIFIVE_GPIO_MAX];
+       unsigned int            irq_number[SIFIVE_GPIO_MAX];
 };
 
 static void sifive_gpio_set_ie(struct sifive_gpio *chip, unsigned int offset)
@@ -144,8 +143,10 @@ static int sifive_gpio_child_to_parent_hwirq(struct 
gpio_chip *gc,
                                             unsigned int *parent,
                                             unsigned int *parent_type)
 {
+       struct sifive_gpio *chip = gpiochip_get_data(gc);
+       struct irq_data *d = irq_get_irq_data(chip->irq_number[child]);
+       *parent = d->hwirq;
        *parent_type = IRQ_TYPE_NONE;
-       *parent = child + SIFIVE_GPIO_IRQ_OFFSET;
        return 0;
 }
 
@@ -165,7 +166,7 @@ static int sifive_gpio_probe(struct platform_device *pdev)
        struct irq_domain *parent;
        struct gpio_irq_chip *girq;
        struct sifive_gpio *chip;
-       int ret, ngpio;
+       int ret, ngpio, i;
 
        chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
        if (!chip)
@@ -200,6 +201,9 @@ static int sifive_gpio_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       for (i = 0; i < ngpio; i++)
+               chip->irq_number[i] = irq_of_parse_and_map(node, i);
+
        ret = bgpio_init(&chip->gc, dev, 4,
                         chip->base + SIFIVE_GPIO_INPUT_VAL,
                         chip->base + SIFIVE_GPIO_OUTPUT_VAL,
-- 
2.29.2

Reply via email to