| From 539d8bde72c22d760013bf81436d6bb94eb67aed Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Thu, 24 Oct 2019 17:33:42 +0300 |
| Subject: pinctrl: baytrail: Allocate IRQ chip dynamic |
| |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| |
| commit 539d8bde72c22d760013bf81436d6bb94eb67aed upstream. |
| |
| Keeping the IRQ chip definition static shares it with multiple instances |
| of the GPIO chip in the system. This is bad and now we get this warning |
| from GPIO library: |
| |
| "detected irqchip that is shared with multiple gpiochips: please fix the driver." |
| |
| Hence, move the IRQ chip definition from being driver static into the struct |
| intel_pinctrl. So a unique IRQ chip is used for each GPIO chip instance. |
| |
| Fixes: 9f573b98ca50 ("pinctrl: baytrail: Update irq chip operations") |
| Depends-on: ca8a958e2acb ("pinctrl: baytrail: Pass irqchip when adding gpiochip") |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pinctrl/intel/pinctrl-baytrail.c | 19 +++++++++---------- |
| 1 file changed, 9 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/pinctrl/intel/pinctrl-baytrail.c |
| +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c |
| @@ -107,6 +107,7 @@ struct byt_gpio_pin_context { |
| |
| struct byt_gpio { |
| struct gpio_chip chip; |
| + struct irq_chip irqchip; |
| struct platform_device *pdev; |
| struct pinctrl_dev *pctl_dev; |
| struct pinctrl_desc pctl_desc; |
| @@ -1395,15 +1396,6 @@ static int byt_irq_type(struct irq_data |
| return 0; |
| } |
| |
| -static struct irq_chip byt_irqchip = { |
| - .name = "BYT-GPIO", |
| - .irq_ack = byt_irq_ack, |
| - .irq_mask = byt_irq_mask, |
| - .irq_unmask = byt_irq_unmask, |
| - .irq_set_type = byt_irq_type, |
| - .flags = IRQCHIP_SKIP_SET_WAKE, |
| -}; |
| - |
| static void byt_gpio_irq_handler(struct irq_desc *desc) |
| { |
| struct irq_data *data = irq_desc_get_irq_data(desc); |
| @@ -1551,8 +1543,15 @@ static int byt_gpio_probe(struct byt_gpi |
| if (irq_rc && irq_rc->start) { |
| struct gpio_irq_chip *girq; |
| |
| + vg->irqchip.name = "BYT-GPIO", |
| + vg->irqchip.irq_ack = byt_irq_ack, |
| + vg->irqchip.irq_mask = byt_irq_mask, |
| + vg->irqchip.irq_unmask = byt_irq_unmask, |
| + vg->irqchip.irq_set_type = byt_irq_type, |
| + vg->irqchip.flags = IRQCHIP_SKIP_SET_WAKE, |
| + |
| girq = &gc->irq; |
| - girq->chip = &byt_irqchip; |
| + girq->chip = &vg->irqchip; |
| girq->init_hw = byt_gpio_irq_init_hw; |
| girq->parent_handler = byt_gpio_irq_handler; |
| girq->num_parents = 1; |