1919LOG_MODULE_REGISTER (dmic_nrfx_pdm , CONFIG_AUDIO_DMIC_LOG_LEVEL );
2020
2121#define NODE_AUDIO_AUXPLL DT_NODELABEL(audio_auxpll)
22- #define NODE_AUDIOPLL DT_NODELABEL(audiopll)
22+
23+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2324
2425#if CONFIG_SOC_SERIES_NRF54H
25- #define DMIC_NRFX_CLOCK_FREQ MHZ(16)
26- #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0)
26+ #undef DMIC_NRFX_CLOCK_FREQ
27+ #define DMIC_NRFX_CLOCK_FREQ MHZ(16)
28+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
29+ #define AUDIO_ASSERT_MSG \
30+ "Clock source ACLK requires frequency property to be set in the audiopll node."
31+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), frequency)
32+
2733#elif DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
2834#define AUXPLL_FREQUENCY_SETTING DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
2935BUILD_ASSERT ((AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_48K ) ||
30- (AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
31- "Unsupported Audio AUXPLL frequency selection for PDM" );
36+ (AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
37+ "Unsupported Audio AUXPLL frequency selection for PDM" );
3238
3339#define DMIC_NRFX_AUDIO_CLOCK_FREQ CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
40+ #define AUDIO_ASSERT_MSG \
41+ "Clock source ACLK requires nordic_frequency property to be set in the audio_auxpll node."
42+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audio_auxpll), nordic_frequency)
3443
35- #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
44+ #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
45+ #undef DMIC_NRFX_CLOCK_FREQ
46+ #define DMIC_NRFX_CLOCK_FREQ MHZ(16)
47+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
48+ #define AUDIO_ASSERT_MSG \
49+ "Clock source ACLK requires frequency property to be set in the audiopll node."
50+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), frequency)
51+
52+ #elif CONFIG_CLOCK_CONTROL_NRF
53+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
54+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
55+ DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
56+ #define AUDIO_ASSERT_MSG \
57+ "Clock source ACLK requires hfclkaudio_frequency property to be set in the clock node" \
58+ "or clock_frequency property to be set in the aclk node."
59+ #define AUDIO_FREQUENCY_DEFINED (DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
60+ DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency))
61+
62+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO )
63+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
64+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
65+ DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_hfclkaudio), \
66+ hfclkaudio_frequency, 0))
67+ #define AUDIO_ASSERT_MSG \
68+ "Clock source ACLK requires hfclkaudio_frequency property to be set in the hfclkaudio " \
69+ "node."
70+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
71+ DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_hfclkaudio), hfclkaudio_frequency)
72+
73+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
74+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
75+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
76+ DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo24m), \
77+ clock_frequency, 0))
78+ #define AUDIO_ASSERT_MSG \
79+ "Clock source ACLK requires clock_frequency property to be set in the xo24m node."
80+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
81+ DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo24m), clock_frequency)
82+
83+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO )
84+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
85+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
86+ DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo), \
87+ clock_frequency, 0))
88+ #define AUDIO_ASSERT_MSG \
89+ "Clock source ACLK requires clock_frequency property to be set in the xo node."
90+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
91+ DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo), clock_frequency)
3692
3793#else
38- #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
39- #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
40- DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
94+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ 0
95+ #define AUDIO_ASSERT_MSG "ACLK clock source not available use another clock source."
96+ #define AUDIO_FREQUENCY_DEFINED 0
97+
4198#endif
4299
43100struct dmic_nrfx_pdm_drv_data {
@@ -46,6 +103,9 @@ struct dmic_nrfx_pdm_drv_data {
46103 const struct device * audiopll_dev ;
47104#elif CONFIG_CLOCK_CONTROL_NRF
48105 struct onoff_manager * clk_mgr ;
106+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
107+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
108+ const struct device * clk_dev ;
49109#endif
50110 struct onoff_client clk_cli ;
51111 struct k_mem_slab * mem_slab ;
@@ -91,6 +151,9 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
91151 return nrf_clock_control_request (drv_data -> audiopll_dev , NULL , & drv_data -> clk_cli );
92152#elif CONFIG_CLOCK_CONTROL_NRF
93153 return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
154+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
155+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
156+ return nrf_clock_control_request (drv_data -> clk_dev , NULL , & drv_data -> clk_cli );
94157#else
95158 return - ENOTSUP ;
96159#endif
@@ -105,6 +168,9 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
105168 return nrf_clock_control_release (drv_data -> audiopll_dev , NULL );
106169#elif CONFIG_CLOCK_CONTROL_NRF
107170 return onoff_release (drv_data -> clk_mgr );
171+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
172+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
173+ return nrf_clock_control_release (drv_data -> clk_dev , NULL );
108174#else
109175 return - ENOTSUP ;
110176#endif
@@ -323,7 +389,8 @@ static int dmic_nrfx_pdm_configure(const struct device *dev,
323389 * before starting the transfer itself.
324390 */
325391 drv_data -> request_clock = (drv_cfg -> clk_src != PCLK32M &&
326- IS_ENABLED (CONFIG_CLOCK_CONTROL_NRF ));
392+ (IS_ENABLED (CONFIG_CLOCK_CONTROL_NRF ) ||
393+ IS_ENABLED (CONFIG_CLOCK_CONTROL_NRFX_COMMON )));
327394 drv_data -> configured = true;
328395 return 0 ;
329396}
@@ -476,18 +543,42 @@ static void init_clock_manager(const struct device *dev)
476543 if (drv_cfg -> clk_src == ACLK ) {
477544 IF_ENABLED (NRF_CLOCK_HAS_HFCLKAUDIO , (subsys = CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO ;))
478545 IF_ENABLED (NRF_CLOCK_HAS_HFCLK24M , (subsys = CLOCK_CONTROL_NRF_SUBSYS_HF24M ;))
479- } else
480- #endif
481- {
546+ } else {
482547 subsys = CLOCK_CONTROL_NRF_SUBSYS_HF ;
483548 }
549+ #else
550+ subsys = CLOCK_CONTROL_NRF_SUBSYS_HF ;
551+ #endif
484552
485553 drv_data -> clk_mgr = z_nrf_clock_control_get_onoff (subsys );
486554 __ASSERT_NO_MSG (drv_data -> clk_mgr != NULL );
555+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
556+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
557+ struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
558+ #if NRF_CLOCK_HAS_HFCLKAUDIO || NRF_CLOCK_HAS_HFCLK24M
559+ const struct dmic_nrfx_pdm_drv_cfg * drv_cfg = dev -> config ;
560+
561+ if (drv_cfg -> clk_src == ACLK ) {
562+ IF_ENABLED (NRF_CLOCK_HAS_HFCLKAUDIO ,
563+ (drv_data -> clk_dev = DEVICE_DT_GET_ONE (nordic_nrf_clock_hfclkaudio );))
564+ IF_ENABLED (NRF_CLOCK_HAS_HFCLK24M ,
565+ (drv_data -> clk_dev = DEVICE_DT_GET_ONE (nordic_nrf_clock_xo24m );))
566+ } else {
567+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (COND_CODE_1 (NRF_CLOCK_HAS_HFCLK ,
568+ (nordic_nrf_clock_hfclk ),
569+ (nordic_nrf_clock_xo )));
570+ }
571+ #else
572+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (COND_CODE_1 (NRF_CLOCK_HAS_HFCLK ,
573+ (nordic_nrf_clock_hfclk ),
574+ (nordic_nrf_clock_xo )));
575+ #endif
576+
577+ __ASSERT_NO_MSG (drv_data -> clk_dev != NULL );
487578#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
488579 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
489580
490- drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIOPLL );
581+ drv_data -> audiopll_dev = DEVICE_DT_GET (DT_NODELABEL ( audiopll ) );
491582#endif
492583}
493584
@@ -538,17 +629,7 @@ static const struct _dmic_ops dmic_ops = {
538629 NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
539630 BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
540631 "Clock source ACLK is not available."); \
541- BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
542- DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
543- DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
544- DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
545- DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
546- "Clock source ACLK requires one following defined frequency " \
547- "properties: " \
548- "hfclkaudio-frequency in the nordic,nrf-clock node, " \
549- "clock-frequency in the aclk node, " \
550- "frequency in the audiopll node, " \
551- "nordic-frequency in the audio_auxpll node"); \
632+ BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || AUDIO_FREQUENCY_DEFINED, AUDIO_ASSERT_MSG); \
552633 DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
553634 &dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
554635 CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);
0 commit comments