Commit 4c875409 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Linus Walleij

gpio: merrifield: Move hardware initialization to callback

The driver wants to initialize related registers before IRQ chip will be added.
That's why move it to a corresponding callback. It also fixes the NULL pointer
dereference.

Fixes: 8f86a5b4 ("gpio: merrifield: Pass irqchip when adding gpiochip")
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent a3391206
...@@ -362,8 +362,9 @@ static void mrfld_irq_handler(struct irq_desc *desc) ...@@ -362,8 +362,9 @@ static void mrfld_irq_handler(struct irq_desc *desc)
chained_irq_exit(irqchip, desc); chained_irq_exit(irqchip, desc);
} }
static void mrfld_irq_init_hw(struct mrfld_gpio *priv) static int mrfld_irq_init_hw(struct gpio_chip *chip)
{ {
struct mrfld_gpio *priv = gpiochip_get_data(chip);
void __iomem *reg; void __iomem *reg;
unsigned int base; unsigned int base;
...@@ -375,6 +376,8 @@ static void mrfld_irq_init_hw(struct mrfld_gpio *priv) ...@@ -375,6 +376,8 @@ static void mrfld_irq_init_hw(struct mrfld_gpio *priv)
reg = gpio_reg(&priv->chip, base, GFER); reg = gpio_reg(&priv->chip, base, GFER);
writel(0, reg); writel(0, reg);
} }
return 0;
} }
static const char *mrfld_gpio_get_pinctrl_dev_name(struct mrfld_gpio *priv) static const char *mrfld_gpio_get_pinctrl_dev_name(struct mrfld_gpio *priv)
...@@ -447,6 +450,7 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id ...@@ -447,6 +450,7 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
girq = &priv->chip.irq; girq = &priv->chip.irq;
girq->chip = &mrfld_irqchip; girq->chip = &mrfld_irqchip;
girq->init_hw = mrfld_irq_init_hw;
girq->parent_handler = mrfld_irq_handler; girq->parent_handler = mrfld_irq_handler;
girq->num_parents = 1; girq->num_parents = 1;
girq->parents = devm_kcalloc(&pdev->dev, girq->num_parents, girq->parents = devm_kcalloc(&pdev->dev, girq->num_parents,
...@@ -459,8 +463,6 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id ...@@ -459,8 +463,6 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
girq->default_type = IRQ_TYPE_NONE; girq->default_type = IRQ_TYPE_NONE;
girq->handler = handle_bad_irq; girq->handler = handle_bad_irq;
mrfld_irq_init_hw(priv);
pci_set_drvdata(pdev, priv); pci_set_drvdata(pdev, priv);
retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv); retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv);
if (retval) { if (retval) {
......
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