77#include <zephyr/audio/dmic.h>
88#include <zephyr/drivers/clock_control/nrf_clock_control.h>
99#include <zephyr/drivers/pinctrl.h>
10+ #include <zephyr/dt-bindings/clock/nrf-auxpll.h>
1011#include <soc.h>
1112#include <dmm.h>
1213#include <nrfx_pdm.h>
1516#include <zephyr/irq.h>
1617LOG_MODULE_REGISTER (dmic_nrfx_pdm , CONFIG_AUDIO_DMIC_LOG_LEVEL );
1718
19+ #define NODE_AUDIO_AUXPLL DT_NODELABEL(audio_auxpll)
20+ #define NODE_AUDIOPLL DT_NODELABEL(audiopll)
21+
1822#if CONFIG_SOC_SERIES_NRF54HX
1923#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
2024#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+ #define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
28+ BUILD_ASSERT ((DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_48K ) ||
29+ (DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
30+ "Unsupported Audio AUXPLL frequency selection for PDM" );
31+ #define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2232#else
2333#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2434#define DMIC_NRFX_CLOCK_FACTOR 4096
@@ -28,10 +38,10 @@ LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL);
2838
2939struct dmic_nrfx_pdm_drv_data {
3040 const nrfx_pdm_t * pdm ;
31- #if CONFIG_CLOCK_CONTROL_NRF
32- struct onoff_manager * clk_mgr ;
33- #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
41+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
3442 const struct device * audiopll_dev ;
43+ #elif CONFIG_CLOCK_CONTROL_NRF
44+ struct onoff_manager * clk_mgr ;
3545#endif
3646 struct onoff_client clk_cli ;
3747 struct k_mem_slab * mem_slab ;
@@ -73,10 +83,10 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
7383 if (!drv_data -> request_clock ) {
7484 return 0 ;
7585 }
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
86+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
7987 return nrf_clock_control_request (drv_data -> audiopll_dev , NULL , & drv_data -> clk_cli );
88+ #elif CONFIG_CLOCK_CONTROL_NRF
89+ return onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
8090#else
8191 return - ENOTSUP ;
8292#endif
@@ -87,11 +97,10 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
8797 if (!drv_data -> request_clock ) {
8898 return 0 ;
8999 }
90-
91- #if CONFIG_CLOCK_CONTROL_NRF
92- return onoff_release (drv_data -> clk_mgr );
93- #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
100+ #if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
94101 return nrf_clock_control_release (drv_data -> audiopll_dev , NULL );
102+ #elif CONFIG_CLOCK_CONTROL_NRF
103+ return onoff_release (drv_data -> clk_mgr );
95104#else
96105 return - ENOTSUP ;
97106#endif
@@ -657,9 +666,11 @@ static int dmic_nrfx_pdm_read(const struct device *dev,
657666
658667static void init_clock_manager (const struct device * dev )
659668{
660- #if CONFIG_CLOCK_CONTROL_NRF
661- clock_control_subsys_t subsys ;
662669 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
670+ #if DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
671+ drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIO_AUXPLL );
672+ #elif CONFIG_CLOCK_CONTROL_NRF
673+ clock_control_subsys_t subsys ;
663674#if NRF_CLOCK_HAS_HFCLKAUDIO
664675 const struct dmic_nrfx_pdm_drv_cfg * drv_cfg = dev -> config ;
665676
@@ -676,7 +687,7 @@ static void init_clock_manager(const struct device *dev)
676687#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
677688 struct dmic_nrfx_pdm_drv_data * drv_data = dev -> data ;
678689
679- drv_data -> audiopll_dev = DEVICE_DT_GET (DT_NODELABEL ( audiopll ) );
690+ drv_data -> audiopll_dev = DEVICE_DT_GET (NODE_AUDIOPLL );
680691#endif
681692}
682693
@@ -737,12 +748,16 @@ static const struct _dmic_ops dmic_ops = {
737748 hfclkaudio_frequency) || \
738749 DT_NODE_HAS_PROP(DT_NODELABEL(aclk), \
739750 clock_frequency) || \
740- DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), \
741- frequency), \
742- "Clock source ACLK requires the hfclkaudio-frequency " \
743- "property to be defined in the nordic,nrf-clock node " \
744- "or clock-frequency property to be defined in aclk node" \
745- "or frequency property to be defined in audiopll node"); \
751+ DT_NODE_HAS_PROP(NODE_AUDIOPLL, \
752+ frequency) || \
753+ DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, \
754+ nordic_frequency), \
755+ "Clock source ACLK requires one following defined frequency "\
756+ "properties: " \
757+ "hfclkaudio-frequency in the nordic,nrf-clock node, " \
758+ "clock-frequency in the aclk node, " \
759+ "frequency in the audiopll node, " \
760+ "nordic-frequency in the audio_auxpll node"); \
746761 DEVICE_DT_DEFINE(PDM(idx), pdm_nrfx_init##idx, NULL, \
747762 &dmic_nrfx_pdm_data##idx, &dmic_nrfx_pdm_cfg##idx, \
748763 POST_KERNEL, CONFIG_AUDIO_DMIC_INIT_PRIORITY, \
0 commit comments