Commit f44b3730 authored by Mark Brown's avatar Mark Brown

Merge existing fixes from spi/for-6.10 into new branch

parents 1613e604 3aac9f48
...@@ -1016,8 +1016,10 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id) ...@@ -1016,8 +1016,10 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id)
static irqreturn_t stm32fx_spi_irq_thread(int irq, void *dev_id) static irqreturn_t stm32fx_spi_irq_thread(int irq, void *dev_id)
{ {
struct spi_controller *ctrl = dev_id; struct spi_controller *ctrl = dev_id;
struct stm32_spi *spi = spi_controller_get_devdata(ctrl);
spi_finalize_current_transfer(ctrl); spi_finalize_current_transfer(ctrl);
stm32fx_spi_disable(spi);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -1185,8 +1187,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl, ...@@ -1185,8 +1187,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl,
~clrb) | setb, ~clrb) | setb,
spi->base + spi->cfg->regs->cpol.reg); spi->base + spi->cfg->regs->cpol.reg);
stm32_spi_enable(spi);
spin_unlock_irqrestore(&spi->lock, flags); spin_unlock_irqrestore(&spi->lock, flags);
return 0; return 0;
...@@ -1204,6 +1204,7 @@ static void stm32fx_spi_dma_tx_cb(void *data) ...@@ -1204,6 +1204,7 @@ static void stm32fx_spi_dma_tx_cb(void *data)
if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) { if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
spi_finalize_current_transfer(spi->ctrl); spi_finalize_current_transfer(spi->ctrl);
stm32fx_spi_disable(spi);
} }
} }
...@@ -1218,6 +1219,7 @@ static void stm32_spi_dma_rx_cb(void *data) ...@@ -1218,6 +1219,7 @@ static void stm32_spi_dma_rx_cb(void *data)
struct stm32_spi *spi = data; struct stm32_spi *spi = data;
spi_finalize_current_transfer(spi->ctrl); spi_finalize_current_transfer(spi->ctrl);
spi->cfg->disable(spi);
} }
/** /**
...@@ -1305,6 +1307,8 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi) ...@@ -1305,6 +1307,8 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi)
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, cr2); stm32_spi_set_bits(spi, STM32FX_SPI_CR2, cr2);
stm32_spi_enable(spi);
/* starting data transfer when buffer is loaded */ /* starting data transfer when buffer is loaded */
if (spi->tx_buf) if (spi->tx_buf)
spi->cfg->write_tx(spi); spi->cfg->write_tx(spi);
...@@ -1341,6 +1345,8 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi) ...@@ -1341,6 +1345,8 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
spin_lock_irqsave(&spi->lock, flags); spin_lock_irqsave(&spi->lock, flags);
stm32_spi_enable(spi);
/* Be sure to have data in fifo before starting data transfer */ /* Be sure to have data in fifo before starting data transfer */
if (spi->tx_buf) if (spi->tx_buf)
stm32h7_spi_write_txfifo(spi); stm32h7_spi_write_txfifo(spi);
...@@ -1372,6 +1378,8 @@ static void stm32fx_spi_transfer_one_dma_start(struct stm32_spi *spi) ...@@ -1372,6 +1378,8 @@ static void stm32fx_spi_transfer_one_dma_start(struct stm32_spi *spi)
*/ */
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, STM32FX_SPI_CR2_ERRIE); stm32_spi_set_bits(spi, STM32FX_SPI_CR2, STM32FX_SPI_CR2_ERRIE);
} }
stm32_spi_enable(spi);
} }
/** /**
...@@ -1405,6 +1413,8 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi) ...@@ -1405,6 +1413,8 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)
stm32_spi_set_bits(spi, STM32H7_SPI_IER, ier); stm32_spi_set_bits(spi, STM32H7_SPI_IER, ier);
stm32_spi_enable(spi);
if (STM32_SPI_HOST_MODE(spi)) if (STM32_SPI_HOST_MODE(spi))
stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART); stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART);
} }
......
...@@ -1243,6 +1243,7 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg) ...@@ -1243,6 +1243,7 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
else else
rx_dev = ctlr->dev.parent; rx_dev = ctlr->dev.parent;
ret = -ENOMSG;
list_for_each_entry(xfer, &msg->transfers, transfer_list) { list_for_each_entry(xfer, &msg->transfers, transfer_list) {
/* The sync is done before each transfer. */ /* The sync is done before each transfer. */
unsigned long attrs = DMA_ATTR_SKIP_CPU_SYNC; unsigned long attrs = DMA_ATTR_SKIP_CPU_SYNC;
...@@ -1272,6 +1273,9 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg) ...@@ -1272,6 +1273,9 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
} }
} }
} }
/* No transfer has been mapped, bail out with success */
if (ret)
return 0;
ctlr->cur_rx_dma_dev = rx_dev; ctlr->cur_rx_dma_dev = rx_dev;
ctlr->cur_tx_dma_dev = tx_dev; ctlr->cur_tx_dma_dev = tx_dev;
...@@ -1307,7 +1311,7 @@ static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg) ...@@ -1307,7 +1311,7 @@ static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
return 0; return 0;
} }
static void spi_dma_sync_for_device(struct spi_controller *ctlr, static void spi_dma_sync_for_device(struct spi_controller *ctlr, struct spi_message *msg,
struct spi_transfer *xfer) struct spi_transfer *xfer)
{ {
struct device *rx_dev = ctlr->cur_rx_dma_dev; struct device *rx_dev = ctlr->cur_rx_dma_dev;
...@@ -1316,11 +1320,14 @@ static void spi_dma_sync_for_device(struct spi_controller *ctlr, ...@@ -1316,11 +1320,14 @@ static void spi_dma_sync_for_device(struct spi_controller *ctlr,
if (!ctlr->cur_msg_mapped) if (!ctlr->cur_msg_mapped)
return; return;
if (!ctlr->can_dma(ctlr, msg->spi, xfer))
return;
dma_sync_sgtable_for_device(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE); dma_sync_sgtable_for_device(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
dma_sync_sgtable_for_device(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE); dma_sync_sgtable_for_device(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
} }
static void spi_dma_sync_for_cpu(struct spi_controller *ctlr, static void spi_dma_sync_for_cpu(struct spi_controller *ctlr, struct spi_message *msg,
struct spi_transfer *xfer) struct spi_transfer *xfer)
{ {
struct device *rx_dev = ctlr->cur_rx_dma_dev; struct device *rx_dev = ctlr->cur_rx_dma_dev;
...@@ -1329,6 +1336,9 @@ static void spi_dma_sync_for_cpu(struct spi_controller *ctlr, ...@@ -1329,6 +1336,9 @@ static void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
if (!ctlr->cur_msg_mapped) if (!ctlr->cur_msg_mapped)
return; return;
if (!ctlr->can_dma(ctlr, msg->spi, xfer))
return;
dma_sync_sgtable_for_cpu(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE); dma_sync_sgtable_for_cpu(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
dma_sync_sgtable_for_cpu(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE); dma_sync_sgtable_for_cpu(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
} }
...@@ -1346,11 +1356,13 @@ static inline int __spi_unmap_msg(struct spi_controller *ctlr, ...@@ -1346,11 +1356,13 @@ static inline int __spi_unmap_msg(struct spi_controller *ctlr,
} }
static void spi_dma_sync_for_device(struct spi_controller *ctrl, static void spi_dma_sync_for_device(struct spi_controller *ctrl,
struct spi_message *msg,
struct spi_transfer *xfer) struct spi_transfer *xfer)
{ {
} }
static void spi_dma_sync_for_cpu(struct spi_controller *ctrl, static void spi_dma_sync_for_cpu(struct spi_controller *ctrl,
struct spi_message *msg,
struct spi_transfer *xfer) struct spi_transfer *xfer)
{ {
} }
...@@ -1622,10 +1634,10 @@ static int spi_transfer_one_message(struct spi_controller *ctlr, ...@@ -1622,10 +1634,10 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
reinit_completion(&ctlr->xfer_completion); reinit_completion(&ctlr->xfer_completion);
fallback_pio: fallback_pio:
spi_dma_sync_for_device(ctlr, xfer); spi_dma_sync_for_device(ctlr, msg, xfer);
ret = ctlr->transfer_one(ctlr, msg->spi, xfer); ret = ctlr->transfer_one(ctlr, msg->spi, xfer);
if (ret < 0) { if (ret < 0) {
spi_dma_sync_for_cpu(ctlr, xfer); spi_dma_sync_for_cpu(ctlr, msg, xfer);
if (ctlr->cur_msg_mapped && if (ctlr->cur_msg_mapped &&
(xfer->error & SPI_TRANS_FAIL_NO_START)) { (xfer->error & SPI_TRANS_FAIL_NO_START)) {
...@@ -1650,7 +1662,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr, ...@@ -1650,7 +1662,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
msg->status = ret; msg->status = ret;
} }
spi_dma_sync_for_cpu(ctlr, xfer); spi_dma_sync_for_cpu(ctlr, msg, xfer);
} else { } else {
if (xfer->len) if (xfer->len)
dev_err(&msg->spi->dev, dev_err(&msg->spi->dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment