* [PATCH 25/58] mtd: rawnand: hisi504: retain open-handle state on removal
@ 2026-11-07 10:16 James Hilliard
0 siblings, 0 replies; 2+ messages in thread
From: James Hilliard @ 2026-11-07 10:16 UTC (permalink / raw)
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, linux-kernel, linux-arm-kernel,
linux-sunxi, linux-tegra, linux-mediatek, linux-rockchip,
linux-mips, imx, linux-renesas-soc, linux-amlogic, linux-arm-msm,
James Hilliard
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.
Retain the host through its embedded legacy controller.
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
---
drivers/mtd/nand/raw/hisi504_nand.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/raw/hisi504_nand.c b/drivers/mtd/nand/raw/hisi504_nand.c
index d97270ec1185..36427a242c2b 100644
--- a/drivers/mtd/nand/raw/hisi504_nand.c
+++ b/drivers/mtd/nand/raw/hisi504_nand.c
@@ -731,6 +731,11 @@ static const struct nand_controller_ops hisi_nfc_controller_ops = {
.attach_chip = hisi_nfc_attach_chip,
};
+static void hisi_nfc_release(struct nand_controller *controller)
+{
+ kfree(container_of(controller, struct hinfc_host, chip.legacy.dummy_controller));
+}
+
static int hisi_nfc_probe(struct platform_device *pdev)
{
int ret = 0, irq, max_chips = HINFC504_MAX_CHIP;
@@ -740,9 +745,14 @@ static int hisi_nfc_probe(struct platform_device *pdev)
struct mtd_info *mtd;
struct device_node *np = dev->of_node;
- host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+ host = kzalloc_obj(*host);
if (!host)
return -ENOMEM;
+ chip = &host->chip;
+ chip->controller = &chip->legacy.dummy_controller;
+ ret = devm_nand_controller_init(dev, chip->controller, hisi_nfc_release);
+ if (ret)
+ return ret;
host->dev = dev;
platform_set_drvdata(pdev, host);
@@ -788,10 +798,16 @@ static int hisi_nfc_probe(struct platform_device *pdev)
if (ret)
return ret;
+ ret = nand_set_release(chip, NULL);
+ if (ret) {
+ nand_cleanup(chip);
+ return ret;
+ }
ret = mtd_device_register(mtd, NULL, 0);
if (ret) {
dev_err(dev, "Err MTD partition=%d\n", ret);
- nand_cleanup(chip);
+ nand_disconnect(chip);
+ mtd_put_master(mtd);
return ret;
}
@@ -806,7 +822,8 @@ static void hisi_nfc_remove(struct platform_device *pdev)
ret = mtd_device_unregister(nand_to_mtd(chip));
WARN_ON(ret);
- nand_cleanup(chip);
+ nand_disconnect(chip);
+ mtd_put_master(nand_to_mtd(chip));
}
#ifdef CONFIG_PM_SLEEP
--
2.53.0
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH 00/58] mtd: rawnand: retain chip and controller state across removal
@ 2026-11-07 10:15 James Hilliard
2026-11-07 19:33 ` [PATCH 25/58] mtd: rawnand: hisi504: retain open-handle state on removal James Hilliard
0 siblings, 1 reply; 2+ messages in thread
From: James Hilliard @ 2026-11-07 10:15 UTC (permalink / raw)
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, linux-kernel, linux-arm-kernel,
linux-sunxi, linux-tegra, linux-mediatek, linux-rockchip,
linux-mips, imx, linux-renesas-soc, linux-amlogic, linux-arm-msm,
James Hilliard, stable
An MTD handle can outlive controller unbind. Its metadata and NAND locks
must remain valid, including when a writable file closes and calls sync,
while further hardware access must be rejected after disconnection.
This builds on earlier MTD removal-lifetime work. Commit 19bfa9ebebb5
("mtd: use refcount to prevent corruption") added MTD reference counting
[0], but retaining an MTD reference does not by itself retain the
driver-owned allocation containing the master. The 2025 read/unbind
discussion also covered raw NAND [1] and highlighted the need to drain
active operations before releasing resources [2]. Tze Yee Ng's SPI-NOR
series addresses the corresponding SPI-NOR paths [3]. This series adds
shared backing-object ownership and applies it to raw-NAND drivers.
Introduce an opt-in backing-object lifetime for MTD masters and separate
raw-NAND hardware disconnection from final cleanup. Registered MTD nodes,
device references and open handles retain the backing chip; nested
partitions also retain their parent metadata. Removal notifiers can
finish I/O before disconnection drains admitted operations. Hardware
resources are then released without waiting for open files to close.
OTP providers retain their callback context through final NVMEM device
release while keeping their existing physical-device parent. Preparatory
patches clear unregistered OTP provider pointers and add opt-in NVMEM
context references.
Share the chip and controller ownership helpers, serialize Macronix OTP
access through the same operation locks, and convert the raw-NAND
controller drivers. Each driver conversion keeps metadata cleanup
separate from hardware teardown, including partially published probes.
Shared controllers remain allocated until their last retained chip is
released. R852 allocates a new chip for each inserted card, and NDFC
allocates controller state per binding, so old handles cannot refer to
replacement media or a new binding.
The series adds the common lifetime support and converts its driver
users. It is based on NAND next at 30daaf3e7897 and Tze Yee Ng's posted
module-reference ordering fix [4], whose patch ID is a prerequisite.
TLA+ models of retained-handle, controller and OTP ownership, including
their assumptions and coverage limits, are available in [5].
[0] https://lore.kernel.org/r/20230620131905.648089-2-alexander.usyskin@intel.com
[1] https://lore.kernel.org/r/CAND4H7dz94Gsi_tXSQmLNme9uROnouOUwuCX9BW_+RCc2ZFDqA@mail.gmail.com
[2] https://lore.kernel.org/r/mafs0bjs73tbq.fsf@kernel.org
[3] https://lore.kernel.org/r/20261022035352.52129-1-tze.yee.ng@altera.com
[4] https://lore.kernel.org/r/20261022035352.52129-2-tze.yee.ng@altera.com
[5] https://github.com/jameshilliard/linux-h616-nand-tla
Assisted-by: Codex:gpt-6-astra
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
---
James Hilliard (58):
mtd: clear OTP provider pointers after unregistering them
nvmem: retain provider context through final device release
mtd: add opt-in lifetime ownership for backing objects
mtd: rawnand: separate hardware disconnection from cleanup
mtd: rawnand: share retained chip and controller ownership
mtd: rawnand: macronix: serialize OTP access with NAND operations
mtd: rawnand: sunxi: retain chip state until the final MTD put
mtd: rawnand: plat_nand: retain open-handle state on removal
mtd: rawnand: gpio: retain open-handle state on removal
mtd: rawnand: stm32_fmc2: retain open-handle state on removal
mtd: rawnand: denali: retain chips across controller removal
mtd: rawnand: arasan: retain chips across controller removal
mtd: rawnand: mxic: retain open-handle state on removal
mtd: rawnand: intel: retain open-handle state on removal
mtd: rawnand: tegra: retain open-handle state on removal
mtd: rawnand: mtk: retain chips across controller removal
mtd: rawnand: rockchip: retain chips across controller removal
mtd: rawnand: atmel: retain chips across controller removal
mtd: rawnand: orion: retain open-handle state on removal
mtd: rawnand: socrates: retain open-handle state on removal
mtd: rawnand: fsl_upm: retain open-handle state on removal
mtd: rawnand: pasemi: retain open-handle state on removal
mtd: rawnand: ams-delta: retain open-handle state on removal
mtd: rawnand: xway: retain open-handle state on removal
mtd: rawnand: hisi504: retain open-handle state on removal
mtd: rawnand: vf610: retain open-handle state on removal
mtd: rawnand: technologic: retain open-handle state on removal
mtd: rawnand: loongson: retain open-handle state on removal
mtd: rawnand: ma35d1: retain open-handle state on removal
mtd: rawnand: pl35x: retain open-handle state on removal
mtd: rawnand: mxc: retain open-handle state on removal
mtd: rawnand: fsmc: retain open-handle state on removal
mtd: rawnand: gpmi: retain open-handle state on removal
mtd: rawnand: omap2: retain open-handle state on removal
mtd: rawnand: marvell: retain open-handle state on removal
mtd: rawnand: renesas: retain open-handle state on removal
mtd: rawnand: meson: retain open-handle state on removal
mtd: rawnand: cadence: retain open-handle state on removal
mtd: rawnand: qcom: retain open-handle state on removal
mtd: rawnand: cafe: retain open-handle state on removal
mtd: rawnand: brcmnand: retain open-handle state on removal
mtd: rawnand: au1550nd: retain chip state across removal
mtd: rawnand: sharpsl: retain chip state across removal
mtd: rawnand: davinci: retain chip state across removal
mtd: rawnand: sh_flctl: retain chip state across removal
mtd: rawnand: lpc32xx_slc: retain chip state across removal
mtd: rawnand: lpc32xx_mlc: retain chip state across removal
mtd: rawnand: ndfc: retain chip state across removal
mtd: rawnand: txx9ndfmc: retain chip state across removal
mtd: rawnand: ingenic: retain chip state across removal
mtd: rawnand: mpc5121: retain chip state across removal
mtd: rawnand: bcm47xxnflash: retain chip state across removal
mtd: rawnand: fsl_elbc: retain chip state across removal
mtd: rawnand: fsl_ifc: retain chip state across removal
mtd: rawnand: r852: retain chip state across removal
mtd: rawnand: nandsim: retain chip state across removal
mtd: rawnand: cs553x: retain chip state across removal
mtd: rawnand: diskonchip: retain chip state across removal
drivers/mtd/mtdcore.c | 214 +++++++++++++++++----
drivers/mtd/nand/raw/Makefile | 1 +
drivers/mtd/nand/raw/ams-delta.c | 29 ++-
drivers/mtd/nand/raw/arasan-nand-controller.c | 57 ++++--
drivers/mtd/nand/raw/atmel/nand-controller.c | 59 ++++--
drivers/mtd/nand/raw/au1550nd.c | 26 ++-
drivers/mtd/nand/raw/bcm47xxnflash/main.c | 23 ++-
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 72 +++++--
drivers/mtd/nand/raw/cadence-nand-controller.c | 60 ++++--
drivers/mtd/nand/raw/cafe_nand.c | 37 +++-
drivers/mtd/nand/raw/cs553x_nand.c | 46 +++--
drivers/mtd/nand/raw/davinci_nand.c | 29 ++-
drivers/mtd/nand/raw/denali.c | 31 ++-
drivers/mtd/nand/raw/denali_dt.c | 21 +-
drivers/mtd/nand/raw/denali_pci.c | 15 +-
drivers/mtd/nand/raw/diskonchip.c | 21 +-
drivers/mtd/nand/raw/fsl_elbc_nand.c | 68 ++++---
drivers/mtd/nand/raw/fsl_ifc_nand.c | 58 ++++--
drivers/mtd/nand/raw/fsl_upm.c | 23 ++-
drivers/mtd/nand/raw/fsmc_nand.c | 22 ++-
drivers/mtd/nand/raw/gpio.c | 21 +-
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 22 ++-
drivers/mtd/nand/raw/hisi504_nand.c | 23 ++-
drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c | 49 +++--
drivers/mtd/nand/raw/intel-nand-controller.c | 22 ++-
drivers/mtd/nand/raw/internals.h | 2 +
drivers/mtd/nand/raw/loongson-nand-controller.c | 23 ++-
drivers/mtd/nand/raw/lpc32xx_mlc.c | 26 ++-
drivers/mtd/nand/raw/lpc32xx_slc.c | 26 ++-
drivers/mtd/nand/raw/marvell_nand.c | 54 ++++--
drivers/mtd/nand/raw/meson_nand.c | 55 ++++--
drivers/mtd/nand/raw/mpc5121_nfc.c | 29 ++-
drivers/mtd/nand/raw/mtk_nand.c | 44 ++++-
drivers/mtd/nand/raw/mxc_nand.c | 24 ++-
drivers/mtd/nand/raw/mxic_nand.c | 26 ++-
drivers/mtd/nand/raw/nand_base.c | 78 ++++++--
drivers/mtd/nand/raw/nand_lifetime.c | 118 ++++++++++++
drivers/mtd/nand/raw/nand_macronix.c | 4 +
drivers/mtd/nand/raw/nandsim.c | 24 ++-
drivers/mtd/nand/raw/ndfc.c | 37 +++-
.../mtd/nand/raw/nuvoton-ma35d1-nand-controller.c | 44 ++++-
drivers/mtd/nand/raw/omap2.c | 45 ++++-
drivers/mtd/nand/raw/orion_nand.c | 27 ++-
drivers/mtd/nand/raw/pasemi_nand.c | 25 ++-
drivers/mtd/nand/raw/pl35x-nand-controller.c | 46 ++++-
drivers/mtd/nand/raw/plat_nand.c | 24 ++-
drivers/mtd/nand/raw/qcom_nandc.c | 74 ++++---
drivers/mtd/nand/raw/r852.c | 111 +++++++----
drivers/mtd/nand/raw/r852.h | 1 +
drivers/mtd/nand/raw/renesas-nand-controller.c | 45 +++--
drivers/mtd/nand/raw/rockchip-nand-controller.c | 49 +++--
drivers/mtd/nand/raw/sh_flctl.c | 25 ++-
drivers/mtd/nand/raw/sharpsl.c | 25 ++-
drivers/mtd/nand/raw/sm_common.c | 15 +-
drivers/mtd/nand/raw/sm_common.h | 2 +-
drivers/mtd/nand/raw/socrates_nand.c | 22 ++-
drivers/mtd/nand/raw/stm32_fmc2_nand.c | 22 ++-
drivers/mtd/nand/raw/sunxi_nand.c | 59 ++++--
drivers/mtd/nand/raw/technologic-nand-controller.c | 25 ++-
drivers/mtd/nand/raw/tegra_nand.c | 37 +++-
drivers/mtd/nand/raw/txx9ndfmc.c | 42 +++-
drivers/mtd/nand/raw/vf610_nfc.c | 22 ++-
drivers/mtd/nand/raw/xway_nand.c | 27 ++-
drivers/nvmem/core.c | 12 +-
drivers/nvmem/internals.h | 1 +
include/linux/mtd/mtd.h | 16 ++
include/linux/mtd/rawnand.h | 21 +-
include/linux/nvmem-provider.h | 10 +
68 files changed, 1949 insertions(+), 544 deletions(-)
---
base-commit: 30daaf3e7897b4a8d9b72e5b0c86dd6e2a4d7d85
change-id: 20261104-submit-rawnand-retained-handle-lifetime-v1-0b4225e5ce0b
prerequisite-patch-id: a51b9cb4077105499133c413d58c7ad21d973b38
Best regards,
--
James Hilliard <james.hilliard1@gmail.com>
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH 25/58] mtd: rawnand: hisi504: retain open-handle state on removal
2026-11-07 10:15 [PATCH 00/58] mtd: rawnand: retain chip and controller state across removal James Hilliard
@ 2026-11-07 19:33 ` James Hilliard
0 siblings, 0 replies; 2+ messages in thread
From: James Hilliard @ 2026-11-07 19:33 UTC (permalink / raw)
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, linux-kernel, linux-arm-kernel,
linux-sunxi, linux-tegra, linux-mediatek, linux-rockchip,
linux-mips, imx, linux-renesas-soc, linux-amlogic, linux-arm-msm,
James Hilliard
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.
Retain the host through its embedded legacy controller.
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
---
drivers/mtd/nand/raw/hisi504_nand.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/raw/hisi504_nand.c b/drivers/mtd/nand/raw/hisi504_nand.c
index d97270ec1185..36427a242c2b 100644
--- a/drivers/mtd/nand/raw/hisi504_nand.c
+++ b/drivers/mtd/nand/raw/hisi504_nand.c
@@ -731,6 +731,11 @@ static const struct nand_controller_ops hisi_nfc_controller_ops = {
.attach_chip = hisi_nfc_attach_chip,
};
+static void hisi_nfc_release(struct nand_controller *controller)
+{
+ kfree(container_of(controller, struct hinfc_host, chip.legacy.dummy_controller));
+}
+
static int hisi_nfc_probe(struct platform_device *pdev)
{
int ret = 0, irq, max_chips = HINFC504_MAX_CHIP;
@@ -740,9 +745,14 @@ static int hisi_nfc_probe(struct platform_device *pdev)
struct mtd_info *mtd;
struct device_node *np = dev->of_node;
- host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+ host = kzalloc_obj(*host);
if (!host)
return -ENOMEM;
+ chip = &host->chip;
+ chip->controller = &chip->legacy.dummy_controller;
+ ret = devm_nand_controller_init(dev, chip->controller, hisi_nfc_release);
+ if (ret)
+ return ret;
host->dev = dev;
platform_set_drvdata(pdev, host);
@@ -788,10 +798,16 @@ static int hisi_nfc_probe(struct platform_device *pdev)
if (ret)
return ret;
+ ret = nand_set_release(chip, NULL);
+ if (ret) {
+ nand_cleanup(chip);
+ return ret;
+ }
ret = mtd_device_register(mtd, NULL, 0);
if (ret) {
dev_err(dev, "Err MTD partition=%d\n", ret);
- nand_cleanup(chip);
+ nand_disconnect(chip);
+ mtd_put_master(mtd);
return ret;
}
@@ -806,7 +822,8 @@ static void hisi_nfc_remove(struct platform_device *pdev)
ret = mtd_device_unregister(nand_to_mtd(chip));
WARN_ON(ret);
- nand_cleanup(chip);
+ nand_disconnect(chip);
+ mtd_put_master(nand_to_mtd(chip));
}
#ifdef CONFIG_PM_SLEEP
--
2.53.0
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-07 20:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-07 10:16 [PATCH 25/58] mtd: rawnand: hisi504: retain open-handle state on removal James Hilliard
-- strict thread matches above, loose matches on Subject: below --
2026-11-07 10:15 [PATCH 00/58] mtd: rawnand: retain chip and controller state across removal James Hilliard
2026-11-07 19:33 ` [PATCH 25/58] mtd: rawnand: hisi504: retain open-handle state on removal James Hilliard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®