Skip to content

Commit 57ff2df

Browse files
andy-shevwesteri
authored andcommitted
pinctrl: intel: Allocate IRQ chip dynamic
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: ee1a6ca ("pinctrl: intel: Add Intel Broxton pin controller support") Depends-on: 5ff56b0 ("pinctrl: intel: Disable GPIO pin interrupts in suspend") Reported-by: Federico Ricchiuto <[email protected]> Suggested-by: Mika Westerberg <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]> Signed-off-by: Mika Westerberg <[email protected]>
1 parent 54ecb8f commit 57ff2df

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

drivers/pinctrl/intel/pinctrl-intel.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct intel_pinctrl_context {
9696
* @pctldesc: Pin controller description
9797
* @pctldev: Pointer to the pin controller device
9898
* @chip: GPIO chip in this pin controller
99+
* @irqchip: IRQ chip in this pin controller
99100
* @soc: SoC/PCH specific pin configuration data
100101
* @communities: All communities in this pin controller
101102
* @ncommunities: Number of communities in this pin controller
@@ -108,6 +109,7 @@ struct intel_pinctrl {
108109
struct pinctrl_desc pctldesc;
109110
struct pinctrl_dev *pctldev;
110111
struct gpio_chip chip;
112+
struct irq_chip irqchip;
111113
const struct intel_pinctrl_soc_data *soc;
112114
struct intel_community *communities;
113115
size_t ncommunities;
@@ -1139,16 +1141,6 @@ static irqreturn_t intel_gpio_irq(int irq, void *data)
11391141
return ret;
11401142
}
11411143

1142-
static struct irq_chip intel_gpio_irqchip = {
1143-
.name = "intel-gpio",
1144-
.irq_ack = intel_gpio_irq_ack,
1145-
.irq_mask = intel_gpio_irq_mask,
1146-
.irq_unmask = intel_gpio_irq_unmask,
1147-
.irq_set_type = intel_gpio_irq_type,
1148-
.irq_set_wake = intel_gpio_irq_wake,
1149-
.flags = IRQCHIP_MASK_ON_SUSPEND,
1150-
};
1151-
11521144
static int intel_gpio_add_pin_ranges(struct intel_pinctrl *pctrl,
11531145
const struct intel_community *community)
11541146
{
@@ -1198,12 +1190,22 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
11981190

11991191
pctrl->chip = intel_gpio_chip;
12001192

1193+
/* Setup GPIO chip */
12011194
pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
12021195
pctrl->chip.label = dev_name(pctrl->dev);
12031196
pctrl->chip.parent = pctrl->dev;
12041197
pctrl->chip.base = -1;
12051198
pctrl->irq = irq;
12061199

1200+
/* Setup IRQ chip */
1201+
pctrl->irqchip.name = dev_name(pctrl->dev);
1202+
pctrl->irqchip.irq_ack = intel_gpio_irq_ack;
1203+
pctrl->irqchip.irq_mask = intel_gpio_irq_mask;
1204+
pctrl->irqchip.irq_unmask = intel_gpio_irq_unmask;
1205+
pctrl->irqchip.irq_set_type = intel_gpio_irq_type;
1206+
pctrl->irqchip.irq_set_wake = intel_gpio_irq_wake;
1207+
pctrl->irqchip.flags = IRQCHIP_MASK_ON_SUSPEND;
1208+
12071209
ret = devm_gpiochip_add_data(pctrl->dev, &pctrl->chip, pctrl);
12081210
if (ret) {
12091211
dev_err(pctrl->dev, "failed to register gpiochip\n");
@@ -1233,15 +1235,14 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
12331235
return ret;
12341236
}
12351237

1236-
ret = gpiochip_irqchip_add(&pctrl->chip, &intel_gpio_irqchip, 0,
1238+
ret = gpiochip_irqchip_add(&pctrl->chip, &pctrl->irqchip, 0,
12371239
handle_bad_irq, IRQ_TYPE_NONE);
12381240
if (ret) {
12391241
dev_err(pctrl->dev, "failed to add irqchip\n");
12401242
return ret;
12411243
}
12421244

1243-
gpiochip_set_chained_irqchip(&pctrl->chip, &intel_gpio_irqchip, irq,
1244-
NULL);
1245+
gpiochip_set_chained_irqchip(&pctrl->chip, &pctrl->irqchip, irq, NULL);
12451246
return 0;
12461247
}
12471248

0 commit comments

Comments
 (0)