STRUCT NAND_DEVICE(9)
β¨ struct nand_device(9) β¨
okay bestie so this is a page from the Kernel API Manual and it's all about struct nand_device β literally the blueprint for a NAND device π
let's get into it
π NAME π
struct nand_device β NAND device, that's the whole vibe
πΈ SYNOPSIS πΈ
struct nand_device {
struct mtd_info mtd;
struct nand_memory_organization memorg;
struct nand_ecc ecc;
struct nand_row_converter rowconv;
struct nand_bbt bbt;
const struct nand_ops *ops;
};
π Members π
mtdβ the MTD instance that's attached to the NAND device, it's giving main character energy frmemorgβ memory layout, the whole map of iteccβ the NAND ECC object attached to the NAND device β¨rowconvβ converter that turns a position into a row addressbbtβ bad block table info, no capopsβ the NAND operations attached to the NAND device
π¦ Description π¦
So this is the generic NAND object, okay?
The specialized NAND layers β you know the ones, raw NAND, SPI NAND, OneNAND β they should declare their own NAND object that embeds a nand_device struct. Yup, that's literally how inheritance is done around here π iconic.
Both struct_nand_device->memorg and struct_nand_device->ecc.requirements need to be filled in at device detection time so they reflect what the NAND device can do and what it needs (capabilities/requirements, yk).
Once that's done, you can call nanddev_init π«Ά It handles converting NAND info into MTD info for you, which means the specialized NAND layers should never manually tweak struct_nand_device->mtd β the one exception is the ->_read/write hooks, obvi.
bestie this part matters: don't go hand-editing->mtdyourself, letnanddev_initdo it π
π SEE ALSO π
Kernel file ./include/linux/mtd/nand.h, plus a whole friend group of references:
struct nand_memory_organization(9)struct nand_row_converter(9)struct nand_pos(9)enum nand_page_io_req_type(9)struct nand_page_io_req(9)enum nand_ecc_engine_type(9)enum nand_ecc_placement(9)enum nand_ecc_algo(9)struct nand_ecc_props(9)struct nand_bbt(9)struct nand_ops(9)struct nand_ecc_context(9)struct nand_ecc_engine_ops(9)enum nand_ecc_engine_integration(9)struct nand_ecc_engine(9)struct nand_ecc_req_tweak_ctx(9)struct nand_ecc(9)struct nand_io_iter(9)mtd_to_nanddev(9)nanddev_to_mtd(9)nanddev_page_size(9)nanddev_per_page_oobsize(9)nanddev_pages_per_eraseblock(9)nanddev_pages_per_target(9)nanddev_eraseblocks_per_lun(9)nanddev_eraseblocks_per_target(9)nanddev_target_size(9)nanddev_neraseblocks(9)nanddev_size(9)nanddev_get_memorg(9)nanddev_get_ecc_conf(9)nanddev_get_ecc_nsteps(9)nanddev_get_ecc_bytes_per_step(9)nanddev_get_ecc_requirements(9)nanddev_set_ecc_requirements(9)nanddev_register(9)nanddev_unregister(9)nanddev_set_of_node(9)nanddev_get_of_node(9)nanddev_offs_to_pos(9)nanddev_pos_cmp(9)nanddev_pos_to_offs(9)nanddev_pos_to_row(9)nanddev_pos_next_target(9)nanddev_pos_next_lun(9)nanddev_pos_next_eraseblock(9)nanddev_pos_next_page(9)nanddev_bbt_pos_to_entry(9)nanddev_bbt_is_initialized(9)
and that's the whole page bestie π this one came from ./include/linux/mtd and it's dated October 2026, filed under struct nand_device(9) β periodt π
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms