Commit b4510f8f authored by Linus Walleij's avatar Linus Walleij Committed by Bartosz Golaszewski

gpio: xilinx: Convert to immutable irq_chip

Convert the driver to immutable irq-chip with a bit of
intuition.

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 9c1282b7
...@@ -68,7 +68,6 @@ struct xgpio_instance { ...@@ -68,7 +68,6 @@ struct xgpio_instance {
DECLARE_BITMAP(dir, 64); DECLARE_BITMAP(dir, 64);
spinlock_t gpio_lock; /* For serializing operations */ spinlock_t gpio_lock; /* For serializing operations */
int irq; int irq;
struct irq_chip irqchip;
DECLARE_BITMAP(enable, 64); DECLARE_BITMAP(enable, 64);
DECLARE_BITMAP(rising_edge, 64); DECLARE_BITMAP(rising_edge, 64);
DECLARE_BITMAP(falling_edge, 64); DECLARE_BITMAP(falling_edge, 64);
...@@ -416,6 +415,8 @@ static void xgpio_irq_mask(struct irq_data *irq_data) ...@@ -416,6 +415,8 @@ static void xgpio_irq_mask(struct irq_data *irq_data)
xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, temp); xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, temp);
} }
spin_unlock_irqrestore(&chip->gpio_lock, flags); spin_unlock_irqrestore(&chip->gpio_lock, flags);
gpiochip_disable_irq(&chip->gc, irq_offset);
} }
/** /**
...@@ -431,6 +432,8 @@ static void xgpio_irq_unmask(struct irq_data *irq_data) ...@@ -431,6 +432,8 @@ static void xgpio_irq_unmask(struct irq_data *irq_data)
u32 old_enable = xgpio_get_value32(chip->enable, bit); u32 old_enable = xgpio_get_value32(chip->enable, bit);
u32 mask = BIT(bit / 32), val; u32 mask = BIT(bit / 32), val;
gpiochip_enable_irq(&chip->gc, irq_offset);
spin_lock_irqsave(&chip->gpio_lock, flags); spin_lock_irqsave(&chip->gpio_lock, flags);
__set_bit(bit, chip->enable); __set_bit(bit, chip->enable);
...@@ -544,6 +547,16 @@ static void xgpio_irqhandler(struct irq_desc *desc) ...@@ -544,6 +547,16 @@ static void xgpio_irqhandler(struct irq_desc *desc)
chained_irq_exit(irqchip, desc); chained_irq_exit(irqchip, desc);
} }
static const struct irq_chip xgpio_irq_chip = {
.name = "gpio-xilinx",
.irq_ack = xgpio_irq_ack,
.irq_mask = xgpio_irq_mask,
.irq_unmask = xgpio_irq_unmask,
.irq_set_type = xgpio_set_irq_type,
.flags = IRQCHIP_IMMUTABLE,
GPIOCHIP_IRQ_RESOURCE_HELPERS,
};
/** /**
* xgpio_probe - Probe method for the GPIO device. * xgpio_probe - Probe method for the GPIO device.
* @pdev: pointer to the platform device * @pdev: pointer to the platform device
...@@ -653,12 +666,6 @@ static int xgpio_probe(struct platform_device *pdev) ...@@ -653,12 +666,6 @@ static int xgpio_probe(struct platform_device *pdev)
if (chip->irq <= 0) if (chip->irq <= 0)
goto skip_irq; goto skip_irq;
chip->irqchip.name = "gpio-xilinx";
chip->irqchip.irq_ack = xgpio_irq_ack;
chip->irqchip.irq_mask = xgpio_irq_mask;
chip->irqchip.irq_unmask = xgpio_irq_unmask;
chip->irqchip.irq_set_type = xgpio_set_irq_type;
/* Disable per-channel interrupts */ /* Disable per-channel interrupts */
xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, 0); xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, 0);
/* Clear any existing per-channel interrupts */ /* Clear any existing per-channel interrupts */
...@@ -668,7 +675,7 @@ static int xgpio_probe(struct platform_device *pdev) ...@@ -668,7 +675,7 @@ static int xgpio_probe(struct platform_device *pdev)
xgpio_writereg(chip->regs + XGPIO_GIER_OFFSET, XGPIO_GIER_IE); xgpio_writereg(chip->regs + XGPIO_GIER_OFFSET, XGPIO_GIER_IE);
girq = &chip->gc.irq; girq = &chip->gc.irq;
girq->chip = &chip->irqchip; gpio_irq_chip_set_chip(girq, &xgpio_irq_chip);
girq->parent_handler = xgpio_irqhandler; girq->parent_handler = xgpio_irqhandler;
girq->num_parents = 1; girq->num_parents = 1;
girq->parents = devm_kcalloc(&pdev->dev, 1, girq->parents = devm_kcalloc(&pdev->dev, 1,
......
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