Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 628f0650 authored by Jayachandran C's avatar Jayachandran C Committed by Ralf Baechle
Browse files

MIPS: Netlogic: Add XLP PIC irqdomain



Add a legacy irq domain for the XLP PIC interrupts. This will be used
when interrupts are assigned from the device tree. This change is required
after commit c5cdc67a "irqdomain: Remove temporary MIPS workaround code".

Signed-off-by: default avatarJayachandran C <jchandra@broadcom.com>
Cc: linux-mips@linux-mips.org
Cc: Jayachandran C <jchandra@broadcom.com>
Patchwork: https://patchwork.linux-mips.org/patch/5597/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 35ac7840
Loading
Loading
Loading
Loading
+57 −11
Original line number Diff line number Diff line
@@ -40,6 +40,10 @@
#include <linux/slab.h>
#include <linux/irq.h>

#include <linux/irqdomain.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>

#include <asm/errno.h>
#include <asm/signal.h>
#include <asm/ptrace.h>
@@ -223,17 +227,6 @@ static void nlm_init_node_irqs(int node)
	nodep->irqmask = irqmask;
}

void __init arch_init_irq(void)
{
	/* Initialize the irq descriptors */
	nlm_init_percpu_irqs();
	nlm_init_node_irqs(0);
	write_c0_eimr(nlm_current_node()->irqmask);
#if defined(CONFIG_CPU_XLR)
	nlm_setup_fmn_irq();
#endif
}

void nlm_smp_irq_init(int hwcpuid)
{
	int node, cpu;
@@ -266,3 +259,56 @@ asmlinkage void plat_irq_dispatch(void)
	/* top level irq handling */
	do_IRQ(nlm_irq_to_xirq(node, i));
}

#ifdef CONFIG_OF
static struct irq_domain *xlp_pic_domain;

static const struct irq_domain_ops xlp_pic_irq_domain_ops = {
	.xlate = irq_domain_xlate_onetwocell,
};

static int __init xlp_of_pic_init(struct device_node *node,
					struct device_node *parent)
{
	const int n_picirqs = PIC_IRT_LAST_IRQ - PIC_IRQ_BASE + 1;
	struct resource res;
	int socid, ret;

	/* we need a hack to get the PIC's SoC chip id */
	ret = of_address_to_resource(node, 0, &res);
	if (ret < 0) {
		pr_err("PIC %s: reg property not found!\n", node->name);
		return -EINVAL;
	}
	socid = (res.start >> 18) & 0x3;
	xlp_pic_domain = irq_domain_add_legacy(node, n_picirqs,
		nlm_irq_to_xirq(socid, PIC_IRQ_BASE), PIC_IRQ_BASE,
		&xlp_pic_irq_domain_ops, NULL);
	if (xlp_pic_domain == NULL) {
		pr_err("PIC %s: Creating legacy domain failed!\n", node->name);
		return -EINVAL;
	}
	pr_info("Node %d: IRQ domain created for PIC@%pa\n", socid,
							&res.start);
	return 0;
}

static struct of_device_id __initdata xlp_pic_irq_ids[] = {
	{ .compatible = "netlogic,xlp-pic", .data = xlp_of_pic_init },
	{},
};
#endif

void __init arch_init_irq(void)
{
	/* Initialize the irq descriptors */
	nlm_init_percpu_irqs();
	nlm_init_node_irqs(0);
	write_c0_eimr(nlm_current_node()->irqmask);
#if defined(CONFIG_CPU_XLR)
	nlm_setup_fmn_irq();
#endif
#if defined(CONFIG_OF)
	of_irq_init(xlp_pic_irq_ids);
#endif
}
+2 −1
Original line number Diff line number Diff line
@@ -76,10 +76,11 @@
			};
		};
		pic: pic@4000 {
			interrupt-controller;
			compatible = "netlogic,xlp-pic";
			#address-cells = <0>;
			#interrupt-cells = <1>;
			reg = <0 0x4000 0x200>;
			interrupt-controller;
		};

		nor_flash@1,0 {
+2 −1
Original line number Diff line number Diff line
@@ -76,10 +76,11 @@
			};
		};
		pic: pic@4000 {
			interrupt-controller;
			compatible = "netlogic,xlp-pic";
			#address-cells = <0>;
			#interrupt-cells = <1>;
			reg = <0 0x4000 0x200>;
			interrupt-controller;
		};

		nor_flash@1,0 {