spl: nand: sunxi: introduce the nand_wait_int() helper
authorMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 28 Feb 2018 19:51:47 +0000 (20:51 +0100)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Tue, 3 Apr 2018 10:11:04 +0000 (12:11 +0200)
The pattern of polling on a status register until a bit is set or a
timeout occurs is repeated multiple times in the driver. Mutualize the
code by introducing the nand_wait_int() helper that does wait for the
bit to flip or returns an error in case of timeout.

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 608cc997caa21f5fbd0911d8d20fd1f0f5ce67f7..c2f4f2cbf72b1e6d4fa2a2df815f6fd4939f88a6 100644 (file)
@@ -155,6 +155,17 @@ static inline int check_value_negated(int offset, int unexpected_bits,
        return check_value_inner(offset, unexpected_bits, timeout_us, 1);
 }
 
+static int nand_wait_int(void)
+{
+       if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
+                        DEFAULT_TIMEOUT_US)) {
+               printf("nand: timeout waiting for interruption\n");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
 void nand_init(void)
 {
        uint32_t val;
@@ -176,12 +187,7 @@ void nand_init(void)
        writel(NFC_SEND_CMD1 | NFC_WAIT_FLAG | NAND_CMD_RESET,
               SUNXI_NFC_BASE + NFC_CMD);
 
-       if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
-                        DEFAULT_TIMEOUT_US)) {
-               printf("Error timeout waiting for nand reset\n");
-               return;
-       }
-       writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
+       nand_wait_int();
 }
 
 static void nand_apply_config(const struct nfc_config *conf)
@@ -211,13 +217,7 @@ static int nand_load_page(const struct nfc_config *conf, u32 offs)
               ((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR,
               SUNXI_NFC_BASE + NFC_CMD);
 
-       if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
-                        DEFAULT_TIMEOUT_US)) {
-               printf("Error while initializing dma interrupt\n");
-               return -EIO;
-       }
-
-       return 0;
+       return nand_wait_int();
 }
 
 static int nand_reset_column(void)
@@ -231,13 +231,7 @@ static int nand_reset_column(void)
               (1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR | NFC_CMD_RNDOUT,
               SUNXI_NFC_BASE + NFC_CMD);
 
-       if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
-                        DEFAULT_TIMEOUT_US)) {
-               printf("Error while initializing dma interrupt\n");
-               return -1;
-       }
-
-       return 0;
+       return nand_wait_int();
 }
 
 static int nand_read_page(const struct nfc_config *conf, u32 offs,