@@ -30,6 +30,11 @@ enum {
30
30
TRANSFER_TO_OR_FROM_PER ,
31
31
};
32
32
33
+ struct dma_siwx91x_channel_info {
34
+ dma_callback_t dma_callback ; /* User callback */
35
+ void * cb_data ; /* User callback data */
36
+ };
37
+
33
38
struct dma_siwx91x_config {
34
39
UDMA0_Type * reg ; /* UDMA register base address */
35
40
uint8_t irq_number ; /* IRQ number */
@@ -42,8 +47,7 @@ struct dma_siwx91x_config {
42
47
struct dma_siwx91x_data {
43
48
struct dma_context dma_ctx ;
44
49
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 ;
47
51
RSI_UDMA_DATACONTEXT_T udma_handle ; /* Buffer to store UDMA handle
48
52
* related information
49
53
*/
@@ -212,8 +216,8 @@ static int siwx91x_dma_configure(const struct device *dev, uint32_t channel,
212
216
return status ;
213
217
}
214
218
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 ;
217
221
218
222
atomic_set_bit (data -> dma_ctx .atomic , channel );
219
223
@@ -426,9 +430,10 @@ static void siwx91x_dma_isr(const struct device *dev)
426
430
channel -= 1 ;
427
431
428
432
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 ) {
430
434
/* 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 );
432
437
}
433
438
sys_write32 (BIT (channel ), (mem_addr_t )& cfg -> reg -> UDMA_DONE_STATUS_REG );
434
439
} else {
@@ -461,11 +466,14 @@ static DEVICE_API(dma, siwx91x_dma_api) = {
461
466
#define SIWX91X_DMA_INIT (inst ) \
462
467
static ATOMIC_DEFINE(dma_channels_atomic_##inst, DT_INST_PROP(inst, dma_channels)); \
463
468
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)]; \
464
471
static struct dma_siwx91x_data dma_data_##inst = { \
465
472
.dma_ctx.magic = DMA_MAGIC, \
466
473
.dma_ctx.dma_channels = DT_INST_PROP(inst, dma_channels), \
467
474
.dma_ctx.atomic = dma_channels_atomic_##inst, \
468
475
.chan_info = dma_channel_info_##inst, \
476
+ .zephyr_channel_info = zephyr_channel_info_##inst, \
469
477
}; \
470
478
static void siwx91x_dma_irq_configure_##inst(void) \
471
479
{ \
0 commit comments