1 /*
2  * Copyright (c) 2025 Silicon Laboratories Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Shim for sl_interrupt_manager API using Zephyr API
7  */
8 
9 #include <zephyr/kernel.h>
10 
11 #include "sl_interrupt_manager.h"
12 
13 #define LOCK_KEY_DEFAULT 0xFFFFFFFFU
14 
15 static unsigned int lock_key = LOCK_KEY_DEFAULT;
16 
sl_interrupt_manager_disable_interrupts(void)17 void sl_interrupt_manager_disable_interrupts(void)
18 {
19 	__ASSERT(lock_key == LOCK_KEY_DEFAULT, "Interrupt manager doesn't support nested disable");
20 	lock_key = irq_lock();
21 }
22 
sl_interrupt_manager_enable_interrupts(void)23 void sl_interrupt_manager_enable_interrupts(void)
24 {
25 	irq_unlock(lock_key);
26 	lock_key = LOCK_KEY_DEFAULT;
27 }
28 
sl_interrupt_manager_disable_irq(int32_t irqn)29 void sl_interrupt_manager_disable_irq(int32_t irqn)
30 {
31 	irq_disable(irqn);
32 }
33 
sl_interrupt_manager_enable_irq(int32_t irqn)34 void sl_interrupt_manager_enable_irq(int32_t irqn)
35 {
36 	irq_enable(irqn);
37 }
38 
sl_interrupt_manager_is_irq_disabled(int32_t irqn)39 bool sl_interrupt_manager_is_irq_disabled(int32_t irqn)
40 {
41 	return !irq_is_enabled(irqn);
42 }
43 
sl_interrupt_manager_is_irq_pending(int32_t irqn)44 bool sl_interrupt_manager_is_irq_pending(int32_t irqn)
45 {
46 	return NVIC_GetPendingIRQ(irqn);
47 }
48 
sl_interrupt_manager_set_irq_pending(int32_t irqn)49 void sl_interrupt_manager_set_irq_pending(int32_t irqn)
50 {
51 	NVIC_SetPendingIRQ(irqn);
52 }
53 
sl_interrupt_manager_clear_irq_pending(int32_t irqn)54 void sl_interrupt_manager_clear_irq_pending(int32_t irqn)
55 {
56 	NVIC_ClearPendingIRQ(irqn);
57 }
58 
sl_interrupt_manager_get_irq_priority(int32_t irqn)59 uint32_t sl_interrupt_manager_get_irq_priority(int32_t irqn)
60 {
61 	return NVIC_GetPriority(irqn);
62 }
63 
sl_interrupt_manager_set_irq_priority(int32_t irqn,uint32_t priority)64 void sl_interrupt_manager_set_irq_priority(int32_t irqn, uint32_t priority)
65 {
66 	NVIC_SetPriority(irqn, priority);
67 }
68 
sl_interrupt_manager_get_active_irq(int32_t irqn)69 uint32_t sl_interrupt_manager_get_active_irq(int32_t irqn)
70 {
71 	return NVIC_GetActive(irqn);
72 }
73