44 */
55
66#include "clock_control_nrf2_common.h"
7+ #include <zephyr/drivers/clock_control/nrf_clock_control.h>
78
89#include <zephyr/logging/log.h>
910LOG_MODULE_REGISTER (clock_control_nrf2 , CONFIG_CLOCK_CONTROL_LOG_LEVEL );
@@ -24,6 +25,13 @@ LOG_MODULE_REGISTER(clock_control_nrf2, CONFIG_CLOCK_CONTROL_LOG_LEVEL);
2425 */
2526STRUCT_CLOCK_CONFIG (generic , ONOFF_CNT_MAX );
2627
28+ /* Structure used for synchronous clock request. */
29+ struct sync_req {
30+ struct onoff_client cli ;
31+ struct k_sem sem ;
32+ int res ;
33+ };
34+
2735static void update_config (struct clock_config_generic * cfg )
2836{
2937 atomic_val_t prev_flags = atomic_or (& cfg -> flags , FLAG_UPDATE_NEEDED );
@@ -159,3 +167,39 @@ int api_nosys_on_off(const struct device *dev, clock_control_subsys_t sys)
159167
160168 return - ENOSYS ;
161169}
170+
171+ static void sync_cb (struct onoff_manager * mgr , struct onoff_client * cli , uint32_t state , int res )
172+ {
173+ struct sync_req * req = CONTAINER_OF (cli , struct sync_req , cli );
174+
175+ req -> res = res ;
176+ k_sem_give (& req -> sem );
177+ }
178+
179+ int nrf_clock_control_request_sync (const struct device * dev ,
180+ const struct nrf_clock_spec * spec ,
181+ k_timeout_t timeout )
182+ {
183+ struct sync_req req = {
184+ .sem = Z_SEM_INITIALIZER (req .sem , 0 , 1 )
185+ };
186+ int err ;
187+
188+ if (k_is_in_isr ()) {
189+ return - EWOULDBLOCK ;
190+ }
191+
192+ sys_notify_init_callback (& req .cli .notify , sync_cb );
193+
194+ err = nrf_clock_control_request (dev , spec , & req .cli );
195+ if (err < 0 ) {
196+ return err ;
197+ }
198+
199+ err = k_sem_take (& req .sem , timeout );
200+ if (err < 0 ) {
201+ return err ;
202+ }
203+
204+ return req .res ;
205+ }
0 commit comments