drivers: imx: sdma: Remove src_may_change and dst_may_change

We extract this information from config->direction. This makes
code easier to understand.

Notice here that we add BD_DONE for all cases, and remove BD_EXTD
as it doesn't make sense for device2memory and memory2device.

Will have m2m case later, it is not yet supported.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
This commit is contained in:
Daniel Baluta 2020-04-09 23:02:37 +03:00 committed by Daniel Baluta
parent c2f44b0c3c
commit 708743594b
1 changed files with 21 additions and 32 deletions

View File

@ -705,8 +705,6 @@ static int sdma_prep_desc(struct dma_chan_data *channel,
int width;
int watermark;
uint32_t sdma_script_addr;
bool src_may_change = 0, dst_may_change = 0;
struct sdma_chan *pdata = dma_chan_get_data(channel);
struct sdma_bd *bd;
@ -730,47 +728,38 @@ static int sdma_prep_desc(struct dma_chan_data *channel,
* For MEM2MEM the source is stored in buf_addr and destination
* is in buf_xaddr.
*/
bd->buf_xaddr = 0;
bd->buf_addr = config->elem_array.elems[i].src;
if (!src_may_change)
bd->buf_addr =
config->elem_array.elems[i].dest;
if (src_may_change && dst_may_change) {
/* M2M copy */
bd->buf_xaddr =
config->elem_array.elems[i].dest;
}
/* We are interested in the element width on the hardware side;
* on RAM side we can adjust.
*/
width = config->src_width;
if (!dst_may_change)
switch (config->direction) {
case DMA_DIR_MEM_TO_DEV:
bd->buf_addr = config->elem_array.elems[i].src;
width = config->src_width;
break;
case DMA_DIR_DEV_TO_MEM:
bd->buf_addr = config->elem_array.elems[i].dest;
width = config->dest_width;
break;
case DMA_DIR_MEM_TO_MEM:
bd->buf_addr = config->elem_array.elems[i].src;
bd->buf_xaddr = config->elem_array.elems[i].dest;
width = config->dest_width;
break;
default:
return -EINVAL;
}
bd->config =
SDMA_BD_COUNT(config->elem_array.elems[i].size) |
SDMA_BD_CMD(SDMA_CMD_XFER_SIZE(width)) | SDMA_BD_CONT;
if (!config->irq_disabled)
bd->config |= SDMA_BD_INT;
if (dst_may_change) {
/* Capture or M2M, enable this descriptor to be
* used by SDMAC
*/
bd->config |= SDMA_BD_DONE;
/* On playback we don't do this and instead wait
* for copy() to let us know the data is ready.
* copy() is called during preload.
*/
}
if (src_may_change && dst_may_change)
bd->config |= SDMA_BD_EXTD;
bd->config |= SDMA_BD_DONE | SDMA_BD_CONT;
}
/* Configure last BD to account for cyclic transfers */
if (config->cyclic)
bd->config |= SDMA_BD_WRAP;
else
bd->config &= ~SDMA_BD_CONT;
bd->config &= ~SDMA_BD_CONT;
/* CCB must point to buffer descriptors array */
memset(pdata->ccb, 0, sizeof(*pdata->ccb));