mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
Merge existing fixes from spi/for-6.10 into new branch
This commit is contained in:
commit
f44b3730b0
|
|
@ -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)
|
||||
{
|
||||
struct spi_controller *ctrl = dev_id;
|
||||
struct stm32_spi *spi = spi_controller_get_devdata(ctrl);
|
||||
|
||||
spi_finalize_current_transfer(ctrl);
|
||||
stm32fx_spi_disable(spi);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
@ -1185,8 +1187,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl,
|
|||
~clrb) | setb,
|
||||
spi->base + spi->cfg->regs->cpol.reg);
|
||||
|
||||
stm32_spi_enable(spi);
|
||||
|
||||
spin_unlock_irqrestore(&spi->lock, flags);
|
||||
|
||||
return 0;
|
||||
|
|
@ -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) {
|
||||
spi_finalize_current_transfer(spi->ctrl);
|
||||
stm32fx_spi_disable(spi);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1218,6 +1219,7 @@ static void stm32_spi_dma_rx_cb(void *data)
|
|||
struct stm32_spi *spi = data;
|
||||
|
||||
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)
|
|||
|
||||
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, cr2);
|
||||
|
||||
stm32_spi_enable(spi);
|
||||
|
||||
/* starting data transfer when buffer is loaded */
|
||||
if (spi->tx_buf)
|
||||
spi->cfg->write_tx(spi);
|
||||
|
|
@ -1341,6 +1345,8 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
|
|||
|
||||
spin_lock_irqsave(&spi->lock, flags);
|
||||
|
||||
stm32_spi_enable(spi);
|
||||
|
||||
/* Be sure to have data in fifo before starting data transfer */
|
||||
if (spi->tx_buf)
|
||||
stm32h7_spi_write_txfifo(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_enable(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_enable(spi);
|
||||
|
||||
if (STM32_SPI_HOST_MODE(spi))
|
||||
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)
|
|||
else
|
||||
rx_dev = ctlr->dev.parent;
|
||||
|
||||
ret = -ENOMSG;
|
||||
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
|
||||
/* The sync is done before each transfer. */
|
||||
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)
|
|||
}
|
||||
}
|
||||
}
|
||||
/* No transfer has been mapped, bail out with success */
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
ctlr->cur_rx_dma_dev = rx_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)
|
|||
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 device *rx_dev = ctlr->cur_rx_dma_dev;
|
||||
|
|
@ -1316,11 +1320,14 @@ static void spi_dma_sync_for_device(struct spi_controller *ctlr,
|
|||
if (!ctlr->cur_msg_mapped)
|
||||
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(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 device *rx_dev = ctlr->cur_rx_dma_dev;
|
||||
|
|
@ -1329,6 +1336,9 @@ static void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
|
|||
if (!ctlr->cur_msg_mapped)
|
||||
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(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
|
||||
}
|
||||
|
|
@ -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,
|
||||
struct spi_message *msg,
|
||||
struct spi_transfer *xfer)
|
||||
{
|
||||
}
|
||||
|
||||
static void spi_dma_sync_for_cpu(struct spi_controller *ctrl,
|
||||
struct spi_message *msg,
|
||||
struct spi_transfer *xfer)
|
||||
{
|
||||
}
|
||||
|
|
@ -1622,10 +1634,10 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
|
|||
reinit_completion(&ctlr->xfer_completion);
|
||||
|
||||
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);
|
||||
if (ret < 0) {
|
||||
spi_dma_sync_for_cpu(ctlr, xfer);
|
||||
spi_dma_sync_for_cpu(ctlr, msg, xfer);
|
||||
|
||||
if (ctlr->cur_msg_mapped &&
|
||||
(xfer->error & SPI_TRANS_FAIL_NO_START)) {
|
||||
|
|
@ -1650,7 +1662,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
|
|||
msg->status = ret;
|
||||
}
|
||||
|
||||
spi_dma_sync_for_cpu(ctlr, xfer);
|
||||
spi_dma_sync_for_cpu(ctlr, msg, xfer);
|
||||
} else {
|
||||
if (xfer->len)
|
||||
dev_err(&msg->spi->dev,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user