Skip to content

Commit e855fa9

Browse files
pchotardLinus Walleij
authored andcommitted
pinctrl: st: add irq_request/release_resources callbacks
When using GPIO as IRQ source, the GPIO must be configured in INPUT. Callbacks dedicated for this was missing in pinctrl-st driver. This fix the following kernel error when trying to lock a gpio as IRQ: [ 7.521095] gpio gpiochip7: (PIO11): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ [ 7.526018] gpio gpiochip7: (PIO11): unable to lock HW IRQ 6 for IRQ [ 7.529405] genirq: Failed to request resources for 0-0053 (irq 81) on irqchip GPIO Signed-off-by: Patrice Chotard <[email protected]> Signed-off-by: Linus Walleij <[email protected]>
1 parent a656671 commit e855fa9

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

drivers/pinctrl/pinctrl-st.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,22 @@ static void st_gpio_irq_unmask(struct irq_data *d)
12851285
writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK);
12861286
}
12871287

1288+
static int st_gpio_irq_request_resources(struct irq_data *d)
1289+
{
1290+
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1291+
1292+
st_gpio_direction_input(gc, d->hwirq);
1293+
1294+
return gpiochip_lock_as_irq(gc, d->hwirq);
1295+
}
1296+
1297+
static void st_gpio_irq_release_resources(struct irq_data *d)
1298+
{
1299+
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1300+
1301+
gpiochip_unlock_as_irq(gc, d->hwirq);
1302+
}
1303+
12881304
static int st_gpio_irq_set_type(struct irq_data *d, unsigned type)
12891305
{
12901306
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@ -1438,12 +1454,14 @@ static struct gpio_chip st_gpio_template = {
14381454
};
14391455

14401456
static struct irq_chip st_gpio_irqchip = {
1441-
.name = "GPIO",
1442-
.irq_disable = st_gpio_irq_mask,
1443-
.irq_mask = st_gpio_irq_mask,
1444-
.irq_unmask = st_gpio_irq_unmask,
1445-
.irq_set_type = st_gpio_irq_set_type,
1446-
.flags = IRQCHIP_SKIP_SET_WAKE,
1457+
.name = "GPIO",
1458+
.irq_request_resources = st_gpio_irq_request_resources,
1459+
.irq_release_resources = st_gpio_irq_release_resources,
1460+
.irq_disable = st_gpio_irq_mask,
1461+
.irq_mask = st_gpio_irq_mask,
1462+
.irq_unmask = st_gpio_irq_unmask,
1463+
.irq_set_type = st_gpio_irq_set_type,
1464+
.flags = IRQCHIP_SKIP_SET_WAKE,
14471465
};
14481466

14491467
static int st_gpiolib_register_bank(struct st_pinctrl *info,

0 commit comments

Comments
 (0)