summaryrefslogtreecommitdiffstats
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorMarek BehĂșn <kabel@kernel.org>2024-07-11 18:09:06 +0200
committerThomas Gleixner <tglx@linutronix.de>2024-07-30 13:35:49 +0200
commit654caa9db6649dbecdfa55ea29c9cbf4603fb402 (patch)
tree176a09031a58725aec88a81f79c3e553351379d2 /drivers/irqchip
parentirqchip/armada-370-xp: Use u32 type instead of unsigned long where possieble (diff)
downloadlinux-654caa9db6649dbecdfa55ea29c9cbf4603fb402.tar.xz
linux-654caa9db6649dbecdfa55ea29c9cbf4603fb402.zip
irqchip/armada-370-xp: Refactor initial memory regions mapping
Refactor the initial memory regions mapping: - put into its own function - return error numbers on failure - use WARN_ON() instead of BUG_ON() Signed-off-by: Marek BehĂșn <kabel@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20240711160907.31012-10-kabel@kernel.org
Diffstat (limited to 'drivers/irqchip')
-rw-r--r--drivers/irqchip/irq-armada-370-xp.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
index 8b28188953b0..9c66c251cee5 100644
--- a/drivers/irqchip/irq-armada-370-xp.c
+++ b/drivers/irqchip/irq-armada-370-xp.c
@@ -12,6 +12,7 @@
#include <linux/bitfield.h>
#include <linux/bits.h>
+#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
@@ -751,29 +752,50 @@ static struct syscore_ops mpic_syscore_ops = {
.resume = mpic_resume,
};
-static int __init mpic_of_init(struct device_node *node,
- struct device_node *parent)
+static int __init mpic_map_region(struct device_node *np, int index,
+ void __iomem **base, phys_addr_t *phys_base)
{
- struct resource main_int_res, per_cpu_int_res;
- unsigned int nr_irqs;
+ struct resource res;
+ int err;
+
+ err = of_address_to_resource(np, index, &res);
+ if (WARN_ON(err))
+ goto fail;
+
+ if (WARN_ON(!request_mem_region(res.start, resource_size(&res), np->full_name))) {
+ err = -EBUSY;
+ goto fail;
+ }
+
+ *base = ioremap(res.start, resource_size(&res));
+ if (WARN_ON(!*base)) {
+ err = -ENOMEM;
+ goto fail;
+ }
- BUG_ON(of_address_to_resource(node, 0, &main_int_res));
- BUG_ON(of_address_to_resource(node, 1, &per_cpu_int_res));
+ if (phys_base)
+ *phys_base = res.start;
- BUG_ON(!request_mem_region(main_int_res.start,
- resource_size(&main_int_res),
- node->full_name));
- BUG_ON(!request_mem_region(per_cpu_int_res.start,
- resource_size(&per_cpu_int_res),
- node->full_name));
+ return 0;
+
+fail:
+ pr_err("%pOF: Unable to map resource %d: %pE\n", np, index, ERR_PTR(err));
+ return err;
+}
+
+static int __init mpic_of_init(struct device_node *node, struct device_node *parent)
+{
+ phys_addr_t phys_base;
+ unsigned int nr_irqs;
+ int err;
- main_int_base = ioremap(main_int_res.start,
- resource_size(&main_int_res));
- BUG_ON(!main_int_base);
+ err = mpic_map_region(node, 0, &main_int_base, &phys_base);
+ if (err)
+ return err;
- per_cpu_int_base = ioremap(per_cpu_int_res.start,
- resource_size(&per_cpu_int_res));
- BUG_ON(!per_cpu_int_base);
+ err = mpic_map_region(node, 1, &per_cpu_int_base, NULL);
+ if (err)
+ return err;
nr_irqs = FIELD_GET(MPIC_INT_CONTROL_NUMINT_MASK, readl(main_int_base + MPIC_INT_CONTROL));
@@ -794,7 +816,7 @@ static int __init mpic_of_init(struct device_node *node,
mpic_perf_init();
mpic_smp_cpu_init();
- mpic_msi_init(node, main_int_res.start);
+ mpic_msi_init(node, phys_base);
if (parent_irq <= 0) {
irq_set_default_host(mpic_domain);