Skip to content

Commit 2cc69ef

Browse files
e-rkrlubos
authored andcommitted
Revert "[nrf fromlist] modules: hal_nordic: nrf_802154: de-escalate to non-ZLI isr"
This reverts commit 568a8ad. Signed-off-by: Rafał Kuźnia <[email protected]>
1 parent 5382487 commit 2cc69ef

File tree

2 files changed

+29
-129
lines changed

2 files changed

+29
-129
lines changed

modules/hal_nordic/nrf_802154/sl_opensource/platform/nrf_802154_clock_zephyr.c

Lines changed: 28 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,8 @@
1313
#include <zephyr/kernel.h>
1414
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
1515
#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
3716

3817
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);
4518

4619
void nrf_802154_clock_init(void)
4720
{
@@ -50,13 +23,11 @@ void nrf_802154_clock_init(void)
5023

5124
nrf_802154_clock_hfclk_latency_set(clock_latency_us);
5225
#endif
53-
54-
nrf_egu_int_enable(NRF_802154_EGU_INSTANCE, SWI_INT);
5526
}
5627

5728
void nrf_802154_clock_deinit(void)
5829
{
59-
nrf_egu_int_disable(NRF_802154_EGU_INSTANCE, SWI_INT);
30+
/* Intentionally empty. */
6031
}
6132

6233
bool nrf_802154_clock_hfclk_is_running(void)
@@ -76,44 +47,8 @@ static void hfclk_on_callback(struct onoff_manager *mgr,
7647
nrf_802154_clock_hfclk_ready();
7748
}
7849

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-
11550
#if defined(CONFIG_CLOCK_CONTROL_NRF)
116-
static void hfclk_start(void)
51+
void nrf_802154_clock_hfclk_start(void)
11752
{
11853
struct onoff_manager *mgr =
11954
z_nrf_clock_control_get_onoff(CLOCK_CONTROL_NRF_SUBSYS_HF);
@@ -122,91 +57,56 @@ static void hfclk_start(void)
12257

12358
sys_notify_init_callback(&hfclk_cli.notify, hfclk_on_callback);
12459

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();
14266
}
14367

144-
enabled = true;
68+
int ret = onoff_request(mgr, &hfclk_cli);
69+
__ASSERT_NO_MSG(ret >= 0);
70+
(void)ret;
14571
}
14672

147-
static void hfclk_stop(void)
73+
void nrf_802154_clock_hfclk_stop(void)
14874
{
14975
struct onoff_manager *mgr =
15076
z_nrf_clock_control_get_onoff(CLOCK_CONTROL_NRF_SUBSYS_HF);
15177

15278
__ASSERT_NO_MSG(mgr != NULL);
15379

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;
16783

168-
irq_unlock(key);
84+
if (IS_ENABLED(CONFIG_NRF_802154_CONSTLAT_CONTROL)) {
85+
nrf_sys_event_release_global_constlat();
16986
}
17087

171-
enabled = false;
88+
hfclk_is_running = false;
17289
}
17390

17491
#elif DT_NODE_HAS_STATUS(DT_NODELABEL(hfxo), okay) && \
17592
DT_NODE_HAS_COMPAT(DT_NODELABEL(hfxo), nordic_nrf54h_hfxo)
17693

177-
static void hfclk_start(void)
94+
void nrf_802154_clock_hfclk_start(void)
17895
{
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);
19198

192-
enabled = true;
99+
__ASSERT_NO_MSG(ret >= 0);
100+
(void)ret;
193101
}
194102

195-
static void hfclk_stop(void)
103+
void nrf_802154_clock_hfclk_stop(void)
196104
{
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);
208107

209-
enabled = false;
108+
__ASSERT_NO_MSG(ret >= 0);
109+
(void)ret;
210110
}
211111

212112
#endif

west.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ manifest:
200200
groups:
201201
- hal
202202
- name: hal_nordic
203-
revision: 9e1bc32436a71adf1aa55937046d659a2db9e74f
203+
revision: 2f5d4e5868ab573eac932fa4bc142565073c3c04
204204
path: modules/hal/nordic
205205
groups:
206206
- hal

0 commit comments

Comments
 (0)