[PATCH v5 1/2] mfd: loongson-se: Add multi-node support
Qunqin Zhao <[email protected]> Thu, 30 Jul 2026 16:26:07 +0800
| Newsgroups | dev.linux.lists.loongarch,org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On the Loongson platform, each node is equipped with a security engine device. However, due to a hardware flaw, only the device on node 0 can trigger interrupts. Therefore, interrupts from other nodes are forwarded by node 0. We need to check in the interrupt handler of node 0 whether this interrupt is intended for other nodes, this can be accomplished via shared interrupt handling. Signed-off-by: Qunqin Zhao <[email protected]> --- drivers/mfd/loongson-se.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/loongson-se.c b/drivers/mfd/loongson-se.c index 3902ba377d..7f552a8ee6 100644 --- a/drivers/mfd/loongson-se.c +++ b/drivers/mfd/loongson-se.c @@ -140,6 +140,11 @@ static irqreturn_t se_irq_handler(int irq, void *dev_id) int_status = readl(se->base + SE_S2LINT_STAT); + if (int_status == 0) { + spin_unlock(&se->dev_lock); + return IRQ_NONE; + } + /* For controller */ if (int_status & SE_INT_CONTROLLER) { complete(&se->cmd_completion); @@ -211,24 +216,26 @@ static int loongson_se_probe(struct platform_device *pdev) if (IS_ERR(se->base)) return PTR_ERR(se->base); - writel(SE_INT_ALL, se->base + SE_S2LINT_EN); - nr_irq = platform_irq_count(pdev); if (nr_irq <= 0) return -ENODEV; + writel(SE_INT_ALL, se->base + SE_S2LINT_CL); + for (i = 0; i < nr_irq; i++) { irq = platform_get_irq(pdev, i); - err = devm_request_irq(dev, irq, se_irq_handler, 0, "loongson-se", se); + err = devm_request_irq(dev, irq, se_irq_handler, IRQF_SHARED, "loongson-se", se); if (err) dev_err(dev, "failed to request IRQ: %d\n", irq); } + writel(SE_INT_ALL, se->base + SE_S2LINT_EN); + err = loongson_se_init(se, paddr, se->dmam_size); if (err) return err; - return devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, engines, + return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, engines, ARRAY_SIZE(engines), NULL, 0, NULL); } -- 2.47.3