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