Commit a3391206 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Linus Walleij

gpio: lynxpoint: 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: 7b1e8894 ("gpio: lynxpoint: 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 a752fbb4
...@@ -294,8 +294,9 @@ static struct irq_chip lp_irqchip = { ...@@ -294,8 +294,9 @@ static struct irq_chip lp_irqchip = {
.flags = IRQCHIP_SKIP_SET_WAKE, .flags = IRQCHIP_SKIP_SET_WAKE,
}; };
static void lp_gpio_irq_init_hw(struct lp_gpio *lg) static int lp_gpio_irq_init_hw(struct gpio_chip *chip)
{ {
struct lp_gpio *lg = gpiochip_get_data(chip);
unsigned long reg; unsigned long reg;
unsigned base; unsigned base;
...@@ -307,6 +308,8 @@ static void lp_gpio_irq_init_hw(struct lp_gpio *lg) ...@@ -307,6 +308,8 @@ static void lp_gpio_irq_init_hw(struct lp_gpio *lg)
reg = lp_gpio_reg(&lg->chip, base, LP_INT_STAT); reg = lp_gpio_reg(&lg->chip, base, LP_INT_STAT);
outl(0xffffffff, reg); outl(0xffffffff, reg);
} }
return 0;
} }
static int lp_gpio_probe(struct platform_device *pdev) static int lp_gpio_probe(struct platform_device *pdev)
...@@ -364,6 +367,7 @@ static int lp_gpio_probe(struct platform_device *pdev) ...@@ -364,6 +367,7 @@ static int lp_gpio_probe(struct platform_device *pdev)
girq = &gc->irq; girq = &gc->irq;
girq->chip = &lp_irqchip; girq->chip = &lp_irqchip;
girq->init_hw = lp_gpio_irq_init_hw;
girq->parent_handler = lp_gpio_irq_handler; girq->parent_handler = lp_gpio_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,
...@@ -374,8 +378,6 @@ static int lp_gpio_probe(struct platform_device *pdev) ...@@ -374,8 +378,6 @@ static int lp_gpio_probe(struct platform_device *pdev)
girq->parents[0] = (unsigned)irq_rc->start; girq->parents[0] = (unsigned)irq_rc->start;
girq->default_type = IRQ_TYPE_NONE; girq->default_type = IRQ_TYPE_NONE;
girq->handler = handle_simple_irq; girq->handler = handle_simple_irq;
lp_gpio_irq_init_hw(lg);
} }
ret = devm_gpiochip_add_data(dev, gc, lg); ret = devm_gpiochip_add_data(dev, gc, lg);
......
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