mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
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:
parent
a9811aeb42
commit
3ac6dfe3d7
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user