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 2200B6082BF5 for ; Sat, 7 Nov 2026 20:13:50 +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=z47P8rXY 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=jYRlZ4P6cMPilpNRMasjeX3uOQCnpLu+xcA1r4VUOx0=; b=z47P8rXYxFCnwn+BQcLkiGl8k5 b6WY7z0P8YM5haKkoCfcVvAp/MLqDCC/PFjNKs489OWlrh8oLitn8dYN086GC6kT2wXdqhVuV7z0w 61gvr2v4+zQzvaUUFTLW4KB9/jA4zCoIp/lNGYc14rdIsoeKXx6GUGrS/HDo37AQQ2zgvy/at35++ ZgkGqZStIAf9Rv11ZKmXapKF/ganh/DiK9Wg/e99Dk9TLuFeIkoxPhIv5DPC4dvpATo8c+zQ3tjUa +27Uc4vSfj7N2wfOWHzx4F/weVXqbfaJkNatmRgKfi5x8iN2Z8p9agJlIp++WHQxYHbD2/GFo4BLj v7sa6nRw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmnN-0000000FIbz-2mtX; Sat, 07 Nov 2026 20:13:49 +0000 Received: from mail-oi1-f180.google.com ([209.85.167.180]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPmn8-0000000FI7I-3H4O for linux-amlogic@lists.infradead.org; Sat, 07 Nov 2026 20:13:41 +0000 Received: by mail-oi1-f180.google.com with SMTP id 5614622812f47-53ec9237600so3437b6e.3 for ; Sat, 07 Nov 2026 12:13:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794082414; x=1794687214; 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=LtCTMO6NoGllay7SWUsBqb6+joFcIMTVNySCP1lhl94=; b=Id7xqmwKBuhwh26eZPoyF1pYfWlcWSC2/9dp4zTaCC/8QnSBjmmNOgKnEKU+4nrHlR 9om2/rbVx/NlTBEEqttl+D96JmCkAn0vLg/1dF4nA25YJGyELZRe5TEv9g+PJdcYU06G +MWdOE6EiGASO8pHlhzzyZMlFEUtTQWzPc/EFgynXDhLKArcHrfLQp3vhLNZm/1tVoDA zYDCMzOKX+6a9OFXBkAdwVFZQZlzh/XLPcqFL6X6/UFEG+rBaQtHor420bfYNsQ26GCG eaRpOZyJC745Kcjf23+tAY1wI3lkBzbQSCwgEkY+IBjCVnYx5irMvYxP6059EeF4uKr6 kqcA== X-Forwarded-Encrypted: i=1; AKwUvBySZy0CDQXFoUYjR1T9yadjVFhmT05zNX50VKIfq32zIWnhOu+2DQ+PB1TSPR0SUaBV/LJfJ/wi20zjzoLg@lists.infradead.org X-Gm-Message-State: APuU4Z9Hnltek1H1ZfmRK1DlhrJSJewbRBCNVfavJcViQ2LmRtoWfNIW 63axchGrqZhaXk/4Xuk07cXv6WLaYZhcGb3gCrEiIqZSTEjcA4BRg9v5yxwqgUtP9C8= X-Gm-Gg: AYBFou0rzLbS/q74eWy+j8JoptBOxF2SBGWnBPhmS+Hm1zfhcrjv94aRNMMxbPkzfFh /mQSevl7eGSwJpUQCSGl8i2LVeIekqBRqILISxyJMKQJaAyj0TPOl7ClmgUHJblKmiPJ2Ac7C91 VlQq9NAJXkG/SYs1oUCrCN5JXZvWiwV0cNiDsTPFwOJsTrgFnN18JLj88HvoSYx9X4rwQmWnnZg QCweiRIARptBwPGU5VGmXAgHVEZjRK0HGAnRGLLvP9+JwbU+V9lF5+LkvzXa4h3Ia7dzO2cc9wz hdcDz9SBBefkck3CVjY7l1xsRfsB0GgkZ5FMQHjBiYy0YK6Mci/zLi9cZK4qBdAH+SUkYuYYtEh KpJ+60IiTX+LWdUW2yAjHWgGmOztai1G6NhsqCq7HIPtJHQKphc767vfAydBCipWDBbFzf5APr0 6qqNViMAEXinlyCs3qSeu4aQTjnsZOblapFQJNZzbuY7GZgYXFHw0RKkuru/ds6EEbt1WLStfIV bGJ7ltYh1jvWEZBCfvnJUuz6XA+DmqJQ3WTdG+YEQ/Y6hnf83hSLq8yd+ReNEoahf+WrGoTbAL8 R5W1WxaGrDbDLFhgcdcGW0lU+WN9sjIXFb8iGL/KHGSyn6KFNAyu/53G3cU7 X-Received: by 2002:a05:6808:3097:b0:4f5:4780:582 with SMTP id 5614622812f47-567e1367a27mr5024513b6e.50.1794082413678; Sat, 07 Nov 2026 12:13:33 -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.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Nov 2026 12:13:33 -0800 (PST) From: James Hilliard Date: Sat, 07 Nov 2026 03:16:38 -0700 Subject: [PATCH 41/58] mtd: rawnand: brcmnand: retain open-handle state on removal X-Archived-By: MIME-Version: 1.0 Message-Id: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-41-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_121334_992955_5BDD4347 X-CRM114-Status: GOOD ( 17.50 ) 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. Unwind previously registered chip-selects on probe failure. Signed-off-by: James Hilliard --- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 72 +++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c index 4a1f5e736a1c..eaf0279518ca 100644 --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c @@ -3077,6 +3077,11 @@ static const struct nand_controller_ops brcmnand_controller_ops = { .exec_op = brcmnand_exec_op, }; +static void brcmnand_host_release(struct nand_chip *chip) +{ + kfree(container_of(chip, struct brcmnand_host, chip)); +} + static int brcmnand_init_cs(struct brcmnand_host *host, const char * const *part_probe_types) { @@ -3093,8 +3098,10 @@ static int brcmnand_init_cs(struct brcmnand_host *host, nand_set_controller_data(chip, host); mtd->name = devm_kasprintf(dev, GFP_KERNEL, "brcmnand.%d", host->cs); - if (!mtd->name) - return -ENOMEM; + if (!mtd->name) { + ret = -ENOMEM; + goto free_host; + } mtd->owner = THIS_MODULE; mtd->dev.parent = dev; @@ -3123,12 +3130,23 @@ static int brcmnand_init_cs(struct brcmnand_host *host, ret = nand_scan(chip, 1); if (ret) - return ret; + goto free_host; - ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0); - if (ret) + ret = nand_set_release(chip, brcmnand_host_release); + if (ret) { nand_cleanup(chip); + goto free_host; + } + ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0); + if (ret) { + nand_disconnect(chip); + mtd_put_master(mtd); + } + + return ret; +free_host: + kfree(host); return ret; } @@ -3294,6 +3312,26 @@ static int brcmnand_edu_setup(struct platform_device *pdev) return 0; } +static void brcmnand_chips_cleanup(struct brcmnand_controller *ctrl) +{ + struct brcmnand_host *host, *tmp; + + list_for_each_entry_safe(host, tmp, &ctrl->host_list, node) { + struct nand_chip *chip = &host->chip; + struct mtd_info *mtd = nand_to_mtd(chip); + + WARN_ON(mtd_device_unregister(mtd)); + nand_disconnect(chip); + list_del(&host->node); + mtd_put_master(mtd); + } +} + +static void brcmnand_release(struct nand_controller *controller) +{ + kfree(container_of(controller, struct brcmnand_controller, controller)); +} + int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) { struct brcmnand_platform_data *pd = dev_get_platdata(&pdev->dev); @@ -3307,9 +3345,12 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) if (dn && !of_match_node(brcmnand_of_match, dn)) return -ENODEV; - ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); + ctrl = kzalloc_obj(*ctrl); if (!ctrl) return -ENOMEM; + ret = devm_nand_controller_init(dev, &ctrl->controller, brcmnand_release); + if (ret) + return ret; dev_set_drvdata(dev, ctrl); ctrl->dev = dev; @@ -3324,7 +3365,6 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) init_completion(&ctrl->done); init_completion(&ctrl->dma_done); init_completion(&ctrl->edu_done); - nand_controller_init(&ctrl->controller); ctrl->controller.ops = &brcmnand_controller_ops; INIT_LIST_HEAD(&ctrl->host_list); @@ -3489,7 +3529,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) for_each_available_child_of_node_scoped(dn, child) { if (of_device_is_compatible(child, "brcm,nandcs")) { - host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); + host = kzalloc_obj(*host); if (!host) { ret = -ENOMEM; goto err; @@ -3500,7 +3540,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) ret = of_property_read_u32(child, "reg", &host->cs); if (ret) { dev_err(dev, "can't get chip-select\n"); - devm_kfree(dev, host); + kfree(host); continue; } @@ -3511,7 +3551,6 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) if (ret == -EPROBE_DEFER) goto err; - devm_kfree(dev, host); continue; /* Try all chip-selects */ } @@ -3528,7 +3567,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) } /* If we got there we must have been probing via platform data */ - host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); + host = kzalloc_obj(*host); if (!host) { ret = -ENOMEM; goto err; @@ -3554,6 +3593,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) return 0; err: + brcmnand_chips_cleanup(ctrl); clk_disable_unprepare(ctrl->clk); return ret; @@ -3563,16 +3603,8 @@ EXPORT_SYMBOL_GPL(brcmnand_probe); void brcmnand_remove(struct platform_device *pdev) { struct brcmnand_controller *ctrl = dev_get_drvdata(&pdev->dev); - struct brcmnand_host *host; - struct nand_chip *chip; - int ret; - list_for_each_entry(host, &ctrl->host_list, node) { - chip = &host->chip; - ret = mtd_device_unregister(nand_to_mtd(chip)); - WARN_ON(ret); - nand_cleanup(chip); - } + brcmnand_chips_cleanup(ctrl); clk_disable_unprepare(ctrl->clk); -- 2.53.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic