[U-Boot] [PATCH 1/2] spi: ti_qspi: use 128 bit transfer mode when writing to flash

Jagan Teki jagannadh.teki at gmail.com
Sun Sep 4 16:21:27 CEST 2016


On Thu, Sep 1, 2016 at 1:24 PM, Vignesh R <vigneshr at ti.com> wrote:
> TI QSPI has four 32 bit data registers which can be used to transfer 16
> bytes of data at once. The register group QSPI_SPI_DATA_REG_3,
> QSPI_SPI_DATA_REG_2, QSPI_SPI_DATA_REG_1 and QSPI_SPI_DATA_REG is
> treated as a single 128-bit word for shifting data in and out. The bit
> at QSPI_SPI_DATA_REG_3[31] position is the first bit to be shifted out
> in case of 128 bit transfer mode. Therefore the first byte to be written
> to flash should be at QSPI_SPI_DATA_REG_3[31-25] position.
> Instead of writing 1 byte at a time when interacting with SPI NOR flash,
> make use of all the four registers so that 16 bytes can be transferred
> in one go.
>
> With this patch, the flash write speed increases from ~250KBs/ to
> ~650KB/s on DRA74 EVM.
>
> Signed-off-by: Vignesh R <vigneshr at ti.com>
> ---
>  drivers/spi/ti_qspi.c | 37 +++++++++++++++++++++++++++++++------
>  1 file changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/spi/ti_qspi.c b/drivers/spi/ti_qspi.c
> index bb72cb03ec24..fe2a280cc7ae 100644
> --- a/drivers/spi/ti_qspi.c
> +++ b/drivers/spi/ti_qspi.c
> @@ -23,6 +23,8 @@ DECLARE_GLOBAL_DATA_PTR;
>  #define QSPI_TIMEOUT                    2000000
>  #define QSPI_FCLK                      192000000
>  #define QSPI_DRA7XX_FCLK                76800000
> +#define QSPI_WLEN_MAX_BITS             128
> +#define QSPI_WLEN_MAX_BYTES            (QSPI_WLEN_MAX_BITS >> 3)
>  /* clock control */
>  #define QSPI_CLK_EN                     BIT(31)
>  #define QSPI_CLK_DIV_MAX                0xffff
> @@ -230,13 +232,33 @@ static int __ti_qspi_xfer(struct ti_qspi_priv *priv, unsigned int bitlen,
>  #ifdef CONFIG_AM43XX
>         udelay(100);
>  #endif
> -       while (words--) {
> +       while (words) {
> +               u8 xfer_len = 0;
> +
>                 if (txp) {
> -                       debug("tx cmd %08x dc %08x data %02x\n",
> -                             priv->cmd | QSPI_WR_SNGL, priv->dc, *txp);
> -                       writel(*txp++, &priv->base->data);
> -                       writel(priv->cmd | QSPI_WR_SNGL,
> -                              &priv->base->cmd);
> +                       u32 cmd = priv->cmd;

Don't we require cmd mask for WLEN_MAX_BITS?

thanks!
-- 
Jagan.


More information about the U-Boot mailing list