mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-22 18:02:46 +00:00
kernel: add support for mediatek NMBM flash mapping support
This NAND flash remapping method is used on newer MediaTek devices with NAND flash. Signed-off-by: Felix Fietkau <nbd@nbd.name> (cherry-picked from commit 06382d1af7b2c5afcde605db436522326fbf5467)
This commit is contained in:
parent
737ee934d2
commit
bb5d415b19
@ -392,6 +392,8 @@ int mtk_bmt_attach(struct mtd_info *mtd)
|
|||||||
|
|
||||||
if (of_property_read_bool(np, "mediatek,bmt-v2"))
|
if (of_property_read_bool(np, "mediatek,bmt-v2"))
|
||||||
bmtd.ops = &mtk_bmt_v2_ops;
|
bmtd.ops = &mtk_bmt_v2_ops;
|
||||||
|
else if (of_property_read_bool(np, "mediatek,nmbm"))
|
||||||
|
bmtd.ops = &mtk_bmt_nmbm_ops;
|
||||||
else if (of_property_read_bool(np, "mediatek,bbt"))
|
else if (of_property_read_bool(np, "mediatek,bbt"))
|
||||||
bmtd.ops = &mtk_bmt_bbt_ops;
|
bmtd.ops = &mtk_bmt_bbt_ops;
|
||||||
else
|
else
|
||||||
@ -410,14 +412,14 @@ int mtk_bmt_attach(struct mtd_info *mtd)
|
|||||||
bmtd.pg_shift = ffs(bmtd.pg_size) - 1;
|
bmtd.pg_shift = ffs(bmtd.pg_size) - 1;
|
||||||
bmtd.total_blks = mtd->size >> bmtd.blk_shift;
|
bmtd.total_blks = mtd->size >> bmtd.blk_shift;
|
||||||
|
|
||||||
bmtd.data_buf = kzalloc(bmtd.pg_size, GFP_KERNEL);
|
bmtd.data_buf = kzalloc(bmtd.pg_size + bmtd.mtd->oobsize, GFP_KERNEL);
|
||||||
if (!bmtd.data_buf) {
|
if (!bmtd.data_buf) {
|
||||||
pr_info("nand: FATAL ERR: allocate buffer failed!\n");
|
pr_info("nand: FATAL ERR: allocate buffer failed!\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(bmtd.data_buf, 0xff, bmtd.pg_size);
|
memset(bmtd.data_buf, 0xff, bmtd.pg_size + bmtd.mtd->oobsize);
|
||||||
|
|
||||||
ret = bmtd.ops->init(np);
|
ret = bmtd.ops->init(np);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -23,6 +23,9 @@ struct mtk_bmt_ops {
|
|||||||
int (*debug)(void *data, u64 val);
|
int (*debug)(void *data, u64 val);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bbbt;
|
||||||
|
struct nmbm_instance;
|
||||||
|
|
||||||
struct bmt_desc {
|
struct bmt_desc {
|
||||||
struct mtd_info *mtd;
|
struct mtd_info *mtd;
|
||||||
unsigned char *bbt_buf;
|
unsigned char *bbt_buf;
|
||||||
@ -38,7 +41,10 @@ struct bmt_desc {
|
|||||||
|
|
||||||
const struct mtk_bmt_ops *ops;
|
const struct mtk_bmt_ops *ops;
|
||||||
|
|
||||||
struct bbbt *bbt;
|
union {
|
||||||
|
struct bbbt *bbt;
|
||||||
|
struct nmbm_instance *ni;
|
||||||
|
};
|
||||||
|
|
||||||
struct dentry *debugfs_dir;
|
struct dentry *debugfs_dir;
|
||||||
|
|
||||||
@ -70,6 +76,7 @@ struct bmt_desc {
|
|||||||
extern struct bmt_desc bmtd;
|
extern struct bmt_desc bmtd;
|
||||||
extern const struct mtk_bmt_ops mtk_bmt_v2_ops;
|
extern const struct mtk_bmt_ops mtk_bmt_v2_ops;
|
||||||
extern const struct mtk_bmt_ops mtk_bmt_bbt_ops;
|
extern const struct mtk_bmt_ops mtk_bmt_bbt_ops;
|
||||||
|
extern const struct mtk_bmt_ops mtk_bmt_nmbm_ops;
|
||||||
|
|
||||||
static inline u32 blk_pg(u16 block)
|
static inline u32 blk_pg(u16 block)
|
||||||
{
|
{
|
||||||
|
2348
target/linux/generic/files/drivers/mtd/nand/mtk_bmt_nmbm.c
Normal file
2348
target/linux/generic/files/drivers/mtd/nand/mtk_bmt_nmbm.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
nandcore-objs := core.o bbt.o
|
nandcore-objs := core.o bbt.o
|
||||||
obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o
|
obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o
|
||||||
+obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o
|
+obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o
|
||||||
|
|
||||||
obj-y += onenand/
|
obj-y += onenand/
|
||||||
obj-y += raw/
|
obj-y += raw/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user