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 4A932606EEBA for ; Sat, 7 Nov 2026 20:13:39 +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=cebZHSQV 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=A4QaoeRcG4eMdn4qlTSxZ8oi5GYfdHo530jA/dqlz8Q=; b=cebZHSQVkYRtNjAtxCsmJUotAo aw3pPyXr8KGf3ntAX5MxbKoTpaucEapjbW2cnF3tEyuqbSWwlsyLua7UZ8HUlM1Ko0Cggx7qQiA40 5oWbmMNePVIXz77NLV89MBeAFqNM5oczLKf0EX+OdGC1gMTlTCxhpVef8lgs7D4+sxQqWPcGl3hqc +/a1mIhv+29jTmEyDLXJFmSLGf3RUUHh22sbncPX4Odsq2N91jgZs2lup+M09PfWzafppvF0XaPQd z/REFMx7PwQ3sp2RhE5xGf8EeOQH2GS/PmELFasQaodyIpabX7De/VDhancgXSWmPaiNSAyJAkPsL B6UiWSiQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmnC-0000000FIDl-0Obf; Sat, 07 Nov 2026 20:13:38 +0000 Received: from mail-ot1-f48.google.com ([209.85.210.48]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmn0-0000000FHqe-0aKC for linux-amlogic@lists.infradead.org; Sat, 07 Nov 2026 20:13:32 +0000 Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-8451a619da7so1123322a34.1 for ; Sat, 07 Nov 2026 12:13:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794082405; x=1794687205; 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=HLZfvDioLp/vY/9zYDjLGVC8TxAnz3Z/4xHRKH8AmZg=; b=2Xr5/Atka3fwIEem9GMDpyIW/RGQTMKLxciFozft1pCl3te1S9Hsl/EQvZkodwN0mV N2HjliqnAFm9Fns9QWgjZITlwqUEgRc6E7+DqUw1cyvEj3dK5Jx+hLOlHz5xGqoL7Gj1 XBFxOkV8b2BYcjSnriG7uEz9/pPhlvUeh8eM5GIk3otVbjsr02xaG+FpFntlX2sq9J+q UJT+ZSONtFfaXIV6ead0oty5Zm4uVKv7ibWcZ1Nl6MlfAmWw3MK4xqhvinTDmNUg0TfL SFPn665dnySnTzmoXqHkg0726xUhQy0VRepLdXNDRKoJshK9UJ2Singr+VIqMLvmDZ8Y N5OA== X-Forwarded-Encrypted: i=1; AKwUvBxjapTWqelV+0KXp2nCsmfqYGlpMBFJE0WTy3uB/5rN0OF76iDUsUpodFFEZZRzZm+PhBB5TwkT9AhlXSDf@lists.infradead.org X-Gm-Message-State: APuU4Z/CBrQvdPIEID7DabCpTgdOVX5qLXJGAcFT/mUx9aY36wJK1vfA BHUmz/3EzwxvJT1/x16a6A8yhkbnCz+Y49ROUMEc86xaC5HUp7YuBh7YZQTusee7e88= X-Gm-Gg: AYBFou0TZoPAe4ylqJKuNSJRRYhYNFfGjojlLTCcAxCFQEAyF2Z6MxUc7hITKRQWtyZ UA6DEUufDpkMlzYNIRiBBAmTElwBhINuWpd7IojEf5F7b/5nPImGHVoULVKDBBU2SR9Np0q/net bNhd8LmR4VmmhyGGDMIzmvzJBLCdiTpD3yy+Qjsl8zFc0FtWdPzsJv9G90us20U1uqBPtVA1qHB uYVHfq1zP5SzBF0fg1jke5vWuW2zHZqbGAoAcY0wAyuT6DdrHDQXOTFgOibvmCnhieyLVsj1jT8 kCcDlNUilmVYB3CShZ3X0NYTJ3S3fMOnnXKdMhR2jZCg+O4egLnIFC7QzawYUsMn2fT4WM10O5e JgjuPNv48m4VR4rh64HCB4qtJ6mKCXNG9J22ssxvW6kyF9kWKFutuQyr4+h1QIQF6XVclQ0go6C LNaFmdIQkiXX+i/5CV/Aq9au/YuMGVYWYkhHBxW5ffwo6Uv1GwG6Q3BMD858nvTVXurMVQ4jTf0 jTy8HfofYtT+HzW4kzAVksBDueed6jhuxRuvo6BllgRJgc0qVD4ovWlikVSdUmc3o6rz93VeUUU MWfuiZ/s5cVRzm3QJzWVbAJUWXE2EjAKNt/u9csgd1UH7/LU+XB1k+ZD+3nx X-Received: by 2002:a05:6808:1202:b0:4c1:5614:acab with SMTP id 5614622812f47-567e10c6cd6mr4431450b6e.37.1794082404730; Sat, 07 Nov 2026 12:13:24 -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.13.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Nov 2026 12:13:24 -0800 (PST) From: James Hilliard Date: Sat, 07 Nov 2026 03:16:35 -0700 Subject: [PATCH 38/58] mtd: rawnand: cadence: retain open-handle state on removal X-Archived-By: MIME-Version: 1.0 Message-Id: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-38-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_121326_265927_68139FA9 X-CRM114-Status: GOOD ( 18.54 ) 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 Keep chip metadata and controller storage alive until the final MTD reference is released. Unregister and disconnect each published chip before releasing the resources used by its hardware operations. Allocate the final shared buffer before publishing any chip. Signed-off-by: James Hilliard --- drivers/mtd/nand/raw/cadence-nand-controller.c | 60 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/drivers/mtd/nand/raw/cadence-nand-controller.c b/drivers/mtd/nand/raw/cadence-nand-controller.c index d53b35a8b3cb..65c4eab600af 100644 --- a/drivers/mtd/nand/raw/cadence-nand-controller.c +++ b/drivers/mtd/nand/raw/cadence-nand-controller.c @@ -562,6 +562,7 @@ struct cdns_nand_chip { struct cadence_nand_timings timings; struct nand_chip chip; u8 nsels; + bool registered; struct list_head node; /* @@ -2991,6 +2992,11 @@ static const struct nand_controller_ops cadence_nand_controller_ops = { .setup_interface = cadence_nand_setup_interface, }; +static void cadence_nand_chip_release(struct nand_chip *chip) +{ + kfree(to_cdns_nand_chip(chip)); +} + static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl, struct device_node *np) { @@ -3007,9 +3013,7 @@ static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl, } /* Allocate the nand chip structure. */ - cdns_chip = devm_kzalloc(cdns_ctrl->dev, sizeof(*cdns_chip) + - (nsels * sizeof(u8)), - GFP_KERNEL); + cdns_chip = kzalloc(struct_size(cdns_chip, cs, nsels), GFP_KERNEL); if (!cdns_chip) { dev_err(cdns_ctrl->dev, "could not allocate chip structure\n"); return -ENOMEM; @@ -3024,20 +3028,22 @@ static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl, dev_err(cdns_ctrl->dev, "could not retrieve reg property: %d\n", ret); - return ret; + goto free_chip; } if (cs >= cdns_ctrl->caps2.max_banks) { dev_err(cdns_ctrl->dev, "invalid reg value: %u (max CS = %d)\n", cs, cdns_ctrl->caps2.max_banks); - return -EINVAL; + ret = -EINVAL; + goto free_chip; } if (test_and_set_bit(cs, &cdns_ctrl->assigned_cs)) { dev_err(cdns_ctrl->dev, "CS %d already assigned\n", cs); - return -EINVAL; + ret = -EINVAL; + goto free_chip; } cdns_chip->cs[i] = cs; @@ -3059,20 +3065,22 @@ static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl, ret = nand_scan(chip, cdns_chip->nsels); if (ret) { dev_err(cdns_ctrl->dev, "could not scan the nand chip\n"); - return ret; + goto free_chip; } - ret = mtd_device_register(mtd, NULL, 0); + ret = nand_set_release(chip, cadence_nand_chip_release); if (ret) { - dev_err(cdns_ctrl->dev, - "failed to register mtd device: %d\n", ret); nand_cleanup(chip); - return ret; + goto free_chip; } list_add_tail(&cdns_chip->node, &cdns_ctrl->chips); return 0; + +free_chip: + kfree(cdns_chip); + return ret; } static void cadence_nand_chips_cleanup(struct cdns_nand_ctrl *cdns_ctrl) @@ -3083,10 +3091,13 @@ static void cadence_nand_chips_cleanup(struct cdns_nand_ctrl *cdns_ctrl) list_for_each_entry_safe(entry, temp, &cdns_ctrl->chips, node) { chip = &entry->chip; - ret = mtd_device_unregister(nand_to_mtd(chip)); - WARN_ON(ret); - nand_cleanup(chip); + if (entry->registered) { + ret = mtd_device_unregister(nand_to_mtd(chip)); + WARN_ON(ret); + } + nand_disconnect(chip); list_del(&entry->node); + mtd_put_master(nand_to_mtd(chip)); } } @@ -3127,6 +3138,7 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) { dma_cap_mask_t mask; struct dma_device *dma_dev; + struct cdns_nand_chip *entry; int ret; cdns_ctrl->cdma_desc = dma_alloc_coherent(cdns_ctrl->dev, @@ -3181,7 +3193,6 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) goto dma_release_chnl; } - nand_controller_init(&cdns_ctrl->controller); INIT_LIST_HEAD(&cdns_ctrl->chips); cdns_ctrl->controller.ops = &cadence_nand_controller_ops; @@ -3201,9 +3212,17 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) goto unmap_dma_resource; } + list_for_each_entry(entry, &cdns_ctrl->chips, node) { + ret = mtd_device_register(nand_to_mtd(&entry->chip), NULL, 0); + if (ret) + goto unmap_dma_resource; + entry->registered = true; + } + return 0; unmap_dma_resource: + cadence_nand_chips_cleanup(cdns_ctrl); dma_unmap_resource(dma_dev->dev, cdns_ctrl->io.iova_dma, cdns_ctrl->io.size, DMA_BIDIRECTIONAL, 0); @@ -3260,6 +3279,11 @@ static const struct of_device_id cadence_nand_dt_ids[] = { MODULE_DEVICE_TABLE(of, cadence_nand_dt_ids); +static void cadence_nand_release(struct nand_controller *controller) +{ + kfree(container_of(controller, struct cadence_nand_dt, cdns_ctrl.controller)); +} + static int cadence_nand_dt_probe(struct platform_device *ofdev) { struct resource *res; @@ -3275,11 +3299,15 @@ static int cadence_nand_dt_probe(struct platform_device *ofdev) return -ENOMEM; } - dt = devm_kzalloc(&ofdev->dev, sizeof(*dt), GFP_KERNEL); + dt = kzalloc_obj(*dt); if (!dt) return -ENOMEM; cdns_ctrl = &dt->cdns_ctrl; + ret = devm_nand_controller_init(&ofdev->dev, &cdns_ctrl->controller, + cadence_nand_release); + if (ret) + return ret; cdns_ctrl->caps1 = devdata; cdns_ctrl->dev = &ofdev->dev; -- 2.53.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic