[PATCH v7 08/12] gpio: mxc: use devres functions to simplify probe code

From: Peng Fan (OSS)

Date: Tue Oct 27 2026 - 08:22:51 EST


From: Peng Fan <peng.fan@xxxxxxx>

Replace irq_domain_create_legacy() with devm_irq_domain_instantiate()
and convert the remaining manually-unwound IRQ resources in probe to
devres management.

The runtime PM cleanup guard from the previous commit disables runtime PM
and drops the probe reference on these error returns.

With every allocation after the PM block now devm-managed, the
out_irqdomain_remove and out_bgio labels are no longer needed.

Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
---
drivers/gpio/gpio-mxc.c | 37 ++++++++++++++++++-------------------
1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c
index 68857730b5e3..eeb7d36e6b44 100644
--- a/drivers/gpio/gpio-mxc.c
+++ b/drivers/gpio/gpio-mxc.c
@@ -465,6 +465,7 @@ static int mxc_gpio_probe(struct platform_device *pdev)
struct gpio_generic_chip_config config = { };
struct device_node *np = pdev->dev.of_node;
struct device *dev = &pdev->dev;
+ struct irq_domain_info d_info;
struct mxc_gpio_port *port;
int irq_count;
int irq_base;
@@ -531,7 +532,7 @@ static int mxc_gpio_probe(struct platform_device *pdev)

err = gpio_generic_chip_init(&port->gen_gc, &config);
if (err)
- goto out_bgio;
+ return err;

port->gen_gc.gc.request = mxc_gpio_request;
port->gen_gc.gc.free = mxc_gpio_free;
@@ -546,24 +547,28 @@ static int mxc_gpio_probe(struct platform_device *pdev)
port->gen_gc.gc.base = -1;

irq_base = devm_irq_alloc_descs(dev, -1, 0, 32, numa_node_id());
- if (irq_base < 0) {
- err = irq_base;
- goto out_bgio;
- }
+ if (irq_base < 0)
+ return irq_base;
+
+ d_info = (struct irq_domain_info) {
+ .fwnode = dev_fwnode(dev),
+ .size = 32,
+ .hwirq_max = 32,
+ .virq_base = irq_base,
+ .ops = &irq_domain_simple_ops,
+ .dev = dev,
+ };

- port->domain = irq_domain_create_legacy(dev_fwnode(dev), 32, irq_base, 0,
- &irq_domain_simple_ops, NULL);
- if (!port->domain) {
- err = -ENODEV;
- goto out_bgio;
- }
+ port->domain = devm_irq_domain_instantiate(dev, &d_info);
+ if (IS_ERR(port->domain))
+ return PTR_ERR(port->domain);

irq_domain_set_pm_device(port->domain, dev);

/* gpio-mxc can be a generic irq chip */
err = mxc_gpio_init_gc(port, irq_base);
if (err < 0)
- goto out_irqdomain_remove;
+ return err;

/*
* Register the GPIO chip last: devm_gpiochip_add_data() makes the
@@ -572,7 +577,7 @@ static int mxc_gpio_probe(struct platform_device *pdev)
*/
err = devm_gpiochip_add_data(dev, &port->gen_gc.gc, port);
if (err)
- goto out_irqdomain_remove;
+ return err;

list_add_tail(&port->node, &mxc_gpio_ports);

@@ -584,12 +589,6 @@ static int mxc_gpio_probe(struct platform_device *pdev)
pm_runtime_put_autosuspend(dev);

return 0;
-
-out_irqdomain_remove:
- irq_domain_remove(port->domain);
-out_bgio:
- dev_info(dev, "%s failed with errno %d\n", __func__, err);
- return err;
}

static void mxc_gpio_save_regs(struct mxc_gpio_port *port)

--
2.51.0