1212LOG_MODULE_DECLARE (clock_control_nrf2 , CONFIG_CLOCK_CONTROL_LOG_LEVEL );
1313
1414#include <soc_lrcconf.h>
15+ #include <hal/nrf_bicr.h>
1516
1617BUILD_ASSERT (DT_NUM_INST_STATUS_OKAY (DT_DRV_COMPAT ) == 1 ,
1718 "multiple instances not supported" );
@@ -21,14 +22,16 @@ struct dev_data_hfxo {
2122 onoff_notify_fn notify ;
2223 struct k_timer timer ;
2324 sys_snode_t hfxo_node ;
25+ k_timeout_t start_up_time ;
2426};
2527
2628struct dev_config_hfxo {
2729 uint32_t fixed_frequency ;
2830 uint16_t fixed_accuracy ;
29- k_timeout_t start_up_time ;
3031};
3132
33+ #define BICR (NRF_BICR_Type *)DT_REG_ADDR(DT_NODELABEL(bicr))
34+
3235static void hfxo_start_up_timer_handler (struct k_timer * timer )
3336{
3437 struct dev_data_hfxo * dev_data =
@@ -52,8 +55,6 @@ static void onoff_start_hfxo(struct onoff_manager *mgr, onoff_notify_fn notify)
5255{
5356 struct dev_data_hfxo * dev_data =
5457 CONTAINER_OF (mgr , struct dev_data_hfxo , mgr );
55- const struct device * dev = DEVICE_DT_INST_GET (0 );
56- const struct dev_config_hfxo * dev_config = dev -> config ;
5758
5859 dev_data -> notify = notify ;
5960
@@ -65,7 +66,7 @@ static void onoff_start_hfxo(struct onoff_manager *mgr, onoff_notify_fn notify)
6566 * unreliable. Hence the timer is used to simply wait the expected
6667 * start-up time. To be removed once the hardware is fixed.
6768 */
68- k_timer_start (& dev_data -> timer , dev_config -> start_up_time , K_NO_WAIT );
69+ k_timer_start (& dev_data -> timer , dev_data -> start_up_time , K_NO_WAIT );
6970}
7071
7172static void onoff_stop_hfxo (struct onoff_manager * mgr , onoff_notify_fn notify )
@@ -159,13 +160,21 @@ static int init_hfxo(const struct device *dev)
159160 .start = onoff_start_hfxo ,
160161 .stop = onoff_stop_hfxo
161162 };
163+ uint32_t start_up_time ;
162164 int rc ;
163165
164166 rc = onoff_manager_init (& dev_data -> mgr , & transitions );
165167 if (rc < 0 ) {
166168 return rc ;
167169 }
168170
171+ start_up_time = nrf_bicr_hfxo_startup_time_us_get (BICR );
172+ if (start_up_time == NRF_BICR_HFXO_STARTUP_TIME_UNCONFIGURED ) {
173+ return - EINVAL ;
174+ }
175+
176+ dev_data -> start_up_time = K_USEC (start_up_time );
177+
169178 k_timer_init (& dev_data -> timer , hfxo_start_up_timer_handler , NULL );
170179
171180 return 0 ;
@@ -187,7 +196,6 @@ static struct dev_data_hfxo data_hfxo;
187196static const struct dev_config_hfxo config_hfxo = {
188197 .fixed_frequency = DT_INST_PROP (0 , clock_frequency ),
189198 .fixed_accuracy = DT_INST_PROP (0 , accuracy_ppm ),
190- .start_up_time = K_USEC (DT_INST_PROP (0 , startup_time_us )),
191199};
192200
193201DEVICE_DT_INST_DEFINE (0 , init_hfxo , NULL ,
0 commit comments