[PATCH 33/58] mtd: rawnand: gpmi: retain open-handle state on removal
James Hilliard
james.hilliard1 at gmail.com
Sat Nov 7 02:16:30 PST 2026
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.
Keep geometry available after removal while releasing DMA and clocks.
Signed-off-by: James Hilliard <james.hilliard1 at gmail.com>
---
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
index 527165ccc839..cda3bbdca928 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
@@ -2744,7 +2744,6 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
if (ret)
return ret;
- nand_controller_init(&this->base);
this->base.ops = &gpmi_nand_controller_ops;
chip->controller = &this->base;
@@ -2759,9 +2758,15 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
if (ret)
goto err_nand_cleanup;
- ret = mtd_device_register(mtd, NULL, 0);
+ ret = nand_set_release(chip, NULL);
if (ret)
goto err_nand_cleanup;
+ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret) {
+ nand_disconnect(chip);
+ mtd_put_master(mtd);
+ goto err_out;
+ }
return 0;
err_nand_cleanup:
@@ -2782,14 +2787,22 @@ static const struct of_device_id gpmi_nand_id_table[] = {
};
MODULE_DEVICE_TABLE(of, gpmi_nand_id_table);
+static void gpmi_nand_release(struct nand_controller *controller)
+{
+ kfree(container_of(controller, struct gpmi_nand_data, base));
+}
+
static int gpmi_nand_probe(struct platform_device *pdev)
{
struct gpmi_nand_data *this;
int ret;
- this = devm_kzalloc(&pdev->dev, sizeof(*this), GFP_KERNEL);
+ this = kzalloc_obj(*this);
if (!this)
return -ENOMEM;
+ ret = devm_nand_controller_init(&pdev->dev, &this->base, gpmi_nand_release);
+ if (ret)
+ return ret;
this->devdata = of_device_get_match_data(&pdev->dev);
platform_set_drvdata(pdev, this);
@@ -2838,7 +2851,7 @@ static void gpmi_nand_remove(struct platform_device *pdev)
ret = mtd_device_unregister(nand_to_mtd(chip));
WARN_ON(ret);
- nand_cleanup(chip);
+ nand_disconnect(chip);
gpmi_free_dma_buffer(this);
release_resources(this);
pm_runtime_dont_use_autosuspend(&pdev->dev);
@@ -2846,6 +2859,7 @@ static void gpmi_nand_remove(struct platform_device *pdev)
#ifndef CONFIG_PM
gpmi_disable_clk(this);
#endif
+ mtd_put_master(nand_to_mtd(chip));
}
static int gpmi_pm_suspend(struct device *dev)
--
2.53.0
More information about the linux-mtd
mailing list