Skip to content

Commit 849e508

Browse files
committed
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 <david.jewsbury@nordicsemi.no>
1 parent 322da1d commit 849e508

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

drivers/audio/dmic_nrfx_pdm.c

Lines changed: 37 additions & 17 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,22 @@
1516
#include <zephyr/irq.h>
1617
LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL);
1718

19+
#define 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+
#if DT_PROP_OR(NODE_AUDIO_AUXPLL, nordic_frequency, 0) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K
28+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ 12287963
29+
#elif DT_PROP_OR(NODE_AUDIO_AUXPLL, nordic_frequency, 0) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1
30+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ 11289591
31+
#else
32+
#error "Unsupported Audio AUXPLL frequency selection for PDM"
33+
#endif
34+
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2235
#else
2336
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2437
#define DMIC_NRFX_CLOCK_FACTOR 4096
@@ -28,10 +41,10 @@ LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL);
2841

2942
struct dmic_nrfx_pdm_drv_data {
3043
const nrfx_pdm_t *pdm;
31-
#if CONFIG_CLOCK_CONTROL_NRF
32-
struct onoff_manager *clk_mgr;
33-
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
44+
#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
3445
const struct device *audiopll_dev;
46+
#elif CONFIG_CLOCK_CONTROL_NRF
47+
struct onoff_manager *clk_mgr;
3548
#endif
3649
struct onoff_client clk_cli;
3750
struct k_mem_slab *mem_slab;
@@ -73,10 +86,10 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
7386
if (!drv_data->request_clock) {
7487
return 0;
7588
}
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
89+
#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
7990
return nrf_clock_control_request(drv_data->audiopll_dev, NULL, &drv_data->clk_cli);
91+
#elif CONFIG_CLOCK_CONTROL_NRF
92+
return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli);
8093
#else
8194
return -ENOTSUP;
8295
#endif
@@ -87,11 +100,10 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
87100
if (!drv_data->request_clock) {
88101
return 0;
89102
}
90-
91-
#if CONFIG_CLOCK_CONTROL_NRF
92-
return onoff_release(drv_data->clk_mgr);
93-
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
103+
#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
94104
return nrf_clock_control_release(drv_data->audiopll_dev, NULL);
105+
#elif CONFIG_CLOCK_CONTROL_NRF
106+
return onoff_release(drv_data->clk_mgr);
95107
#else
96108
return -ENOTSUP;
97109
#endif
@@ -659,7 +671,11 @@ static int dmic_nrfx_pdm_read(const struct device *dev,
659671

660672
static void init_clock_manager(const struct device *dev)
661673
{
662-
#if CONFIG_CLOCK_CONTROL_NRF
674+
#if DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
675+
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
676+
677+
drv_data->audiopll_dev = DEVICE_DT_GET(NODE_AUDIO_AUXPLL);
678+
#elif CONFIG_CLOCK_CONTROL_NRF
663679
clock_control_subsys_t subsys;
664680
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
665681
#if NRF_CLOCK_HAS_HFCLKAUDIO
@@ -678,7 +694,7 @@ static void init_clock_manager(const struct device *dev)
678694
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
679695
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
680696

681-
drv_data->audiopll_dev = DEVICE_DT_GET(DT_NODELABEL(audiopll));
697+
drv_data->audiopll_dev = DEVICE_DT_GET(NODE_AUDIOPLL);
682698
#endif
683699
}
684700

@@ -738,12 +754,16 @@ static const struct _dmic_ops dmic_ops = {
738754
hfclkaudio_frequency) || \
739755
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), \
740756
clock_frequency) || \
741-
DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), \
742-
frequency), \
757+
DT_NODE_HAS_PROP(NODE_AUDIOPLL, \
758+
frequency) || \
759+
DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, \
760+
nordic_frequency), \
743761
"Clock source ACLK requires the hfclkaudio-frequency " \
744762
"property to be defined in the nordic,nrf-clock node " \
745-
"or clock-frequency property to be defined in aclk node" \
746-
"or frequency property to be defined in audiopll node"); \
763+
"or clock-frequency property to be defined in aclk node " \
764+
"or frequency property to be defined in audiopll node " \
765+
"or nordic_frequency property to be defined in " \
766+
"audio_auxpll node"); \
747767
DEVICE_DT_DEFINE(PDM(idx), pdm_nrfx_init##idx, NULL, \
748768
&dmic_nrfx_pdm_data##idx, &dmic_nrfx_pdm_cfg##idx, \
749769
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)