From 75bbb6dd9f9b46ce7fc77497dcd57f777c9e957b Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Thu, 10 Jul 2025 15:12:26 +0200 Subject: [PATCH 1/3] drivers: spi: mchp_mss: Make more universal The driver has ignored the first RX buffer. Most likely it has been modeled for accesses to a SPI flash or similar where the first read data is not relevant. This commit makes sure that the driver can work as a universal SPI master instead. Signed-off-by: Christian Mauderer --- drivers/spi/spi_mchp_mss.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/drivers/spi/spi_mchp_mss.c b/drivers/spi/spi_mchp_mss.c index fcf58687f6287..6758b15c0aecd 100644 --- a/drivers/spi/spi_mchp_mss.c +++ b/drivers/spi/spi_mchp_mss.c @@ -192,29 +192,20 @@ static inline void mss_spi_readwr_fifo(const struct device *dev) struct mss_spi_data *data = dev->data; struct spi_context *ctx = &data->ctx; struct mss_spi_transfer *xfer = &data->xfer; - uint32_t rx_raw = 0, rd_byte_size, tr_len; + uint32_t rx_raw = 0; uint32_t data8, transfer_idx = 0; int count; - tr_len = spi_context_longest_current_buf(ctx); count = spi_context_total_tx_len(ctx); - if (ctx->rx_buf) { - rd_byte_size = count - tr_len; - } else { - rd_byte_size = 0; - } mss_spi_hw_tfsz_set(cfg, count); mss_spi_enable_ints(cfg); - spi_context_update_rx(ctx, 1, xfer->rx_len); while (transfer_idx < count) { if (!(mss_spi_read(cfg, MSS_SPI_REG_STATUS) & MSS_SPI_STATUS_RXFIFO_EMPTY)) { rx_raw = mss_spi_read(cfg, MSS_SPI_REG_RX_DATA); - if (transfer_idx >= tr_len) { - if (spi_context_rx_buf_on(ctx)) { - UNALIGNED_PUT(rx_raw, (uint8_t *)ctx->rx_buf); - spi_context_update_rx(ctx, 1, 1); - } + if (spi_context_rx_buf_on(ctx)) { + UNALIGNED_PUT(rx_raw, (uint8_t *)ctx->rx_buf); + spi_context_update_rx(ctx, 1, 1); } ++transfer_idx; } From 9539923b5e67b67e3b9cabdefaa187ac7af6e084 Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Fri, 11 Jul 2025 08:50:52 +0200 Subject: [PATCH 2/3] drivers: spi: mchp_mss: Handle NULL buffers better At the moment, if you would pass a NULL buffer to the driver, the rx and tx counts of that buffer would not advance. This patch fixes that. Signed-off-by: Christian Mauderer --- drivers/spi/spi_mchp_mss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/spi/spi_mchp_mss.c b/drivers/spi/spi_mchp_mss.c index 6758b15c0aecd..f18fd177e7fdb 100644 --- a/drivers/spi/spi_mchp_mss.c +++ b/drivers/spi/spi_mchp_mss.c @@ -205,8 +205,8 @@ static inline void mss_spi_readwr_fifo(const struct device *dev) rx_raw = mss_spi_read(cfg, MSS_SPI_REG_RX_DATA); if (spi_context_rx_buf_on(ctx)) { UNALIGNED_PUT(rx_raw, (uint8_t *)ctx->rx_buf); - spi_context_update_rx(ctx, 1, 1); } + spi_context_update_rx(ctx, 1, 1); ++transfer_idx; } @@ -214,10 +214,10 @@ static inline void mss_spi_readwr_fifo(const struct device *dev) if (spi_context_tx_buf_on(ctx)) { data8 = ctx->tx_buf[0]; mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, data8); - spi_context_update_tx(ctx, 1, 1); } else { mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, 0x0); } + spi_context_update_tx(ctx, 1, 1); } } } From fc7d7382c11c45ba66a9d666e4301ac90511b3ea Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Fri, 11 Jul 2025 09:58:50 +0200 Subject: [PATCH 3/3] drivers: spi: mchp_mss: Avoid sending extra bytes The driver did send some extra 0 bytes when the receive hasn't been finished yet. This patch makes sure to avoid that. Signed-off-by: Christian Mauderer --- drivers/spi/spi_mchp_mss.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/spi/spi_mchp_mss.c b/drivers/spi/spi_mchp_mss.c index f18fd177e7fdb..336edf0ae45ab 100644 --- a/drivers/spi/spi_mchp_mss.c +++ b/drivers/spi/spi_mchp_mss.c @@ -211,13 +211,15 @@ static inline void mss_spi_readwr_fifo(const struct device *dev) } if (!(mss_spi_read(cfg, MSS_SPI_REG_STATUS) & MSS_SPI_STATUS_TXFIFO_FULL)) { - if (spi_context_tx_buf_on(ctx)) { - data8 = ctx->tx_buf[0]; - mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, data8); - } else { - mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, 0x0); + if (spi_context_tx_on(ctx)) { + if (spi_context_tx_buf_on(ctx)) { + data8 = ctx->tx_buf[0]; + mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, data8); + } else { + mss_spi_write(cfg, MSS_SPI_REG_TX_DATA, 0x0); + } + spi_context_update_tx(ctx, 1, 1); } - spi_context_update_tx(ctx, 1, 1); } } }