irqchip/ls-extirq: Use for_each_of_imap_item iterator

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>
This commit is contained in:
Herve Codina (Schneider Electric) 2026-01-14 10:39:32 +01:00 committed by Geert Uytterhoeven
parent a9811aeb42
commit 3ac6dfe3d7

View File

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