Skip to content

Commit cca973a

Browse files
author
Linus Walleij
committed
pinctrl: mcp23s08: Convert to immutable irq_chip
Convert the driver to immutable irq-chip with a bit of intuition. I switched to using irqd_to_hwirq() consistently while we are at it. Cc: Marc Zyngier <maz@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20230403-immutable-irqchips-v1-6-503788a7f6e6@linaro.org
1 parent 52066a5 commit cca973a

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

drivers/pinctrl/pinctrl-mcp23s08.c

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/export.h>
1111
#include <linux/gpio/driver.h>
1212
#include <linux/gpio/consumer.h>
13+
#include <linux/seq_file.h>
1314
#include <linux/slab.h>
1415
#include <asm/byteorder.h>
1516
#include <linux/interrupt.h>
@@ -467,25 +468,27 @@ static void mcp23s08_irq_mask(struct irq_data *data)
467468
{
468469
struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
469470
struct mcp23s08 *mcp = gpiochip_get_data(gc);
470-
unsigned int pos = data->hwirq;
471+
unsigned int pos = irqd_to_hwirq(data);
471472

472473
mcp_set_bit(mcp, MCP_GPINTEN, pos, false);
474+
gpiochip_disable_irq(gc, pos);
473475
}
474476

475477
static void mcp23s08_irq_unmask(struct irq_data *data)
476478
{
477479
struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
478480
struct mcp23s08 *mcp = gpiochip_get_data(gc);
479-
unsigned int pos = data->hwirq;
481+
unsigned int pos = irqd_to_hwirq(data);
480482

483+
gpiochip_enable_irq(gc, pos);
481484
mcp_set_bit(mcp, MCP_GPINTEN, pos, true);
482485
}
483486

484487
static int mcp23s08_irq_set_type(struct irq_data *data, unsigned int type)
485488
{
486489
struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
487490
struct mcp23s08 *mcp = gpiochip_get_data(gc);
488-
unsigned int pos = data->hwirq;
491+
unsigned int pos = irqd_to_hwirq(data);
489492

490493
if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
491494
mcp_set_bit(mcp, MCP_INTCON, pos, false);
@@ -554,6 +557,25 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
554557
return 0;
555558
}
556559

560+
static void mcp23s08_irq_print_chip(struct irq_data *d, struct seq_file *p)
561+
{
562+
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
563+
struct mcp23s08 *mcp = gpiochip_get_data(gc);
564+
565+
seq_printf(p, dev_name(mcp->dev));
566+
}
567+
568+
static const struct irq_chip mcp23s08_irq_chip = {
569+
.irq_mask = mcp23s08_irq_mask,
570+
.irq_unmask = mcp23s08_irq_unmask,
571+
.irq_set_type = mcp23s08_irq_set_type,
572+
.irq_bus_lock = mcp23s08_irq_bus_lock,
573+
.irq_bus_sync_unlock = mcp23s08_irq_bus_unlock,
574+
.irq_print_chip = mcp23s08_irq_print_chip,
575+
.flags = IRQCHIP_IMMUTABLE,
576+
GPIOCHIP_IRQ_RESOURCE_HELPERS,
577+
};
578+
557579
/*----------------------------------------------------------------------*/
558580

559581
int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
@@ -569,12 +591,6 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
569591
mcp->addr = addr;
570592

571593
mcp->irq_active_high = false;
572-
mcp->irq_chip.name = dev_name(dev);
573-
mcp->irq_chip.irq_mask = mcp23s08_irq_mask;
574-
mcp->irq_chip.irq_unmask = mcp23s08_irq_unmask;
575-
mcp->irq_chip.irq_set_type = mcp23s08_irq_set_type;
576-
mcp->irq_chip.irq_bus_lock = mcp23s08_irq_bus_lock;
577-
mcp->irq_chip.irq_bus_sync_unlock = mcp23s08_irq_bus_unlock;
578594

579595
mcp->chip.direction_input = mcp23s08_direction_input;
580596
mcp->chip.get = mcp23s08_get;
@@ -636,7 +652,7 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
636652
if (mcp->irq && mcp->irq_controller) {
637653
struct gpio_irq_chip *girq = &mcp->chip.irq;
638654

639-
girq->chip = &mcp->irq_chip;
655+
gpio_irq_chip_set_chip(girq, &mcp23s08_irq_chip);
640656
/* This will let us handle the parent IRQ in the driver */
641657
girq->parent_handler = NULL;
642658
girq->num_parents = 0;

drivers/pinctrl/pinctrl-mcp23s08.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ struct mcp23s08 {
3636
struct mutex lock;
3737

3838
struct gpio_chip chip;
39-
struct irq_chip irq_chip;
4039

4140
struct regmap *regmap;
4241
struct device *dev;

0 commit comments

Comments
 (0)