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>
1416LOG_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,
233225static 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