Skip to content

Commit 4a5e0f9

Browse files
committed
gpio: merrifield: Pass irqchip when adding gpiochip
We need to convert all old gpio irqchips to pass the irqchip setup along when adding the gpio_chip. For more info see drivers/gpio/TODO. For chained irqchips this is a pretty straight-forward conversion. Cc: Andy Shevchenko <[email protected]> Cc: Mika Westerberg <[email protected]> Cc: Thierry Reding <[email protected]> Signed-off-by: Linus Walleij <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]> Reviewed-by: Mika Westerberg <[email protected]> Reviewed-by: Hans de Goede <[email protected]>
1 parent cd242b3 commit 4a5e0f9

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

drivers/gpio/gpio-merrifield.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,9 @@ static void mrfld_irq_handler(struct irq_desc *desc)
365365
chained_irq_exit(irqchip, desc);
366366
}
367367

368-
static void mrfld_irq_init_hw(struct mrfld_gpio *priv)
368+
static int mrfld_irq_init_hw(struct gpio_chip *chip)
369369
{
370+
struct mrfld_gpio *priv = gpiochip_get_data(chip);
370371
void __iomem *reg;
371372
unsigned int base;
372373

@@ -378,6 +379,8 @@ static void mrfld_irq_init_hw(struct mrfld_gpio *priv)
378379
reg = gpio_reg(&priv->chip, base, GFER);
379380
writel(0, reg);
380381
}
382+
383+
return 0;
381384
}
382385

383386
static const char *mrfld_gpio_get_pinctrl_dev_name(struct mrfld_gpio *priv)
@@ -422,6 +425,7 @@ static int mrfld_gpio_add_pin_ranges(struct gpio_chip *chip)
422425

423426
static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id)
424427
{
428+
struct gpio_irq_chip *girq;
425429
struct mrfld_gpio *priv;
426430
u32 gpio_base, irq_base;
427431
void __iomem *base;
@@ -469,24 +473,26 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
469473

470474
raw_spin_lock_init(&priv->lock);
471475

476+
girq = &priv->chip.irq;
477+
girq->chip = &mrfld_irqchip;
478+
girq->init_hw = mrfld_irq_init_hw;
479+
girq->parent_handler = mrfld_irq_handler;
480+
girq->num_parents = 1;
481+
girq->parents = devm_kcalloc(&pdev->dev, girq->num_parents,
482+
sizeof(*girq->parents), GFP_KERNEL);
483+
if (!girq->parents)
484+
return -ENOMEM;
485+
girq->parents[0] = pdev->irq;
486+
girq->first = irq_base;
487+
girq->default_type = IRQ_TYPE_NONE;
488+
girq->handler = handle_bad_irq;
489+
472490
retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv);
473491
if (retval) {
474492
dev_err(&pdev->dev, "gpiochip_add error %d\n", retval);
475493
return retval;
476494
}
477495

478-
retval = gpiochip_irqchip_add(&priv->chip, &mrfld_irqchip, irq_base,
479-
handle_bad_irq, IRQ_TYPE_NONE);
480-
if (retval) {
481-
dev_err(&pdev->dev, "could not connect irqchip to gpiochip\n");
482-
return retval;
483-
}
484-
485-
mrfld_irq_init_hw(priv);
486-
487-
gpiochip_set_chained_irqchip(&priv->chip, &mrfld_irqchip, pdev->irq,
488-
mrfld_irq_handler);
489-
490496
pci_set_drvdata(pdev, priv);
491497
return 0;
492498
}

0 commit comments

Comments
 (0)