Skip to content

Commit adeecd2

Browse files
committed
[nrf fromlist] Replace clock api with clock api v2
Replaced old clock_control.h api with nrf_clock_control.h api. Old api is still available when CONFIG_CLOCK_CONTROL_NRF is set. Upstream PR #: 99290 Signed-off-by: Michal Frankiewicz <[email protected]>
1 parent 5a6d2b2 commit adeecd2

File tree

29 files changed

+804
-117
lines changed

29 files changed

+804
-117
lines changed

drivers/audio/dmic_nrfx_pdm.c

Lines changed: 92 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,23 @@ BUILD_ASSERT((DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
3030
(DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
3131
"Unsupported Audio AUXPLL frequency selection for PDM");
3232
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
33-
#else
33+
#elif CONFIG_CLOCK_CONTROL_NRF
3434
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
3535
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
3636
DT_PROP_OR(DT_NODELABEL(clock), hfclkaudio_frequency, 0))
37+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO)
38+
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
39+
#define DMIC_NRFX_AUDIO_CLOCK_FREQ \
40+
DT_PROP_OR(DT_NODELABEL(aclk), clock_frequency, \
41+
DT_PROP_OR(DT_NODELABEL(hfclkaudio), hfclkaudio_frequency, 0))
42+
#endif
43+
44+
#if defined(CONFIG_CLOCK_CONTORL_NRF)
45+
#define HFCLKAUDIO_NODE clock
46+
#define HFCLKAUDIO_NODE_DESC "hfclkaudio-frequency in the nordic,nrf-clock node, "
47+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO)
48+
#define HFCLKAUDIO_NODE hfclkaudio
49+
#define HFCLKAUDIO_NODE_DESC "hfclkaudio-frequency in the nordic,nrf-clock-hfclkaudio node, "
3750
#endif
3851

3952
struct dmic_nrfx_pdm_drv_data {
@@ -42,6 +55,9 @@ struct dmic_nrfx_pdm_drv_data {
4255
const struct device *audiopll_dev;
4356
#elif CONFIG_CLOCK_CONTROL_NRF
4457
struct onoff_manager *clk_mgr;
58+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK) || \
59+
defined(CONFIG_CLOCK_CONTROL_NRF_XO)
60+
const struct device *clk_dev;
4561
#endif
4662
struct onoff_client clk_cli;
4763
struct k_mem_slab *mem_slab;
@@ -87,6 +103,9 @@ static int request_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
87103
return nrf_clock_control_request(drv_data->audiopll_dev, NULL, &drv_data->clk_cli);
88104
#elif CONFIG_CLOCK_CONTROL_NRF
89105
return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli);
106+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK) || \
107+
defined(CONFIG_CLOCK_CONTROL_NRF_XO)
108+
return nrf_clock_control_request(drv_data->clk_dev, NULL, &drv_data->clk_cli);
90109
#else
91110
return -ENOTSUP;
92111
#endif
@@ -101,6 +120,9 @@ static int release_clock(struct dmic_nrfx_pdm_drv_data *drv_data)
101120
return nrf_clock_control_release(drv_data->audiopll_dev, NULL);
102121
#elif CONFIG_CLOCK_CONTROL_NRF
103122
return onoff_release(drv_data->clk_mgr);
123+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK) || \
124+
defined(CONFIG_CLOCK_CONTROL_NRF_XO)
125+
return nrf_clock_control_release(drv_data->clk_dev, NULL);
104126
#else
105127
return -ENOTSUP;
106128
#endif
@@ -482,6 +504,23 @@ static void init_clock_manager(const struct device *dev)
482504

483505
drv_data->clk_mgr = z_nrf_clock_control_get_onoff(subsys);
484506
__ASSERT_NO_MSG(drv_data->clk_mgr != NULL);
507+
#elif defined(CONFIG_CLOCK_CONTROL_NRF_HFCLKAUDIO) || defined(CONFIG_CLOCK_CONTROL_NRF_HFCLK) || \
508+
defined(CONFIG_CLOCK_CONTROL_NRF_XO)
509+
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
510+
#if NRF_CLOCK_HAS_HFCLKAUDIO
511+
const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config;
512+
513+
if (drv_cfg->clk_src == ACLK) {
514+
drv_data->clk_dev = DEVICE_DT_GET_ONE(nordic_nrf_clock_hfclkaudio);
515+
} else
516+
#endif
517+
{
518+
drv_data->clk_dev = DEVICE_DT_GET_ONE(COND_CODE_1((NRF_CLOCK_HAS_HFCLK),
519+
(nordic_nrf_clock_hfclk),
520+
(nordic_nrf_clock_xo)));
521+
}
522+
523+
__ASSERT_NO_MSG(drv_data->clk_dev != NULL);
485524
#elif CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
486525
struct dmic_nrfx_pdm_drv_data *drv_data = dev->data;
487526

@@ -497,58 +536,58 @@ static const struct _dmic_ops dmic_ops = {
497536

498537
#define PDM_CLK_SRC(inst) DT_STRING_TOKEN(DT_DRV_INST(inst), clock_source)
499538

500-
#define PDM_NRFX_DEVICE(inst) \
501-
static void *rx_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
502-
static void *mem_slab_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
503-
static struct dmic_nrfx_pdm_drv_data dmic_nrfx_pdm_data##inst = { \
504-
.pdm = NRFX_PDM_INSTANCE(DT_INST_REG_ADDR(inst)), \
505-
}; \
506-
static int pdm_nrfx_init##inst(const struct device *dev) \
507-
{ \
508-
IRQ_CONNECT(DT_INST_IRQN(inst), DT_INST_IRQ(inst, priority), nrfx_pdm_irq_handler, \
509-
&dmic_nrfx_pdm_data##inst.pdm, 0); \
510-
const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config; \
511-
int err = pinctrl_apply_state(drv_cfg->pcfg, PINCTRL_STATE_DEFAULT); \
512-
if (err < 0) { \
513-
return err; \
514-
} \
515-
k_msgq_init(&dmic_nrfx_pdm_data##inst.rx_queue, (char *)rx_msgs##inst, \
516-
sizeof(void *), ARRAY_SIZE(rx_msgs##inst)); \
517-
k_msgq_init(&dmic_nrfx_pdm_data##inst.mem_slab_queue, (char *)mem_slab_msgs##inst, \
518-
sizeof(void *), ARRAY_SIZE(mem_slab_msgs##inst)); \
519-
init_clock_manager(dev); \
520-
return 0; \
521-
} \
522-
static void event_handler##inst(const nrfx_pdm_evt_t *evt) \
523-
{ \
524-
event_handler(DEVICE_DT_INST_GET(inst), evt); \
525-
} \
526-
PINCTRL_DT_INST_DEFINE(inst); \
527-
static const struct dmic_nrfx_pdm_drv_cfg dmic_nrfx_pdm_cfg##inst = { \
528-
.event_handler = event_handler##inst, \
529-
.nrfx_def_cfg = NRFX_PDM_DEFAULT_CONFIG(0, 0), \
530-
.nrfx_def_cfg.skip_gpio_cfg = true, \
531-
.nrfx_def_cfg.skip_psel_cfg = true, \
532-
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
533-
.clk_src = PDM_CLK_SRC(inst), \
534-
.mem_reg = DMM_DEV_TO_REG(DT_DRV_INST(inst)), \
535-
}; \
536-
NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
537-
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
538-
"Clock source ACLK is not available."); \
539-
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
540-
DT_NODE_HAS_PROP(DT_NODELABEL(clock), hfclkaudio_frequency) || \
541-
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
542-
DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
543-
DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
544-
"Clock source ACLK requires one following defined frequency " \
545-
"properties: " \
546-
"hfclkaudio-frequency in the nordic,nrf-clock node, " \
547-
"clock-frequency in the aclk node, " \
548-
"frequency in the audiopll node, " \
549-
"nordic-frequency in the audio_auxpll node"); \
550-
DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
551-
&dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
539+
#define PDM_NRFX_DEVICE(inst) \
540+
static void *rx_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
541+
static void *mem_slab_msgs##inst[DT_INST_PROP(inst, queue_size)]; \
542+
static struct dmic_nrfx_pdm_drv_data dmic_nrfx_pdm_data##inst = { \
543+
.pdm = NRFX_PDM_INSTANCE(DT_INST_REG_ADDR(inst)), \
544+
}; \
545+
static int pdm_nrfx_init##inst(const struct device *dev) \
546+
{ \
547+
IRQ_CONNECT(DT_INST_IRQN(inst), DT_INST_IRQ(inst, priority), nrfx_pdm_irq_handler, \
548+
&dmic_nrfx_pdm_data##inst.pdm, 0); \
549+
const struct dmic_nrfx_pdm_drv_cfg *drv_cfg = dev->config; \
550+
int err = pinctrl_apply_state(drv_cfg->pcfg, PINCTRL_STATE_DEFAULT); \
551+
if (err < 0) { \
552+
return err; \
553+
} \
554+
k_msgq_init(&dmic_nrfx_pdm_data##inst.rx_queue, (char *)rx_msgs##inst, \
555+
sizeof(void *), ARRAY_SIZE(rx_msgs##inst)); \
556+
k_msgq_init(&dmic_nrfx_pdm_data##inst.mem_slab_queue, (char *)mem_slab_msgs##inst, \
557+
sizeof(void *), ARRAY_SIZE(mem_slab_msgs##inst)); \
558+
init_clock_manager(dev); \
559+
return 0; \
560+
} \
561+
static void event_handler##inst(const nrfx_pdm_evt_t *evt) \
562+
{ \
563+
event_handler(DEVICE_DT_INST_GET(inst), evt); \
564+
} \
565+
PINCTRL_DT_INST_DEFINE(inst); \
566+
static const struct dmic_nrfx_pdm_drv_cfg dmic_nrfx_pdm_cfg##inst = { \
567+
.event_handler = event_handler##inst, \
568+
.nrfx_def_cfg = NRFX_PDM_DEFAULT_CONFIG(0, 0), \
569+
.nrfx_def_cfg.skip_gpio_cfg = true, \
570+
.nrfx_def_cfg.skip_psel_cfg = true, \
571+
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
572+
.clk_src = PDM_CLK_SRC(inst), \
573+
.mem_reg = DMM_DEV_TO_REG(DT_DRV_INST(inst)), \
574+
}; \
575+
NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(DT_DRV_INST(inst)); \
576+
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || NRF_PDM_HAS_SELECTABLE_CLOCK, \
577+
"Clock source ACLK is not available."); \
578+
BUILD_ASSERT(PDM_CLK_SRC(inst) != ACLK || \
579+
DT_NODE_HAS_PROP(DT_NODELABEL(HFCLKAUDIO_NODE), hfclkaudio_frequency) || \
580+
DT_NODE_HAS_PROP(DT_NODELABEL(aclk), clock_frequency) || \
581+
DT_NODE_HAS_PROP(NODE_AUDIOPLL, frequency) || \
582+
DT_NODE_HAS_PROP(NODE_AUDIO_AUXPLL, nordic_frequency), \
583+
"Clock source ACLK requires one following defined frequency " \
584+
"properties: " \
585+
HFCLKAUDIO_NODE_DESC \
586+
"clock-frequency in the aclk node, " \
587+
"frequency in the audiopll node, " \
588+
"nordic-frequency in the audio_auxpll node"); \
589+
DEVICE_DT_INST_DEFINE(inst, pdm_nrfx_init##inst, NULL, &dmic_nrfx_pdm_data##inst, \
590+
&dmic_nrfx_pdm_cfg##inst, POST_KERNEL, \
552591
CONFIG_AUDIO_DMIC_INIT_PRIORITY, &dmic_ops);
553592

554593
DT_INST_FOREACH_STATUS_OKAY(PDM_NRFX_DEVICE)

drivers/clock_control/clock_control_nrf_lfclk.c

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,28 @@ LOG_MODULE_REGISTER(clock_control_lfclk, CONFIG_CLOCK_CONTROL_LOG_LEVEL);
5151
#define CLOCK_DEVICE_HF DEVICE_DT_GET_ONE(nordic_nrf_clock_xo)
5252
#endif
5353

54+
#define LFCLK_SRC (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src))
55+
56+
#if ((LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_RC) && \
57+
(LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_XTAL) && \
58+
(LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_SYNTH) && \
59+
(LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING) && \
60+
(LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING))
61+
#error "Unsupported LFCLK source configured in devicetree"
62+
#endif
63+
64+
#if (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src) == CLOCK_CONTROL_NRF_K32SRC_RC)
65+
#define K32SRC NRF_CLOCK_LFCLK_RC
66+
#elif (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src) == CLOCK_CONTROL_NRF_K32SRC_XTAL)
67+
#define K32SRC NRF_CLOCK_LFCLK_XTAL
68+
#elif (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src) == CLOCK_CONTROL_NRF_K32SRC_SYNTH)
69+
#define K32SRC NRF_CLOCK_LFCLK_SYNTH
70+
#elif (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src) == CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING)
71+
#define K32SRC NRF_CLOCK_LFCLK_XTAL_LOW_SWING
72+
#elif (DT_STRING_TOKEN(DT_NODELABEL(lfclk), k32src) == CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING)
73+
#define K32SRC NRF_CLOCK_LFCLK_XTAL_FULL_SWING
74+
#endif
75+
5476
typedef void (*clk_ctrl_func_t)(void);
5577

5678
typedef struct {
@@ -68,7 +90,7 @@ typedef struct {
6890
#endif
6991
} lfclk_config_t;
7092

71-
#if CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH
93+
#if (LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_SYNTH)
7294
/* Client to request HFXO to synthesize low frequency clock. */
7395
static struct onoff_client lfsynth_cli;
7496
#endif
@@ -149,7 +171,7 @@ static void lfclk_start(void)
149171
anomaly_132_workaround();
150172
}
151173

152-
#if CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH
174+
#if (LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_SYNTH)
153175
sys_notify_init_spinwait(&lfsynth_cli.notify);
154176

155177
(void)nrf_clock_control_request(CLOCK_DEVICE_HF, NULL, &lfsynth_cli);
@@ -166,7 +188,7 @@ static void lfclk_stop(void)
166188

167189
nrfx_clock_lfclk_stop();
168190

169-
#if CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH
191+
#if (LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_SYNTH)
170192

171193
(void)nrf_clock_control_cancel_or_release(CLOCK_DEVICE_HF, NULL, &lfsynth_cli);
172194
#endif
@@ -234,16 +256,16 @@ static void lfclk_spinwait(enum nrf_lfclk_start_mode mode)
234256
/* For sources XTAL, EXT_LOW_SWING, and EXT_FULL_SWING,
235257
* NRF_CLOCK_LFCLK_XTAL is returned as the type of running clock.
236258
*/
237-
(IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL) ||
238-
IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING) ||
239-
IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING))
259+
((LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_XTAL) ||
260+
(LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING) ||
261+
(LFCLK_SRC == CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING))
240262
? NRF_CLOCK_LFCLK_XTAL
241-
: CLOCK_CONTROL_NRF_K32SRC;
263+
: K32SRC;
242264
nrf_clock_lfclk_t type;
243265

244266
if ((mode == CLOCK_CONTROL_NRF_LF_START_AVAILABLE) &&
245267
(target_type == NRF_CLOCK_LFCLK_XTAL) &&
246-
(nrf_clock_lf_srccopy_get(NRF_CLOCK) == CLOCK_CONTROL_NRF_K32SRC)) {
268+
(nrf_clock_lf_srccopy_get(NRF_CLOCK) == K32SRC)) {
247269
/* If target clock source is using XTAL then due to two-stage
248270
* clock startup sequence, RC might already be running.
249271
* It can be determined by checking current LFCLK source. If it
@@ -266,7 +288,7 @@ static void lfclk_spinwait(enum nrf_lfclk_start_mode mode)
266288
/* Synth source start is almost instant and LFCLKSTARTED may
267289
* happen before calling idle. That would lead to deadlock.
268290
*/
269-
if (!IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH)) {
291+
if (LFCLK_SRC != CLOCK_CONTROL_NRF_K32SRC_SYNTH) {
270292
if (isr_mode || !IS_ENABLED(CONFIG_MULTITHREADING)) {
271293
k_cpu_atomic_idle(key);
272294
} else {
@@ -277,12 +299,9 @@ static void lfclk_spinwait(enum nrf_lfclk_start_mode mode)
277299
/* Clock interrupt is locked, LFCLKSTARTED is handled here. */
278300
if ((target_type == NRF_CLOCK_LFCLK_XTAL)
279301
&& (nrf_clock_lf_src_get(NRF_CLOCK) == NRF_CLOCK_LFCLK_RC)
280-
&& nrf_clock_event_check(NRF_CLOCK,
281-
NRF_CLOCK_EVENT_LFCLKSTARTED)) {
282-
nrf_clock_event_clear(NRF_CLOCK,
283-
NRF_CLOCK_EVENT_LFCLKSTARTED);
284-
nrf_clock_lf_src_set(NRF_CLOCK,
285-
CLOCK_CONTROL_NRF_K32SRC);
302+
&& nrf_clock_event_check(NRF_CLOCK, NRF_CLOCK_EVENT_LFCLKSTARTED)) {
303+
nrf_clock_event_clear(NRF_CLOCK, NRF_CLOCK_EVENT_LFCLKSTARTED);
304+
nrf_clock_lf_src_set(NRF_CLOCK, K32SRC);
286305

287306
/* Clear pending interrupt, otherwise new clock event
288307
* would not wake up from idle.

drivers/clock_control/nrf_clock_calibration.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
#include <zephyr/drivers/clock_control.h>
88
#include "nrf_clock_calibration.h"
99
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
10+
#if defined(CONFIG_CLOCK_CONTROL_NRF)
1011
#include <nrfx_clock.h>
12+
#else
13+
#include <nrfx_clock_lfclk.h>
14+
#endif
1115
#include <zephyr/logging/log.h>
1216
#include <stdlib.h>
1317

@@ -155,7 +159,11 @@ static void cal_lf_callback(struct onoff_manager *mgr,
155159
/* Start actual HW calibration assuming that HFCLK XTAL is on. */
156160
static void start_hw_cal(void)
157161
{
162+
#if defined(CONFIG_CLOCK_CONTROL_NRF)
158163
nrfx_clock_calibration_start();
164+
#else
165+
nrfx_clock_lfclk_calibration_start();
166+
#endif
159167
calib_skip_cnt = CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_MAX_SKIP;
160168
}
161169

drivers/counter/counter_nrfx_rtc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ static int init_rtc(const struct device *dev, uint32_t prescaler)
528528
NRF_RTC_Type *rtc = nrfx_config->rtc;
529529
int err;
530530

531-
#ifdef CONFIG_CLOCK_CONTROL_NRF
531+
#ifndef HALTIUM_XXAA
532532
z_nrf_clock_control_lf_on(CLOCK_CONTROL_NRF_LF_START_NOWAIT);
533533
#endif
534534

0 commit comments

Comments
 (0)