Skip to content

Commit 10649e3

Browse files
committed
[nrf fromtree] 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 <[email protected]> (cherry picked from commit d9e22a7)
1 parent cf180fe commit 10649e3

File tree

2 files changed

+36
-22
lines changed

2 files changed

+36
-22
lines changed

drivers/audio/dmic_nrfx_pdm.c

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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>
@@ -15,10 +16,19 @@
1516
#include <zephyr/irq.h>
1617
LOG_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

2939
struct 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

658667
static 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, \

dts/bindings/audio/nordic,nrf-pdm.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ properties:
3131
(HFXO) for better clock accuracy and jitter performance
3232
- "ACLK": Audio PLL clock with configurable frequency (frequency for
3333
this clock must be set via the "hfclkaudio-frequency" property
34-
in the "nordic,nrf-clock" node); this clock source is only available
35-
in the nRF53 Series SoCs and it requires the use of HFXO
34+
in the "nordic,nrf-clock" node); this clock source requires the use of HFXO
3635
enum:
3736
- "PCLK32M"
3837
- "PCLK32M_HFXO"

0 commit comments

Comments
 (0)