Skip to content

Commit 2038606

Browse files
TatsuyaOgawanxquytranpzz
authored andcommitted
drivers: interrupt-controller: Add support Group interrupt driver on RX
Add support Group interrupt driver on RX Signed-off-by: TatsuyaOgawa <[email protected]>
1 parent 9e2c43d commit 2038606

File tree

6 files changed

+300
-3
lines changed

6 files changed

+300
-3
lines changed

drivers/interrupt_controller/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ zephyr_library_sources_ifdef(CONFIG_XMC4XXX_INTC intc_xmc4xxx.c)
4444
zephyr_library_sources_ifdef(CONFIG_NXP_PINT intc_nxp_pint.c)
4545
zephyr_library_sources_ifdef(CONFIG_RENESAS_RX_ICU intc_renesas_rx_icu.c)
4646
zephyr_library_sources_ifdef(CONFIG_RENESAS_RZ_EXT_IRQ intc_renesas_rz_ext_irq.c)
47+
zephyr_library_sources_ifdef(CONFIG_RENESAS_RX_GRP_INTC intc_renesas_rx_grp_int.c)
4748
zephyr_library_sources_ifdef(CONFIG_NXP_IRQSTEER intc_nxp_irqsteer.c)
4849
zephyr_library_sources_ifdef(CONFIG_INTC_MTK_ADSP intc_mtk_adsp.c)
4950
zephyr_library_sources_ifdef(CONFIG_WCH_PFIC intc_wch_pfic.c)

drivers/interrupt_controller/Kconfig.renesas_rx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,10 @@ config RENESAS_RX_ICU
77
depends on DT_HAS_RENESAS_RX_ICU_ENABLED
88
help
99
Renesas RX series interrupt controller unit
10+
11+
config RENESAS_RX_GRP_INTC
12+
bool "Renesas RX series group interrupt"
13+
default y
14+
depends on DT_HAS_RENESAS_RX_GRP_INTC_ENABLED
15+
help
16+
Renesas RX series group interrupt feature
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
/*
2+
* Copyright (c) 2021 KT-Elektronik, Klaucke und Partner GmbH
3+
* Copyright (c) 2025 Renesas Electronics Corporation
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#define DT_DRV_COMPAT renesas_rx_grp_intc
8+
9+
#include <zephyr/device.h>
10+
#include <zephyr/irq.h>
11+
#include <zephyr/spinlock.h>
12+
#include <zephyr/drivers/interrupt_controller/intc_renesas_rx_grp_int.h>
13+
#include <errno.h>
14+
15+
#if DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) > 0
16+
17+
extern void group_bl0_handler_isr(void);
18+
extern void group_bl1_handler_isr(void);
19+
extern void group_bl2_handler_isr(void);
20+
extern void group_al0_handler_isr(void);
21+
extern void group_al1_handler_isr(void);
22+
23+
#define VECT_GROUP_BL0 DT_IRQN(DT_NODELABEL(group_irq_bl0))
24+
#define VECT_GROUP_BL1 DT_IRQN(DT_NODELABEL(group_irq_bl1))
25+
#define VECT_GROUP_BL2 DT_IRQN(DT_NODELABEL(group_irq_bl2))
26+
#define VECT_GROUP_AL0 DT_IRQN(DT_NODELABEL(group_irq_al0))
27+
#define VECT_GROUP_AL1 DT_IRQN(DT_NODELABEL(group_irq_al1))
28+
29+
#define DEV_CFG(cfg, dev) struct rx_grp_int_cfg *cfg = (struct rx_grp_int_cfg *)(dev->config)
30+
31+
/**
32+
* @brief configuration data for a group interrupt device
33+
*/
34+
struct rx_grp_int_cfg {
35+
/* address of the Group Interrupt Request Enable Register (GENxxx) */
36+
volatile uint32_t *gen;
37+
/* vector number of the interrupt */
38+
const uint8_t vect;
39+
/* priority of the interrupt */
40+
const uint8_t prio;
41+
};
42+
43+
static struct k_spinlock lock;
44+
45+
int rx_grp_intc_set_callback(const struct device *dev, bsp_int_src_t vector, bsp_int_cb_t callback,
46+
void *context)
47+
{
48+
49+
bsp_int_err_t err;
50+
51+
ARG_UNUSED(dev);
52+
53+
err = R_BSP_InterruptWrite_EX(vector, callback, context);
54+
55+
if (err != BSP_INT_SUCCESS) {
56+
err = -EINVAL;
57+
}
58+
59+
return err;
60+
}
61+
62+
int rx_grp_intc_set_grp_int(const struct device *dev, bsp_int_src_t vector, bool set)
63+
{
64+
65+
if (dev == NULL) {
66+
return -EINVAL;
67+
}
68+
69+
DEV_CFG(cfg, dev);
70+
71+
volatile bsp_int_ctrl_t group_priority;
72+
bsp_int_err_t err;
73+
74+
group_priority.ipl = cfg->prio;
75+
76+
k_spinlock_key_t key = k_spin_lock(&lock);
77+
78+
if (set) {
79+
/* ENABLE GROUP INTERRUPTS */
80+
err = R_BSP_InterruptControl(vector, BSP_INT_CMD_GROUP_INTERRUPT_ENABLE,
81+
(void *)&group_priority);
82+
} else {
83+
/* DISABLE GROUP INTERRUPTS */
84+
err = R_BSP_InterruptControl(vector, BSP_INT_CMD_GROUP_INTERRUPT_DISABLE, NULL);
85+
}
86+
87+
k_spin_unlock(&lock, key);
88+
89+
if (err != BSP_INT_SUCCESS) {
90+
return -EINVAL;
91+
}
92+
93+
return err;
94+
}
95+
96+
int rx_grp_intc_set_gen(const struct device *dev, int is_number, bool set)
97+
{
98+
99+
if ((is_number < 0 || is_number > 31) || dev == NULL) {
100+
return -EINVAL;
101+
}
102+
103+
DEV_CFG(cfg, dev);
104+
105+
k_spinlock_key_t key = k_spin_lock(&lock);
106+
107+
if (set) {
108+
/* ENABLE GROUP INTERRUPTS */
109+
*cfg->gen |= (1U << is_number);
110+
} else {
111+
/* DISABLE GROUP INTERRUPTS */
112+
*cfg->gen = 0;
113+
}
114+
115+
k_spin_unlock(&lock, key);
116+
117+
return 0;
118+
}
119+
120+
static int rx_grp_intc_init(const struct device *dev)
121+
{
122+
123+
DEV_CFG(cfg, dev);
124+
125+
volatile bsp_int_ctrl_t group_priority;
126+
int err = 0;
127+
group_priority.ipl = cfg->prio;
128+
129+
switch (cfg->vect) {
130+
131+
case VECT_GROUP_BL0:
132+
IRQ_CONNECT(VECT_GROUP_BL0, 0, group_bl0_handler_isr, NULL, 0);
133+
break;
134+
135+
case VECT_GROUP_BL1:
136+
IRQ_CONNECT(VECT_GROUP_BL1, 0, group_bl1_handler_isr, NULL, 0);
137+
break;
138+
139+
case VECT_GROUP_BL2:
140+
IRQ_CONNECT(VECT_GROUP_BL2, 0, group_bl2_handler_isr, NULL, 0);
141+
break;
142+
143+
case VECT_GROUP_AL0:
144+
IRQ_CONNECT(VECT_GROUP_AL0, 0, group_al0_handler_isr, NULL, 0);
145+
break;
146+
147+
case VECT_GROUP_AL1:
148+
IRQ_CONNECT(VECT_GROUP_AL1, 0, group_al1_handler_isr, NULL, 0);
149+
break;
150+
151+
default:
152+
/* ERROR */
153+
err = -EINVAL;
154+
break;
155+
}
156+
157+
irq_enable(cfg->vect);
158+
159+
return err;
160+
}
161+
162+
#endif /* ZEPHYR_INCLUDE_INTC_GRP_RX_ARCH_H_ */ /* DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) > 0 */
163+
164+
#define GRP_INT_RX_INIT(index) \
165+
static struct rx_grp_int_cfg rx_grp_int_##index##_cfg = { \
166+
.gen = (uint32_t *)DT_INST_REG_ADDR_BY_NAME(index, GEN), \
167+
.vect = DT_INST_IRQN(index), \
168+
.prio = DT_INST_IRQ(index, priority)}; \
169+
static int rx_grp_int_##index##_init(const struct device *dev) \
170+
{ \
171+
return rx_grp_intc_init(dev); \
172+
} \
173+
DEVICE_DT_INST_DEFINE(index, rx_grp_int_##index##_init, NULL, NULL, \
174+
&rx_grp_int_##index##_cfg, PRE_KERNEL_1, \
175+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, NULL);
176+
177+
DT_INST_FOREACH_STATUS_OKAY(GRP_INT_RX_INIT);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright (c) 2021 KT-Elektronik Klaucke und Partner GmbH
2+
# Copyright (c) 2025 Renesas Electronics Corporation
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
description: Renesas group interrupt
6+
compatible: "renesas,rx-grp-intc"
7+
8+
include: [interrupt-controller.yaml, base.yaml]
9+
10+
properties:
11+
reg:
12+
required: true
13+
14+
reg-names:
15+
required: true
16+
17+
"#interrupt-cells":
18+
const: 2
19+
20+
interrupt-cells:
21+
- irq
22+
- priority

dts/rx/renesas/rx26t-common.dtsi

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@
3838
<0x0087300 0xff>,
3939
<0x00872f0 0x02>,
4040
<0x0087500 0x0f>,
41-
<0x0087510 0x01>,
42-
<0x0087514 0x01>;
43-
reg-names = "IR", "IER", "IPR", "FIR", "IRQCR", "IRQFLTE", "IRQFLTC0";
41+
<0x0087520 0x01>,
42+
<0x0087521 0x01>,
43+
<0x0087528 0x01>,
44+
<0x008752a 0x01>;
45+
reg-names = "IR", "IER", "IPR", "FIR","IRQCR","IRQFLTE","IRQFLTE1","IRQFLTC0","IRQFLTC1";
4446

4547
swint1: swint1@872e0 {
4648
compatible = "renesas,rx-swint";
@@ -558,5 +560,77 @@
558560
zephyr,memory-region = "OFSM";
559561
status = "okay";
560562
};
563+
564+
group_irq_be0: grp_intc@87600 {
565+
compatible = "renesas,rx-grp-intc";
566+
interrupt-controller;
567+
label = "be0";
568+
reg = <0x00087600 0x04>,
569+
<0x00087640 0x04>;
570+
reg-names = "GRP", "GEN";
571+
interrupts = <106 4>;
572+
status = "disabled";
573+
#interrupt-cells = <2>;
574+
};
575+
576+
group_irq_bl0: grp_intc@87630 {
577+
compatible = "renesas,rx-grp-intc";
578+
interrupt-controller;
579+
label = "bl0";
580+
reg = <0x00087630 0x04>,
581+
<0x00087670 0x04>;
582+
reg-names = "GRP", "GEN";
583+
interrupts = <110 4>;
584+
status = "okay";
585+
#interrupt-cells = <2>;
586+
};
587+
588+
group_irq_bl1: grp_intc@87634 {
589+
compatible = "renesas,rx-grp-intc";
590+
interrupt-controller;
591+
label = "bl1";
592+
reg = <0x00087634 0x04>,
593+
<0x00087674 0x04>;
594+
reg-names = "GRP", "GEN";
595+
interrupts = <111 4>;
596+
status = "disabled";
597+
#interrupt-cells = <2>;
598+
};
599+
600+
group_irq_bl2: grp_intc@87638 {
601+
compatible = "renesas,rx-grp-intc";
602+
interrupt-controller;
603+
label = "bl2";
604+
reg = <0x00087638 0x04>,
605+
<0x00087678 0x04>;
606+
reg-names = "GRP", "GEN";
607+
interrupts = <107 4>;
608+
status = "disabled";
609+
#interrupt-cells = <2>;
610+
};
611+
612+
group_irq_al0: grp_intc@87830 {
613+
compatible = "renesas,rx-grp-intc";
614+
interrupt-controller;
615+
label = "al0";
616+
reg = <0x00087830 0x04>,
617+
<0x00087870 0x04>;
618+
reg-names = "GRP", "GEN";
619+
interrupts = <112 4>;
620+
status = "disabled";
621+
#interrupt-cells = <2>;
622+
};
623+
624+
group_irq_al1: grp_intc@87834 {
625+
compatible = "renesas,rx-grp-intc";
626+
interrupt-controller;
627+
label = "al1";
628+
reg = <0x00087834 0x04>,
629+
<0x00087874 0x04>;
630+
reg-names = "GRP", "GEN";
631+
interrupts = <113 4>;
632+
status = "disabled";
633+
#interrupt-cells = <2>;
634+
};
561635
};
562636
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2025 Renesas Electronics Corporation
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#ifndef ZEPHYR_INCLUDE_INTC_GRP_RX_ARCH_H_
7+
#define ZEPHYR_INCLUDE_INTC_GRP_RX_ARCH_H_
8+
9+
#include "platform.h"
10+
11+
int rx_grp_intc_set_callback(const struct device *dev, bsp_int_src_t vector, bsp_int_cb_t callback,
12+
void *context);
13+
int rx_grp_intc_set_grp_int(const struct device *dev, bsp_int_src_t vector, bool set);
14+
int rx_grp_intc_set_gen(const struct device *dev, int is_number, bool set);
15+
16+
#endif /* ZEPHYR_INCLUDE_INTC_GRP_RX_ARCH_H_ */

0 commit comments

Comments
 (0)