[PATCH v4 3/8] mtd: spi-nor: Reorder the preparation vs locking steps

Tudor Ambarus tudor.ambarus at linaro.org
Thu Mar 16 20:39:10 PDT 2023



On 2/1/23 11:35, Miquel Raynal wrote:
> The ->prepare()/->unprepare() hooks are now legacy, we no longer accept
> new drivers supporting them. The only remaining controllers using them
> acquires a per-chip mutex, which should not interfere with the rest of
> the operation done in the core. As a result, we should be safe to
> reorganize these helpers to first perform the preparation, before
> acquiring the core locks. This is necessary in order to be able to
> improve the locking mechanism in the core (coming next). No side effects
> are expected.
> 
> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>

Reviewed-by: Tudor Ambarus <tudor.ambarus at linaro.org>

> ---
>  drivers/mtd/spi-nor/core.c | 23 ++++++++++-------------
>  1 file changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
> index 3845de9c874c..01932dbaa5b9 100644
> --- a/drivers/mtd/spi-nor/core.c
> +++ b/drivers/mtd/spi-nor/core.c
> @@ -1071,27 +1071,24 @@ static void spi_nor_set_4byte_opcodes(struct spi_nor *nor)
>  	}
>  }
>  
> -int spi_nor_lock_and_prep(struct spi_nor *nor)
> +int spi_nor_prep_and_lock(struct spi_nor *nor)
>  {
>  	int ret = 0;
>  
> -	mutex_lock(&nor->lock);
> -
> -	if (nor->controller_ops &&  nor->controller_ops->prepare) {
> +	if (nor->controller_ops && nor->controller_ops->prepare)
>  		ret = nor->controller_ops->prepare(nor);
> -		if (ret) {
> -			mutex_unlock(&nor->lock);
> -			return ret;
> -		}
> -	}
> +
> +	mutex_lock(&nor->lock);
> +
>  	return ret;
>  }
>  
>  void spi_nor_unlock_and_unprep(struct spi_nor *nor)
>  {
> +	mutex_unlock(&nor->lock);
> +
>  	if (nor->controller_ops && nor->controller_ops->unprepare)
>  		nor->controller_ops->unprepare(nor);
> -	mutex_unlock(&nor->lock);
>  }
>  
>  static u32 spi_nor_convert_addr(struct spi_nor *nor, loff_t addr)
> @@ -1447,7 +1444,7 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
>  	addr = instr->addr;
>  	len = instr->len;
>  
> -	ret = spi_nor_lock_and_prep(nor);
> +	ret = spi_nor_prep_and_lock(nor);
>  	if (ret)
>  		return ret;
>  
> @@ -1707,7 +1704,7 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
>  
>  	dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len);
>  
> -	ret = spi_nor_lock_and_prep(nor);
> +	ret = spi_nor_prep_and_lock(nor);
>  	if (ret)
>  		return ret;
>  
> @@ -1753,7 +1750,7 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
>  
>  	dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len);
>  
> -	ret = spi_nor_lock_and_prep(nor);
> +	ret = spi_nor_prep_and_lock(nor);
>  	if (ret)
>  		return ret;
>  



More information about the linux-arm-kernel mailing list