@@ -19,12 +19,10 @@ static K_SEM_DEFINE(dvfs_service_sync_sem, 0, 1);
1919static K_SEM_DEFINE (dvfs_service_idle_sem , 0 , 1 ) ;
2020
2121#define DVFS_SERV_HDL_INIT_DONE_BIT_POS (0)
22- #define DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS (1)
22+ #define DVFS_SERV_HDL_FREQ_CHANGE_IN_PROGRESS_BIT_POS (1)
2323
2424static atomic_t dvfs_service_handler_state_bits ;
25- static volatile enum dvfs_frequency_setting current_freq_setting ;
26- static volatile enum dvfs_frequency_setting requested_freq_setting ;
27- static dvfs_service_handler_callback dvfs_frequency_change_applied_clb ;
25+ static enum dvfs_frequency_setting current_freq_setting ;
2826
2927static void dvfs_service_handler_set_state_bit (uint32_t bit_pos )
3028{
@@ -46,9 +44,9 @@ static bool dvfs_service_handler_init_done(void)
4644 return dvfs_service_handler_get_state_bit (DVFS_SERV_HDL_INIT_DONE_BIT_POS );
4745}
4846
49- static bool dvfs_service_handler_freq_change_req_pending (void )
47+ static bool dvfs_service_handler_freq_change_in_progress (void )
5048{
51- return dvfs_service_handler_get_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS );
49+ return dvfs_service_handler_get_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_IN_PROGRESS_BIT_POS );
5250}
5351
5452static void dvfs_service_handler_nrfs_error_check (nrfs_err_t err )
@@ -89,12 +87,6 @@ static enum dvfs_frequency_setting dvfs_service_handler_get_current_oppoint(void
8987 return current_freq_setting ;
9088}
9189
92- static enum dvfs_frequency_setting dvfs_service_handler_get_requested_oppoint (void )
93- {
94- LOG_DBG ("Requested LD freq setting: %d" , requested_freq_setting );
95- return requested_freq_setting ;
96- }
97-
9890/* Function to check if current operation is down-scaling */
9991static bool dvfs_service_handler_is_downscaling (enum dvfs_frequency_setting target_freq_setting )
10092{
@@ -151,12 +143,7 @@ static void dvfs_service_handler_scaling_finish(enum dvfs_frequency_setting oppo
151143 dvfs_service_handler_error (err );
152144 }
153145 }
154- dvfs_service_handler_clear_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS );
155146 current_freq_setting = oppoint_freq ;
156- LOG_DBG ("Current LD freq setting: %d" , current_freq_setting );
157- if (dvfs_frequency_change_applied_clb ) {
158- dvfs_frequency_change_applied_clb (current_freq_setting );
159- }
160147}
161148
162149/* Function to set hsfll to highest frequency when switched to ABB. */
@@ -165,29 +152,11 @@ static void dvfs_service_handler_set_initial_hsfll_config(void)
165152 int32_t err = ld_dvfs_configure_hsfll (DVFS_FREQ_HIGH );
166153
167154 current_freq_setting = DVFS_FREQ_HIGH ;
168- requested_freq_setting = DVFS_FREQ_HIGH ;
169155 if (err != 0 ) {
170156 dvfs_service_handler_error (err );
171157 }
172158}
173159
174- /* Timer to add additional delay to finish downscale procedure when domain other than secure */
175- #if !defined(NRF_SECURE )
176- #define SCALING_FINISH_DELAY_TIMEOUT_US \
177- K_USEC(CONFIG_NRFS_LOCAL_DOMAIN_DOWNSCALE_FINISH_DELAY_TIMEOUT_US)
178-
179- static void dvfs_service_handler_scaling_finish_delay_timeout (struct k_timer * timer )
180- {
181- if (timer ) {
182- dvfs_service_handler_scaling_finish (
183- * (enum dvfs_frequency_setting * )timer -> user_data );
184- }
185- }
186-
187- K_TIMER_DEFINE (dvfs_service_scaling_finish_delay_timer ,
188- dvfs_service_handler_scaling_finish_delay_timeout , NULL );
189- #endif
190-
191160/* DVFS event handler callback function.*/
192161static void nrfs_dvfs_evt_handler (nrfs_dvfs_evt_t const * p_evt , void * context )
193162{
@@ -213,13 +182,7 @@ static void nrfs_dvfs_evt_handler(nrfs_dvfs_evt_t const *p_evt, void *context)
213182 break ;
214183 case NRFS_DVFS_EVT_OPPOINT_REQ_CONFIRMED :
215184 /* Optional confirmation from sysctrl, wait for oppoint.*/
216- dvfs_service_handler_clear_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS );
217- LOG_DBG ("DVFS handler EVT_OPPOINT_REQ_CONFIRMED %d" , (uint32_t )p_evt -> freq );
218- if (dvfs_service_handler_get_requested_oppoint () == p_evt -> freq ) {
219- if (dvfs_frequency_change_applied_clb ) {
220- dvfs_frequency_change_applied_clb (p_evt -> freq );
221- }
222- }
185+ LOG_DBG ("DVFS handler EVT_OPPOINT_REQ_CONFIRMED" );
223186 break ;
224187 case NRFS_DVFS_EVT_OPPOINT_SCALING_PREPARE :
225188 /*Target oppoint will be received here.*/
@@ -233,20 +196,15 @@ static void nrfs_dvfs_evt_handler(nrfs_dvfs_evt_t const *p_evt, void *context)
233196 dvfs_service_handler_scaling_background_job (p_evt -> freq );
234197 LOG_DBG ("DVFS handler EVT_OPPOINT_SCALING_PREPARE handled" );
235198#if !defined(NRF_SECURE )
236- /* Additional delay for downscale to finish on secdom side */
237- static enum dvfs_frequency_setting freq ;
238-
239- freq = p_evt -> freq ;
240- dvfs_service_scaling_finish_delay_timer .user_data = (void * )& freq ;
241- k_timer_start (& dvfs_service_scaling_finish_delay_timer ,
242- SCALING_FINISH_DELAY_TIMEOUT_US , K_NO_WAIT );
199+ current_freq_setting = p_evt -> freq ;
243200 } else {
244201 LOG_ERR ("DVFS handler - unexpected EVT_OPPOINT_SCALING_PREPARE" );
245202 }
246203#endif
247204 break ;
248205 case NRFS_DVFS_EVT_OPPOINT_SCALING_DONE :
249206 LOG_DBG ("DVFS handler EVT_OPPOINT_SCALING_DONE" );
207+ dvfs_service_handler_clear_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_IN_PROGRESS_BIT_POS );
250208 dvfs_service_handler_scaling_finish (p_evt -> freq );
251209 LOG_DBG ("DVFS handler EVT_OPPOINT_SCALING_DONE handled" );
252210 break ;
@@ -317,36 +275,18 @@ int32_t dvfs_service_handler_change_freq_setting(enum dvfs_frequency_setting fre
317275 return - EAGAIN ;
318276 }
319277
320- if (!dvfs_service_handler_freq_setting_allowed (freq_setting )) {
321- LOG_ERR ("Requested frequency setting %d not supported." , freq_setting );
322- return - ENXIO ;
323- }
324-
325- if (dvfs_service_handler_freq_change_req_pending ()) {
326- LOG_DBG ("Frequency change request pending." );
278+ if (dvfs_service_handler_freq_change_in_progress ()) {
279+ LOG_DBG ("Frequency change in progress." );
327280 return - EBUSY ;
328281 }
329282
330- dvfs_service_handler_set_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS );
331- requested_freq_setting = freq_setting ;
283+ if (!dvfs_service_handler_freq_setting_allowed (freq_setting )) {
284+ return - ENXIO ;
285+ }
332286
333287 nrfs_err_t status = nrfs_dvfs_oppoint_request (freq_setting , get_next_context ());
334288
335- if (status != NRFS_SUCCESS ) {
336- dvfs_service_handler_clear_state_bit (DVFS_SERV_HDL_FREQ_CHANGE_REQ_PENDING_BIT_POS );
337- }
338-
339289 dvfs_service_handler_nrfs_error_check (status );
340290
341291 return status ;
342292}
343-
344- void dvfs_service_handler_register_freq_setting_applied_callback (dvfs_service_handler_callback clb )
345- {
346- if (clb ) {
347- LOG_DBG ("Registered frequency applied callback" );
348- dvfs_frequency_change_applied_clb = clb ;
349- } else {
350- LOG_ERR ("Invalid callback function provided!" );
351- }
352- }
0 commit comments