mtd: rawnand: gpmi: Fix the driver only sense CS0 R/B issue
authorHan Xu <han.xu@nxp.com>
Wed, 9 Dec 2020 03:51:03 +0000 (21:51 -0600)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Thu, 10 Dec 2020 21:37:33 +0000 (22:37 +0100)
Set the GPMI CTRL1 GANGED_RDYBUSY bit so driver can sense the R/B signal
from all CS.

For the NAND chip MT29F64G08AFAAAWP, only the first chip detected
without the patch.

[    3.764118] nand: device found, Manufacturer ID: 0x2c, Chip ID: 0x68
[    3.770613] nand: Micron MT29F64G08AFAAAWP
[    3.774752] nand: 4096 MiB, SLC, erase size: 1024 KiB, page size: 8192, OOB size: 448
[    3.786421] Bad block table found at page 524160, version 0x01
[    3.792730] Bad block table found at page 524032, version 0x01

After applying the patch

[    3.764445] nand: device found, Manufacturer ID: 0x2c, Chip ID: 0x68
[    3.770941] nand: Micron MT29F64G08AFAAAWP
[    3.775080] nand: 4096 MiB, SLC, erase size: 1024 KiB, page size: 8192, OOB size: 448
[    3.784390] nand: 2 chips detected
[    3.790900] Bad block table found at page 524160, version 0x01
[    3.796776] Bad block table found at page 1048448, version 0x01

Signed-off-by: Han Xu <han.xu@nxp.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20201209035104.22679-2-han.xu@nxp.com
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h

index 0d30f3fbb0452367cfb01cfcdd48d2b7f23e8dab..b06e202cdd0d9934453a71a39dc688464a4bb4a1 100644 (file)
@@ -181,9 +181,11 @@ static int gpmi_init(struct gpmi_nand_data *this)
 
        /*
         * Decouple the chip select from dma channel. We use dma0 for all
-        * the chips.
+        * the chips, force all NAND RDY_BUSY inputs to be sourced from
+        * RDY_BUSY0.
         */
-       writel(BM_GPMI_CTRL1_DECOUPLE_CS, r->gpmi_regs + HW_GPMI_CTRL1_SET);
+       writel(BM_GPMI_CTRL1_DECOUPLE_CS | BM_GPMI_CTRL1_GANGED_RDYBUSY,
+              r->gpmi_regs + HW_GPMI_CTRL1_SET);
 
 err_out:
        pm_runtime_mark_last_busy(this->dev);
index f5e4f26c34da0fd98dc942444c802c6506b0ae77..fc31fd084dcf39d64fc1a8e2e27397f99c7e3794 100644 (file)
 #define BV_GPMI_CTRL1_WRN_DLY_SEL_7_TO_12NS            0x2
 #define BV_GPMI_CTRL1_WRN_DLY_SEL_NO_DELAY             0x3
 
+#define BM_GPMI_CTRL1_GANGED_RDYBUSY                   (1 << 19)
 #define BM_GPMI_CTRL1_BCH_MODE                         (1 << 18)
 
 #define BP_GPMI_CTRL1_DLL_ENABLE                       17