]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
irqchip/ls-extirq: Use for_each_of_imap_item iterator
authorHerve Codina (Schneider Electric) <herve.codina@bootlin.com>
Wed, 14 Jan 2026 09:39:32 +0000 (10:39 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 15 Jan 2026 11:03:27 +0000 (12:03 +0100)
The ls-extirq driver parses the interrupt-map property. It does it using
open code.

Recently for_each_of_imap_item iterator has been introduce to help
drivers in this parsing.

Convert the ls-extirq driver to use the for_each_of_imap_item
iterator instead of open code.

Signed-off-by: Herve Codina (Schneider Electric) <herve.codina@bootlin.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Thomas Gleixner <tglx@kernel.org>
Link: https://patch.msgid.link/20260114093938.1089936-4-herve.codina@bootlin.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/irqchip/irq-ls-extirq.c

index 50a7b38381b9869a064b12b6106bed928cb3d779..ed875577734965b44a2c6dd2ba3b3fa7f8e90fb1 100644 (file)
@@ -125,45 +125,32 @@ static const struct irq_domain_ops extirq_domain_ops = {
 static int
 ls_extirq_parse_map(struct ls_extirq_data *priv, struct device_node *node)
 {
-       const __be32 *map;
-       u32 mapsize;
+       struct of_imap_parser imap_parser;
+       struct of_imap_item imap_item;
        int ret;
 
-       map = of_get_property(node, "interrupt-map", &mapsize);
-       if (!map)
-               return -ENOENT;
-       if (mapsize % sizeof(*map))
-               return -EINVAL;
-       mapsize /= sizeof(*map);
+       ret = of_imap_parser_init(&imap_parser, node, &imap_item);
+       if (ret)
+               return ret;
 
-       while (mapsize) {
+       for_each_of_imap_item(&imap_parser, &imap_item) {
                struct device_node *ipar;
-               u32 hwirq, intsize, j;
+               u32 hwirq;
+               int i;
 
-               if (mapsize < 3)
-                       return -EINVAL;
-               hwirq = be32_to_cpup(map);
-               if (hwirq >= MAXIRQ)
+               hwirq = imap_item.child_imap[0];
+               if (hwirq >= MAXIRQ) {
+                       of_node_put(imap_item.parent_args.np);
                        return -EINVAL;
+               }
                priv->nirq = max(priv->nirq, hwirq + 1);
 
-               ipar = of_find_node_by_phandle(be32_to_cpup(map + 2));
-               map += 3;
-               mapsize -= 3;
-               if (!ipar)
-                       return -EINVAL;
-               priv->map[hwirq].fwnode = &ipar->fwnode;
-               ret = of_property_read_u32(ipar, "#interrupt-cells", &intsize);
-               if (ret)
-                       return ret;
-
-               if (intsize > mapsize)
-                       return -EINVAL;
+               ipar = of_node_get(imap_item.parent_args.np);
+               priv->map[hwirq].fwnode = of_fwnode_handle(ipar);
 
-               priv->map[hwirq].param_count = intsize;
-               for (j = 0; j < intsize; ++j)
-                       priv->map[hwirq].param[j] = be32_to_cpup(map++);
-               mapsize -= intsize;
+               priv->map[hwirq].param_count = imap_item.parent_args.args_count;
+               for (i = 0; i < priv->map[hwirq].param_count; i++)
+                       priv->map[hwirq].param[i] = imap_item.parent_args.args[i];
        }
        return 0;
 }