summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-05-04 16:22:18 +0300
committerMark Brown <broonie@kernel.org>2026-05-04 16:22:18 +0300
commit5b33b756aba9237813216476538abcc8afe8af8b (patch)
tree1f45f29acb8f98b224ef288a225bdbea4dd9d637
parent7fd2df204f342fc17d1a0bfcd474b24232fb0f32 (diff)
parent894e04b7116297a6529e0c4ed90e3eb160939805 (diff)
downloadlinux-5b33b756aba9237813216476538abcc8afe8af8b.tar.xz
spi: imx: Three fixes for the i.MX SPI driver
John Madieu <john.madieu@gmail.com> says: This series independent fixes found in the i.MX SPI driver. These are: 1/3 fixes a precedence bug in spi_imx_dma_max_wml_find() that makes the watermark-finding logic effectively dead code. The function currently always returns wml = 1 because of how the !-operator binds to the modulo expression. 2/3 fixes a missing return on the package-1 failure path in spi_imx_dma_data_prepare(). The error path frees the dma_data array and the package-0 buffers, then falls through to "return 0" - the caller proceeds with a freed pointer. 3/3 makes spi_imx_setupxfer() propagate the prepare_transfer() return value. Currently a -EINVAL from mx51_ecspi_prepare_transfer (e.g. on a word_delay overflow) is silently swallowed and the transfer proceeds with a partially-configured controller.
-rw-r--r--drivers/spi/spi-imx.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index e5c907c45b87..480d1e8b281f 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -1382,9 +1382,7 @@ static int spi_imx_setupxfer(struct spi_device *spi,
spi_imx->target_burst = t->len;
}
- spi_imx->devtype_data->prepare_transfer(spi_imx, spi, t);
-
- return 0;
+ return spi_imx->devtype_data->prepare_transfer(spi_imx, spi, t);
}
static void spi_imx_sdma_exit(struct spi_imx_data *spi_imx)
@@ -1709,6 +1707,7 @@ static int spi_imx_dma_data_prepare(struct spi_imx_data *spi_imx,
kfree(spi_imx->dma_data[0].dma_tx_buf);
kfree(spi_imx->dma_data[0].dma_rx_buf);
kfree(spi_imx->dma_data);
+ return ret;
}
}
@@ -1836,7 +1835,7 @@ static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx,
unsigned int i;
for (i = spi_imx->devtype_data->fifo_size / 2; i > 0; i--) {
- if (!dma_data->dma_len % (i * bytes_per_word))
+ if (!(dma_data->dma_len % (i * bytes_per_word)))
break;
}
/* Use 1 as wml in case no available burst length got */