From b663008560f2609d93371926c0fa8c0b52d0a5c1 Mon Sep 17 00:00:00 2001 From: bkleiner Date: Sun, 14 Apr 2024 16:21:02 +0200 Subject: [PATCH] spi: return state on continue --- src/driver/spi.c | 10 ++++++---- src/driver/spi.h | 11 ++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/driver/spi.c b/src/driver/spi.c index cf8e9cd04..923f3f3c8 100644 --- a/src/driver/spi.c +++ b/src/driver/spi.c @@ -60,22 +60,22 @@ void spi_txn_wait(spi_bus_device_t *bus) { } } -void spi_txn_continue_port(spi_ports_t port) { +bool spi_txn_continue_port(spi_ports_t port) { spi_device_t *dev = &spi_dev[port]; spi_txn_t *txn = NULL; ATOMIC_BLOCK_ALL { if (dev->txn_head == dev->txn_tail) { - return; + return false; } txn = dev->txns[(dev->txn_tail + 1) % SPI_TXN_MAX]; if (txn->status != TXN_READY) { - return; + return false; } if (!spi_txn_can_send(txn->bus, true)) { - return; + return false; } txn->status = TXN_IN_PROGRESS; @@ -98,6 +98,8 @@ void spi_txn_continue_port(spi_ports_t port) { spi_csn_enable(txn->bus); spi_dma_transfer_begin(port, txn->buffer, txn->size); + + return true; } void spi_seg_submit_ex(spi_bus_device_t *bus, const spi_txn_opts_t opts) { diff --git a/src/driver/spi.h b/src/driver/spi.h index b850bce81..201381ee0 100644 --- a/src/driver/spi.h +++ b/src/driver/spi.h @@ -123,7 +123,7 @@ extern const spi_port_def_t spi_port_defs[SPI_PORT_MAX]; void spi_bus_device_init(const spi_bus_device_t *bus); void spi_txn_wait(spi_bus_device_t *bus); -void spi_txn_continue_port(spi_ports_t port); +bool spi_txn_continue_port(spi_ports_t port); void spi_seg_submit_ex(spi_bus_device_t *bus, const spi_txn_opts_t opts); void spi_seg_submit_wait_ex(spi_bus_device_t *bus, const spi_txn_segment_t *segs, const uint32_t count); @@ -131,7 +131,7 @@ void spi_seg_submit_wait_ex(spi_bus_device_t *bus, const spi_txn_segment_t *segs static inline void spi_csn_enable(spi_bus_device_t *bus) { gpio_pin_reset(bus->nss); } static inline void spi_csn_disable(spi_bus_device_t *bus) { gpio_pin_set(bus->nss); } -static inline void spi_txn_continue(spi_bus_device_t *bus) { spi_txn_continue_port(bus->port); } +static inline bool spi_txn_continue(spi_bus_device_t *bus) { return spi_txn_continue_port(bus->port); } static inline void spi_bus_device_reconfigure(spi_bus_device_t *bus, spi_mode_t mode, uint32_t hz) { bus->mode = mode; @@ -162,9 +162,10 @@ static inline bool spi_txn_ready(spi_bus_device_t *bus) { static_assert(count < SPI_TXN_SEG_MAX, "spi segment count > max"); \ spi_seg_submit_ex(bus, (spi_txn_opts_t){.segs = segs, .seg_count = count, __VA_ARGS__}); \ } -#define spi_seg_submit_continue(bus, segs, ...) \ - spi_seg_submit(bus, segs, __VA_ARGS__); \ - spi_txn_continue(bus); +#define spi_seg_submit_continue(bus, segs, ...) ({ \ + spi_seg_submit(bus, segs, __VA_ARGS__); \ + spi_txn_continue(bus); \ +}) static inline void spi_txn_set_done(void *arg) { *((bool *)arg) = true; } #define spi_seg_submit_check(bus, segs, ...) \