[PATCH 00/58] mtd: rawnand: retain chip and controller state across removal
James Hilliard
james.hilliard1 at gmail.com
Sat Nov 7 02:15:57 PST 2026
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 at 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 at gmail.com>
More information about the linux-mtd
mailing list