From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 88E14606A331 for ; Sat, 7 Nov 2026 20:14:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=OLIyo68b DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=oIBgoKYPG2xMBNbHVaoeoMDyQE3QjavLpiAgg1bFIFU=; b=OLIyo68bWt/ZKyNEPrIZr5bUxn sY0Q5NkOzo/1TGxa+9FYPfQKBao8Y1XGKgLmI85gVifj7fScU7t9gdqhY1IJPNj8Q1QzW7V1ASJcw QZps5XJW7ousoH2y7z3UI7jTVCZCkiYOnFpXSG33dhbviMXMGcVUNQER9mFlw30gDLdeVkvGkFSid X1yfzahhH5RwRPNgUf03O2eGRS0hnih0TTDvKnfDM7JAOkcyXKJgC0xoXxdmW2JSCfYF2gpgm8Gnk jieK47ln5GOUMoh5Sy+UJEoRmtttPqR//rteV0yzpPARLzsBVKVZcDMHIEDq9N6hHZgQ84WQ5Ozfc qL3G42aQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmoE-0000000FK67-0UYl; Sat, 07 Nov 2026 20:14:42 +0000 Received: from mail-oo1-f50.google.com ([209.85.161.50]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmnk-0000000FJFF-1qnf for linux-amlogic@lists.infradead.org; Sat, 07 Nov 2026 20:14:16 +0000 Received: by mail-oo1-f50.google.com with SMTP id 006d021491bc7-6d68de53053so1238589eaf.0 for ; Sat, 07 Nov 2026 12:14:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794082451; x=1794687251; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=NppZ7CUb04bxQjnUofthCMie7KVnuMp1vzpPBAm263s=; b=ChM/tnTjlWY9sCn7gO0CEK+KRJBGnmOSHB0UrOrVPKh9nI7Xr5kowVy/PlUtkQPNk/ Wy7IGrwPp/S4afmSOW6t7djmzrKfKG3rMp6cDOrV8KKVPqBx9AvH5Uy3E0NOwRTL0w+e ceCUP4Git2/JkX5M2z8AeSYWsnIk/13xv9kl+X23hzFYmuCQ/7gtXZoFSfJg457+beG2 +17humnNVdUhx5A3EgWcQSeqsVwjKYxrmp0wVOs9oy/4IIkOKZ+tGrRe4WTsGXzOXwXZ IzF0mkWunYO2dwMPkJpv0OIdY3TLL8yarfSkWBfmj1nVa2avv1nlHIvjIhz6Sgdtb6Ia YZEg== X-Forwarded-Encrypted: i=1; AKwUvBwQ+TBnihqCj4NfkftEoQWxfz865DxvCeToPkQdwUlIJYNsFs/33kOGCI8Mu3nB3Is5xT312dLWinZzOY/j@lists.infradead.org X-Gm-Message-State: APuU4Z/BdhgNFQPnt/2Icuo/PFrCMqeKRskyyD1KiTNke/F8nMC48vqe dqIreht38na7Hq9zEntD0X/PgtfNBNVYz+fHKw71Szqrb1kz4Ui8YBBbNXpaY3/8prs= X-Gm-Gg: AYBFou1bSS7KrHR9yWb0m4K81xPZGkBTvwxNHoyDqatFGVfbIzjOpwLIR2BXtPDzoBf ZfNqjUtaZigAncqyq5z5SHNVaj42uP0PRCzimDR0haDRRmRt1nq+4sx/a3/TBN3wiCVacwisbaT QKjcvDsxa0RvQ9WzdskOK9/NNXEHjnmhxUS2wIUMfe3vQrcncQfte0LH1rkh/KLreDzw4ICmGMG E7p0jXRBhZOnKuMerWGpRrIEwzv+DfTdUPhzD3TvIfdrxcDSYGkTW/l7vEa/E3enQ4SBwTlxqwc a0eeAvclvsm9Qo3AFpaRmCfj+oZS93IMLH7dqicZ9gGhRHuEiBTa3lqLr3kvoh78KAAesG1z14K zfDOuYCgZFM25aJnHxuiYPbHgibqnuFEPzTcsQKH/wX+t7rrID62xZ3Qny6ZyHu7FNiaQKa62/+ ZdKxiuGhEFGzxYyw5lq0bbld2AN3zoXN5H6QYZrPVRvcNukpRmnudhsSONVlxtW8I2wiPzGD7rX FYhrolzbWgQlrAqSvrcTxTjd4rpHax1T/tnRxzUcmIV5z+PVd7DwRxWYmFYBbRPbXLVQ8sOVNih DNRzoHHWx2A9i4pNbOR+RDcJZVi5wFHgpt0ZhCJ459EB03lddB4SpP/XksgB X-Received: by 2002:a05:6820:440d:b0:703:10f3:89f1 with SMTP id 006d021491bc7-7170f2cf793mr13093eaf.40.1794082451391; Sat, 07 Nov 2026 12:14:11 -0800 (PST) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4ade68aa561sm226096fac.5.2026.11.07.12.14.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Nov 2026 12:14:10 -0800 (PST) From: James Hilliard Date: Sat, 07 Nov 2026 03:16:51 -0700 Subject: [PATCH 54/58] mtd: rawnand: fsl_ifc: retain chip state across removal X-Archived-By: MIME-Version: 1.0 Message-Id: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-54-0181ef0cc4c8@gmail.com> References: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-0-0181ef0cc4c8@gmail.com> In-Reply-To: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-0-0181ef0cc4c8@gmail.com> To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Brian Norris , Boris Brezillon , Arseniy Krasnov , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Thomas Gleixner , Vitaly Wool , David Woodhouse , Russell King , David Woodhouse , Mike Rapoport , Maxime Coquelin , Alexandre Torgue , Christophe Kerello , Jason Roberts , Michal Simek , Boris Brezillon , Mason Yang , Ramuthevar Vadivel Murugan , Stefan Agner , Lucas Stach , Thierry Reding , Jonathan Hunter , Dmitry Osipenko , Matthias Brugger , AngeloGioacchino Del Regno , Jorge Ramirez-Ortiz , Heiko Stuebner , Yifeng Zhao , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Keguang Zhang , Jacky Huang , Shan-Chun Hung , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Han Xu , Liang Yang , Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , Manivannan Sadhasivam , Kamal Dasu , Broadcom internal kernel review list , Vladimir Zapolskiy , Piotr Wojtaszczyk , Paul Cercueil , Harvey Hunt , Maxim Levitsky , Michael Walle , Srinivas Kandagatla Cc: Tze Yee Ng , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-mips@vger.kernel.org, imx@lists.linux.dev, linux-renesas-soc@vger.kernel.org, linux-amlogic@lists.infradead.org, linux-arm-msm@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261107_121413_348844_033324BF X-CRM114-Status: GOOD ( 18.10 ) X-Spam-Score: 1.7 (+) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-amlogic" X-Spam-Status: No, score=-12.3 required=3.0 tests=BAYES_00,DATE_IN_PAST_06_12, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 Separate active bank membership from ownership of the shared IFC NAND controller. Retained chip references keep the controller lock and chip metadata alive after removal, without retaining hardware mappings. Disconnect before device-managed resources disappear and drop the shared controller reference from each chip's final release callback. Signed-off-by: James Hilliard --- drivers/mtd/nand/raw/fsl_ifc_nand.c | 58 ++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c b/drivers/mtd/nand/raw/fsl_ifc_nand.c index cc75b6a67e07..18b747e73c3b 100644 --- a/drivers/mtd/nand/raw/fsl_ifc_nand.c +++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c @@ -40,6 +40,8 @@ struct fsl_ifc_mtd { /* overview of the fsl ifc controller */ struct fsl_ifc_nand_ctrl { struct nand_controller controller; + struct kref refcnt; + unsigned int users; struct fsl_ifc_mtd *chips[FSL_IFC_BANK_COUNT]; void __iomem *addr; /* Address of assigned IFC buffer */ @@ -961,11 +963,33 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv) return 0; } -static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv) +static void fsl_ifc_controller_release(struct kref *ref) { - ifc_nand_ctrl->chips[priv->bank] = NULL; + kfree(container_of(ref, struct fsl_ifc_nand_ctrl, refcnt)); +} - return 0; +static void fsl_ifc_chip_release(struct nand_chip *chip) +{ + struct fsl_ifc_nand_ctrl *ctrl; + + ctrl = container_of(chip->controller, struct fsl_ifc_nand_ctrl, controller); + kfree(nand_get_controller_data(chip)); + kref_put(&ctrl->refcnt, fsl_ifc_controller_release); +} + +static DEFINE_MUTEX(fsl_ifc_nand_mutex); + +static void fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv) +{ + struct fsl_ifc_nand_ctrl *ctrl; + + ctrl = container_of(priv->chip.controller, struct fsl_ifc_nand_ctrl, controller); + guard(mutex)(&fsl_ifc_nand_mutex); + ctrl->chips[priv->bank] = NULL; + if (!--ctrl->users) { + priv->ctrl->nand = NULL; + ifc_nand_ctrl = NULL; + } } static int match_bank(struct fsl_ifc_global __iomem *ifc_global, int bank, @@ -981,8 +1005,6 @@ static int match_bank(struct fsl_ifc_global __iomem *ifc_global, int bank, return (cspr & CSPR_BA) == convert_ifc_address(addr); } -static DEFINE_MUTEX(fsl_ifc_nand_mutex); - static int fsl_ifc_nand_probe(struct platform_device *dev) { struct fsl_ifc_runtime __iomem *ifc; @@ -1016,30 +1038,35 @@ static int fsl_ifc_nand_probe(struct platform_device *dev) return -ENODEV; } - priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); + priv = kzalloc_obj(*priv); if (!priv) return -ENOMEM; mutex_lock(&fsl_ifc_nand_mutex); if (!fsl_ifc_ctrl_dev->nand) { - ifc_nand_ctrl = devm_kzalloc(fsl_ifc_ctrl_dev->dev, sizeof(*ifc_nand_ctrl), - GFP_KERNEL); + ifc_nand_ctrl = kzalloc_obj(*ifc_nand_ctrl); if (!ifc_nand_ctrl) { mutex_unlock(&fsl_ifc_nand_mutex); + kfree(priv); return -ENOMEM; } fsl_ifc_ctrl_dev->nand = ifc_nand_ctrl; nand_controller_init(&ifc_nand_ctrl->controller); + kref_init(&ifc_nand_ctrl->refcnt); } else { ifc_nand_ctrl = fsl_ifc_ctrl_dev->nand; + kref_get(&ifc_nand_ctrl->refcnt); } + ifc_nand_ctrl->users++; mutex_unlock(&fsl_ifc_nand_mutex); ifc_nand_ctrl->chips[bank] = priv; priv->bank = bank; priv->ctrl = fsl_ifc_ctrl_dev; + priv->chip.controller = &ifc_nand_ctrl->controller; + nand_set_controller_data(&priv->chip, priv); priv->dev = &dev->dev; priv->vbase = vbase; @@ -1071,12 +1098,19 @@ static int fsl_ifc_nand_probe(struct platform_device *dev) ret = nand_scan(&priv->chip, 1); if (ret) goto err; + ret = nand_set_release(&priv->chip, fsl_ifc_chip_release); + if (ret) + goto cleanup_nand; /* First look for RedBoot table or partitions on the command * line, these take precedence over device tree information */ ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0); - if (ret) - goto cleanup_nand; + if (ret) { + nand_disconnect(&priv->chip); + fsl_ifc_chip_remove(priv); + mtd_put_master(mtd); + return ret; + } dev_info(priv->dev, "IFC NAND device at 0x%llx, bank %d\n", (unsigned long long)res->start, priv->bank); @@ -1087,6 +1121,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev) nand_cleanup(&priv->chip); err: fsl_ifc_chip_remove(priv); + fsl_ifc_chip_release(&priv->chip); return ret; } @@ -1099,9 +1134,10 @@ static void fsl_ifc_nand_remove(struct platform_device *dev) ret = mtd_device_unregister(nand_to_mtd(chip)); WARN_ON(ret); - nand_cleanup(chip); + nand_disconnect(chip); fsl_ifc_chip_remove(priv); + mtd_put_master(nand_to_mtd(chip)); } static const struct of_device_id fsl_ifc_nand_match[] = { -- 2.53.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic