mtd: spi: Replace ad-hoc default implementation with spi_mem_op
authorMarek Vasut <marek.vasut@gmail.com>
Tue, 2 Apr 2019 00:52:53 +0000 (02:52 +0200)
committerJagan Teki <jagan@amarulasolutions.com>
Fri, 12 Apr 2019 06:12:48 +0000 (11:42 +0530)
Replace the ad-hoc erase operation implementation with a simple spi_mem_op
implementation of the same functionality. This is a minor optimization and
removal of the ad-hoc code.

This however also changes the behavior of the execution of the erase
opcode from two separate transfer requests to the SPI NOR driver to
one transfer request to the SPI NOR driver. The former was how U-Boot
behaved before the SPI NOR framework was imported and the later was
introduced by the SPI NOR framework. The former is more optimal, so
keep that.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Horatiu Vultur <horatiu.vultur@microchip.com>
Cc: Jagan Teki <jagan@openedev.com>
Cc: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Cc: Stefan Roese <sr@denx.de>
Cc: Vignesh R <vigneshr@ti.com>
Tested-by: Ashish Kumar <Ashish.kumar@nxp.com>
drivers/mtd/spi/spi-nor-core.c

index b7f073387796a10e795e7c8b27f16c3a920ee583..c4e2f6a08fa8372cde2e9e5981784e08ec0dac4d 100644 (file)
@@ -524,8 +524,11 @@ static int read_bar(struct spi_nor *nor, const struct flash_info *info)
  */
 static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
 {
-       u8 buf[SPI_NOR_MAX_ADDR_WIDTH];
-       int i;
+       struct spi_mem_op op =
+               SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 1),
+                          SPI_MEM_OP_ADDR(nor->addr_width, addr, 1),
+                          SPI_MEM_OP_NO_DUMMY,
+                          SPI_MEM_OP_NO_DATA);
 
        if (nor->erase)
                return nor->erase(nor, addr);
@@ -534,12 +537,7 @@ static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
         * Default implementation, if driver doesn't have a specialized HW
         * control
         */
-       for (i = nor->addr_width - 1; i >= 0; i--) {
-               buf[i] = addr & 0xff;
-               addr >>= 8;
-       }
-
-       return nor->write_reg(nor, nor->erase_opcode, buf, nor->addr_width);
+       return spi_mem_exec_op(nor->spi, &op);
 }
 
 /*