Skip to content

Commit 07c0928

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: Tatsuya Ogawa <[email protected]>
1 parent fd81031 commit 07c0928

File tree

6 files changed

+302
-3
lines changed

6 files changed

+302
-3
lines changed

drivers/interrupt_controller/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ zephyr_library_sources_ifdef(CONFIG_XMC4XXX_INTC intc_xmc4xxx.c)
4646
zephyr_library_sources_ifdef(CONFIG_NXP_PINT intc_nxp_pint.c)
4747
zephyr_library_sources_ifdef(CONFIG_RENESAS_RX_ICU intc_renesas_rx_icu.c)
4848
zephyr_library_sources_ifdef(CONFIG_RENESAS_RZ_EXT_IRQ intc_renesas_rz_ext_irq.c)
49+
zephyr_library_sources_ifdef(CONFIG_RENESAS_RX_GRP_INTC intc_renesas_rx_grp_int.c)
4950
zephyr_library_sources_ifdef(CONFIG_NXP_IRQSTEER intc_nxp_irqsteer.c)
5051
zephyr_library_sources_ifdef(CONFIG_INTC_MTK_ADSP intc_mtk_adsp.c)
5152
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: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
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 &= ~(1U << is_number);
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+
128+
group_priority.ipl = cfg->prio;
129+
130+
switch (cfg->vect) {
131+
132+
case VECT_GROUP_BL0:
133+
IRQ_CONNECT(VECT_GROUP_BL0, 0, group_bl0_handler_isr, NULL, 0);
134+
break;
135+
136+
case VECT_GROUP_BL1:
137+
IRQ_CONNECT(VECT_GROUP_BL1, 0, group_bl1_handler_isr, NULL, 0);
138+
break;
139+
140+
case VECT_GROUP_BL2:
141+
IRQ_CONNECT(VECT_GROUP_BL2, 0, group_bl2_handler_isr, NULL, 0);
142+
break;
143+
144+
case VECT_GROUP_AL0:
145+
IRQ_CONNECT(VECT_GROUP_AL0, 0, group_al0_handler_isr, NULL, 0);
146+
break;
147+
148+
case VECT_GROUP_AL1:
149+
IRQ_CONNECT(VECT_GROUP_AL1, 0, group_al1_handler_isr, NULL, 0);
150+
break;
151+
152+
default:
153+
/* ERROR */
154+
err = -EINVAL;
155+
break;
156+
}
157+
158+
irq_enable(cfg->vect);
159+
160+
return err;
161+
}
162+
163+
#endif /* ZEPHYR_INCLUDE_INTC_GRP_RX_ARCH_H_ */ /* DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) > 0 */
164+
165+
#define GRP_INT_RX_INIT(index) \
166+
static struct rx_grp_int_cfg rx_grp_int_##index##_cfg = { \
167+
.gen = (uint32_t *)DT_INST_REG_ADDR_BY_NAME(index, GEN), \
168+
.vect = DT_INST_IRQN(index), \
169+
.prio = DT_INST_IRQ(index, priority)}; \
170+
static int rx_grp_int_##index##_init(const struct device *dev) \
171+
{ \
172+
return rx_grp_intc_init(dev); \
173+
} \
174+
DEVICE_DT_INST_DEFINE(index, rx_grp_int_##index##_init, NULL, NULL, \
175+
&rx_grp_int_##index##_cfg, PRE_KERNEL_1, \
176+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, NULL);
177+
178+
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: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@
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",
46+
"IRQFLTE1", "IRQFLTC0", "IRQFLTC1";
4447

4548
swint1: swint1@872e0 {
4649
compatible = "renesas,rx-swint";
@@ -558,5 +561,77 @@
558561
zephyr,memory-region = "OFSM";
559562
status = "okay";
560563
};
564+
565+
group_irq_be0: grp_intc@87600 {
566+
compatible = "renesas,rx-grp-intc";
567+
interrupt-controller;
568+
label = "be0";
569+
reg = <0x00087600 0x04>,
570+
<0x00087640 0x04>;
571+
reg-names = "GRP", "GEN";
572+
interrupts = <106 4>;
573+
status = "disabled";
574+
#interrupt-cells = <2>;
575+
};
576+
577+
group_irq_bl0: grp_intc@87630 {
578+
compatible = "renesas,rx-grp-intc";
579+
interrupt-controller;
580+
label = "bl0";
581+
reg = <0x00087630 0x04>,
582+
<0x00087670 0x04>;
583+
reg-names = "GRP", "GEN";
584+
interrupts = <110 4>;
585+
status = "okay";
586+
#interrupt-cells = <2>;
587+
};
588+
589+
group_irq_bl1: grp_intc@87634 {
590+
compatible = "renesas,rx-grp-intc";
591+
interrupt-controller;
592+
label = "bl1";
593+
reg = <0x00087634 0x04>,
594+
<0x00087674 0x04>;
595+
reg-names = "GRP", "GEN";
596+
interrupts = <111 4>;
597+
status = "disabled";
598+
#interrupt-cells = <2>;
599+
};
600+
601+
group_irq_bl2: grp_intc@87638 {
602+
compatible = "renesas,rx-grp-intc";
603+
interrupt-controller;
604+
label = "bl2";
605+
reg = <0x00087638 0x04>,
606+
<0x00087678 0x04>;
607+
reg-names = "GRP", "GEN";
608+
interrupts = <107 4>;
609+
status = "disabled";
610+
#interrupt-cells = <2>;
611+
};
612+
613+
group_irq_al0: grp_intc@87830 {
614+
compatible = "renesas,rx-grp-intc";
615+
interrupt-controller;
616+
label = "al0";
617+
reg = <0x00087830 0x04>,
618+
<0x00087870 0x04>;
619+
reg-names = "GRP", "GEN";
620+
interrupts = <112 4>;
621+
status = "disabled";
622+
#interrupt-cells = <2>;
623+
};
624+
625+
group_irq_al1: grp_intc@87834 {
626+
compatible = "renesas,rx-grp-intc";
627+
interrupt-controller;
628+
label = "al1";
629+
reg = <0x00087834 0x04>,
630+
<0x00087874 0x04>;
631+
reg-names = "GRP", "GEN";
632+
interrupts = <113 4>;
633+
status = "disabled";
634+
#interrupt-cells = <2>;
635+
};
561636
};
562637
};
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)