Skip to content

Commit 6c9ec8d

Browse files
smalaekartben
authored andcommitted
drivers: dma: siwx91x: Fix callback assignment for each DMA channel
Updated the driver to ensure that each DMA channel can properly assign and handle individual callbacks. Signed-off-by: Sai Santhosh Malae <[email protected]>
1 parent 8d3bb53 commit 6c9ec8d

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

drivers/dma/dma_silabs_siwx91x.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ enum {
3030
TRANSFER_TO_OR_FROM_PER,
3131
};
3232

33+
struct dma_siwx91x_channel_info {
34+
dma_callback_t dma_callback; /* User callback */
35+
void *cb_data; /* User callback data */
36+
};
37+
3338
struct dma_siwx91x_config {
3439
UDMA0_Type *reg; /* UDMA register base address */
3540
uint8_t irq_number; /* IRQ number */
@@ -42,8 +47,7 @@ struct dma_siwx91x_config {
4247
struct dma_siwx91x_data {
4348
struct dma_context dma_ctx;
4449
UDMA_Channel_Info *chan_info;
45-
dma_callback_t dma_callback; /* User callback */
46-
void *cb_data; /* User callback data */
50+
struct dma_siwx91x_channel_info *zephyr_channel_info;
4751
RSI_UDMA_DATACONTEXT_T udma_handle; /* Buffer to store UDMA handle
4852
* related information
4953
*/
@@ -212,8 +216,8 @@ static int siwx91x_dma_configure(const struct device *dev, uint32_t channel,
212216
return status;
213217
}
214218

215-
data->dma_callback = config->dma_callback;
216-
data->cb_data = config->user_data;
219+
data->zephyr_channel_info[channel].dma_callback = config->dma_callback;
220+
data->zephyr_channel_info[channel].cb_data = config->user_data;
217221

218222
atomic_set_bit(data->dma_ctx.atomic, channel);
219223

@@ -426,9 +430,10 @@ static void siwx91x_dma_isr(const struct device *dev)
426430
channel -= 1;
427431

428432
if (data->chan_info[channel].Cnt == data->chan_info[channel].Size) {
429-
if (data->dma_callback) {
433+
if (data->zephyr_channel_info[channel].dma_callback) {
430434
/* Transfer complete, call user callback */
431-
data->dma_callback(dev, data->cb_data, channel, 0);
435+
data->zephyr_channel_info[channel].dma_callback(
436+
dev, data->zephyr_channel_info[channel].cb_data, channel, 0);
432437
}
433438
sys_write32(BIT(channel), (mem_addr_t)&cfg->reg->UDMA_DONE_STATUS_REG);
434439
} else {
@@ -461,11 +466,14 @@ static DEVICE_API(dma, siwx91x_dma_api) = {
461466
#define SIWX91X_DMA_INIT(inst) \
462467
static ATOMIC_DEFINE(dma_channels_atomic_##inst, DT_INST_PROP(inst, dma_channels)); \
463468
static UDMA_Channel_Info dma_channel_info_##inst[DT_INST_PROP(inst, dma_channels)]; \
469+
static struct dma_siwx91x_channel_info \
470+
zephyr_channel_info_##inst[DT_INST_PROP(inst, dma_channels)]; \
464471
static struct dma_siwx91x_data dma_data_##inst = { \
465472
.dma_ctx.magic = DMA_MAGIC, \
466473
.dma_ctx.dma_channels = DT_INST_PROP(inst, dma_channels), \
467474
.dma_ctx.atomic = dma_channels_atomic_##inst, \
468475
.chan_info = dma_channel_info_##inst, \
476+
.zephyr_channel_info = zephyr_channel_info_##inst, \
469477
}; \
470478
static void siwx91x_dma_irq_configure_##inst(void) \
471479
{ \

0 commit comments

Comments
 (0)