@@ -12,6 +12,8 @@ LOG_MODULE_REGISTER(dma_cc23x0, CONFIG_DMA_LOG_LEVEL);
12
12
#include <zephyr/device.h>
13
13
#include <zephyr/drivers/dma.h>
14
14
#include <zephyr/irq.h>
15
+ #include <zephyr/pm/device.h>
16
+ #include <zephyr/pm/policy.h>
15
17
#include <zephyr/sys/util.h>
16
18
17
19
#include <driverlib/clkctl.h>
@@ -56,6 +58,18 @@ struct dma_cc23x0_data {
56
58
struct dma_cc23x0_channel channels [UDMA_NUM_CHANNELS ];
57
59
};
58
60
61
+ static inline void dma_cc23x0_pm_policy_state_lock_get (void )
62
+ {
63
+ pm_policy_state_lock_get (PM_STATE_RUNTIME_IDLE , PM_ALL_SUBSTATES );
64
+ pm_policy_state_lock_get (PM_STATE_STANDBY , PM_ALL_SUBSTATES );
65
+ }
66
+
67
+ static inline void dma_cc23x0_pm_policy_state_lock_put (void )
68
+ {
69
+ pm_policy_state_lock_put (PM_STATE_STANDBY , PM_ALL_SUBSTATES );
70
+ pm_policy_state_lock_put (PM_STATE_RUNTIME_IDLE , PM_ALL_SUBSTATES );
71
+ }
72
+
59
73
/*
60
74
* If the channel is a software channel, then the completion will be signaled
61
75
* on this DMA dedicated interrupt.
@@ -343,27 +357,38 @@ static int dma_cc23x0_get_status(const struct device *dev, uint32_t channel,
343
357
return 0 ;
344
358
}
345
359
346
- static int dma_cc23x0_init (const struct device * dev )
360
+ static int dma_cc23x0_pm_action (const struct device * dev , enum pm_device_action action )
347
361
{
348
362
struct dma_cc23x0_data * data = dev -> data ;
349
363
364
+ switch (action ) {
365
+ case PM_DEVICE_ACTION_SUSPEND :
366
+ uDMADisable ();
367
+ CLKCTLDisable (CLKCTL_BASE , CLKCTL_DMA );
368
+ dma_cc23x0_pm_policy_state_lock_put ();
369
+ return 0 ;
370
+ case PM_DEVICE_ACTION_RESUME :
371
+ dma_cc23x0_pm_policy_state_lock_get ();
372
+ CLKCTLEnable (CLKCTL_BASE , CLKCTL_DMA );
373
+ uDMAEnable ();
374
+ /* Set base address for channel control table (descriptors) */
375
+ uDMASetControlBase (data -> desc );
376
+ return 0 ;
377
+ default :
378
+ return - ENOTSUP ;
379
+ }
380
+ }
381
+
382
+ static int dma_cc23x0_init (const struct device * dev )
383
+ {
350
384
IRQ_CONNECT (DT_INST_IRQN (0 ),
351
385
DT_INST_IRQ (0 , priority ),
352
386
dma_cc23x0_isr ,
353
387
DEVICE_DT_INST_GET (0 ),
354
388
0 );
355
389
irq_enable (DT_INST_IRQN (0 ));
356
390
357
- /* Enable clock */
358
- CLKCTLEnable (CLKCTL_BASE , CLKCTL_DMA );
359
-
360
- /* Enable DMA */
361
- uDMAEnable ();
362
-
363
- /* Set base address for channel control table (descriptors) */
364
- uDMASetControlBase (data -> desc );
365
-
366
- return 0 ;
391
+ return pm_device_driver_init (dev , dma_cc23x0_pm_action );
367
392
}
368
393
369
394
static struct dma_cc23x0_data cc23x0_data ;
@@ -376,7 +401,10 @@ static DEVICE_API(dma, dma_cc23x0_api) = {
376
401
.get_status = dma_cc23x0_get_status ,
377
402
};
378
403
379
- DEVICE_DT_INST_DEFINE (0 , dma_cc23x0_init , NULL ,
404
+ PM_DEVICE_DT_INST_DEFINE (0 , dma_cc23x0_pm_action );
405
+
406
+ DEVICE_DT_INST_DEFINE (0 , dma_cc23x0_init ,
407
+ PM_DEVICE_DT_INST_GET (0 ),
380
408
& cc23x0_data , NULL ,
381
409
PRE_KERNEL_1 , CONFIG_DMA_INIT_PRIORITY ,
382
410
& dma_cc23x0_api );
0 commit comments