[EXT] Re: [PATCH 5/6] spi: imx: support dynamic burst length for ECSPI DMA mode
Carlos Song
carlos.song at nxp.com
Wed Nov 26 00:18:28 PST 2025
> -----Original Message-----
> From: Marc Kleine-Budde <mkl at pengutronix.de>
> Sent: Wednesday, November 26, 2025 4:12 PM
> To: Carlos Song <carlos.song at nxp.com>
> Cc: broonie at kernel.org; Frank Li <frank.li at nxp.com>; hawnguo at kernel.org;
> s.hauer at pengutronix.de; kernel at pengutronix.de; festevam at gmail.com;
> linux-spi at vger.kernel.org; imx at lists.linux.dev;
> linux-arm-kernel at lists.infradead.org; linux-kernel at vger.kernel.org
> Subject: [EXT] Re: [PATCH 5/6] spi: imx: support dynamic burst length for ECSPI
> DMA mode
>
> On 25.11.2025 18:06:17, Carlos Song wrote:
> > +static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
> > + struct spi_transfer *transfer)
> > +{
> > + bool word_delay = transfer->word_delay.value != 0;
> > + int ret;
> > + int i;
> > +
> > + ret = spi_imx_dma_data_prepare(spi_imx, transfer, word_delay);
> > + if (ret < 0) {
> > + transfer->error |= SPI_TRANS_FAIL_NO_START;
> > + dev_err(spi_imx->dev, "DMA data prepare fail\n");
> > + goto fallback_pio;
> > + }
> > +
> > + spi_imx->rx_offset = 0;
> > +
> > + /* Each dma_package performs a separate DMA transfer once */
> > + for (i = 0; i < spi_imx->dma_package_num; i++) {
> > + ret = spi_imx_dma_map(spi_imx, &spi_imx->dma_data[i]);
> > + if (ret < 0) {
> > + transfer->error |= SPI_TRANS_FAIL_NO_START;
> > + dev_err(spi_imx->dev, "DMA map fail\n");
> > + break;
> > + }
> > +
> > + /* Update the CTRL register BL field */
> > + writel(spi_imx->dma_data[i].cmd_word, spi_imx->base +
> MX51_ECSPI_CTRL);
> > +
> > + ret = spi_imx_dma_package_transfer(spi_imx,
> &spi_imx->dma_data[i],
> > + transfer, word_delay);
> > +
> > + /* Whether the dma transmission is successful or not, dma unmap is
> necessary */
> > + spi_imx_dma_unmap(spi_imx, &spi_imx->dma_data[i]);
> > +
> > + if (ret < 0) {
> > + dev_dbg(spi_imx->dev, "DMA %d transfer not really finish\n", i);
> > + break;
> > + }
> > + }
> > +
> > + for (int j = 0; j < spi_imx->dma_package_num; j++) {
> > + kfree(spi_imx->dma_data[j].dma_tx_buf);
> > + kfree(spi_imx->dma_data[j].dma_rx_buf);
> > + }
> > + kfree(spi_imx->dma_data);
> > +
> > +fallback_pio:
> > + /* If no any dma package data is transferred, fallback to PIO mode transfer
> */
> > + if ((transfer->error & SPI_TRANS_FAIL_NO_START) && i != 0)
> > + transfer->error &= !SPI_TRANS_FAIL_NO_START;
> ^
> this doesn't look correct, you probably want to use a "~", right?
>
> Marc
>
Ohh! Yes! your are totally right!
Also will fix it in V2~
>
> --
> Pengutronix e.K. | Marc Kleine-Budde |
> Embedded Linux | https://www.pengutronix.de |
> Vertretung Nürnberg | Phone: +49-5121-206917-129 |
> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
More information about the linux-arm-kernel
mailing list