From patchwork Sat Apr 21 13:55:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 10354157 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E19CC600F6 for ; Sat, 21 Apr 2018 14:04:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D014828722 for ; Sat, 21 Apr 2018 14:04:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C27872891A; Sat, 21 Apr 2018 14:04:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 20A1728722 for ; Sat, 21 Apr 2018 14:04:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=0bIBR5jVeclw/RdR+ihLC+iZQ7J6YoG2qyC7BLaMMOk=; b=lCXzer8mgSfoH57umUhO/vWflf FqVZ/q6wdGLOtCPLDhwwCyNCX5eUKwvnEHKJn3/W+TDDr78b8+jPXNL47BaWK/7rnhBAmfhtw9fOJ fkyYsRQTfQDXYEGrIE20fNdqfREPeyBTf395EgJL2elrRJmr/q3pmCbd/7HoyW9sfP0VC78jlCgQ7 HORCzGC49ZSGPuzYULpg625/nFaCG1H9ebXvVvcucWHyQ3G+/Mv1re0BZTYMf7tablb+S2EHYUuit qdXwBx4D4wMuIA42BPQLOD6To1wsJKTgJqXzYq5doJveDriItzxQEnxcrvD/dWCt3Yv5Av4qpKE+r 9suUogJQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1f9t7g-000819-UQ; Sat, 21 Apr 2018 14:04:17 +0000 Received: from mail.bootlin.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1f9szn-0003Sg-PS for linux-arm-kernel@lists.infradead.org; Sat, 21 Apr 2018 13:56:13 +0000 Received: by mail.bootlin.com (Postfix, from userid 110) id BCD15207CE; Sat, 21 Apr 2018 15:55:47 +0200 (CEST) Received: from localhost.localdomain (unknown [91.224.148.103]) by mail.bootlin.com (Postfix) with ESMTPSA id C285620376; Sat, 21 Apr 2018 15:55:46 +0200 (CEST) From: Miquel Raynal To: Thomas Gleixner , Jason Cooper , Marc Zyngier Subject: [PATCH 08/17] irqchip/irq-mvebu-icu: disociate ICU and NSR Date: Sat, 21 Apr 2018 15:55:28 +0200 Message-Id: <20180421135537.24716-9-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180421135537.24716-1-miquel.raynal@bootlin.com> References: <20180421135537.24716-1-miquel.raynal@bootlin.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180421_065608_175400_C8D95BC5 X-CRM114-Status: GOOD ( 18.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Andrew Lunn , devicetree@vger.kernel.org, Antoine Tenart , Catalin Marinas , Gregory Clement , Haim Boot , Will Deacon , Maxime Chevallier , Nadav Haklai , Rob Herring , Thomas Petazzoni , Miquel Raynal , Hanna Hawa , linux-arm-kernel@lists.infradead.org, Sebastian Hesselbarth MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP NSR (non-secure interrupts) are handled in the ICU driver like if there was only this type of interrupt in the ICU. Change this behavior to prepare the introduction of SEI (System Error Interrupts) support by moving the NSR code in a separate function. This is done under the form of a 'probe' function to ease future migration to NSR/SEI being platform devices part of the ICU. Signed-off-by: Miquel Raynal Reviewed-by: Thomas Petazzoni --- drivers/irqchip/irq-mvebu-icu.c | 84 ++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/drivers/irqchip/irq-mvebu-icu.c b/drivers/irqchip/irq-mvebu-icu.c index 493c9625d48b..c919110dcee5 100644 --- a/drivers/irqchip/irq-mvebu-icu.c +++ b/drivers/irqchip/irq-mvebu-icu.c @@ -192,15 +192,53 @@ static const struct irq_domain_ops mvebu_icu_domain_ops = { .free = mvebu_icu_irq_domain_free, }; -static int mvebu_icu_probe(struct platform_device *pdev) +static int mvebu_icu_nsr_probe(struct platform_device *pdev) { - struct mvebu_icu *icu; - struct device_node *node = pdev->dev.of_node; - struct device_node *gicp_dn; + struct device_node *msi_parent_dn; struct irq_domain *irq_domain; - struct resource *res; - phys_addr_t setspi, clrspi; + struct mvebu_icu *icu; + phys_addr_t set, clr; int ret; + + icu = dev_get_drvdata(&pdev->dev); + if (!icu) + return -ENODEV; + + pdev->dev.msi_domain = of_msi_get_domain(&pdev->dev, pdev->dev.of_node, + DOMAIN_BUS_PLATFORM_MSI); + if (!pdev->dev.msi_domain) + return -EPROBE_DEFER; + + msi_parent_dn = irq_domain_get_of_node(pdev->dev.msi_domain); + if (!msi_parent_dn) + return -ENODEV; + + /* Set Clear/Set ICU NSR SPI message address in AP */ + ret = mvebu_gicp_get_doorbells(msi_parent_dn, &set, &clr); + if (ret) + return ret; + + regmap_write(icu->regmap, ICU_SETSPI_NSR_AH, upper_32_bits(set)); + regmap_write(icu->regmap, ICU_SETSPI_NSR_AL, lower_32_bits(set)); + regmap_write(icu->regmap, ICU_CLRSPI_NSR_AH, upper_32_bits(clr)); + regmap_write(icu->regmap, ICU_CLRSPI_NSR_AL, lower_32_bits(clr)); + + irq_domain = platform_msi_create_device_domain(&pdev->dev, ICU_MAX_IRQS, + mvebu_icu_write_msg, + &mvebu_icu_domain_ops, + icu); + if (!irq_domain) { + dev_err(&pdev->dev, "Failed to create ICU MSI domain\n"); + return -ENOMEM; + } + + return 0; +} + +static int mvebu_icu_probe(struct platform_device *pdev) +{ + struct mvebu_icu *icu; + struct resource *res; u32 i; icu = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_icu), @@ -232,29 +270,6 @@ static int mvebu_icu_probe(struct platform_device *pdev) icu->irq_chip.irq_set_affinity = irq_chip_set_affinity_parent; #endif - /* - * We're probed after MSI domains have been resolved, so force - * resolution here. - */ - pdev->dev.msi_domain = of_msi_get_domain(&pdev->dev, node, - DOMAIN_BUS_PLATFORM_MSI); - if (!pdev->dev.msi_domain) - return -EPROBE_DEFER; - - gicp_dn = irq_domain_get_of_node(pdev->dev.msi_domain); - if (!gicp_dn) - return -ENODEV; - - ret = mvebu_gicp_get_doorbells(gicp_dn, &setspi, &clrspi); - if (ret) - return ret; - - /* Set Clear/Set ICU SPI message address in AP */ - regmap_write(icu->regmap, ICU_SETSPI_NSR_AH, upper_32_bits(setspi)); - regmap_write(icu->regmap, ICU_SETSPI_NSR_AL, lower_32_bits(setspi)); - regmap_write(icu->regmap, ICU_CLRSPI_NSR_AH, upper_32_bits(clrspi)); - regmap_write(icu->regmap, ICU_CLRSPI_NSR_AL, lower_32_bits(clrspi)); - /* * Clean all ICU interrupts with type SPI_NSR, required to * avoid unpredictable SPI assignments done by firmware. @@ -269,16 +284,9 @@ static int mvebu_icu_probe(struct platform_device *pdev) regmap_write(icu->regmap, ICU_INT_CFG(i), 0); } - irq_domain = - platform_msi_create_device_domain(&pdev->dev, ICU_MAX_IRQS, - mvebu_icu_write_msg, - &mvebu_icu_domain_ops, icu); - if (!irq_domain) { - dev_err(&pdev->dev, "Failed to create ICU domain\n"); - return -ENOMEM; - } + platform_set_drvdata(pdev, icu); - return 0; + return mvebu_icu_nsr_probe(pdev); } static const struct of_device_id mvebu_icu_of_match[] = {