spl: nand: sunxi: ensure enough time has passed after changing the column
authorMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 28 Feb 2018 19:51:51 +0000 (20:51 +0100)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Tue, 3 Apr 2018 10:11:22 +0000 (12:11 +0200)
When changing the column, the ONFI specification states that a minimum
time of tCCS (Change Column Setup time) must elapse between the last
address cycle is asserted on the bus and the first data cycle is
clocked. An usual value for average NANDs is 500 nanoseconds. Round it
up to 1 microsecond to be safe.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
drivers/mtd/nand/sunxi_nand_spl.c

index 25a0941fd2c68f3d84b271b59b9c2fbf8578d0e1..d63aa978d4ff553de6ce7da9b01fa0085026f8fa 100644 (file)
@@ -243,15 +243,24 @@ static int nand_load_page(const struct nfc_config *conf, u32 offs)
 
 static int nand_reset_column(void)
 {
+       int ret;
+
        writel((NFC_CMD_RNDOUTSTART << NFC_RANDOM_READ_CMD1_OFFSET) |
               (NFC_CMD_RNDOUT << NFC_RANDOM_READ_CMD0_OFFSET) |
               (NFC_CMD_RNDOUTSTART << NFC_READ_CMD_OFFSET),
               SUNXI_NFC_BASE + NFC_RCMD_SET);
        writel(0, SUNXI_NFC_BASE + NFC_ADDR_LOW);
 
-       return nand_exec_cmd(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_RAW_CMD |
-                            (1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR |
-                            NFC_CMD_RNDOUT);
+       ret = nand_exec_cmd(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_RAW_CMD |
+                           (1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR |
+                           NFC_CMD_RNDOUT);
+       if (ret)
+               return ret;
+
+       /* Ensure tCCS has passed before reading data */
+       udelay(1);
+
+       return 0;
 }
 
 static int nand_read_page(const struct nfc_config *conf, u32 offs,