From 50947be1873f09284049f71035b021ead3108480 Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Fri, 20 Aug 2021 11:14:42 +0800 Subject: [PATCH] drivers: rkflash: Add RK_SFTL configuration Avoid adding redundant FTL code to SPI Nand MTD case. make ARCH=arm rv1126_defconfig test, size -t drivers/rkflash/built-in.a the former size: CONFIG_RK_SFC_NAND=y CONFIG_RK_SFC_NAND_MTD=y CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y text data bss dec hex filename 83237 2757 23716 109710 1ac8e (TOTALS) after adjust: 31677 2705 3624 38006 9476 (TOTALS) For Nor only: CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y 19350 1237 2568 23155 5a73 (TOTALS) Change-Id: I46186393de26512566cc62ceb1490ef35a70be1d Signed-off-by: Jon Lin --- drivers/rkflash/Kconfig | 9 ++++++++ drivers/rkflash/Makefile | 6 ++++-- drivers/rkflash/rkflash_blk.c | 4 ++-- drivers/rkflash/sfc_nand.c | 2 ++ drivers/rkflash/sfc_nand_boot.c | 37 +++++++++++++++++++++++---------- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/drivers/rkflash/Kconfig b/drivers/rkflash/Kconfig index 4c791915e7bc..5c2f4295da15 100644 --- a/drivers/rkflash/Kconfig +++ b/drivers/rkflash/Kconfig @@ -19,6 +19,15 @@ if RK_FLASH comment "Rockchip Flash Devices" +config RK_SFTL + tristate "Rockchip Slc Nand FTL support" + default y + depends on (RK_NAND || (RK_SFC_NAND && RK_SFC_NAND_MTD !=y)) + help + This enables support for Slc Nand FTL. + + Say Y when you have a board with Slc Nand Flash register as block device. + config RK_NANDC_NAND tristate "Rockchip NANDC Slc Nand Devices support" default n diff --git a/drivers/rkflash/Makefile b/drivers/rkflash/Makefile index 283a217eb6ca..f59991e5e933 100644 --- a/drivers/rkflash/Makefile +++ b/drivers/rkflash/Makefile @@ -1,11 +1,13 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_RK_NANDC_NAND) += rkflash_blk.o rkflash_debug.o rksftl.o rknandc_base.o nand_boot.o flash.o nandc.o -obj-$(CONFIG_RK_SFC_NAND) += rkflash_blk.o rkflash_debug.o rksftl.o rksfc_base.o sfc_nand_boot.o sfc_nand.o sfc.o +obj-$(CONFIG_RK_NANDC_NAND) += rkflash_blk.o rkflash_debug.o rknandc_base.o nand_boot.o flash.o nandc.o +obj-$(CONFIG_RK_SFC_NAND) += rkflash_blk.o rkflash_debug.o rksfc_base.o sfc_nand_boot.o sfc_nand.o sfc.o obj-$(CONFIG_RK_SFC_NAND_MTD) += sfc_nand_mtd.o sfc_nand_mtd_bbt.o obj-$(CONFIG_RK_SFC_NOR) += rkflash_blk.o rkflash_debug.o rksfc_base.o sfc_nor_boot.o sfc_nor.o sfc.o obj-$(CONFIG_RK_SFC_NOR_MTD) += sfc_nor_mtd.o +obj-$(CONFIG_RK_SFTL) += rksftl.o + ifdef CONFIG_THUMB2_KERNEL rksftl-$(CONFIG_THUMB2_KERNEL) += rk_sftl_arm_v7_thumb.o else diff --git a/drivers/rkflash/rkflash_blk.c b/drivers/rkflash/rkflash_blk.c index 17ffe73865fe..646aa9c712d7 100644 --- a/drivers/rkflash/rkflash_blk.c +++ b/drivers/rkflash/rkflash_blk.c @@ -122,7 +122,7 @@ static int rkflash_blk_proc_show(struct seq_file *m, void *v) { char *ftl_buf = kzalloc(4096, GFP_KERNEL); -#if IS_ENABLED(CONFIG_RK_NANDC_NAND) || IS_ENABLED(CONFIG_RK_SFC_NAND) +#if IS_ENABLED(CONFIG_RK_SFTL) int real_size = 0; real_size = rknand_proc_ftlread(4096, ftl_buf); @@ -702,7 +702,7 @@ int rkflash_dev_init(void __iomem *reg_addr, break; #endif case FLASH_TYPE_NANDC_NAND: -#if defined(CONFIG_RK_SFC_NAND) || defined(CONFIG_RK_NANDC_NAND) +#if defined(CONFIG_RK_SFTL) rk_sftl_vendor_dev_ops_register(rkflash_dev_vendor_read, rkflash_dev_vendor_write); ret = rk_sftl_vendor_storage_init(); diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c index 75b8b44e5548..77f1348be76c 100644 --- a/drivers/rkflash/sfc_nand.c +++ b/drivers/rkflash/sfc_nand.c @@ -953,6 +953,7 @@ int sfc_nand_read_id(u8 *data) return ret; } +#if defined(CONFIG_RK_SFTL) /* * Read the 1st page's 1st byte of a phy_blk * If not FF, it's bad blk @@ -1007,6 +1008,7 @@ void sfc_nand_ftl_ops_init(void) g_nand_ops.read_page = sfc_nand_read_page; g_nand_ops.bch_sel = NULL; } +#endif static int sfc_nand_enable_QE(void) { diff --git a/drivers/rkflash/sfc_nand_boot.c b/drivers/rkflash/sfc_nand_boot.c index 8db7f8df968f..4c0bd84d7236 100644 --- a/drivers/rkflash/sfc_nand_boot.c +++ b/drivers/rkflash/sfc_nand_boot.c @@ -17,9 +17,11 @@ static int snand_init(void __iomem *reg_addr) ret = sfc_nand_init(); if (ret == 0) { sfnand_dev = sfc_nand_get_private_dev(); -#ifndef CONFIG_RK_SFC_NAND_MTD +#if defined(CONFIG_RK_SFTL) sfc_nand_ftl_ops_init(); ret = sftl_init(); +#elif !defined(CONFIG_RK_SFC_NAND_MTD) +#error "When CONFIG_RK_SFC_NAND_MTD is not used, CONFIG_RK_SFTL is required!" #endif } @@ -28,44 +30,57 @@ static int snand_init(void __iomem *reg_addr) static unsigned int snand_get_capacity(void) { - return sftl_get_density(); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_get_density(); + return 0; } static int snand_write(u32 sec, u32 n_sec, void *p_data) { - return sftl_write(sec, n_sec, p_data); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_write(sec, n_sec, p_data); + return 0; } static int snand_read(u32 sec, u32 n_sec, void *p_data) { - return sftl_read(sec, n_sec, p_data); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_read(sec, n_sec, p_data); + return 0; } static int snand_vendor_read(u32 sec, u32 n_sec, void *p_data) { - return sftl_vendor_read(sec, n_sec, p_data); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_vendor_read(sec, n_sec, p_data); + return 0; } static int snand_vendor_write(u32 sec, u32 n_sec, void *p_data) { - return sftl_vendor_write(sec, n_sec, p_data); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_vendor_write(sec, n_sec, p_data); + return 0; } static int snand_gc(void) { - return sftl_gc(); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_gc(); + return 0; } static int snand_discard(u32 sec, u32 n_sec) { - return sftl_discard(sec, n_sec); + if (IS_ENABLED(CONFIG_RK_SFTL)) + return sftl_discard(sec, n_sec); + return 0; } static void snand_deinit(void) { -#ifndef CONFIG_RK_SFC_NAND_MTD - sftl_deinit(); -#endif + if (IS_ENABLED(CONFIG_RK_SFTL)) + sftl_deinit(); sfc_nand_deinit(); }