Skip to content

Commit 8108c89

Browse files
yangbolu1991kartben
authored andcommitted
drivers: interrupt_controller: intc_nxp_irqsteer: support ARM Cortex-M
Added ARM Cortex-M support for intc_nxp_irqsteer driver. Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
1 parent 627a3b8 commit 8108c89

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

drivers/interrupt_controller/Kconfig.nxp_irqsteer

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ config NXP_IRQSTEER
66
default y
77
depends on DT_HAS_NXP_IRQSTEER_INTC_ENABLED
88
depends on MULTI_LEVEL_INTERRUPTS
9-
depends on XTENSA
109
help
1110
The IRQSTEER INTC provides support for MUX-ing
1211
multiple interrupts from peripheral to one or

drivers/interrupt_controller/intc_nxp_irqsteer.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,18 @@ LOG_MODULE_REGISTER(nxp_irqstr);
265265
#define DISPATCHER_REGMAP(disp) \
266266
(((const struct irqsteer_config *)disp->dev->config)->regmap_phys)
267267

268+
#if defined(CONFIG_XTENSA)
269+
#define irqsteer_level1_irq_enable(irq) xtensa_irq_enable(XTENSA_IRQ_NUMBER(irq))
270+
#define irqsteer_level1_irq_disable(irq) xtensa_irq_disable(XTENSA_IRQ_NUMBER(irq))
271+
#define irqsteer_level1_irq_is_enabled(irq) xtensa_irq_is_enabled(XTENSA_IRQ_NUMBER(irq))
272+
#elif defined(CONFIG_ARM)
273+
#define irqsteer_level1_irq_enable(irq) arm_irq_enable(irq)
274+
#define irqsteer_level1_irq_disable(irq) arm_irq_disable(irq)
275+
#define irqsteer_level1_irq_is_enabled(irq) arm_irq_is_enabled(irq)
276+
#else
277+
#error ARCH not supported
278+
#endif
279+
268280
struct irqsteer_config {
269281
uint32_t regmap_phys;
270282
uint32_t regmap_size;
@@ -336,13 +348,11 @@ static void _irqstr_disp_enable_disable(struct irqsteer_dispatcher *disp,
336348
uint32_t regmap = DISPATCHER_REGMAP(disp);
337349

338350
if (enable) {
339-
xtensa_irq_enable(XTENSA_IRQ_NUMBER(disp->irq));
340-
351+
irqsteer_level1_irq_enable(disp->irq);
341352
IRQSTEER_EnableMasterInterrupt(UINT_TO_IRQSTEER(regmap), disp->irq);
342353
} else {
343354
IRQSTEER_DisableMasterInterrupt(UINT_TO_IRQSTEER(regmap), disp->irq);
344-
345-
xtensa_irq_disable(XTENSA_IRQ_NUMBER(disp->irq));
355+
irqsteer_level1_irq_disable(disp->irq);
346356
}
347357
}
348358

@@ -467,9 +477,9 @@ void z_soc_irq_enable_disable(uint32_t irq, bool enable)
467477
if (irq_get_level(irq) == 1) {
468478
/* LEVEL 1 interrupts are DSP direct */
469479
if (enable) {
470-
xtensa_irq_enable(XTENSA_IRQ_NUMBER(irq));
480+
irqsteer_level1_irq_enable(irq);
471481
} else {
472-
xtensa_irq_disable(XTENSA_IRQ_NUMBER(irq));
482+
irqsteer_level1_irq_disable(irq);
473483
}
474484
return;
475485
}
@@ -513,8 +523,7 @@ int z_soc_irq_is_enabled(unsigned int irq)
513523
bool enabled;
514524

515525
if (irq_get_level(irq) == 1) {
516-
/* LEVEL 1 interrupts are DSP direct */
517-
return xtensa_irq_is_enabled(XTENSA_IRQ_NUMBER(irq));
526+
return irqsteer_level1_irq_is_enabled(irq);
518527
}
519528

520529
parent_irq = irq_parent_level_2(irq);
@@ -538,6 +547,18 @@ int z_soc_irq_is_enabled(unsigned int irq)
538547
return false;
539548
}
540549

550+
#if defined(CONFIG_ARM)
551+
void z_soc_irq_priority_set(unsigned int irq, unsigned int prio, unsigned int flags)
552+
{
553+
uint32_t level1_irq = irq;
554+
555+
if (irq_get_level(irq) != 1) {
556+
level1_irq = irq_parent_level_2(irq);
557+
}
558+
559+
arm_irq_priority_set(level1_irq, prio, flags);
560+
}
561+
#endif
541562

542563
static void irqsteer_isr_dispatcher(const void *data)
543564
{

0 commit comments

Comments
 (0)