[PATCH v10 04/27] spi: spi-mem: add spi_mem_dtr_supports_op()

Jagan Teki jagan at amarulasolutions.com
Sat Jun 26 11:14:53 CEST 2021


On Sat, Jun 26, 2021 at 12:47 AM Pratyush Yadav <p.yadav at ti.com> wrote:
>
> spi_mem_default_supports_op() rejects DTR ops by default to ensure that
> the controller drivers that haven't been updated with DTR support
> continue to reject them. It also makes sure that controllers that don't
> support DTR mode at all (which is most of them at the moment) also
> reject them.
>
> This means that controller drivers that want to support DTR mode can't
> use spi_mem_default_supports_op(). Driver authors have to roll their own
> supports_op() function and mimic the buswidth checks. Or even worse,
> driver authors might skip it completely or get it wrong.
>
> Add spi_mem_dtr_supports_op(). It provides a basic sanity check for DTR
> ops and performs the buswidth requirement check. Move the logic for
> checking buswidth in spi_mem_default_supports_op() to a separate
> function so the logic is not repeated twice.
>
> Signed-off-by: Pratyush Yadav <p.yadav at ti.com>
> ---
>  drivers/spi/spi-mem.c | 32 +++++++++++++++++++++++++++++---
>  include/spi-mem.h     |  2 ++
>  2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
> index 541cd0e5a7..9c1ede1b61 100644
> --- a/drivers/spi/spi-mem.c
> +++ b/drivers/spi/spi-mem.c
> @@ -145,8 +145,8 @@ static int spi_check_buswidth_req(struct spi_slave *slave, u8 buswidth, bool tx)
>         return -ENOTSUPP;
>  }
>
> -bool spi_mem_default_supports_op(struct spi_slave *slave,
> -                                const struct spi_mem_op *op)
> +static bool spi_mem_check_buswidth(struct spi_slave *slave,
> +                                  const struct spi_mem_op *op)
>  {
>         if (spi_check_buswidth_req(slave, op->cmd.buswidth, true))
>                 return false;
> @@ -164,13 +164,39 @@ bool spi_mem_default_supports_op(struct spi_slave *slave,
>                                    op->data.dir == SPI_MEM_DATA_OUT))
>                 return false;
>
> +       return true;
> +}
> +
> +bool spi_mem_dtr_supports_op(struct spi_slave *slave,
> +                            const struct spi_mem_op *op)
> +{
> +       if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2)
> +               return false;
> +
> +       if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2)
> +               return false;
> +
> +       if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2)
> +               return false;
> +
> +       if (op->data.dir != SPI_MEM_NO_DATA &&
> +           op->dummy.buswidth == 8 && op->data.nbytes % 2)
> +               return false;
> +
> +       return spi_mem_check_buswidth(slave, op);
> +}
> +EXPORT_SYMBOL_GPL(spi_mem_dtr_supports_op);

Does this export_symbol is used in U-Boot?

Jagan.


More information about the U-Boot mailing list