[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