7
7
#include <zephyr/audio/dmic.h>
8
8
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
9
9
#include <zephyr/drivers/pinctrl.h>
10
+ #include <zephyr/dt-bindings/clock/nrf-auxpll.h>
10
11
#include <soc.h>
11
12
#include <dmm.h>
12
13
#include <nrfx_pdm.h>
15
16
#include <zephyr/irq.h>
16
17
LOG_MODULE_REGISTER (dmic_nrfx_pdm , CONFIG_AUDIO_DMIC_LOG_LEVEL );
17
18
19
+ #define AUDIO_AUXPLL DT_NODELABEL(audio_auxpll)
20
+ #define NODE_AUDIOPLL DT_NODELABEL(audiopll)
21
+
18
22
#if CONFIG_SOC_SERIES_NRF54HX
19
23
#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
20
24
#define DMIC_NRFX_CLOCK_FACTOR 8192
21
- #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
25
+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0)
26
+ #elif DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
27
+ #if DT_PROP_OR (NODE_AUDIO_AUXPLL , nordic_frequency , 0 ) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K
28
+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ 12287963
29
+ #elif DT_PROP_OR (NODE_AUDIO_AUXPLL , nordic_frequency , 0 ) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1
30
+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ 11289591
31
+ #else
32
+ #error "Unsupported Audio AUXPLL frequency selection for PDM"
33
+ #endif
34
+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
22
35
#else
23
36
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
24
37
#define DMIC_NRFX_CLOCK_FACTOR 4096
@@ -28,10 +41,10 @@ LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL);
28
41
29
42
struct dmic_nrfx_pdm_drv_data {
30
43
const nrfx_pdm_t * pdm ;
31
- #if CONFIG_CLOCK_CONTROL_NRF
32
- struct onoff_manager * clk_mgr ;
33
- #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
44
+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
34
45
const struct device * audiopll_dev ;
46
+ #elif CONFIG_CLOCK_CONTROL_NRF
47
+ struct onoff_manager * clk_mgr ;
35
48
#endif
36
49
struct onoff_client clk_cli ;
37
50
struct k_mem_slab * mem_slab ;
@@ -73,10 +86,10 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
73
86
if (!drv_data -> request_clock ) {
74
87
return 0 ;
75
88
}
76
- #if CONFIG_CLOCK_CONTROL_NRF
77
- return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
78
- #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
89
+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
79
90
return nrf_clock_control_request (drv_data -> audiopll_dev , NULL , & drv_data -> clk_cli );
91
+ #elif CONFIG_CLOCK_CONTROL_NRF
92
+ return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
80
93
#else
81
94
return - ENOTSUP ;
82
95
#endif
@@ -87,11 +100,10 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
87
100
if (!drv_data -> request_clock ) {
88
101
return 0 ;
89
102
}
90
-
91
- #if CONFIG_CLOCK_CONTROL_NRF
92
- return onoff_release (drv_data -> clk_mgr );
93
- #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
103
+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
94
104
return nrf_clock_control_release (drv_data -> audiopll_dev , NULL );
105
+ #elif CONFIG_CLOCK_CONTROL_NRF
106
+ return onoff_release (drv_data -> clk_mgr );
95
107
#else
96
108
return - ENOTSUP ;
97
109
#endif
@@ -659,7 +671,11 @@ static int dmic_nrfx_pdm_read(const struct device *dev,
659
671
660
672
static void init_clock_manager (const struct device * dev )
661
673
{
662
- #if CONFIG_CLOCK_CONTROL_NRF
674
+ #if DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
675
+ struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
676
+
677
+ drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIO_AUXPLL );
678
+ #elif CONFIG_CLOCK_CONTROL_NRF
663
679
clock_control_subsys_t subsys ;
664
680
struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
665
681
#if NRF_CLOCK_HAS_HFCLKAUDIO
@@ -678,7 +694,7 @@ static void init_clock_manager(const struct device *dev)
678
694
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
679
695
struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
680
696
681
- drv_data -> audiopll_dev = DEVICE_DT_GET (DT_NODELABEL ( audiopll ) );
697
+ drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIOPLL );
682
698
#endif
683
699
}
684
700
@@ -738,12 +754,16 @@ static const struct _dmic_ops dmic_ops = {
738
754
hfclkaudio_frequency) || \
739
755
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), \
740
756
clock_frequency) || \
741
- DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), \
742
- frequency), \
757
+ DT_NODE_HAS_PROP(NODE_AUDIOPLL, \
758
+ frequency) || \
759
+ DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, \
760
+ nordic_frequency), \
743
761
"Clock source ACLK requires the hfclkaudio-frequency " \
744
762
"property to be defined in the nordic,nrf-clock node " \
745
- "or clock-frequency property to be defined in aclk node" \
746
- "or frequency property to be defined in audiopll node"); \
763
+ "or clock-frequency property to be defined in aclk node " \
764
+ "or frequency property to be defined in audiopll node " \
765
+ "or nordic_frequency property to be defined in " \
766
+ "audio_auxpll node"); \
747
767
DEVICE_DT_DEFINE(PDM(idx), pdm_nrfx_init##idx, NULL, \
748
768
&dmic_nrfx_pdm_data##idx, &dmic_nrfx_pdm_cfg##idx, \
749
769
POST_KERNEL, CONFIG_AUDIO_DMIC_INIT_PRIORITY, \
0 commit comments