@@ -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
@@ -482,6 +504,23 @@ static void init_clock_manager(const struct device *dev)
482504
483505 drv_data -> clk_mgr = z_nrf_clock_control_get_onoff (subsys );
484506 __ASSERT_NO_MSG (drv_data -> clk_mgr != NULL );
507+ #elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO ) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK ) || \
508+ defined(CONFIG_CLOCK_CONTROL_NRF_XO )
509+ struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
510+ #if NRF_CLOCK_HAS_HFCLKAUDIO
511+ const struct dmic_nrfx_pdm_drv_cfg * drv_cfg = dev -> config ;
512+
513+ if (drv_cfg -> clk_src == ACLK ) {
514+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (nordic_nrf_clock_hfclkaudio );
515+ } else
516+ #endif
517+ {
518+ drv_data -> clk_dev = DEVICE_DT_GET_ONE (COND_CODE_1 ((NRF_CLOCK_HAS_HFCLK ),
519+ (nordic_nrf_clock_hfclk ),
520+ (nordic_nrf_clock_xo )));
521+ }
522+
523+ __ASSERT_NO_MSG (drv_data -> clk_dev != NULL );
485524#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
486525 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
487526
@@ -497,58 +536,58 @@ static const struct _dmic_ops dmic_ops = {
497536
498537#define PDM_CLK_SRC (inst ) DT_STRING_TOKEN(DT_DRV_INST(inst), clock_source)
499538
500- #define PDM_NRFX_DEVICE (inst ) \
501- static void *rx_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
502- static void *mem_slab_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
503- static struct dmic_nrfx_pdm_drv_data dmic_nrfx_pdm_data##inst = { \
504- .pdm = NRFX_PDM_INSTANCE(DT_INST_REG_ADDR(inst)), \
505- }; \
506- static int pdm_nrfx_init##inst(const struct device *dev) \
507- { \
508- IRQ_CONNECT(DT_INST_IRQN(inst), DT_INST_IRQ(inst, priority), nrfx_pdm_irq_handler, \
509- &dmic_nrfx_pdm_data##inst.pdm, 0); \
510- const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config; \
511- int err = pinctrl_apply_state(drv_cfg->pcfg, PINCTRL_STATE_DEFAULT); \
512- if (err < 0) { \
513- return err; \
514- } \
515- k_msgq_init(&dmic_nrfx_pdm_data##inst.rx_queue, (char *)rx_msgs##inst, \
516- sizeof(void *), ARRAY_SIZE(rx_msgs##inst)); \
517- k_msgq_init(&dmic_nrfx_pdm_data##inst.mem_slab_queue, (char *)mem_slab_msgs##inst, \
518- sizeof(void *), ARRAY_SIZE(mem_slab_msgs##inst)); \
519- init_clock_manager(dev); \
520- return 0; \
521- } \
522- static void event_handler##inst(const nrfx_pdm_evt_t *evt) \
523- { \
524- event_handler(DEVICE_DT_INST_GET(inst), evt); \
525- } \
526- PINCTRL_DT_INST_DEFINE(inst); \
527- static const struct dmic_nrfx_pdm_drv_cfg dmic_nrfx_pdm_cfg##inst = { \
528- .event_handler = event_handler##inst, \
529- .nrfx_def_cfg = NRFX_PDM_DEFAULT_CONFIG(0, 0), \
530- .nrfx_def_cfg.skip_gpio_cfg = true, \
531- .nrfx_def_cfg.skip_psel_cfg = true, \
532- .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
533- .clk_src = PDM_CLK_SRC(inst), \
534- .mem_reg = DMM_DEV_TO_REG(DT_DRV_INST(inst)), \
535- }; \
536- NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
537- BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
538- "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"); \
550- DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
551- &dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
539+ #define PDM_NRFX_DEVICE (inst ) \
540+ static void *rx_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
541+ static void *mem_slab_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
542+ static struct dmic_nrfx_pdm_drv_data dmic_nrfx_pdm_data##inst = { \
543+ .pdm = NRFX_PDM_INSTANCE(DT_INST_REG_ADDR(inst)), \
544+ }; \
545+ static int pdm_nrfx_init##inst(const struct device *dev) \
546+ { \
547+ IRQ_CONNECT(DT_INST_IRQN(inst), DT_INST_IRQ(inst, priority), nrfx_pdm_irq_handler, \
548+ &dmic_nrfx_pdm_data##inst.pdm, 0); \
549+ const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config; \
550+ int err = pinctrl_apply_state(drv_cfg->pcfg, PINCTRL_STATE_DEFAULT); \
551+ if (err < 0) { \
552+ return err; \
553+ } \
554+ k_msgq_init(&dmic_nrfx_pdm_data##inst.rx_queue, (char *)rx_msgs##inst, \
555+ sizeof(void *), ARRAY_SIZE(rx_msgs##inst)); \
556+ k_msgq_init(&dmic_nrfx_pdm_data##inst.mem_slab_queue, (char *)mem_slab_msgs##inst, \
557+ sizeof(void *), ARRAY_SIZE(mem_slab_msgs##inst)); \
558+ init_clock_manager(dev); \
559+ return 0; \
560+ } \
561+ static void event_handler##inst(const nrfx_pdm_evt_t *evt) \
562+ { \
563+ event_handler(DEVICE_DT_INST_GET(inst), evt); \
564+ } \
565+ PINCTRL_DT_INST_DEFINE(inst); \
566+ static const struct dmic_nrfx_pdm_drv_cfg dmic_nrfx_pdm_cfg##inst = { \
567+ .event_handler = event_handler##inst, \
568+ .nrfx_def_cfg = NRFX_PDM_DEFAULT_CONFIG(0, 0), \
569+ .nrfx_def_cfg.skip_gpio_cfg = true, \
570+ .nrfx_def_cfg.skip_psel_cfg = true, \
571+ .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
572+ .clk_src = PDM_CLK_SRC(inst), \
573+ .mem_reg = DMM_DEV_TO_REG(DT_DRV_INST(inst)), \
574+ }; \
575+ NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
576+ BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
577+ "Clock source ACLK is not available."); \
578+ BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
579+ DT_NODE_HAS_PROP(DT_NODELABEL(HFCLKAUDIO_NODE ), hfclkaudio_frequency) || \
580+ DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
581+ DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
582+ DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
583+ "Clock source ACLK requires one following defined frequency " \
584+ "properties: " \
585+ HFCLKAUDIO_NODE_DESC \
586+ "clock-frequency in the aclk node, " \
587+ "frequency in the audiopll node, " \
588+ "nordic-frequency in the audio_auxpll node"); \
589+ DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
590+ &dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
552591 CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);
553592
554593DT_INST_FOREACH_STATUS_OKAY (PDM_NRFX_DEVICE )
0 commit comments