mtd: spinand: add support for FudanMicro FM25S01A
Subsystems (2)
PATCH v2 1/1 mtd: spinand: add support for FudanMicro FM25S01A
Add support for FudanMicro FM25S01A SPI NAND.
This driver is ported from linux v6.18 and tested on a MT7981 board.
Signed-off-by Tianling Shen <[email protected]>
---
Changes in v2:
- add fmsh manufacturer to core files
--- drivers/mtd/nand/spi/Makefile | 2 +- drivers/mtd/nand/spi/core.c | 1 + drivers/mtd/nand/spi/fmsh.c | 76 +++++++++++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 1 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 drivers/mtd/nand/spi/fmsh.c
drivers/mtd/nand/spi/Makefile +1 -1
@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 spinand-objs := core.o otp.o -spinand-objs += alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o +spinand-objs += alliancememory.o ato.o esmt.o fmsh.o foresee.o gigadevice.o macronix.o spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
drivers/mtd/nand/spi/core.c +1 -0
@@ -1227,6 +1227,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = { &alliancememory_spinand_manufacturer, &ato_spinand_manufacturer, &esmt_c8_spinand_manufacturer, + &fmsh_spinand_manufacturer, &foresee_spinand_manufacturer, &gigadevice_spinand_manufacturer, ¯onix_spinand_manufacturer,
drivers/mtd/nand/spi/fmsh.c new file +76 -0
76 lines not on this page · raw message
include/linux/mtd/spinand.h +1 -0
@@ -361,6 +361,7 @@ struct spinand_manufacturer {extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;extern const struct spinand_manufacturer ato_spinand_manufacturer;extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; +extern const struct spinand_manufacturer fmsh_spinand_manufacturer;extern const struct spinand_manufacturer foresee_spinand_manufacturer;extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;extern const struct spinand_manufacturer macronix_spinand_manufacturer;
Signature · 1 line
2.51.1
Reviewed-by Mikhail Kshevetskiy <[email protected]>
Quoted 137 lines · Tianling Shen
Add support for FudanMicro FM25S01A SPI NAND.
This driver is ported from linux v6.18 and tested on a MT7981 board.
Signed-off-by Tianling Shen <[email protected]>---
Changes in v2:
- add fmsh manufacturer to core files--- drivers/mtd/nand/spi/Makefile | 2 +- drivers/mtd/nand/spi/core.c | 1 + drivers/mtd/nand/spi/fmsh.c | 76 +++++++++++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 1 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 drivers/mtd/nand/spi/fmsh.cdrivers/mtd/nand/spi/Makefile +1
-1@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 spinand-objs := core.o otp.o -spinand-objs += alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o +spinand-objs += alliancememory.o ato.o esmt.o fmsh.o foresee.o gigadevice.o macronix.o spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.odrivers/mtd/nand/spi/core.c +1
-0@@ -1227,6 +1227,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = { &alliancememory_spinand_manufacturer, &ato_spinand_manufacturer, &esmt_c8_spinand_manufacturer, + &fmsh_spinand_manufacturer, &foresee_spinand_manufacturer, &gigadevice_spinand_manufacturer, ¯onix_spinand_manufacturer,drivers/mtd/nand/spi/fmsh.c new file +76
-0@@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd. +* +* Author: Dingqiang Lin <[email protected]> +*/ + +#ifndef __UBOOT__ +#include <linux/device.h> +#include <linux/kernel.h> +#endif +#include <linux/mtd/spinand.h> + +#define SPINAND_MFR_FMSH 0xA1 + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 2, NULL, 0, 0), +SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_FAST_1S_1S_1S_OP (0 ,1 ,NULL ,0 ,0 ), + SPINAND_PAGE_READ_FROM_CACHE_1S_1S_1S_OP(0, 1, NULL, 0, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_1S_1S_4S_OP(true, 0, NULL, 0), + SPINAND_PROG_LOAD_1S_1S_1S_OP(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_1S_1S_4S_OP(false, 0, NULL, 0), + SPINAND_PROG_LOAD_1S_1S_1S_OP(false, 0, NULL, 0)); + +static int fm25s01a_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + return -ERANGE; +} + +static int fm25s01a_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset = 2; + region->length =62 ; + +return 0 ; +} + +static const struct mtd_ooblayout_ops fm25s01a_ooblayout = { + .ecc = fm25s01a_ooblayout_ecc, + .rfree = fm25s01a_ooblayout_free, +}; + +static const struct spinand_info fmsh_spinand_table[] = { +SPINAND_INFO ("FM25S01A" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0xE4 ), +NAND_MEMORG (1 ,2048 ,64 ,64 ,1024 ,20 ,1 ,1 ,1 ), +NAND_ECCREQ (1 ,512 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_HAS_QE_BIT , +SPINAND_ECCINFO (&fm25s01a_ooblayout,NULL )), +}; + +static const struct spinand_manufacturer_ops fmsh_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer fmsh_spinand_manufacturer = { + .id =SPINAND_MFR_FMSH , + .name ="Fudan Micro" , + .chips = fmsh_spinand_table, + .nchips =ARRAY_SIZE (fmsh_spinand_table), + .ops = &fmsh_spinand_manuf_ops, +};include/linux/mtd/spinand.h +1
-0@@ -361,6 +361,7 @@ struct spinand_manufacturer {extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;extern const struct spinand_manufacturer ato_spinand_manufacturer;extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; +extern const struct spinand_manufacturer fmsh_spinand_manufacturer;extern const struct spinand_manufacturer foresee_spinand_manufacturer;extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;extern const struct spinand_manufacturer macronix_spinand_manufacturer;
One more issue found
according to datasheet https://www.fmsh.com/nvm/FM25S01A_ds_eng.pdf
there is no QE bit on this flash
Regards,
Mikhail Kshevetskiy
Quoted 141 lines · Mikhail Kshevetskiy
Reviewed-by Mikhail Kshevetskiy <[email protected]>Quoted 137 lines · Tianling Shen
Add support for FudanMicro FM25S01A SPI NAND.
This driver is ported from linux v6.18 and tested on a MT7981 board.
Signed-off-by Tianling Shen <[email protected]>---
Changes in v2:
- add fmsh manufacturer to core files--- drivers/mtd/nand/spi/Makefile | 2 +- drivers/mtd/nand/spi/core.c | 1 + drivers/mtd/nand/spi/fmsh.c | 76 +++++++++++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 1 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 drivers/mtd/nand/spi/fmsh.cdrivers/mtd/nand/spi/Makefile +1
-1@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 spinand-objs := core.o otp.o -spinand-objs += alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o +spinand-objs += alliancememory.o ato.o esmt.o fmsh.o foresee.o gigadevice.o macronix.o spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.odrivers/mtd/nand/spi/core.c +1
-0@@ -1227,6 +1227,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = { &alliancememory_spinand_manufacturer, &ato_spinand_manufacturer, &esmt_c8_spinand_manufacturer, + &fmsh_spinand_manufacturer, &foresee_spinand_manufacturer, &gigadevice_spinand_manufacturer, ¯onix_spinand_manufacturer,drivers/mtd/nand/spi/fmsh.c new file +76
-0@@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd. +* +* Author: Dingqiang Lin <[email protected]> +*/ + +#ifndef __UBOOT__ +#include <linux/device.h> +#include <linux/kernel.h> +#endif +#include <linux/mtd/spinand.h> + +#define SPINAND_MFR_FMSH 0xA1 + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 2, NULL, 0, 0), +SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP (0 ,1 ,NULL ,0 ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_FAST_1S_1S_1S_OP (0 ,1 ,NULL ,0 ,0 ), + SPINAND_PAGE_READ_FROM_CACHE_1S_1S_1S_OP(0, 1, NULL, 0, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_1S_1S_4S_OP(true, 0, NULL, 0), + SPINAND_PROG_LOAD_1S_1S_1S_OP(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_1S_1S_4S_OP(false, 0, NULL, 0), + SPINAND_PROG_LOAD_1S_1S_1S_OP(false, 0, NULL, 0)); + +static int fm25s01a_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + return -ERANGE; +} + +static int fm25s01a_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset = 2; + region->length =62 ; + +return 0 ; +} + +static const struct mtd_ooblayout_ops fm25s01a_ooblayout = { + .ecc = fm25s01a_ooblayout_ecc, + .rfree = fm25s01a_ooblayout_free, +}; + +static const struct spinand_info fmsh_spinand_table[] = { +SPINAND_INFO ("FM25S01A" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0xE4 ), +NAND_MEMORG (1 ,2048 ,64 ,64 ,1024 ,20 ,1 ,1 ,1 ), +NAND_ECCREQ (1 ,512 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_HAS_QE_BIT , +SPINAND_ECCINFO (&fm25s01a_ooblayout,NULL )), +}; + +static const struct spinand_manufacturer_ops fmsh_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer fmsh_spinand_manufacturer = { + .id =SPINAND_MFR_FMSH , + .name ="Fudan Micro" , + .chips = fmsh_spinand_table, + .nchips =ARRAY_SIZE (fmsh_spinand_table), + .ops = &fmsh_spinand_manuf_ops, +};include/linux/mtd/spinand.h +1
-0@@ -361,6 +361,7 @@ struct spinand_manufacturer {extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;extern const struct spinand_manufacturer ato_spinand_manufacturer;extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; +extern const struct spinand_manufacturer fmsh_spinand_manufacturer;extern const struct spinand_manufacturer foresee_spinand_manufacturer;extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;extern const struct spinand_manufacturer macronix_spinand_manufacturer;