mtd: nxp-spifi: return amount of data transferred or error in read/write
authorBrian Norris <computersforpeace@gmail.com>
Fri, 6 May 2016 00:31:51 +0000 (17:31 -0700)
committerBrian Norris <computersforpeace@gmail.com>
Thu, 2 Jun 2016 00:22:45 +0000 (17:22 -0700)
Add checking of SPI transfer errors and return them from read/write
functions. Also return the amount of data transferred.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/spi-nor/nxp-spifi.c

index 187adba5e69fa85c464a4d4b77a54b6c88dcd610..b0fb86996b8fd033920be6af49296f9bdab269c5 100644 (file)
@@ -185,7 +185,7 @@ static ssize_t nxp_spifi_read(struct spi_nor *nor, loff_t from, size_t len,
        memcpy_fromio(buf, spifi->flash_base + from, len);
        *retlen += len;
 
-       return 0;
+       return len;
 }
 
 static ssize_t nxp_spifi_write(struct spi_nor *nor, loff_t to, size_t len,
@@ -194,6 +194,7 @@ static ssize_t nxp_spifi_write(struct spi_nor *nor, loff_t to, size_t len,
        struct nxp_spifi *spifi = nor->priv;
        u32 cmd;
        int ret;
+       size_t i;
 
        ret = nxp_spifi_set_memory_mode_off(spifi);
        if (ret)
@@ -209,10 +210,14 @@ static ssize_t nxp_spifi_write(struct spi_nor *nor, loff_t to, size_t len,
              SPIFI_CMD_FRAMEFORM(spifi->nor.addr_width + 1);
        writel(cmd, spifi->io_base + SPIFI_CMD);
 
-       while (len--)
-               writeb(*buf++, spifi->io_base + SPIFI_DATA);
+       for (i = 0; i < len; i++)
+               writeb(buf[i], spifi->io_base + SPIFI_DATA);
 
-       return nxp_spifi_wait_for_cmd(spifi);
+       ret = nxp_spifi_wait_for_cmd(spifi);
+       if (ret)
+               return ret;
+
+       return len;
 }
 
 static int nxp_spifi_erase(struct spi_nor *nor, loff_t offs)