OSDN Git Service

gpio: sifive: To get gpio irq offset from device tree data
authorGreentime Hu <greentime.hu@sifive.com>
Fri, 13 Nov 2020 02:33:55 +0000 (10:33 +0800)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Wed, 18 Nov 2020 08:28:43 +0000 (09:28 +0100)
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.hu@sifive.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpio-sifive.c

index c54dd08..630bdde 100644 (file)
@@ -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,12 @@ 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_type = IRQ_TYPE_NONE;
-       *parent = child + SIFIVE_GPIO_IRQ_OFFSET;
+       *parent = irqd_to_hwirq(d);
+
        return 0;
 }
 
@@ -165,7 +168,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 +203,9 @@ static int sifive_gpio_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       for (i = 0; i < ngpio; i++)
+               chip->irq_number[i] = platform_get_irq(pdev, i);
+
        ret = bgpio_init(&chip->gc, dev, 4,
                         chip->base + SIFIVE_GPIO_INPUT_VAL,
                         chip->base + SIFIVE_GPIO_OUTPUT_VAL,