[PATCH v2 0/6] spi: add multi-bus support

David Lechner posted 6 patches 3 months ago
.../devicetree/bindings/iio/adc/adi,ad7380.yaml    |  22 ++++
.../bindings/spi/spi-peripheral-props.yaml         |  12 ++
drivers/iio/adc/ad7380.c                           |  42 ++++---
drivers/spi/spi-axi-spi-engine.c                   | 128 ++++++++++++++++++++-
drivers/spi/spi.c                                  |  28 ++++-
include/linux/spi/spi.h                            |  23 ++++
6 files changed, 237 insertions(+), 18 deletions(-)
[PATCH v2 0/6] spi: add multi-bus support
Posted by David Lechner 3 months ago
This series is adding support for SPI controllers and peripherals that
have multiple SPI data buses (data buses being independent sets of
SDI/SDO lines, each with their own serializer/deserializer).

This series covers this specific use case:

+--------------+    +---------+
| SPI          |    | SPI     |
| Controller   |    | ADC     |
|              |    |         |
|          CS0 |--->| CS      |
|         SCLK |--->| SCLK    |
|          SDO |--->| SDI     |
|         SDI0 |<---| SDOA    |
|         SDI1 |<---| SDOB    |
|         SDI2 |<---| SDOC    |
|         SDI3 |<---| SDOD    |
+--------------+     +--------+

The ADC is a simultaneous sampling ADC that can convert 4 samples at the
same time. It has 4 data output lines (SDOA-D) that each contain the
data of one of the 4 channels. So it requires a SPI controller with 4
separate deserializers in order to receive all of the information at the
same time.

This should also work for the use case in [1] as well. (Some of the
patches in this series were already submitted there). In that case the
SPI controller is used kind of like it is two separate SPI controllers,
each with its own chip select, clock, and data lines.

[1]: https://lore.kernel.org/linux-spi/20250616220054.3968946-1-sean.anderson@linux.dev/

The DT bindings are a fairly straight-forward mapping of which pins on
the peripheral are connected to which pins on the controller. The SPI
core code parses this and makes the information available to drivers.
When a peripheral driver sees that multiple data buses are wired up, it
can chose to use them when sending messages.

The SPI message API is a bit higher-level than just specifying the
number of data lines for a SPI transfer though. I did some research on
other SPI controllers that have this feature. They tend to be the kind
meant for connecting to two flash memory chips at the same time but can
be used more generically as well. They generally have the option to
either use one bus at a time (Sean's use case), or can mirror the same
data on multiple buses (no users of this yet) or can perform striping
of a single data FIFO/DMA stream to/from the two buses (our use case).

For now, the API assumes that if you want to do mirror/striping, then
you want to use all available data buses. Otherwise, it just uses the
first data bus for "normal" SPI transfers.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
Changes in v2:
- Renamed devicetree property spi-buses to spi-data-buses. (Driver code
  was already using spi->data_buses, so it matches).
- Fixed a small bug in the AXI ADC driver changes.
- Moved one line of code in the ADC driver changes.
- Link to v1: https://lore.kernel.org/r/20251014-spi-add-multi-bus-support-v1-0-2098c12d6f5f@baylibre.com

---
David Lechner (6):
      spi: dt-bindings: Add spi-data-buses property
      spi: Support multi-bus controllers
      spi: add multi_bus_mode field to struct spi_transfer
      spi: axi-spi-engine: support SPI_MULTI_BUS_MODE_STRIPE
      dt-bindings: iio: adc: adi,ad7380: add spi-buses property
      iio: adc: ad7380: Add support for multiple SPI buses

 .../devicetree/bindings/iio/adc/adi,ad7380.yaml    |  22 ++++
 .../bindings/spi/spi-peripheral-props.yaml         |  12 ++
 drivers/iio/adc/ad7380.c                           |  42 ++++---
 drivers/spi/spi-axi-spi-engine.c                   | 128 ++++++++++++++++++++-
 drivers/spi/spi.c                                  |  28 ++++-
 include/linux/spi/spi.h                            |  23 ++++
 6 files changed, 237 insertions(+), 18 deletions(-)
---
base-commit: 1a26618e7466b8d825989201086c235e76aa999a
change-id: 20250815-spi-add-multi-bus-support-1b35d05c54f6

Best regards,
-- 
David Lechner <dlechner@baylibre.com>
Re: [PATCH v2 0/6] spi: add multi-bus support
Posted by Jonathan Cameron 3 months ago
On Fri, 07 Nov 2025 14:52:46 -0600
David Lechner <dlechner@baylibre.com> wrote:

> This series is adding support for SPI controllers and peripherals that
> have multiple SPI data buses (data buses being independent sets of
> SDI/SDO lines, each with their own serializer/deserializer).
> 
> This series covers this specific use case:
> 
> +--------------+    +---------+
> | SPI          |    | SPI     |
> | Controller   |    | ADC     |
> |              |    |         |
> |          CS0 |--->| CS      |
> |         SCLK |--->| SCLK    |
> |          SDO |--->| SDI     |
> |         SDI0 |<---| SDOA    |
> |         SDI1 |<---| SDOB    |
> |         SDI2 |<---| SDOC    |
> |         SDI3 |<---| SDOD    |
> +--------------+     +--------+
> 
> The ADC is a simultaneous sampling ADC that can convert 4 samples at the
> same time. It has 4 data output lines (SDOA-D) that each contain the
> data of one of the 4 channels. So it requires a SPI controller with 4
> separate deserializers in order to receive all of the information at the
> same time.
> 
> This should also work for the use case in [1] as well. (Some of the
> patches in this series were already submitted there). In that case the
> SPI controller is used kind of like it is two separate SPI controllers,
> each with its own chip select, clock, and data lines.
> 
> [1]: https://lore.kernel.org/linux-spi/20250616220054.3968946-1-sean.anderson@linux.dev/
> 
> The DT bindings are a fairly straight-forward mapping of which pins on
> the peripheral are connected to which pins on the controller. The SPI
> core code parses this and makes the information available to drivers.
> When a peripheral driver sees that multiple data buses are wired up, it
> can chose to use them when sending messages.
> 
> The SPI message API is a bit higher-level than just specifying the
> number of data lines for a SPI transfer though. I did some research on
> other SPI controllers that have this feature. They tend to be the kind
> meant for connecting to two flash memory chips at the same time but can
> be used more generically as well. They generally have the option to
> either use one bus at a time (Sean's use case), or can mirror the same
> data on multiple buses (no users of this yet) or can perform striping
> of a single data FIFO/DMA stream to/from the two buses (our use case).
> 
> For now, the API assumes that if you want to do mirror/striping, then
> you want to use all available data buses. Otherwise, it just uses the
> first data bus for "normal" SPI transfers.
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>

Series looks good to me. If the SPI and DT folk are fine with it, then
I guess time to ask Mark for another immutable branch so the SPI stuff
can be in the SPI tree and IIO tree.

J
> ---
> Changes in v2:
> - Renamed devicetree property spi-buses to spi-data-buses. (Driver code
>   was already using spi->data_buses, so it matches).
> - Fixed a small bug in the AXI ADC driver changes.
> - Moved one line of code in the ADC driver changes.
> - Link to v1: https://lore.kernel.org/r/20251014-spi-add-multi-bus-support-v1-0-2098c12d6f5f@baylibre.com
> 
> ---
> David Lechner (6):
>       spi: dt-bindings: Add spi-data-buses property
>       spi: Support multi-bus controllers
>       spi: add multi_bus_mode field to struct spi_transfer
>       spi: axi-spi-engine: support SPI_MULTI_BUS_MODE_STRIPE
>       dt-bindings: iio: adc: adi,ad7380: add spi-buses property
>       iio: adc: ad7380: Add support for multiple SPI buses
> 
>  .../devicetree/bindings/iio/adc/adi,ad7380.yaml    |  22 ++++
>  .../bindings/spi/spi-peripheral-props.yaml         |  12 ++
>  drivers/iio/adc/ad7380.c                           |  42 ++++---
>  drivers/spi/spi-axi-spi-engine.c                   | 128 ++++++++++++++++++++-
>  drivers/spi/spi.c                                  |  28 ++++-
>  include/linux/spi/spi.h                            |  23 ++++
>  6 files changed, 237 insertions(+), 18 deletions(-)
> ---
> base-commit: 1a26618e7466b8d825989201086c235e76aa999a
> change-id: 20250815-spi-add-multi-bus-support-1b35d05c54f6
> 
> Best regards,