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)
2322
2423#if CONFIG_SOC_SERIES_NRF54H
2524#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
26- #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0)
25+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
26+ #define AUDIO_NODE_DESC "frequency property to be set in the audiopll node."
27+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), frequency)
28+
2729#elif DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
2830#define AUXPLL_FREQUENCY_SETTING DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
2931BUILD_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" );
32+ (AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
33+ "Unsupported Audio AUXPLL frequency selection for PDM" );
3234
3335#define DMIC_NRFX_AUDIO_CLOCK_FREQ CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
36+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
37+ #define AUDIO_NODE_DESC "nordic_frequency property to be set in the audio_auxpll node."
38+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audio_auxpll), nordic_frequency)
3439
40+ #elif CONFIG_CLOCK_CONTROL_NRF
3541#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
42+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
43+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
44+ DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
45+ #define AUDIO_NODE_DESC "hfclkaudio_frequency property to be set in the clock node."
46+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency)
3647
37- #else
48+ #elif defined( CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO )
3849#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))
50+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
51+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
52+ DT_PROP_OR(DT_NODELABEL(hfclkaudio), hfclkaudio_frequency, 0))
53+ #define AUDIO_NODE_DESC "hfclkaudio_frequency property to be set in the hfclkaudio node."
54+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(hfclkaudio), hfclkaudio_frequency)
55+
56+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M )
57+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
58+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
59+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
60+ DT_PROP_OR(DT_NODELABEL(xo24m), clock_frequency, 0))
61+ #define AUDIO_NODE_DESC "clock_frequency property to be set in the xo24m node."
62+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(xo24m), clock_frequency)
63+
64+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO )
65+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
66+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
67+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
68+ DT_PROP_OR(DT_NODELABEL(xo), clock_frequency, 0))
69+ #define AUDIO_NODE_DESC "clock_frequency property to be set in the xo node."
70+ #define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(xo), clock_frequency)
4171#endif
4272
4373struct dmic_nrfx_pdm_drv_data {
@@ -46,6 +76,9 @@ struct dmic_nrfx_pdm_drv_data {
4676 const struct device * audiopll_dev ;
4777#elif CONFIG_CLOCK_CONTROL_NRF
4878 struct onoff_manager * clk_mgr ;
79+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
80+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO )
81+ const struct device * clk_dev ;
4982#endif
5083 struct onoff_client clk_cli ;
5184 struct k_mem_slab * mem_slab ;
@@ -91,6 +124,9 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
91124 return nrf_clock_control_request (drv_data -> audiopll_dev , NULL , & drv_data -> clk_cli );
92125#elif CONFIG_CLOCK_CONTROL_NRF
93126 return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
127+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
128+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO )
129+ return nrf_clock_control_request (drv_data -> clk_dev , NULL , & drv_data -> clk_cli );
94130#else
95131 return - ENOTSUP ;
96132#endif
@@ -105,6 +141,9 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
105141 return nrf_clock_control_release (drv_data -> audiopll_dev , NULL );
106142#elif CONFIG_CLOCK_CONTROL_NRF
107143 return onoff_release (drv_data -> clk_mgr );
144+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK ) || \
145+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO )
146+ return nrf_clock_control_release (drv_data -> clk_dev , NULL );
108147#else
109148 return - ENOTSUP ;
110149#endif
@@ -476,18 +515,37 @@ static void init_clock_manager(const struct device *dev)
476515
477516 if (drv_cfg -> clk_src == ACLK ) {
478517 subsys = CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO ;
479- } else
518+ } else {
480519#endif
481- {
482520 subsys = CLOCK_CONTROL_NRF_SUBSYS_HF ;
521+ #if NRF_CLOCK_HAS_HFCLKAUDIO
483522 }
523+ #endif
484524
485525 drv_data -> clk_mgr = z_nrf_clock_control_get_onoff (subsys );
486526 __ASSERT_NO_MSG (drv_data -> clk_mgr != NULL );
527+ #elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK) || \
528+ defined(CONFIG_CLOCK_CONTROL_NRFX_XO)
529+ struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
530+ #if NRF_CLOCK_HAS_HFCLKAUDIO
531+ const struct dmic_nrfx_pdm_drv_cfg * drv_cfg = dev -> config ;
532+
533+ if (drv_cfg -> clk_src == ACLK ) {
534+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (nordic_nrf_clock_hfclkaudio );
535+ } else {
536+ #endif
537+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (COND_CODE_1 (NRF_CLOCK_HAS_HFCLK ,
538+ (nordic_nrf_clock_hfclk ),
539+ (nordic_nrf_clock_xo )));
540+ #if NRF_CLOCK_HAS_HFCLKAUDIO
541+ }
542+ #endif
543+
544+ __ASSERT_NO_MSG (drv_data -> clk_dev != NULL );
487545#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
488546 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
489547
490- drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIOPLL );
548+ drv_data -> audiopll_dev = DEVICE_DT_GET (DT_NODELABEL ( audiopll ) );
491549#endif
492550}
493551
@@ -538,17 +596,8 @@ static const struct _dmic_ops dmic_ops = {
538596 NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
539597 BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
540598 "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"); \
599+ BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || AUDIO_FREQUENCY_DEFINED, \
600+ "Clock source ACLK requires " AUDIO_NODE_DESC); \
552601 DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
553602 &dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
554603 CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);
0 commit comments