spi: stm32: use callbacks for read_rx and write_tx
authorBen Wolsieffer <ben.wolsieffer@hefring.com>
Thu, 2 Nov 2023 19:37:19 +0000 (15:37 -0400)
committerMark Brown <broonie@kernel.org>
Mon, 13 Nov 2023 01:26:35 +0000 (01:26 +0000)
The STM32F7 will require different read and write routines, so make
these functions into configurable callbacks.

Signed-off-by: Ben Wolsieffer <ben.wolsieffer@hefring.com>
Link: https://lore.kernel.org/r/20231102193722.3042245-3-ben.wolsieffer@hefring.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-stm32.c

index 02d1409d722946a528ce1fc6a19fcf8a0c6c4f96..427788d18532bce46eccb3fc865bb8159ef1cf33 100644 (file)
@@ -229,6 +229,8 @@ struct stm32_spi;
  * time between frames (if driver has this functionality)
  * @set_number_of_data: optional routine to configure registers to desired
  * number of data (if driver has this functionality)
+ * @write_tx: routine to write to transmit register/FIFO
+ * @read_rx: routine to read from receive register/FIFO
  * @transfer_one_dma_start: routine to start transfer a single spi_transfer
  * using DMA
  * @dma_rx_cb: routine to call after DMA RX channel operation is complete
@@ -252,6 +254,8 @@ struct stm32_spi_cfg {
        int (*set_mode)(struct stm32_spi *spi, unsigned int comm_type);
        void (*set_data_idleness)(struct stm32_spi *spi, u32 length);
        int (*set_number_of_data)(struct stm32_spi *spi, u32 length);
+       void (*write_tx)(struct stm32_spi *spi);
+       void (*read_rx)(struct stm32_spi *spi);
        void (*transfer_one_dma_start)(struct stm32_spi *spi);
        void (*dma_rx_cb)(void *data);
        void (*dma_tx_cb)(void *data);
@@ -822,17 +826,17 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id)
 
        if (sr & STM32FX_SPI_SR_TXE) {
                if (spi->tx_buf)
-                       stm32f4_spi_write_tx(spi);
+                       spi->cfg->write_tx(spi);
                if (spi->tx_len == 0)
                        end = true;
        }
 
        if (sr & STM32FX_SPI_SR_RXNE) {
-               stm32f4_spi_read_rx(spi);
+               spi->cfg->read_rx(spi);
                if (spi->rx_len == 0)
                        end = true;
                else if (spi->tx_buf)/* Load data for discontinuous mode */
-                       stm32f4_spi_write_tx(spi);
+                       spi->cfg->write_tx(spi);
        }
 
 end_irq:
@@ -1149,7 +1153,7 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi)
 
        /* starting data transfer when buffer is loaded */
        if (spi->tx_buf)
-               stm32f4_spi_write_tx(spi);
+               spi->cfg->write_tx(spi);
 
        spin_unlock_irqrestore(&spi->lock, flags);
 
@@ -1752,6 +1756,8 @@ static const struct stm32_spi_cfg stm32f4_spi_cfg = {
        .config = stm32fx_spi_config,
        .set_bpw = stm32f4_spi_set_bpw,
        .set_mode = stm32fx_spi_set_mode,
+       .write_tx = stm32f4_spi_write_tx,
+       .read_rx = stm32f4_spi_read_rx,
        .transfer_one_dma_start = stm32fx_spi_transfer_one_dma_start,
        .dma_tx_cb = stm32fx_spi_dma_tx_cb,
        .dma_rx_cb = stm32_spi_dma_rx_cb,
@@ -1775,6 +1781,8 @@ static const struct stm32_spi_cfg stm32h7_spi_cfg = {
        .set_mode = stm32h7_spi_set_mode,
        .set_data_idleness = stm32h7_spi_data_idleness,
        .set_number_of_data = stm32h7_spi_number_of_data,
+       .write_tx = stm32h7_spi_write_txfifo,
+       .read_rx = stm32h7_spi_read_rxfifo,
        .transfer_one_dma_start = stm32h7_spi_transfer_one_dma_start,
        .dma_rx_cb = stm32_spi_dma_rx_cb,
        /*