[PATCH 4/4] mtd: spi-nor: aspeed: use command mode for reads
Marek Vasut
marek.vasut at gmail.com
Thu Apr 20 06:31:30 PDT 2017
On 04/20/2017 01:56 PM, Cédric Le Goater wrote:
> When reading flash contents, try to use the "command mode" if the AHB
> window configured for the flash module is big enough. Else, just fall
> back to the "user mode" to perform the read.
>
> Signed-off-by: Cédric Le Goater <clg at kaod.org>
> ---
>
> Changes since initial version :
>
> - rebased on current patchset which removed DMA support
>
> drivers/mtd/spi-nor/aspeed-smc.c | 27 ++++++++++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/spi-nor/aspeed-smc.c b/drivers/mtd/spi-nor/aspeed-smc.c
> index 60c020482946..43015aec4557 100644
> --- a/drivers/mtd/spi-nor/aspeed-smc.c
> +++ b/drivers/mtd/spi-nor/aspeed-smc.c
> @@ -394,6 +394,31 @@ static ssize_t aspeed_smc_read_user(struct spi_nor *nor, loff_t from,
>
> aspeed_smc_read_from_ahb(read_buf, chip->ahb_base, len);
> aspeed_smc_stop_user(nor);
> + return 0;
> +}
> +
> +static ssize_t aspeed_smc_read(struct spi_nor *nor, loff_t from, size_t len,
> + u_char *read_buf)
> +{
> + struct aspeed_smc_chip *chip = nor->priv;
> +
> + /*
> + * The AHB window configured for the chip is too small for the
> + * read offset. Use the "User mode" of the controller to
> + * perform the read.
> + */
> + if (from >= chip->ahb_window_size) {
> + aspeed_smc_read_user(nor, from, len, read_buf);
> + goto out;
What about turning this into dumb if () {} else {} and dropping the goto ?
> + }
> +
> + /*
> + * Use the "Command mode" to do a direct read from the AHB
> + * window configured for the chip. This should be the default.
> + */
> + memcpy_fromio(read_buf, chip->ahb_base + from, len);
> +
> +out:
> return len;
> }
>
> @@ -817,7 +842,7 @@ static int aspeed_smc_setup_flash(struct aspeed_smc_controller *controller,
> nor->dev = dev;
> nor->priv = chip;
> spi_nor_set_flash_node(nor, child);
> - nor->read = aspeed_smc_read_user;
> + nor->read = aspeed_smc_read;
> nor->write = aspeed_smc_write_user;
> nor->read_reg = aspeed_smc_read_reg;
> nor->write_reg = aspeed_smc_write_reg;
>
--
Best regards,
Marek Vasut
More information about the linux-mtd
mailing list