<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Do SPI transfers through DMA block CPU ? in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809176#M124805</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am currently working with imx SPI driver on an imx6. I am using a kernel based on the 3.10 branch of linux-fslc.&lt;/P&gt;&lt;P&gt;I am not used to DMA transfer, but what I understand about DMA is that they should let the CPU do others tasks when a transfer through DMA is in progress.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But I have the feeling that when the DMA transfer is initialized and then triggered, the CPU is waiting actively for DMA transfer to finish.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In the following code, I see a call to wait_for_timeout_completion which is a not interruptible function. Can you confirm me that this means that when my CPU perform a SPI transfer it is blocked waiting the end of the DMA transfer ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;static&lt;/SPAN&gt; &lt;SPAN class=""&gt;int&lt;/SPAN&gt; &lt;SPAN class=""&gt;spi_imx_dma_transfer&lt;/SPAN&gt;(&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_imx_data *spi_imx,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_transfer *transfer)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; dma_async_tx_descriptor *desc_tx = &lt;SPAN class=""&gt;NULL&lt;/SPAN&gt;, *desc_rx = &lt;SPAN class=""&gt;NULL&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; ret;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; left = &lt;SPAN class=""&gt;0&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_master *master = spi_imx-&amp;gt;&lt;SPAN class=""&gt;bitbang&lt;/SPAN&gt;.&lt;SPAN class=""&gt;master&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; sg_table *tx = &amp;amp;transfer-&amp;gt;&lt;SPAN class=""&gt;tx_sg&lt;/SPAN&gt;, *rx = &amp;amp;transfer-&amp;gt;&lt;SPAN class=""&gt;rx_sg&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (tx) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx = &lt;SPAN class=""&gt;dmaengine_prep_slave_sg&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;tx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;, tx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt;, DMA_TO_DEVICE,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;DMA_PREP_INTERRUPT | DMA_CTRL_ACK);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!desc_tx)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;goto&lt;/SPAN&gt; no_dma;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx-&amp;gt;&lt;SPAN class=""&gt;callback&lt;/SPAN&gt; = spi_imx_dma_tx_callback;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx-&amp;gt;&lt;SPAN class=""&gt;callback_param&lt;/SPAN&gt; = (&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *)spi_imx;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_submit&lt;/SPAN&gt;(desc_tx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (rx) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; scatterlist *sgl_last = &amp;amp;rx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;[rx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt; - &lt;SPAN class=""&gt;1&lt;/SPAN&gt;];&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class=""&gt;int&lt;/SPAN&gt; orig_length = sgl_last-&amp;gt;&lt;SPAN class=""&gt;length&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; wml_mask = ~(spi_imx-&amp;gt;&lt;SPAN class=""&gt;rx_wml&lt;/SPAN&gt; - &lt;SPAN class=""&gt;1&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * Adjust the transfer lenth of the last scattlist if there are&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * some tail data, use PIO read to get the tail data since DMA&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * sometimes miss the last tail interrupt.&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;left = transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt; % spi_imx-&amp;gt;&lt;SPAN class=""&gt;rx_wml&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (left)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;sgl_last-&amp;gt;&lt;SPAN class=""&gt;length&lt;/SPAN&gt; = orig_length &amp;amp; wml_mask;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx = &lt;SPAN class=""&gt;dmaengine_prep_slave_sg&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;rx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;, rx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt;, DMA_FROM_DEVICE,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;DMA_PREP_INTERRUPT | DMA_CTRL_ACK);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!desc_rx)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;goto&lt;/SPAN&gt; no_dma;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx-&amp;gt;&lt;SPAN class=""&gt;callback&lt;/SPAN&gt; = spi_imx_dma_rx_callback;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx-&amp;gt;&lt;SPAN class=""&gt;callback_param&lt;/SPAN&gt; = (&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *)spi_imx;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_submit&lt;/SPAN&gt;(desc_rx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;reinit_completion&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_rx_completion&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;reinit_completion&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_tx_completion&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; Trigger the cspi module. &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_finished&lt;/SPAN&gt; = &lt;SPAN class=""&gt;0&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;trigger&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dma_async_issue_pending&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dma_async_issue_pending&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; Wait SDMA to finish the data transfer.&lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = &lt;SPAN class=""&gt;wait_for_completion_timeout&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_tx_completion&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;IMX_DMA_TIMEOUT&lt;/SPAN&gt;(transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: I/O Error in DMA TX:&lt;SPAN class=""&gt;%x&lt;/SPAN&gt;&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;), transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_terminate_all&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;} &lt;SPAN class=""&gt;else&lt;/SPAN&gt; {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = &lt;SPAN class=""&gt;wait_for_completion_timeout&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_rx_completion&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;IMX_DMA_TIMEOUT&lt;/SPAN&gt;(transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: I/O Error in DMA RX:&lt;SPAN class=""&gt;%x&lt;/SPAN&gt;&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;), transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;reset&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_terminate_all&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;} &lt;SPAN class=""&gt;else&lt;/SPAN&gt; &lt;SPAN class=""&gt;if&lt;/SPAN&gt; (left) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; read the tail data by PIO &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *tmpbuf = transfer-&amp;gt;&lt;SPAN class=""&gt;rx_buf&lt;/SPAN&gt; + transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt; - left;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;while&lt;/SPAN&gt; (&lt;SPAN class=""&gt;readl&lt;/SPAN&gt;(spi_imx-&amp;gt;&lt;SPAN class=""&gt;base&lt;/SPAN&gt; + MX51_ECSPI_STAT) &amp;amp; &lt;SPAN class=""&gt;0x8&lt;/SPAN&gt;) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;*(&lt;SPAN class=""&gt;char&lt;/SPAN&gt; *)tmpbuf =&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;readl&lt;/SPAN&gt;(spi_imx-&amp;gt;&lt;SPAN class=""&gt;base&lt;/SPAN&gt; + MXC_CSPIRXDATA);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;tmpbuf++;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_finished&lt;/SPAN&gt; = &lt;SPAN class=""&gt;1&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;trigger&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = -ETIMEDOUT;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;else&lt;/SPAN&gt; &lt;SPAN class=""&gt;if&lt;/SPAN&gt; (ret &amp;gt; &lt;SPAN class=""&gt;0&lt;/SPAN&gt;)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;return&lt;/SPAN&gt; ret;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;no_dma:&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn_once&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: DMA not available, falling back to PIO&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;return&lt;/SPAN&gt; -EAGAIN;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 11 Sep 2018 11:30:14 GMT</pubDate>
    <dc:creator>bastien_cornut</dc:creator>
    <dc:date>2018-09-11T11:30:14Z</dc:date>
    <item>
      <title>Do SPI transfers through DMA block CPU ?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809176#M124805</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am currently working with imx SPI driver on an imx6. I am using a kernel based on the 3.10 branch of linux-fslc.&lt;/P&gt;&lt;P&gt;I am not used to DMA transfer, but what I understand about DMA is that they should let the CPU do others tasks when a transfer through DMA is in progress.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But I have the feeling that when the DMA transfer is initialized and then triggered, the CPU is waiting actively for DMA transfer to finish.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In the following code, I see a call to wait_for_timeout_completion which is a not interruptible function. Can you confirm me that this means that when my CPU perform a SPI transfer it is blocked waiting the end of the DMA transfer ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;static&lt;/SPAN&gt; &lt;SPAN class=""&gt;int&lt;/SPAN&gt; &lt;SPAN class=""&gt;spi_imx_dma_transfer&lt;/SPAN&gt;(&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_imx_data *spi_imx,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_transfer *transfer)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; dma_async_tx_descriptor *desc_tx = &lt;SPAN class=""&gt;NULL&lt;/SPAN&gt;, *desc_rx = &lt;SPAN class=""&gt;NULL&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; ret;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; left = &lt;SPAN class=""&gt;0&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; spi_master *master = spi_imx-&amp;gt;&lt;SPAN class=""&gt;bitbang&lt;/SPAN&gt;.&lt;SPAN class=""&gt;master&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; sg_table *tx = &amp;amp;transfer-&amp;gt;&lt;SPAN class=""&gt;tx_sg&lt;/SPAN&gt;, *rx = &amp;amp;transfer-&amp;gt;&lt;SPAN class=""&gt;rx_sg&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (tx) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx = &lt;SPAN class=""&gt;dmaengine_prep_slave_sg&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;tx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;, tx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt;, DMA_TO_DEVICE,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;DMA_PREP_INTERRUPT | DMA_CTRL_ACK);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!desc_tx)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;goto&lt;/SPAN&gt; no_dma;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx-&amp;gt;&lt;SPAN class=""&gt;callback&lt;/SPAN&gt; = spi_imx_dma_tx_callback;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_tx-&amp;gt;&lt;SPAN class=""&gt;callback_param&lt;/SPAN&gt; = (&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *)spi_imx;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_submit&lt;/SPAN&gt;(desc_tx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (rx) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;struct&lt;/SPAN&gt; scatterlist *sgl_last = &amp;amp;rx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;[rx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt; - &lt;SPAN class=""&gt;1&lt;/SPAN&gt;];&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class=""&gt;int&lt;/SPAN&gt; orig_length = sgl_last-&amp;gt;&lt;SPAN class=""&gt;length&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;int&lt;/SPAN&gt; wml_mask = ~(spi_imx-&amp;gt;&lt;SPAN class=""&gt;rx_wml&lt;/SPAN&gt; - &lt;SPAN class=""&gt;1&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * Adjust the transfer lenth of the last scattlist if there are&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * some tail data, use PIO read to get the tail data since DMA&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; * sometimes miss the last tail interrupt.&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt; &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;left = transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt; % spi_imx-&amp;gt;&lt;SPAN class=""&gt;rx_wml&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (left)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;sgl_last-&amp;gt;&lt;SPAN class=""&gt;length&lt;/SPAN&gt; = orig_length &amp;amp; wml_mask;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx = &lt;SPAN class=""&gt;dmaengine_prep_slave_sg&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;rx-&amp;gt;&lt;SPAN class=""&gt;sgl&lt;/SPAN&gt;, rx-&amp;gt;&lt;SPAN class=""&gt;nents&lt;/SPAN&gt;, DMA_FROM_DEVICE,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;DMA_PREP_INTERRUPT | DMA_CTRL_ACK);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!desc_rx)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;goto&lt;/SPAN&gt; no_dma;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx-&amp;gt;&lt;SPAN class=""&gt;callback&lt;/SPAN&gt; = spi_imx_dma_rx_callback;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;desc_rx-&amp;gt;&lt;SPAN class=""&gt;callback_param&lt;/SPAN&gt; = (&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *)spi_imx;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_submit&lt;/SPAN&gt;(desc_rx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;reinit_completion&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_rx_completion&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;reinit_completion&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_tx_completion&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; Trigger the cspi module. &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_finished&lt;/SPAN&gt; = &lt;SPAN class=""&gt;0&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;trigger&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dma_async_issue_pending&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dma_async_issue_pending&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; Wait SDMA to finish the data transfer.&lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = &lt;SPAN class=""&gt;wait_for_completion_timeout&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_tx_completion&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;IMX_DMA_TIMEOUT&lt;/SPAN&gt;(transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: I/O Error in DMA TX:&lt;SPAN class=""&gt;%x&lt;/SPAN&gt;&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;), transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_terminate_all&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_tx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;} &lt;SPAN class=""&gt;else&lt;/SPAN&gt; {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = &lt;SPAN class=""&gt;wait_for_completion_timeout&lt;/SPAN&gt;(&amp;amp;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_rx_completion&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;IMX_DMA_TIMEOUT&lt;/SPAN&gt;(transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: I/O Error in DMA RX:&lt;SPAN class=""&gt;%x&lt;/SPAN&gt;&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;), transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;reset&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dmaengine_terminate_all&lt;/SPAN&gt;(master-&amp;gt;&lt;SPAN class=""&gt;dma_rx&lt;/SPAN&gt;);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;} &lt;SPAN class=""&gt;else&lt;/SPAN&gt; &lt;SPAN class=""&gt;if&lt;/SPAN&gt; (left) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;/*&lt;/SPAN&gt; read the tail data by PIO &lt;SPAN class=""&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;void&lt;/SPAN&gt; *tmpbuf = transfer-&amp;gt;&lt;SPAN class=""&gt;rx_buf&lt;/SPAN&gt; + transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt; - left;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;while&lt;/SPAN&gt; (&lt;SPAN class=""&gt;readl&lt;/SPAN&gt;(spi_imx-&amp;gt;&lt;SPAN class=""&gt;base&lt;/SPAN&gt; + MX51_ECSPI_STAT) &amp;amp; &lt;SPAN class=""&gt;0x8&lt;/SPAN&gt;) {&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;*(&lt;SPAN class=""&gt;char&lt;/SPAN&gt; *)tmpbuf =&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;readl&lt;/SPAN&gt;(spi_imx-&amp;gt;&lt;SPAN class=""&gt;base&lt;/SPAN&gt; + MXC_CSPIRXDATA);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;tmpbuf++;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;dma_finished&lt;/SPAN&gt; = &lt;SPAN class=""&gt;1&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;spi_imx-&amp;gt;&lt;SPAN class=""&gt;devtype_data&lt;/SPAN&gt;-&amp;gt;&lt;SPAN class=""&gt;trigger&lt;/SPAN&gt;(spi_imx);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;if&lt;/SPAN&gt; (!ret)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = -ETIMEDOUT;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;else&lt;/SPAN&gt; &lt;SPAN class=""&gt;if&lt;/SPAN&gt; (ret &amp;gt; &lt;SPAN class=""&gt;0&lt;/SPAN&gt;)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;ret = transfer-&amp;gt;&lt;SPAN class=""&gt;len&lt;/SPAN&gt;;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;return&lt;/SPAN&gt; ret;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;no_dma:&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;pr_warn_once&lt;/SPAN&gt;(&lt;SPAN class=""&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;%s&lt;/SPAN&gt; &lt;SPAN class=""&gt;%s&lt;/SPAN&gt;: DMA not available, falling back to PIO&lt;SPAN class=""&gt;\n&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_driver_string&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;),&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;dev_name&lt;/SPAN&gt;(&amp;amp;master-&amp;gt;&lt;SPAN class=""&gt;dev&lt;/SPAN&gt;));&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE data-tab-size="8"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD class=""&gt;&lt;SPAN class=""&gt;return&lt;/SPAN&gt; -EAGAIN;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Sep 2018 11:30:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809176#M124805</guid>
      <dc:creator>bastien_cornut</dc:creator>
      <dc:date>2018-09-11T11:30:14Z</dc:date>
    </item>
    <item>
      <title>Re: Do SPI transfers through DMA block CPU ?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809177#M124806</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Bastien&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;nxp sdma driver do not use this function, one can check sect.4.1.3 Source Code Structure&lt;/P&gt;&lt;P&gt;attached Linux Manual and sources on&lt;/P&gt;&lt;P&gt;&lt;A class="link-titled" href="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/dma/imx-dma.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga" title="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/dma/imx-dma.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga"&gt;linux-2.6-imx.git - Freescale i.MX Linux Tree&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;A class="link-titled" href="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/dma/dmaengine.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga" title="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/dma/dmaengine.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga"&gt;linux-2.6-imx.git - Freescale i.MX Linux Tree&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;linux-fslc is community branch and supported by community, it may be posted on&lt;/P&gt;&lt;P&gt;meta-fsl-arm mailing list&lt;BR /&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Flists.yoctoproject.org%2Flistinfo%2Fmeta-freescale" rel="nofollow" target="_blank"&gt;https://lists.yoctoproject.org/listinfo/meta-freescale&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/323782"&gt;difference between Yocto Community BSP and Freescale BSP Release&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 16 Sep 2018 23:13:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809177#M124806</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2018-09-16T23:13:33Z</dc:date>
    </item>
    <item>
      <title>Re: Do SPI transfers through DMA block CPU ?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809178#M124807</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;Actually, this function "wait_for_completion_timeout" is called in the imx spi driver: &lt;A class="jivelink1" href="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/spi/spi-imx.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga" title="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/spi/spi-imx.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga"&gt;http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/spi/spi-imx.c?h=imx_3.10.17_1.0.0_ga&amp;amp;id=rel_imx_3.10.53_1.1.0_ga&lt;/A&gt; (see function spi_imx_dma_transfer, line 958)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My question was to know if the CPU is actually polling the end of dma transfer or do I misunderstand the workflow of a spi dma transfer ?&lt;CODE&gt;&lt;/CODE&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Bastien&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Sep 2018 07:56:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809178#M124807</guid>
      <dc:creator>bastien_cornut</dc:creator>
      <dc:date>2018-09-17T07:56:47Z</dc:date>
    </item>
    <item>
      <title>Re: Do SPI transfers through DMA block CPU ?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809179#M124808</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;sorry you are right, it waits for sdma completion, however seems it does not prevent&lt;/P&gt;&lt;P&gt;other threads to be executed.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 18 Sep 2018 05:16:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Do-SPI-transfers-through-DMA-block-CPU/m-p/809179#M124808</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2018-09-18T05:16:59Z</dc:date>
    </item>
  </channel>
</rss>

