Skip to content

Commit 285ad12

Browse files
committed
[nrf fromlist] drivers: clock_control: nrf54h-fll16m: use values from BICR
The real, applicable and trusted values are the ones flashed into BICR. So, drop DT properties that replicate BICR and use runtime reads to BICR instead. Upstream PR #: 81122 Signed-off-by: Gerard Marull-Paretas <[email protected]> (cherry picked from commit a41e7e407448e731cdb3861864d89b1632b57b3d)
1 parent 899b4da commit 285ad12

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

drivers/clock_control/clock_control_nrf2_fll16m.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
#include "clock_control_nrf2_common.h"
99
#include <zephyr/devicetree.h>
1010
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
11+
1112
#include <soc_lrcconf.h>
13+
#include <hal/nrf_bicr.h>
1214

1315
#include <zephyr/logging/log.h>
1416
LOG_MODULE_DECLARE(clock_control_nrf2, CONFIG_CLOCK_CONTROL_LOG_LEVEL);
@@ -23,26 +25,17 @@ BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 1,
2325
#define FLL16M_MODE_BYPASS 2
2426
#define FLL16M_MODE_DEFAULT FLL16M_MODE_OPEN_LOOP
2527

26-
#define FLL16M_LFXO_NODE DT_INST_PHANDLE_BY_NAME(0, clocks, lfxo)
2728
#define FLL16M_HFXO_NODE DT_INST_PHANDLE_BY_NAME(0, clocks, hfxo)
2829

29-
#define FLL16M_HAS_LFXO DT_NODE_HAS_STATUS_OKAY(FLL16M_LFXO_NODE)
30-
31-
#define FLL16M_LFXO_ACCURACY DT_PROP(FLL16M_LFXO_NODE, accuracy_ppm)
3230
#define FLL16M_HFXO_ACCURACY DT_PROP(FLL16M_HFXO_NODE, accuracy_ppm)
3331
#define FLL16M_OPEN_LOOP_ACCURACY DT_INST_PROP(0, open_loop_accuracy_ppm)
3432
#define FLL16M_CLOSED_LOOP_BASE_ACCURACY DT_INST_PROP(0, closed_loop_base_accuracy_ppm)
3533
#define FLL16M_MAX_ACCURACY FLL16M_HFXO_ACCURACY
3634

37-
/* Closed-loop mode uses LFXO as source if present, HFXO otherwise */
38-
#if FLL16M_HAS_LFXO
39-
#define FLL16M_CLOSED_LOOP_ACCURACY (FLL16M_CLOSED_LOOP_BASE_ACCURACY + FLL16M_LFXO_ACCURACY)
40-
#else
41-
#define FLL16M_CLOSED_LOOP_ACCURACY (FLL16M_CLOSED_LOOP_BASE_ACCURACY + FLL16M_HFXO_ACCURACY)
42-
#endif
35+
#define BICR (NRF_BICR_Type *)DT_REG_ADDR(DT_NODELABEL(bicr))
4336

4437
/* Clock options sorted from lowest to highest accuracy */
45-
static const struct clock_options {
38+
static struct clock_options {
4639
uint16_t accuracy;
4740
uint8_t mode;
4841
} clock_options[] = {
@@ -51,7 +44,6 @@ static const struct clock_options {
5144
.mode = FLL16M_MODE_OPEN_LOOP,
5245
},
5346
{
54-
.accuracy = FLL16M_CLOSED_LOOP_ACCURACY,
5547
.mode = FLL16M_MODE_CLOSED_LOOP,
5648
},
5749
{
@@ -233,6 +225,27 @@ static int api_get_rate_fll16m(const struct device *dev,
233225
static int fll16m_init(const struct device *dev)
234226
{
235227
struct fll16m_dev_data *dev_data = dev->data;
228+
nrf_bicr_lfosc_mode_t lfosc_mode;
229+
230+
clock_options[1].accuracy = FLL16M_CLOSED_LOOP_BASE_ACCURACY;
231+
232+
/* Closed-loop mode uses LFXO as source if present, HFXO otherwise */
233+
lfosc_mode = nrf_bicr_lfosc_mode_get(BICR);
234+
235+
if (lfosc_mode != NRF_BICR_LFOSC_MODE_UNCONFIGURED &&
236+
lfosc_mode != NRF_BICR_LFOSC_MODE_DISABLED) {
237+
int ret;
238+
uint16_t accuracy;
239+
240+
ret = lfosc_get_accuracy(&accuracy);
241+
if (ret < 0) {
242+
return ret;
243+
}
244+
245+
clock_options[1].accuracy += accuracy;
246+
} else {
247+
clock_options[1].accuracy += FLL16M_HFXO_ACCURACY;
248+
}
236249

237250
return clock_config_init(&dev_data->clk_cfg,
238251
ARRAY_SIZE(dev_data->clk_cfg.onoff),

0 commit comments

Comments
 (0)