^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include "rkflash_api.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "rk_sftl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) struct SFNAND_DEV *sfnand_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) static int snand_init(void __iomem *reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) sfc_init(reg_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ret = sfc_nand_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) sfnand_dev = sfc_nand_get_private_dev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #if defined(CONFIG_RK_SFTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) sfc_nand_ftl_ops_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) ret = sftl_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #elif !defined(CONFIG_RK_SFC_NAND_MTD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #error "When CONFIG_RK_SFC_NAND_MTD is not used, CONFIG_RK_SFTL is required!"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static unsigned int snand_get_capacity(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return sftl_get_density();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static int snand_write(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) return sftl_write(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static int snand_read(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) return sftl_read(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static int snand_vendor_read(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return sftl_vendor_read(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static int snand_vendor_write(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return sftl_vendor_write(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static int snand_gc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) return sftl_gc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static int snand_discard(u32 sec, u32 n_sec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return sftl_discard(sec, n_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static void snand_deinit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) sftl_deinit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) sfc_nand_deinit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static int snand_resume(void __iomem *reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) sfc_init(reg_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) return sfc_nand_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) const struct flash_boot_ops sfc_nand_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) snand_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) snand_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) snand_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) snand_get_capacity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) snand_deinit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) snand_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) snand_vendor_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) snand_vendor_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) snand_gc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) snand_discard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };