From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/rkflash/sfc_nand.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff --git a/kernel/drivers/rkflash/sfc_nand.c b/kernel/drivers/rkflash/sfc_nand.c index f0eeec9..4accf3d 100644 --- a/kernel/drivers/rkflash/sfc_nand.c +++ b/kernel/drivers/rkflash/sfc_nand.c @@ -311,7 +311,7 @@ return ret; } -static int sfc_nand_wait_busy(u8 *data, int timeout) +static int sfc_nand_wait_busy_sleep(u8 *data, int timeout, int sleep_us) { int ret; int i; @@ -319,7 +319,9 @@ *data = 0; - for (i = 0; i < timeout; i++) { + for (i = 0; i < timeout; i += sleep_us) { + usleep_range(sleep_us, sleep_us + 50); + ret = sfc_nand_read_feature(0xC0, &status); if (ret != SFC_OK) @@ -329,8 +331,6 @@ if (!(status & (1 << 0))) return SFC_OK; - - sfc_delay(1); } return SFC_NAND_WAIT_TIME_OUT; @@ -794,7 +794,7 @@ if (ret != SFC_OK) return ret; - ret = sfc_nand_wait_busy(&status, 1000 * 1000); + ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 1000); if (status & (1 << 2)) return SFC_NAND_PROG_ERASE_ERROR; @@ -851,6 +851,7 @@ op.sfctrl.d32 = 0; op.sfctrl.b.datalines = sfc_nand_dev.prog_lines; op.sfctrl.b.addrbits = 16; + op.sfctrl.b.enbledma = 0; plane = p_nand_info->plane_per_die == 2 ? ((addr >> 6) & 0x1) << 12 : 0; sfc_request(&op, plane, p_page_buf, page_size); @@ -880,7 +881,8 @@ if (ret != SFC_OK) return ret; - ret = sfc_nand_wait_busy(&status, 1000 * 1000); + ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 200); + if (status & (1 << 3)) return SFC_NAND_PROG_ERASE_ERROR; @@ -931,7 +933,10 @@ sfc_get_version() < SFC_VER_3) sfc_nand_rw_preset(); - sfc_nand_wait_busy(&status, 1000 * 1000); + sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50); + if (sfc_nand_dev.manufacturer == 0x01 && status) + sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50); + ecc_result = p_nand_info->ecc_status(); op.sfcmd.d32 = 0; @@ -942,6 +947,7 @@ op.sfctrl.d32 = 0; op.sfctrl.b.datalines = sfc_nand_dev.read_lines; op.sfctrl.b.addrbits = 16; + op.sfctrl.b.enbledma = 0; plane = p_nand_info->plane_per_die == 2 ? ((row >> 6) & 0x1) << 12 : 0; ret = sfc_request(&op, plane | column, p_page_buf, len); -- Gitblit v1.6.2