From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=192.19.144.205 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792601759; b=WC/dpreCwIkPZID8OA+xq/2UrKiu04B3YltK+KRKmflQFEwOQKmmb5ZCGQiiFuAZ9UZw o61biGWVc/YBZ90f5lvAuxCXCSVKOH1Bs8oT1SC3S86WErk0UsLsumqZF1QEhkk7tLtc0 /KjLJNPUzgoF7IDY7/1tcS5t3Exi87aGVkkeLt1MJsq03Z0oovC9ZEjcLJHyRCnZZoVd+ D+P2Dli2Zdpab91nFjxWDVuiKJ5GpXQwxgbxKASxKEPHOw1UT6UGagxzIVE3Ijp6TnKPf S20HjE+o1gAx1nPEADG1fqL8JaeKIbQJGGPXtnDjimiQ0EUY99aLBlzJKqs/UK0V7vA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792601759; h=DMARC-Filter:Received:DKIM-Filter:DKIM-Signature:Received:From:To:Cc: Subject:Date:Message-ID:X-Mailer:In-Reply-To:References:MIME-Version: Content-Transfer-Encoding; bh=mvtMFeEgqCOciHeQyrJ9AYtTF4EED76l0h+Ctv+GHTw=; b=kDyRv2hst9ao6Hd2+MI8LNvIwcNOZytErrqQZG4Hj9QNzcweos83LXTHHvUTSD50G5TS 4guAyA5M2qhVHfkVWTe0ffn8YQU6ENgpVMy2G3SJefZyBbvuJfzuNkRL6UyyXZwKCiRcL Oy65/d2HfeDjBT/u+FcZrzeW4xm/Ibt5JeeLmiiMyYF5aW3POuF4hVv29BACp5Q/d/eSO DgldbtIWHKppsooYdoVDFL/lG5PQhxpmJHMURA8TQ/mFtirhyD4HLCJHfw4Z4Oky4bCuZ LPaNiK0xMCztUjsiBxt6+ZxNbEyYHcfOyLz6poVL+cBygnMquyg6U3RTiVfz5RtgT+A== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=dkimrelay header.b=Actv1RdJ; arc=none smtp.remote-ip=192.19.144.205 Received: from relay.smtp-ext.broadcom.com (relay.smtp-ext.broadcom.com [192.19.144.205]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA3E3606A323; Wed, 21 Oct 2026 16:55:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org DA3E3606A323 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=dkimrelay header.b=Actv1RdJ Received: from mail-lvn-it-01.broadcom.com (mail-lvn-it-01.lvn.broadcom.net [10.36.132.253]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id 1652FC0003DD; Wed, 21 Oct 2026 09:55:58 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com 1652FC0003DD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1792601758; bh=EM7n+tDGenpZu2JqhvLLbNFJk9ot1h+4BcfzddABqHw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Actv1RdJpjRCNiiBBaasas7Mhx36iY4X4bsr5dGbH5AV3xIthtxhFcp4KASp1WZHC llrjuGI+cSBnMDoo7pXfj0cjVP9rfSpd2rdwBZMf1NET5tg903IcG/OK8IBtETVbGR +I1KJD4/1kWmUTctfVEPYWftJf65N1cy/H4BQsA4= Received: from fainelli-desktop.igp.broadcom.net (fainelli-desktop.dhcp.broadcom.net [10.67.48.245]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail-lvn-it-01.broadcom.com (Postfix) with ESMTPSA id A1EE4A83; Wed, 21 Oct 2026 09:55:57 -0700 (PDT) From: Florian Fainelli To: linux-arm-kernel@lists.infradead.org Cc: Florian Fainelli , Damien Le Moal , Niklas Cassel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Ray Jui , Scott Branden , Broadcom internal kernel review list , Vinod Koul , Neil Armstrong , Manivannan Sadhasivam , Kishon Vijay Abraham I , Tejun Heo , Yendapally Reddy Dhananjaya Reddy , linux-ide@vger.kernel.org (open list:LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)), devicetree@vger.kernel.org (open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS), linux-kernel@vger.kernel.org (open list), linux-phy@lists.infradead.org (open list:GENERIC PHY FRAMEWORK) Subject: [PATCH 3/6] ata: ahci_brcm: Initialize the NSP interface clock and reset Date: Wed, 21 Oct 2026 09:55:50 -0700 Message-ID: <20261021165555.652102-4-florian.fainelli@broadcom.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261021165555.652102-1-florian.fainelli@broadcom.com> References: <20261021165555.652102-1-florian.fainelli@broadcom.com> X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The NSP probe path assumes firmware has enabled the SATA IDM interface clock and released the core reset. The downstream iProc config_AHCI() sequence explicitly performs both operations before accessing AHCI. Without that setup, a cold boot can access an inactive controller. Map the optional NSP IDM register region and enable the interface clock before releasing reset, retaining the downstream settling intervals. Perform the sequence at probe and resume before reconfiguring SATA. Keep the resource optional so older device trees continue to rely on firmware initialization. Fixes: 3ee2e6dcaa35 ("ata: ahci_brcm: Add support for Broadcom NSP SoC") Signed-off-by: Florian Fainelli --- drivers/ata/ahci_brcm.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c index 29be74fedcf0..2ed60806b671 100644 --- a/drivers/ata/ahci_brcm.c +++ b/drivers/ata/ahci_brcm.c @@ -6,7 +6,9 @@ */ #include +#include #include +#include #include #include #include @@ -83,6 +85,7 @@ enum brcm_ahci_quirks { struct brcm_ahci_priv { struct device *dev; void __iomem *top_ctrl; + void __iomem *idm; u32 port_mask; u32 quirks; enum brcm_ahci_version version; @@ -230,6 +233,25 @@ static u32 brcm_ahci_get_portmask(struct ahci_host_priv *hpriv, return impl; } +static void brcm_sata_init_idm(struct brcm_ahci_priv *priv) +{ + u32 data; + + if (!priv->idm) + return; + + /* Enable the interface clock before taking the SATA core out of reset. */ + data = readl(priv->idm + BCMA_IOCTL); + writel(data | BCMA_IOCTL_CLK, priv->idm + BCMA_IOCTL); + readl(priv->idm + BCMA_IOCTL); + usleep_range(1000, 2000); + + data = readl(priv->idm + BCMA_RESET_CTL); + writel(data & ~BCMA_RESET_CTL_RESET, priv->idm + BCMA_RESET_CTL); + readl(priv->idm + BCMA_RESET_CTL); + usleep_range(1000, 2000); +} + static void brcm_sata_init(struct brcm_ahci_priv *priv) { void __iomem *ctrl = priv->top_ctrl + SATA_TOP_CTRL_BUS_CTRL; @@ -369,6 +391,8 @@ static int __maybe_unused brcm_ahci_resume(struct device *dev) struct brcm_ahci_priv *priv = hpriv->plat_data; int ret = 0; + brcm_sata_init_idm(priv); + ret = reset_control_deassert(priv->rcdev_ahci); if (ret) return ret; @@ -453,6 +477,14 @@ static int brcm_ahci_probe(struct platform_device *pdev) priv->version = (unsigned long)of_id->data; priv->dev = dev; + /* Older NSP device trees rely on firmware to initialize the IDM. */ + if (priv->version == BRCM_SATA_NSP && + platform_get_resource_byname(pdev, IORESOURCE_MEM, "idm")) { + priv->idm = devm_platform_ioremap_resource_byname(pdev, "idm"); + if (IS_ERR(priv->idm)) + return PTR_ERR(priv->idm); + } + priv->top_ctrl = devm_platform_ioremap_resource_byname(pdev, "top-ctrl"); if (IS_ERR(priv->top_ctrl)) return PTR_ERR(priv->top_ctrl); @@ -493,6 +525,8 @@ static int brcm_ahci_probe(struct platform_device *pdev) if (ret) return ret; + brcm_sata_init_idm(priv); + ret = ahci_platform_enable_clks(hpriv); if (ret) goto out_reset; -- 2.53.0