drivers: dma: siwx91x: DMA reload bug fix
Current DMA driver reload function only works for 8-bit data. This is due to incorrect interpretation of size argument. Added changes to support other xfer sizes. Signed-off-by: Sai Santhosh Malae <Santhosh.Malae@silabs.com>
This commit is contained in:
parent
eee464dae7
commit
5572e49bc9
1 changed files with 13 additions and 11 deletions
|
@ -420,10 +420,11 @@ static int siwx91x_dma_reload(const struct device *dev, uint32_t channel, uint32
|
||||||
const struct dma_siwx91x_config *cfg = dev->config;
|
const struct dma_siwx91x_config *cfg = dev->config;
|
||||||
struct dma_siwx91x_data *data = dev->data;
|
struct dma_siwx91x_data *data = dev->data;
|
||||||
void *udma_handle = &data->udma_handle;
|
void *udma_handle = &data->udma_handle;
|
||||||
uint32_t desc_src_addr;
|
void *desc_src_addr;
|
||||||
uint32_t desc_dst_addr;
|
void *desc_dst_addr;
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
RSI_UDMA_DESC_T *udma_table = cfg->sram_desc_addr;
|
RSI_UDMA_DESC_T *udma_table = cfg->sram_desc_addr;
|
||||||
|
uint8_t xfer_size = 1 << udma_table[channel].vsUDMAChaConfigData1.srcSize;
|
||||||
|
|
||||||
/* Expecting a fixed channel number between 0-31 for dma0 and 0-11 for ulpdma */
|
/* Expecting a fixed channel number between 0-31 for dma0 and 0-11 for ulpdma */
|
||||||
if (channel >= data->dma_ctx.dma_channels) {
|
if (channel >= data->dma_ctx.dma_channels) {
|
||||||
|
@ -438,31 +439,32 @@ static int siwx91x_dma_reload(const struct device *dev, uint32_t channel, uint32
|
||||||
/* Update new channel info to dev->data structure */
|
/* Update new channel info to dev->data structure */
|
||||||
data->chan_info[channel].SrcAddr = src;
|
data->chan_info[channel].SrcAddr = src;
|
||||||
data->chan_info[channel].DestAddr = dst;
|
data->chan_info[channel].DestAddr = dst;
|
||||||
data->chan_info[channel].Size = size;
|
data->chan_info[channel].Size = size / xfer_size;
|
||||||
|
|
||||||
/* Update new transfer size to dev->data structure */
|
/* Update new transfer size to dev->data structure */
|
||||||
if (size >= DMA_MAX_TRANSFER_COUNT) {
|
if (data->chan_info[channel].Size >= DMA_MAX_TRANSFER_COUNT) {
|
||||||
data->chan_info[channel].Cnt = DMA_MAX_TRANSFER_COUNT - 1;
|
data->chan_info[channel].Cnt = DMA_MAX_TRANSFER_COUNT;
|
||||||
} else {
|
} else {
|
||||||
data->chan_info[channel].Cnt = size;
|
data->chan_info[channel].Cnt = size / xfer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Program the DMA descriptors with new transfer data information. */
|
/* Program the DMA descriptors with new transfer data information. */
|
||||||
if (udma_table[channel].vsUDMAChaConfigData1.srcInc != UDMA_SRC_INC_NONE) {
|
if (udma_table[channel].vsUDMAChaConfigData1.srcInc != UDMA_SRC_INC_NONE) {
|
||||||
length = data->chan_info[channel].Cnt
|
length = data->chan_info[channel].Cnt
|
||||||
<< udma_table[channel].vsUDMAChaConfigData1.srcInc;
|
<< udma_table[channel].vsUDMAChaConfigData1.srcInc;
|
||||||
desc_src_addr = src + (length - 1);
|
desc_src_addr = (void *)(src + length - 1);
|
||||||
udma_table[channel].pSrcEndAddr = (void *)desc_src_addr;
|
udma_table[channel].pSrcEndAddr = desc_src_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (udma_table[channel].vsUDMAChaConfigData1.dstInc != UDMA_SRC_INC_NONE) {
|
if (udma_table[channel].vsUDMAChaConfigData1.dstInc != UDMA_SRC_INC_NONE) {
|
||||||
length = data->chan_info[channel].Cnt
|
length = data->chan_info[channel].Cnt
|
||||||
<< udma_table[channel].vsUDMAChaConfigData1.dstInc;
|
<< udma_table[channel].vsUDMAChaConfigData1.dstInc;
|
||||||
desc_dst_addr = dst + (length - 1);
|
desc_dst_addr = (void *)(dst + length - 1);
|
||||||
udma_table[channel].pDstEndAddr = (void *)desc_dst_addr;
|
udma_table[channel].pDstEndAddr = desc_dst_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
udma_table[channel].vsUDMAChaConfigData1.totalNumOfDMATrans = data->chan_info[channel].Cnt;
|
udma_table[channel].vsUDMAChaConfigData1.totalNumOfDMATrans =
|
||||||
|
data->chan_info[channel].Cnt - 1;
|
||||||
udma_table[channel].vsUDMAChaConfigData1.transferType = UDMA_MODE_BASIC;
|
udma_table[channel].vsUDMAChaConfigData1.transferType = UDMA_MODE_BASIC;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue