Skip to content

Commit cd242b3

Browse files
committed
gpio: merrifield: Add GPIO <-> pin mapping ranges via callback
When IRQ chip is instantiated via GPIO library flow, the few functions, in particular the ACPI event registration mechanism, on some of ACPI based platforms expect that the pin ranges are initialized to that point. Add GPIO <-> pin mapping ranges via callback in the GPIO library flow. Signed-off-by: Andy Shevchenko <[email protected]> Reviewed-by: Mika Westerberg <[email protected]> Reviewed-by: Hans de Goede <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]>
1 parent b056ca1 commit cd242b3

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

drivers/gpio/gpio-merrifield.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,35 @@ static const char *mrfld_gpio_get_pinctrl_dev_name(struct mrfld_gpio *priv)
396396
return name;
397397
}
398398

399-
static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id)
399+
static int mrfld_gpio_add_pin_ranges(struct gpio_chip *chip)
400400
{
401+
struct mrfld_gpio *priv = gpiochip_get_data(chip);
401402
const struct mrfld_gpio_pinrange *range;
402403
const char *pinctrl_dev_name;
404+
unsigned int i;
405+
int retval;
406+
407+
pinctrl_dev_name = mrfld_gpio_get_pinctrl_dev_name(priv);
408+
for (i = 0; i < ARRAY_SIZE(mrfld_gpio_ranges); i++) {
409+
range = &mrfld_gpio_ranges[i];
410+
retval = gpiochip_add_pin_range(&priv->chip, pinctrl_dev_name,
411+
range->gpio_base,
412+
range->pin_base,
413+
range->npins);
414+
if (retval) {
415+
dev_err(priv->dev, "failed to add GPIO pin range\n");
416+
return retval;
417+
}
418+
}
419+
420+
return 0;
421+
}
422+
423+
static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id)
424+
{
403425
struct mrfld_gpio *priv;
404426
u32 gpio_base, irq_base;
405427
void __iomem *base;
406-
unsigned int i;
407428
int retval;
408429

409430
retval = pcim_enable_device(pdev);
@@ -444,30 +465,16 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
444465
priv->chip.base = gpio_base;
445466
priv->chip.ngpio = MRFLD_NGPIO;
446467
priv->chip.can_sleep = false;
468+
priv->chip.add_pin_ranges = mrfld_gpio_add_pin_ranges;
447469

448470
raw_spin_lock_init(&priv->lock);
449471

450-
pci_set_drvdata(pdev, priv);
451472
retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv);
452473
if (retval) {
453474
dev_err(&pdev->dev, "gpiochip_add error %d\n", retval);
454475
return retval;
455476
}
456477

457-
pinctrl_dev_name = mrfld_gpio_get_pinctrl_dev_name(priv);
458-
for (i = 0; i < ARRAY_SIZE(mrfld_gpio_ranges); i++) {
459-
range = &mrfld_gpio_ranges[i];
460-
retval = gpiochip_add_pin_range(&priv->chip,
461-
pinctrl_dev_name,
462-
range->gpio_base,
463-
range->pin_base,
464-
range->npins);
465-
if (retval) {
466-
dev_err(&pdev->dev, "failed to add GPIO pin range\n");
467-
return retval;
468-
}
469-
}
470-
471478
retval = gpiochip_irqchip_add(&priv->chip, &mrfld_irqchip, irq_base,
472479
handle_bad_irq, IRQ_TYPE_NONE);
473480
if (retval) {
@@ -480,6 +487,7 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
480487
gpiochip_set_chained_irqchip(&priv->chip, &mrfld_irqchip, pdev->irq,
481488
mrfld_irq_handler);
482489

490+
pci_set_drvdata(pdev, priv);
483491
return 0;
484492
}
485493

0 commit comments

Comments
 (0)