[PATCH v7 0/3] rust: spi: add SPI driver abstractions

From: Shuai Liu

Date: Fri Nov 13 2026 - 04:48:06 EST


Rework the device I/O to map onto the lower-level C APIs, as suggested
by Mark Brown [1]: instead of leveraging the C convenience wrappers
(spi_write(), spi_read() and spi_write_then_read()), all device I/O is
now built on a single `SpiDevice::transfer()` primitive that maps onto
spi_sync(). The convenience methods `write()`, `read()` and
`write_then_read()` remain as thin wrappers on top of `transfer()`.

`spi_sync()` requires DMA-safe transfer buffers and Rust slices may be
located anywhere (e.g. on the stack), so the Rust layer owns the
bounce-buffering: every transfer buffer is copied into a kmalloc'd
buffer before submission, and received data is copied back afterwards.
This removes the dependency on the C convenience wrappers (and their
helpers) entirely, and adds full-duplex support via
`Transfer::full_duplex()`, which the wrappers do not offer.

Changes in v7:
- Rework device I/O around a `transfer()` primitive that maps onto
spi_sync(), per Mark Brown's review (patch 2).
- Drop the spi_write()/spi_read() helpers; add
spi_message_init()/spi_message_add_tail() helpers instead (patch 1).

[1] https://lore.kernel.org/rust-for-linux/179451185979.339049.12323339081307899766.b4-review@b4/

Shuai Liu (3):
rust: helpers: add SPI helpers
rust: spi: add SPI driver abstractions
samples: rust: add SPI driver sample

rust/bindings/bindings_helper.h | 1 +
rust/helpers/helpers.c | 1 +
rust/helpers/spi.c | 26 ++
rust/kernel/Kconfig.test | 11 +
rust/kernel/lib.rs | 2 +
rust/kernel/spi.rs | 673 ++++++++++++++++++++++++++++++++
samples/rust/Kconfig | 11 +
samples/rust/Makefile | 1 +
samples/rust/rust_driver_spi.rs | 66 ++++
9 files changed, 792 insertions(+)
create mode 100644 rust/helpers/spi.c
create mode 100644 rust/kernel/spi.rs
create mode 100644 samples/rust/rust_driver_spi.rs

--
2.43.0