]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
Revert "irqchip/ls-extirq: Use for_each_of_imap_item iterator"
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 24 Feb 2026 11:36:09 +0000 (13:36 +0200)
committerThomas Gleixner <tglx@kernel.org>
Tue, 24 Feb 2026 17:35:48 +0000 (18:35 +0100)
This reverts commit 3ac6dfe3d7a2396602b67667249b146504dfbd2a.

The ls-extirq uses interrupt-map but it's a non-standard use documented
in fsl,ls-extirq.yaml:

        # The driver(drivers/irqchip/irq-ls-extirq.c) have not use standard DT
        # function to parser interrupt-map. So it doesn't consider '#address-size'
        # in parent interrupt controller, such as GIC.
        #
        # When dt-binding verify interrupt-map, item data matrix is spitted at
        # incorrect position. Remove interrupt-map restriction because it always
        # wrong.

This means that by using for_each_of_imap_item and the underlying
of_irq_parse_imap_parent() on its interrupt-map property will effectively
break its functionality

Revert the patch making use of for_each_of_imap_item() in ls-extirq.

Fixes: 3ac6dfe3d7a2 ("irqchip/ls-extirq: Use for_each_of_imap_item iterator")
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Acked-by: Herve Codina <herve.codina@bootlin.com>
Link: https://patch.msgid.link/20260224113610.1129022-2-ioana.ciornei@nxp.com
drivers/irqchip/irq-ls-extirq.c

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