Commit e08f2adc authored by Ioana Ciornei's avatar Ioana Ciornei Committed by Thomas Gleixner
Browse files

Revert "irqchip/ls-extirq: Use for_each_of_imap_item iterator"



This reverts commit 3ac6dfe3.

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: 3ac6dfe3 ("irqchip/ls-extirq: Use for_each_of_imap_item iterator")
Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarThomas Gleixner <tglx@kernel.org>
Acked-by: default avatarHerve Codina <herve.codina@bootlin.com>
Link: https://patch.msgid.link/20260224113610.1129022-2-ioana.ciornei@nxp.com
parent f0617176
Loading
Loading
Loading
Loading
+30 −17
Original line number Diff line number Diff line
@@ -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;
}