[U-Boot] [PATCH] mtd: spi: Replace ad-hoc default implementation with spi_mem_op

Vignesh Raghavendra vigneshr at ti.com
Tue Apr 2 04:34:06 UTC 2019


+ Ashish,

On 02/04/19 6:22 AM, Marek Vasut wrote:
> 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 at gmail.com>
> Cc: Horatiu Vultur <horatiu.vultur at microchip.com>
> Cc: Jagan Teki <jagan at openedev.com>
> Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
> Cc: Stefan Roese <sr at denx.de>
> Cc: Vignesh R <vigneshr at ti.com>
> ---

Marek, thanks for the fix!

Jagan,

Could we get this merged before v2019.04 release as this should fix
regression wrt erase reported by Ashish.

>  drivers/mtd/spi/spi-nor-core.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
> index b7f0733877..c4e2f6a08f 100644
> --- a/drivers/mtd/spi/spi-nor-core.c
> +++ b/drivers/mtd/spi/spi-nor-core.c
> @@ -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);
>  }
>  
>  /*
> 

-- 
Regards
Vignesh


More information about the U-Boot mailing list