From f4d765a12815e3f4bd9c4dff5fd88661b3615114 Mon Sep 17 00:00:00 2001 From: Christophe Kerello Date: Mon, 17 May 2021 15:20:31 +0200 Subject: [PATCH] fix(nand): reset the SLC NAND The reset command should be the first command sent to the SLC NAND. Resetting the SLC NAND should not be done only if NAND_ONFI_DETECT is enabled. Change-Id: If225a1b1a7e04181cc5839e282c435c5c8958bd7 Signed-off-by: Christophe Kerello --- drivers/mtd/nand/raw_nand.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/drivers/mtd/nand/raw_nand.c b/drivers/mtd/nand/raw_nand.c index 021e30b3b..3595c2142 100644 --- a/drivers/mtd/nand/raw_nand.c +++ b/drivers/mtd/nand/raw_nand.c @@ -218,6 +218,18 @@ int nand_wait_ready(unsigned int delay_ms) return -ETIMEDOUT; } +static int nand_reset(void) +{ + int ret; + + ret = nand_send_cmd(NAND_CMD_RESET, NAND_TWB_MAX); + if (ret != 0) { + return ret; + } + + return nand_send_wait(PSEC_TO_MSEC(NAND_TRST_MAX), 0U); +} + #if NAND_ONFI_DETECT static uint16_t nand_check_crc(uint16_t crc, uint8_t *data_in, unsigned int data_len) @@ -265,18 +277,6 @@ static int nand_read_id(uint8_t addr, uint8_t *id, unsigned int size) return nand_read_data(id, size, true); } -static int nand_reset(void) -{ - int ret; - - ret = nand_send_cmd(NAND_CMD_RESET, NAND_TWB_MAX); - if (ret != 0) { - return ret; - } - - return nand_send_wait(PSEC_TO_MSEC(NAND_TRST_MAX), 0U); -} - static int nand_read_param_page(void) { struct nand_param_page page; @@ -346,11 +346,6 @@ static int detect_onfi(void) int ret; char id[4]; - ret = nand_reset(); - if (ret != 0) { - return ret; - } - ret = nand_read_id(ONFI_SIGNATURE_ADDR, (uint8_t *)id, sizeof(id)); if (ret != 0) { return ret; @@ -406,6 +401,8 @@ void nand_raw_ctrl_init(const struct nand_ctrl_ops *ops) int nand_raw_init(unsigned long long *size, unsigned int *erase_size) { + int ret; + rawnand_dev.nand_dev = get_nand_device(); if (rawnand_dev.nand_dev == NULL) { return -EINVAL; @@ -420,6 +417,11 @@ int nand_raw_init(unsigned long long *size, unsigned int *erase_size) return -ENODEV; } + ret = nand_reset(); + if (ret != 0) { + return ret; + } + #if NAND_ONFI_DETECT if (detect_onfi() != 0) { WARN("Detect ONFI failed\n");