13
13
#include <zephyr/kernel.h>
14
14
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
15
15
#include <nrf_sys_event.h>
16
- #include <hal/nrf_egu.h>
17
-
18
- /**
19
- * The implementation uses EGU to de-escalate execution context from ZLI to a regular interrupt
20
- * to ensure that Zephyr APIs can be used safely.
21
- *
22
- * Both the nrf_802154_clock_hfclk_start() and nrf_802154_clock_hfclk_stop() can potentially be
23
- * called from ZLI and non-ZLI contexts and consecutive calls are not guaranteed to be alternating.
24
- *
25
- * For example, it is possible that _stop() may be called multiple times in succession and the
26
- * same thing applies to _start(). What is known however is that the last call always takes
27
- * the precedence.
28
- */
29
-
30
- #define SWI_INT NRFX_CONCAT_2(NRF_EGU_INT_TRIGGERED, NRF_802154_SL_EGU_CLOCK_CHANNEL_NO)
31
- #define SWI_TASK NRFX_CONCAT_2(NRF_EGU_TASK_TRIGGER, NRF_802154_SL_EGU_CLOCK_CHANNEL_NO)
32
- #define SWI_EVENT NRFX_CONCAT_2(NRF_EGU_EVENT_TRIGGERED, NRF_802154_SL_EGU_CLOCK_CHANNEL_NO)
33
-
34
- #define CLOCK_NONE 0u
35
- #define CLOCK_REQUEST 1u
36
- #define CLOCK_RELEASE 2u
37
16
38
17
static bool hfclk_is_running ;
39
- static bool enabled ;
40
- static atomic_t request = CLOCK_NONE ;
41
-
42
- /* Forward declarations. */
43
- static void hfclk_start (void );
44
- static void hfclk_stop (void );
45
18
46
19
void nrf_802154_clock_init (void )
47
20
{
@@ -50,13 +23,11 @@ void nrf_802154_clock_init(void)
50
23
51
24
nrf_802154_clock_hfclk_latency_set (clock_latency_us );
52
25
#endif
53
-
54
- nrf_egu_int_enable (NRF_802154_EGU_INSTANCE , SWI_INT );
55
26
}
56
27
57
28
void nrf_802154_clock_deinit (void )
58
29
{
59
- nrf_egu_int_disable ( NRF_802154_EGU_INSTANCE , SWI_INT );
30
+ /* Intentionally empty. */
60
31
}
61
32
62
33
bool nrf_802154_clock_hfclk_is_running (void )
@@ -76,44 +47,8 @@ static void hfclk_on_callback(struct onoff_manager *mgr,
76
47
nrf_802154_clock_hfclk_ready ();
77
48
}
78
49
79
- void nrf_802154_sl_clock_swi_irq_handler (void )
80
- {
81
- if (nrf_egu_event_check (NRF_802154_EGU_INSTANCE , SWI_EVENT )) {
82
- nrf_egu_event_clear (NRF_802154_EGU_INSTANCE , SWI_EVENT );
83
-
84
- atomic_val_t previous = atomic_set (& request , CLOCK_NONE );
85
-
86
- __ASSERT_NO_MSG (previous == CLOCK_REQUEST || previous == CLOCK_RELEASE );
87
-
88
- switch (previous ) {
89
- case CLOCK_REQUEST :
90
- hfclk_start ();
91
- break ;
92
-
93
- case CLOCK_RELEASE :
94
- hfclk_stop ();
95
- break ;
96
-
97
- default :
98
- break ;
99
- }
100
- }
101
- }
102
-
103
- void nrf_802154_clock_hfclk_start (void )
104
- {
105
- atomic_set (& request , CLOCK_REQUEST );
106
- nrf_egu_task_trigger (NRF_802154_EGU_INSTANCE , SWI_TASK );
107
- }
108
-
109
- void nrf_802154_clock_hfclk_stop (void )
110
- {
111
- atomic_set (& request , CLOCK_RELEASE );
112
- nrf_egu_task_trigger (NRF_802154_EGU_INSTANCE , SWI_TASK );
113
- }
114
-
115
50
#if defined(CONFIG_CLOCK_CONTROL_NRF )
116
- static void hfclk_start (void )
51
+ void nrf_802154_clock_hfclk_start (void )
117
52
{
118
53
struct onoff_manager * mgr =
119
54
z_nrf_clock_control_get_onoff (CLOCK_CONTROL_NRF_SUBSYS_HF );
@@ -122,91 +57,56 @@ static void hfclk_start(void)
122
57
123
58
sys_notify_init_callback (& hfclk_cli .notify , hfclk_on_callback );
124
59
125
- if (!enabled ) {
126
- unsigned int key = irq_lock ();
127
-
128
- /*
129
- * todo: replace constlat request with PM policy API when
130
- * controlling the event latency becomes possible.
131
- */
132
- if (IS_ENABLED (CONFIG_NRF_802154_CONSTLAT_CONTROL )) {
133
- nrf_sys_event_request_global_constlat ();
134
- }
135
-
136
- int ret = onoff_request (mgr , & hfclk_cli );
137
-
138
- __ASSERT_NO_MSG (ret >= 0 );
139
- (void )ret ;
140
-
141
- irq_unlock (key );
60
+ /*
61
+ * todo: replace constlat request with PM policy API when
62
+ * controlling the event latency becomes possible.
63
+ */
64
+ if (IS_ENABLED (CONFIG_NRF_802154_CONSTLAT_CONTROL )) {
65
+ nrf_sys_event_request_global_constlat ();
142
66
}
143
67
144
- enabled = true;
68
+ int ret = onoff_request (mgr , & hfclk_cli );
69
+ __ASSERT_NO_MSG (ret >= 0 );
70
+ (void )ret ;
145
71
}
146
72
147
- static void hfclk_stop (void )
73
+ void nrf_802154_clock_hfclk_stop (void )
148
74
{
149
75
struct onoff_manager * mgr =
150
76
z_nrf_clock_control_get_onoff (CLOCK_CONTROL_NRF_SUBSYS_HF );
151
77
152
78
__ASSERT_NO_MSG (mgr != NULL );
153
79
154
- if (enabled ) {
155
- unsigned int key = irq_lock ();
156
-
157
- int ret = onoff_cancel_or_release (mgr , & hfclk_cli );
158
-
159
- __ASSERT_NO_MSG (ret >= 0 );
160
- (void )ret ;
161
-
162
- if (IS_ENABLED (CONFIG_NRF_802154_CONSTLAT_CONTROL )) {
163
- nrf_sys_event_release_global_constlat ();
164
- }
165
-
166
- hfclk_is_running = false;
80
+ int ret = onoff_cancel_or_release (mgr , & hfclk_cli );
81
+ __ASSERT_NO_MSG (ret >= 0 );
82
+ (void )ret ;
167
83
168
- irq_unlock (key );
84
+ if (IS_ENABLED (CONFIG_NRF_802154_CONSTLAT_CONTROL )) {
85
+ nrf_sys_event_release_global_constlat ();
169
86
}
170
87
171
- enabled = false;
88
+ hfclk_is_running = false;
172
89
}
173
90
174
91
#elif DT_NODE_HAS_STATUS (DT_NODELABEL (hfxo ), okay ) && \
175
92
DT_NODE_HAS_COMPAT (DT_NODELABEL (hfxo ), nordic_nrf54h_hfxo )
176
93
177
- static void hfclk_start (void )
94
+ void nrf_802154_clock_hfclk_start (void )
178
95
{
179
- if (!enabled ) {
180
- unsigned int key = irq_lock ();
181
-
182
- sys_notify_init_callback (& hfclk_cli .notify , hfclk_on_callback );
183
- int ret = nrf_clock_control_request (DEVICE_DT_GET (DT_NODELABEL (hfxo )),
184
- NULL , & hfclk_cli );
185
-
186
- __ASSERT_NO_MSG (ret >= 0 );
187
- (void )ret ;
188
-
189
- irq_unlock (key );
190
- }
96
+ sys_notify_init_callback (& hfclk_cli .notify , hfclk_on_callback );
97
+ int ret = nrf_clock_control_request (DEVICE_DT_GET (DT_NODELABEL (hfxo )), NULL , & hfclk_cli );
191
98
192
- enabled = true;
99
+ __ASSERT_NO_MSG (ret >= 0 );
100
+ (void )ret ;
193
101
}
194
102
195
- static void hfclk_stop (void )
103
+ void nrf_802154_clock_hfclk_stop (void )
196
104
{
197
- if (enabled ) {
198
- unsigned int key = irq_lock ();
199
-
200
- int ret = nrf_clock_control_cancel_or_release (DEVICE_DT_GET (DT_NODELABEL (hfxo )),
201
- NULL , & hfclk_cli );
202
-
203
- __ASSERT_NO_MSG (ret >= 0 );
204
- (void )ret ;
205
-
206
- irq_unlock (key );
207
- }
105
+ int ret = nrf_clock_control_cancel_or_release (DEVICE_DT_GET (DT_NODELABEL (hfxo )),
106
+ NULL , & hfclk_cli );
208
107
209
- enabled = false;
108
+ __ASSERT_NO_MSG (ret >= 0 );
109
+ (void )ret ;
210
110
}
211
111
212
112
#endif
0 commit comments