diff options
author | Mark Brown <broonie@kernel.org> | 2023-01-30 11:47:16 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2023-01-30 11:47:16 +0100 |
commit | 35bba23e6732a593722c96cbe03ced627f0d8831 (patch) | |
tree | a410d820f60f6ddcdd909604b56e70a37b5933a3 | |
parent | spi: spidev: remove debug messages that access spidev->spi without locking (diff) | |
parent | spi: spidev: fix a recursive locking error (diff) | |
download | linux-35bba23e6732a593722c96cbe03ced627f0d8831.tar.xz linux-35bba23e6732a593722c96cbe03ced627f0d8831.zip |
Merge remote-tracking branch 'spi/for-6.2' into spi-6.2
-rw-r--r-- | drivers/spi/spi-dw-core.c | 2 | ||||
-rw-r--r-- | drivers/spi/spidev.c | 21 |
2 files changed, 17 insertions, 6 deletions
diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 99edddf9958b..c3bfb6c84cab 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -366,7 +366,7 @@ static void dw_spi_irq_setup(struct dw_spi *dws) * will be adjusted at the final stage of the IRQ-based SPI transfer * execution so not to lose the leftover of the incoming data. */ - level = min_t(u16, dws->fifo_len / 2, dws->tx_len); + level = min_t(unsigned int, dws->fifo_len / 2, dws->tx_len); dw_writel(dws, DW_SPI_TXFTLR, level); dw_writel(dws, DW_SPI_RXFTLR, level - 1); diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 1935ca613447..3db94d1483ed 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c @@ -90,9 +90,21 @@ MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message"); /*-------------------------------------------------------------------------*/ static ssize_t +spidev_sync_unlocked(struct spi_device *spi, struct spi_message *message) +{ + ssize_t status; + + status = spi_sync(spi, message); + if (status == 0) + status = message->actual_length; + + return status; +} + +static ssize_t spidev_sync(struct spidev_data *spidev, struct spi_message *message) { - int status; + ssize_t status; struct spi_device *spi; mutex_lock(&spidev->spi_lock); @@ -101,10 +113,9 @@ spidev_sync(struct spidev_data *spidev, struct spi_message *message) if (spi == NULL) status = -ESHUTDOWN; else - status = spi_sync(spi, message); + status = spidev_sync_unlocked(spi, message); - if (status == 0) - status = message->actual_length; + mutex_unlock(&spidev->spi_lock); mutex_unlock(&spidev->spi_lock); return status; @@ -294,7 +305,7 @@ static int spidev_message(struct spidev_data *spidev, spi_message_add_tail(k_tmp, &msg); } - status = spidev_sync(spidev, &msg); + status = spidev_sync_unlocked(spidev->spi, &msg); if (status < 0) goto done; |