From 849e5087640e5b7669ae3362bed871cc7da3b035 Mon Sep 17 00:00:00 2001 From: David Jewsbury Date: Mon, 14 Jul 2025 10:53:03 +0100 Subject: [PATCH] drivers: audio: dmic_nrfx: add support for audio_auxpll clk src Added support for auxpll being used as audio clock source for DMIC PDM driver. Signed-off-by: David Jewsbury --- drivers/audio/dmic_nrfx_pdm.c | 54 ++++++++++++++++++-------- dts/bindings/audio/nordic,nrf-pdm.yaml | 3 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/drivers/audio/dmic_nrfx_pdm.c b/drivers/audio/dmic_nrfx_pdm.c index 7b426132adf91..11266ed31aeda 100644 --- a/drivers/audio/dmic_nrfx_pdm.c +++ b/drivers/audio/dmic_nrfx_pdm.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -15,10 +16,22 @@ #include LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL); +#define AUDIO_AUXPLL DT_NODELABEL(audio_auxpll) +#define NODE_AUDIOPLL DT_NODELABEL(audiopll) + #if CONFIG_SOC_SERIES_NRF54HX #define DMIC_NRFX_CLOCK_FREQ MHZ(16) #define DMIC_NRFX_CLOCK_FACTOR 8192 -#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0) +#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0) +#elif DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) +#if DT_PROP_OR(NODE_AUDIO_AUXPLL, nordic_frequency, 0) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K +#define DMIC_NRFX_AUDIO_CLOCK_FREQ 12287963 +#elif DT_PROP_OR(NODE_AUDIO_AUXPLL, nordic_frequency, 0) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 +#define DMIC_NRFX_AUDIO_CLOCK_FREQ 11289591 +#else +#error "Unsupported Audio AUXPLL frequency selection for PDM" +#endif +#define DMIC_NRFX_CLOCK_FREQ MHZ(32) #else #define DMIC_NRFX_CLOCK_FREQ MHZ(32) #define DMIC_NRFX_CLOCK_FACTOR 4096 @@ -28,10 +41,10 @@ LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL); struct dmic_nrfx_pdm_drv_data { const nrfx_pdm_t *pdm; -#if CONFIG_CLOCK_CONTROL_NRF - struct onoff_manager *clk_mgr; -#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL +#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) const struct device *audiopll_dev; +#elif CONFIG_CLOCK_CONTROL_NRF + struct onoff_manager *clk_mgr; #endif struct onoff_client clk_cli; struct k_mem_slab *mem_slab; @@ -73,10 +86,10 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data) if (!drv_data->request_clock) { return 0; } -#if CONFIG_CLOCK_CONTROL_NRF - return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli); -#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL +#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) return nrf_clock_control_request(drv_data->audiopll_dev, NULL, &drv_data->clk_cli); +#elif CONFIG_CLOCK_CONTROL_NRF + return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli); #else return -ENOTSUP; #endif @@ -87,11 +100,10 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data) if (!drv_data->request_clock) { return 0; } - -#if CONFIG_CLOCK_CONTROL_NRF - return onoff_release(drv_data->clk_mgr); -#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL +#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) return nrf_clock_control_release(drv_data->audiopll_dev, NULL); +#elif CONFIG_CLOCK_CONTROL_NRF + return onoff_release(drv_data->clk_mgr); #else return -ENOTSUP; #endif @@ -659,7 +671,11 @@ static int dmic_nrfx_pdm_read(const struct device *dev, static void init_clock_manager(const struct device *dev) { -#if CONFIG_CLOCK_CONTROL_NRF +#if DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) + struct dmic_nrfx_pdm_drv_data *drv_data = dev->data; + + drv_data->audiopll_dev = DEVICE_DT_GET(NODE_AUDIO_AUXPLL); +#elif CONFIG_CLOCK_CONTROL_NRF clock_control_subsys_t subsys; struct dmic_nrfx_pdm_drv_data *drv_data = dev->data; #if NRF_CLOCK_HAS_HFCLKAUDIO @@ -678,7 +694,7 @@ static void init_clock_manager(const struct device *dev) #elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL struct dmic_nrfx_pdm_drv_data *drv_data = dev->data; - drv_data->audiopll_dev = DEVICE_DT_GET(DT_NODELABEL(audiopll)); + drv_data->audiopll_dev = DEVICE_DT_GET(NODE_AUDIOPLL); #endif } @@ -738,12 +754,16 @@ static const struct _dmic_ops dmic_ops = { hfclkaudio_frequency) || \ DT_NODE_HAS_PROP(DT_NODELABEL(aclk), \ clock_frequency) || \ - DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), \ - frequency), \ + DT_NODE_HAS_PROP(NODE_AUDIOPLL, \ + frequency) || \ + DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, \ + nordic_frequency), \ "Clock source ACLK requires the hfclkaudio-frequency " \ "property to be defined in the nordic,nrf-clock node " \ - "or clock-frequency property to be defined in aclk node" \ - "or frequency property to be defined in audiopll node"); \ + "or clock-frequency property to be defined in aclk node " \ + "or frequency property to be defined in audiopll node " \ + "or nordic_frequency property to be defined in " \ + "audio_auxpll node"); \ DEVICE_DT_DEFINE(PDM(idx), pdm_nrfx_init##idx, NULL, \ &dmic_nrfx_pdm_data##idx, &dmic_nrfx_pdm_cfg##idx, \ POST_KERNEL, CONFIG_AUDIO_DMIC_INIT_PRIORITY, \ diff --git a/dts/bindings/audio/nordic,nrf-pdm.yaml b/dts/bindings/audio/nordic,nrf-pdm.yaml index 78b08567b7d2b..e700a02053583 100644 --- a/dts/bindings/audio/nordic,nrf-pdm.yaml +++ b/dts/bindings/audio/nordic,nrf-pdm.yaml @@ -31,8 +31,7 @@ properties: (HFXO) for better clock accuracy and jitter performance - "ACLK": Audio PLL clock with configurable frequency (frequency for this clock must be set via the "hfclkaudio-frequency" property - in the "nordic,nrf-clock" node); this clock source is only available - in the nRF53 Series SoCs and it requires the use of HFXO + in the "nordic,nrf-clock" node); this clock source requires the use of HFXO enum: - "PCLK32M" - "PCLK32M_HFXO"