Commit 7d2fed1f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'irq_urgent_for_v6.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fixes from Borislav Petkov:

 - Fix a wrong ioremap size in mvebu-gicp

 - Remove yet another compile-test case for a driver which needs an
   additional dependency

 - Fix a lock inversion scenario in the IRQ unit test suite

 - Remove an impossible flag situation in gic-v5

 - Do not iounmap resources in gic-v5 which are managed by devm

 - Make sure stale, left-over interrupts in mvebu-gicp are cleared on
   driver init

 - Fix a reference counting mishap in msi-lib

 - Fix a dereference-before-null-ptr-check case in the riscv-imsic
   irqchip driver

* tag 'irq_urgent_for_v6.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/mvebu-gicp: Use resource_size() for ioremap()
  irqchip: Build IMX_MU_MSI only on ARM
  genirq/test: Resolve irq lock inversion warnings
  irqchip/gic-v5: Remove IRQD_RESEND_WHEN_IN_PROGRESS for ITS IRQs
  irqchip/gic-v5: iwb: Fix iounmap probe failure path
  irqchip/mvebu-gicp: Clear pending interrupts on init
  irqchip/msi-lib: Fix fwnode refcount in msi_lib_irq_domain_select()
  irqchip/riscv-imsic: Don't dereference before NULL pointer check
parents acaa21a2 9f7488f2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -554,6 +554,7 @@ config IMX_MU_MSI
	tristate "i.MX MU used as MSI controller"
	depends on OF && HAS_IOMEM
	depends on ARCH_MXC || COMPILE_TEST
	depends on ARM || ARM64
	default m if ARCH_MXC
	select IRQ_DOMAIN
	select IRQ_DOMAIN_HIERARCHY
+0 −1
Original line number Diff line number Diff line
@@ -973,7 +973,6 @@ static int gicv5_its_irq_domain_alloc(struct irq_domain *domain, unsigned int vi
		irqd = irq_get_irq_data(virq + i);
		irqd_set_single_target(irqd);
		irqd_set_affinity_on_activate(irqd);
		irqd_set_resend_when_in_progress(irqd);
	}

	return 0;
+2 −9
Original line number Diff line number Diff line
@@ -241,7 +241,6 @@ static int gicv5_iwb_device_probe(struct platform_device *pdev)
	struct gicv5_iwb_chip_data *iwb_node;
	void __iomem *iwb_base;
	struct resource *res;
	int ret;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res)
@@ -254,16 +253,10 @@ static int gicv5_iwb_device_probe(struct platform_device *pdev)
	}

	iwb_node = gicv5_iwb_init_bases(iwb_base, pdev);
	if (IS_ERR(iwb_node)) {
		ret = PTR_ERR(iwb_node);
		goto out_unmap;
	}
	if (IS_ERR(iwb_node))
		return PTR_ERR(iwb_node);

	return 0;

out_unmap:
	iounmap(iwb_base);
	return ret;
}

static const struct of_device_id gicv5_iwb_of_match[] = {
+3 −3
Original line number Diff line number Diff line
@@ -133,13 +133,13 @@ int msi_lib_irq_domain_select(struct irq_domain *d, struct irq_fwspec *fwspec,
{
	const struct msi_parent_ops *ops = d->msi_parent_ops;
	u32 busmask = BIT(bus_token);
	struct fwnode_handle *fwh;

	if (!ops)
		return 0;

	fwh = d->flags & IRQ_DOMAIN_FLAG_FWNODE_PARENT ? fwnode_get_parent(fwspec->fwnode)
						       : fwspec->fwnode;
	struct fwnode_handle *fwh __free(fwnode_handle) =
		d->flags & IRQ_DOMAIN_FLAG_FWNODE_PARENT ? fwnode_get_parent(fwspec->fwnode)
							 : fwnode_handle_get(fwspec->fwnode);
	if (fwh != d->fwnode || fwspec->param_count != 0)
		return 0;

+10 −0
Original line number Diff line number Diff line
@@ -177,6 +177,7 @@ static int mvebu_gicp_probe(struct platform_device *pdev)
		.ops	= &gicp_domain_ops,
	};
	struct mvebu_gicp *gicp;
	void __iomem *base;
	int ret, i;

	gicp = devm_kzalloc(&pdev->dev, sizeof(*gicp), GFP_KERNEL);
@@ -236,6 +237,15 @@ static int mvebu_gicp_probe(struct platform_device *pdev)
		return -ENODEV;
	}

	base = ioremap(gicp->res->start, resource_size(gicp->res));
	if (IS_ERR(base)) {
		dev_err(&pdev->dev, "ioremap() failed. Unable to clear pending interrupts.\n");
	} else {
		for (i = 0; i < 64; i++)
			writel(i, base + GICP_CLRSPI_NSR_OFFSET);
		iounmap(base);
	}

	return msi_create_parent_irq_domain(&info, &gicp_msi_parent_ops) ? 0 : -ENOMEM;
}

Loading