hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/rkflash/sfc_nand.c
....@@ -311,7 +311,7 @@
311311 return ret;
312312 }
313313
314
-static int sfc_nand_wait_busy(u8 *data, int timeout)
314
+static int sfc_nand_wait_busy_sleep(u8 *data, int timeout, int sleep_us)
315315 {
316316 int ret;
317317 int i;
....@@ -319,7 +319,9 @@
319319
320320 *data = 0;
321321
322
- for (i = 0; i < timeout; i++) {
322
+ for (i = 0; i < timeout; i += sleep_us) {
323
+ usleep_range(sleep_us, sleep_us + 50);
324
+
323325 ret = sfc_nand_read_feature(0xC0, &status);
324326
325327 if (ret != SFC_OK)
....@@ -329,8 +331,6 @@
329331
330332 if (!(status & (1 << 0)))
331333 return SFC_OK;
332
-
333
- sfc_delay(1);
334334 }
335335
336336 return SFC_NAND_WAIT_TIME_OUT;
....@@ -794,7 +794,7 @@
794794 if (ret != SFC_OK)
795795 return ret;
796796
797
- ret = sfc_nand_wait_busy(&status, 1000 * 1000);
797
+ ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 1000);
798798
799799 if (status & (1 << 2))
800800 return SFC_NAND_PROG_ERASE_ERROR;
....@@ -851,6 +851,7 @@
851851 op.sfctrl.d32 = 0;
852852 op.sfctrl.b.datalines = sfc_nand_dev.prog_lines;
853853 op.sfctrl.b.addrbits = 16;
854
+ op.sfctrl.b.enbledma = 0;
854855 plane = p_nand_info->plane_per_die == 2 ? ((addr >> 6) & 0x1) << 12 : 0;
855856 sfc_request(&op, plane, p_page_buf, page_size);
856857
....@@ -880,7 +881,8 @@
880881 if (ret != SFC_OK)
881882 return ret;
882883
883
- ret = sfc_nand_wait_busy(&status, 1000 * 1000);
884
+ ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 200);
885
+
884886 if (status & (1 << 3))
885887 return SFC_NAND_PROG_ERASE_ERROR;
886888
....@@ -931,7 +933,10 @@
931933 sfc_get_version() < SFC_VER_3)
932934 sfc_nand_rw_preset();
933935
934
- sfc_nand_wait_busy(&status, 1000 * 1000);
936
+ sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50);
937
+ if (sfc_nand_dev.manufacturer == 0x01 && status)
938
+ sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50);
939
+
935940 ecc_result = p_nand_info->ecc_status();
936941
937942 op.sfcmd.d32 = 0;
....@@ -942,6 +947,7 @@
942947 op.sfctrl.d32 = 0;
943948 op.sfctrl.b.datalines = sfc_nand_dev.read_lines;
944949 op.sfctrl.b.addrbits = 16;
950
+ op.sfctrl.b.enbledma = 0;
945951
946952 plane = p_nand_info->plane_per_die == 2 ? ((row >> 6) & 0x1) << 12 : 0;
947953 ret = sfc_request(&op, plane | column, p_page_buf, len);