@@ -30,10 +30,23 @@ BUILD_ASSERT((DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
3030 (DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
3131 "Unsupported Audio AUXPLL frequency selection for PDM" );
3232#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
33- #else
33+ #elif CONFIG_CLOCK_CONTROL_NRF
3434#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
3535#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
3636 DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
37+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO )
38+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
39+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ \
40+ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
41+ DT_PROP_OR(DT_NODELABEL(hfclkaudio), hfclkaudio_frequency, 0))
42+ #endif
43+
44+ #if defined(CONFIG_CLOCK_CONTORL_NRF )
45+ #define HFCLKAUDIO_NODE clock
46+ #define HFCLKAUDIO_NODE_DESC "hfclkaudio-frequency in the nordic,nrf-clock node, "
47+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO )
48+ #define HFCLKAUDIO_NODE hfclkaudio
49+ #define HFCLKAUDIO_NODE_DESC "hfclkaudio-frequency in the nordic,nrf-clock-hfclkaudio node, "
3750#endif
3851
3952struct dmic_nrfx_pdm_drv_data {
@@ -42,6 +55,9 @@ struct dmic_nrfx_pdm_drv_data {
4255 const struct device * audiopll_dev ;
4356#elif CONFIG_CLOCK_CONTROL_NRF
4457 struct onoff_manager * clk_mgr ;
58+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK ) || \
59+ defined(CONFIG_CLOCK_CONTROL_NRF_XO )
60+ const struct device * clk_dev ;
4561#endif
4662 struct onoff_client clk_cli ;
4763 struct k_mem_slab * mem_slab ;
@@ -87,6 +103,9 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
87103 return nrf_clock_control_request (drv_data -> audiopll_dev , NULL , & drv_data -> clk_cli );
88104#elif CONFIG_CLOCK_CONTROL_NRF
89105 return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
106+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK ) || \
107+ defined(CONFIG_CLOCK_CONTROL_NRF_XO )
108+ return nrf_clock_control_request (drv_data -> clk_dev , NULL , & drv_data -> clk_cli );
90109#else
91110 return - ENOTSUP ;
92111#endif
@@ -101,6 +120,9 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
101120 return nrf_clock_control_release (drv_data -> audiopll_dev , NULL );
102121#elif CONFIG_CLOCK_CONTROL_NRF
103122 return onoff_release (drv_data -> clk_mgr );
123+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK ) || \
124+ defined(CONFIG_CLOCK_CONTROL_NRF_XO )
125+ return nrf_clock_control_release (drv_data -> clk_dev , NULL );
104126#else
105127 return - ENOTSUP ;
106128#endif
@@ -474,14 +496,32 @@ static void init_clock_manager(const struct device *dev)
474496
475497 if (drv_cfg -> clk_src == ACLK ) {
476498 subsys = CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO ;
477- } else
499+ } else {
478500#endif
479- {
480501 subsys = CLOCK_CONTROL_NRF_SUBSYS_HF ;
502+ #if NRF_CLOCK_HAS_HFCLKAUDIO
481503 }
504+ #endif
482505
483506 drv_data -> clk_mgr = z_nrf_clock_control_get_onoff (subsys );
484507 __ASSERT_NO_MSG (drv_data -> clk_mgr != NULL );
508+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK) || \
509+ defined(CONFIG_CLOCK_CONTROL_NRF_XO)
510+ struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
511+ #if NRF_CLOCK_HAS_HFCLKAUDIO
512+ const struct dmic_nrfx_pdm_drv_cfg * drv_cfg = dev -> config ;
513+
514+ if (drv_cfg -> clk_src == ACLK ) {
515+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (nordic_nrf_clock_hfclkaudio );
516+ } else
517+ #endif
518+ {
519+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (COND_CODE_1 ((NRF_CLOCK_HAS_HFCLK ),
520+ (nordic_nrf_clock_hfclk ),
521+ (nordic_nrf_clock_xo )));
522+ }
523+
524+ __ASSERT_NO_MSG (drv_data -> clk_dev != NULL );
485525#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
486526 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
487527
@@ -536,17 +576,16 @@ static const struct _dmic_ops dmic_ops = {
536576 NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
537577 BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
538578 "Clock source ACLK is not available."); \
539- BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
540- DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
541- DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
542- DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
543- DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
544- "Clock source ACLK requires one following defined frequency " \
545- "properties: " \
546- "hfclkaudio-frequency in the nordic,nrf-clock node, " \
547- "clock-frequency in the aclk node, " \
548- "frequency in the audiopll node, " \
549- "nordic-frequency in the audio_auxpll node"); \
579+ BUILD_ASSERT( \
580+ PDM_CLK_SRC(inst) != ACLK || \
581+ DT_NODE_HAS_PROP(DT_NODELABEL(HFCLKAUDIO_NODE), hfclkaudio_frequency) || \
582+ DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
583+ DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
584+ DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
585+ "Clock source ACLK requires one following defined frequency " \
586+ "properties: " HFCLKAUDIO_NODE_DESC "clock-frequency in the aclk node, " \
587+ "frequency in the audiopll node, " \
588+ "nordic-frequency in the audio_auxpll node"); \
550589 DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
551590 &dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
552591 CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);
0 commit comments