Skip to content

Commit e75665c

Browse files
committed
[nrf fromlist] drivers: clock_control: split clock control into individual clocks.
Split clock control into individual clocks: HFCLK, XO, LFCLK, HFCLK192M, XO24M, HFCLKAUDIO Signed-off-by: Michal Frankiewicz <michal.frankiewicz@nordicsemi.no> Upstream PR #: 104658
1 parent c0d6f23 commit e75665c

69 files changed

Lines changed: 3936 additions & 166 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

drivers/audio/dmic_nrfx_pdm.c

Lines changed: 106 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,82 @@
1919
LOG_MODULE_REGISTER(dmic_nrfx_pdm, CONFIG_AUDIO_DMIC_LOG_LEVEL);
2020

2121
#define NODE_AUDIO_AUXPLL DT_NODELABEL(audio_auxpll)
22-
#define NODE_AUDIOPLL DT_NODELABEL(audiopll)
22+
23+
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
2324

2425
#if CONFIG_SOC_SERIES_NRF54H
25-
#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
26-
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0)
26+
#undef DMIC_NRFX_CLOCK_FREQ
27+
#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
28+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
29+
#define AUDIO_ASSERT_MSG \
30+
"Clock source ACLK requires frequency property to be set in the audiopll node."
31+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), frequency)
32+
2733
#elif DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
2834
#define AUXPLL_FREQUENCY_SETTING DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
2935
BUILD_ASSERT((AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
30-
(AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
31-
"Unsupported Audio AUXPLL frequency selection for PDM");
36+
(AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
37+
"Unsupported Audio AUXPLL frequency selection for PDM");
3238

3339
#define DMIC_NRFX_AUDIO_CLOCK_FREQ CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
40+
#define AUDIO_ASSERT_MSG \
41+
"Clock source ACLK requires nordic_frequency property to be set in the audio_auxpll node."
42+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audio_auxpll), nordic_frequency)
3443

35-
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
44+
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
45+
#undef DMIC_NRFX_CLOCK_FREQ
46+
#define DMIC_NRFX_CLOCK_FREQ MHZ(16)
47+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(audiopll), frequency, 0)
48+
#define AUDIO_ASSERT_MSG \
49+
"Clock source ACLK requires frequency property to be set in the audiopll node."
50+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP(DT_NODELABEL(audiopll), frequency)
51+
52+
#elif CONFIG_CLOCK_CONTROL_NRF
53+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ \
54+
DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
55+
DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
56+
#define AUDIO_ASSERT_MSG \
57+
"Clock source ACLK requires hfclkaudio_frequency property to be set in the clock node" \
58+
"or clock_frequency property to be set in the aclk node."
59+
#define AUDIO_FREQUENCY_DEFINED (DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
60+
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency))
61+
62+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO)
63+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ \
64+
DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
65+
DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_hfclkaudio), \
66+
hfclkaudio_frequency, 0))
67+
#define AUDIO_ASSERT_MSG \
68+
"Clock source ACLK requires hfclkaudio_frequency property to be set in the hfclkaudio " \
69+
"node."
70+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
71+
DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_hfclkaudio), hfclkaudio_frequency)
72+
73+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M)
74+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ \
75+
DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
76+
DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo24m), \
77+
clock_frequency, 0))
78+
#define AUDIO_ASSERT_MSG \
79+
"Clock source ACLK requires clock_frequency property to be set in the xo24m node."
80+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
81+
DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo24m), clock_frequency)
82+
83+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_XO)
84+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ \
85+
DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
86+
DT_PROP_OR(DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo), \
87+
clock_frequency, 0))
88+
#define AUDIO_ASSERT_MSG \
89+
"Clock source ACLK requires clock_frequency property to be set in the xo node."
90+
#define AUDIO_FREQUENCY_DEFINED DT_NODE_HAS_PROP( \
91+
DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_clock_xo), clock_frequency)
3692

3793
#else
38-
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
39-
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
40-
DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
94+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ 0
95+
#define AUDIO_ASSERT_MSG "ACLK clock source not available use another clock source."
96+
#define AUDIO_FREQUENCY_DEFINED 0
97+
4198
#endif
4299

43100
struct dmic_nrfx_pdm_drv_data {
@@ -46,6 +103,9 @@ struct dmic_nrfx_pdm_drv_data {
46103
const struct device *audiopll_dev;
47104
#elif CONFIG_CLOCK_CONTROL_NRF
48105
struct onoff_manager *clk_mgr;
106+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK) || \
107+
defined(CONFIG_CLOCK_CONTROL_NRFX_XO) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M)
108+
const struct device *clk_dev;
49109
#endif
50110
struct onoff_client clk_cli;
51111
struct k_mem_slab *mem_slab;
@@ -91,6 +151,9 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
91151
return nrf_clock_control_request(drv_data->audiopll_dev, NULL, &drv_data->clk_cli);
92152
#elif CONFIG_CLOCK_CONTROL_NRF
93153
return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli);
154+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK) || \
155+
defined(CONFIG_CLOCK_CONTROL_NRFX_XO) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M)
156+
return nrf_clock_control_request(drv_data->clk_dev, NULL, &drv_data->clk_cli);
94157
#else
95158
return -ENOTSUP;
96159
#endif
@@ -105,6 +168,9 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
105168
return nrf_clock_control_release(drv_data->audiopll_dev, NULL);
106169
#elif CONFIG_CLOCK_CONTROL_NRF
107170
return onoff_release(drv_data->clk_mgr);
171+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK) || \
172+
defined(CONFIG_CLOCK_CONTROL_NRFX_XO) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M)
173+
return nrf_clock_control_release(drv_data->clk_dev, NULL);
108174
#else
109175
return -ENOTSUP;
110176
#endif
@@ -323,7 +389,8 @@ static int dmic_nrfx_pdm_configure(const struct device *dev,
323389
* before starting the transfer itself.
324390
*/
325391
drv_data->request_clock = (drv_cfg->clk_src != PCLK32M &&
326-
IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF));
392+
(IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF) ||
393+
IS_ENABLED(CONFIG_CLOCK_CONTROL_NRFX_COMMON)));
327394
drv_data->configured = true;
328395
return 0;
329396
}
@@ -476,18 +543,42 @@ static void init_clock_manager(const struct device *dev)
476543
if (drv_cfg->clk_src == ACLK) {
477544
IF_ENABLED(NRF_CLOCK_HAS_HFCLKAUDIO, (subsys = CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO;))
478545
IF_ENABLED(NRF_CLOCK_HAS_HFCLK24M, (subsys = CLOCK_CONTROL_NRF_SUBSYS_HF24M;))
479-
} else
480-
#endif
481-
{
546+
} else {
482547
subsys = CLOCK_CONTROL_NRF_SUBSYS_HF;
483548
}
549+
#else
550+
subsys = CLOCK_CONTROL_NRF_SUBSYS_HF;
551+
#endif
484552

485553
drv_data->clk_mgr = z_nrf_clock_control_get_onoff(subsys);
486554
__ASSERT_NO_MSG(drv_data->clk_mgr != NULL);
555+
#elif defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRFX_HFCLK) || \
556+
defined(CONFIG_CLOCK_CONTROL_NRFX_XO) || defined(CONFIG_CLOCK_CONTROL_NRFX_XO24M)
557+
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
558+
#if NRF_CLOCK_HAS_HFCLKAUDIO || NRF_CLOCK_HAS_HFCLK24M
559+
const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config;
560+
561+
if (drv_cfg->clk_src == ACLK) {
562+
IF_ENABLED(NRF_CLOCK_HAS_HFCLKAUDIO,
563+
(drv_data->clk_dev = DEVICE_DT_GET_ONE(nordic_nrf_clock_hfclkaudio);))
564+
IF_ENABLED(NRF_CLOCK_HAS_HFCLK24M,
565+
(drv_data->clk_dev = DEVICE_DT_GET_ONE(nordic_nrf_clock_xo24m);))
566+
} else {
567+
drv_data->clk_dev = DEVICE_DT_GET_ONE(COND_CODE_1(NRF_CLOCK_HAS_HFCLK,
568+
(nordic_nrf_clock_hfclk),
569+
(nordic_nrf_clock_xo)));
570+
}
571+
#else
572+
drv_data->clk_dev = DEVICE_DT_GET_ONE(COND_CODE_1(NRF_CLOCK_HAS_HFCLK,
573+
(nordic_nrf_clock_hfclk),
574+
(nordic_nrf_clock_xo)));
575+
#endif
576+
577+
__ASSERT_NO_MSG(drv_data->clk_dev != NULL);
487578
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
488579
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
489580

490-
drv_data->audiopll_dev = DEVICE_DT_GET(NODE_AUDIOPLL);
581+
drv_data->audiopll_dev = DEVICE_DT_GET(DT_NODELABEL(audiopll));
491582
#endif
492583
}
493584

@@ -538,17 +629,7 @@ static const struct _dmic_ops dmic_ops = {
538629
NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
539630
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
540631
"Clock source ACLK is not available."); \
541-
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
542-
DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
543-
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
544-
DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
545-
DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
546-
"Clock source ACLK requires one following defined frequency " \
547-
"properties: " \
548-
"hfclkaudio-frequency in the nordic,nrf-clock node, " \
549-
"clock-frequency in the aclk node, " \
550-
"frequency in the audiopll node, " \
551-
"nordic-frequency in the audio_auxpll node"); \
632+
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || AUDIO_FREQUENCY_DEFINED, AUDIO_ASSERT_MSG); \
552633
DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
553634
&dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
554635
CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);

drivers/clock_control/CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRF clock_control_nrf.c)
110110
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRF54H_HFXO clock_control_nrf54h_hfxo.c)
111111
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL clock_control_nrfs_audiopll.c)
112112
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_COMMON clock_control_nrfx_common.c)
113+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_DRIVER_CALIBRATION nrf_clock_calibration.c)
114+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_HFCLK clock_control_nrfx_hfclk.c)
115+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_HFCLK192M clock_control_nrfx_hfclk192m.c)
116+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_HFCLKAUDIO clock_control_nrfx_hfclkaudio.c)
117+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_LFCLK clock_control_nrfx_lfclk.c)
118+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_XO clock_control_nrfx_xo.c)
119+
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRFX_XO24M clock_control_nrfx_xo24m.c)
113120
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRF_AUXPLL clock_control_nrf_auxpll.c)
114121
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRF_COMMON clock_control_nrf_common.c)
115122
zephyr_library_sources_ifdef(CONFIG_CLOCK_CONTROL_NRF_DRIVER_CALIBRATION nrf_clock_calibration.c)
@@ -151,4 +158,7 @@ zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_AGILEX clock_agilex.c)
151158
zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_AGILEX clock_agilex_ll.c)
152159
# zephyr-keep-sorted-stop
153160

154-
zephyr_linker_sources(SECTIONS clock_control_nrfx_irq_handlers.ld)
161+
if(CONFIG_CLOCK_CONTROL_NRFX_COMMON)
162+
zephyr_linker_sources(SECTIONS clock_control_nrfx_irq_handlers.ld)
163+
zephyr_iterable_section(NAME clock_control_nrfx_irq_handler KVMA RAM_REGION GROUP RODATA_REGION)
164+
endif()

0 commit comments

Comments
 (0)