1 /*
2  * Copyright (c) 2024-2025 Renesas Electronics Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_DRIVERS_GPIO_RENESAS_RZ_H_
8 #define ZEPHYR_DRIVERS_GPIO_RENESAS_RZ_H_
9 
10 #include "r_ioport.h"
11 
12 #define GPIO_RZ_INT_UNSUPPORTED 0xF
13 
14 #if defined(CONFIG_SOC_SERIES_RZG3S)
15 #include <zephyr/dt-bindings/gpio/renesas-rz-gpio.h>
16 
17 #define GPIO_RZ_IOPORT_P_REG_BASE_GET   (&R_GPIO->P_20)
18 #define GPIO_RZ_IOPORT_PM_REG_BASE_GET  (&R_GPIO->PM_20)
19 #define GPIO_RZ_IOPORT_PFC_REG_BASE_GET (&R_GPIO->PFC_20)
20 
21 #define GPIO_RZ_IOPORT_P_REG_GET(port, pin)   (&GPIO_RZ_IOPORT_P_REG_BASE_GET[port + (pin / 4)])
22 #define GPIO_RZ_IOPORT_PM_REG_GET(port, pin)  (&GPIO_RZ_IOPORT_PM_REG_BASE_GET[port + (pin / 4)])
23 #define GPIO_RZ_IOPORT_PFC_REG_GET(port, pin) (&GPIO_RZ_IOPORT_PFC_REG_BASE_GET[port + (pin / 4)])
24 
25 #define GPIO_RZ_P_VALUE_GET(value, pin)   ((value >> pin) & 1U)
26 #define GPIO_RZ_PM_VALUE_GET(value, pin)  ((value >> (pin * 2)) & 3U)
27 #define GPIO_RZ_PFC_VALUE_GET(value, pin) ((value >> (pin * 4)) & 0xF)
28 
29 #define GPIO_RZ_IOPORT_PFC_SET(value) (value << 24)
30 
31 #define GPIO_RZ_PIN_DISCONNECT(port, pin) /* do nothing */
32 
33 #define GPIO_RZ_MAX_PORT_NUM 19
34 #define GPIO_RZ_MAX_INT_NUM  32
35 
36 #define GPIO_RZ_TINT_IRQ_OFFSET        429
37 #define GPIO_RZ_TINT_IRQ_GET(tint_num) (tint_num + GPIO_RZ_TINT_IRQ_OFFSET)
38 
39 #define GPIO_RZ_INT_EDGE_RISING  0x0
40 #define GPIO_RZ_INT_EDGE_FALLING 0x1
41 #define GPIO_RZ_INT_LEVEL_HIGH   0x2
42 #define GPIO_RZ_INT_LEVEL_LOW    0x3
43 #define GPIO_RZ_INT_BOTH_EDGE    GPIO_RZ_INT_UNSUPPORTED
44 
45 #define GPIO_RZ_TSSR_VAL(port, pin) (0x80 | (gpio_rz_int[port] + pin))
46 #define GPIO_RZ_TSSR_OFFSET(irq)    ((irq % 4) * 8)
47 #define GPIO_RZ_TITSR_OFFSET(irq)   ((irq % 16) * 2)
48 
49 #define GPIO_RZ_PIN_CONFIGURE_GET_FILTER(flag) (((flags >> RZG3S_GPIO_FILTER_SHIFT) & 0x1F) << 19U)
50 #define GPIO_RZ_PIN_CONFIGURE_GET(flag)        (((flag >> RZG3S_GPIO_IOLH_SHIFT) & 0x3) << 10U)
51 
52 #define GPIO_RZ_PIN_CONFIGURE_INT_ENABLE         IOPORT_CFG_TINT_ENABLE
53 #define GPIO_RZ_PIN_CONFIGURE_INT_DISABLE        (~(IOPORT_CFG_TINT_ENABLE))
54 #define GPIO_RZ_PIN_CONFIGURE_INPUT_OUTPUT_RESET (~(0x3 << 2))
55 #define GPIO_RZ_PIN_SPECIAL_FLAG_GET(flag)       GPIO_RZ_PIN_CONFIGURE_GET_FILTER(flag)
56 
57 static const uint8_t gpio_rz_int[GPIO_RZ_MAX_PORT_NUM] = {0,  4,  9,  13, 17, 23, 28, 33, 38, 43,
58 							  47, 52, 56, 58, 63, 66, 70, 72, 76};
59 
60 #elif defined(CONFIG_SOC_SERIES_RZN2L) || defined(CONFIG_SOC_SERIES_RZT2L)
61 #include <zephyr/dt-bindings/gpio/renesas-rztn-gpio.h>
62 #define GPIO_RZ_IOPORT_REG_REGION_GET(p) (R_BSP_IoRegionGet(p) == BSP_IO_REGION_NOT_SAFE ? 1 : 0)
63 
64 #define GPIO_RZ_IOPORT_P_REG_BASE_GET(port, pin)                                                   \
65 	(GPIO_RZ_IOPORT_REG_REGION_GET((port << 8U) | pin) == 1 ? &R_PORT_NSR->P[port]             \
66 								: &R_PORT_SR->P[port])
67 
68 #define GPIO_RZ_IOPORT_PM_REG_BASE_GET(port, pin)                                                  \
69 	(GPIO_RZ_IOPORT_REG_REGION_GET((port << 8U) | pin) == 1 ? &R_PORT_NSR->PM[port]            \
70 								: &R_PORT_SR->PM[port])
71 
72 #define GPIO_RZ_IOPORT_PFC_REG_BASE_GET(port, pin)                                                 \
73 	(GPIO_RZ_IOPORT_REG_REGION_GET((port << 8U) | pin) == 1 ? &R_PORT_NSR->PFC[port]           \
74 								: &R_PORT_SR->PFC[port])
75 
76 #define GPIO_RZ_IOPORT_P_REG_GET(port, pin)   (GPIO_RZ_IOPORT_P_REG_BASE_GET(port, pin))
77 #define GPIO_RZ_IOPORT_PM_REG_GET(port, pin)  (GPIO_RZ_IOPORT_PM_REG_BASE_GET(port, pin))
78 #define GPIO_RZ_IOPORT_PFC_REG_GET(port, pin) (GPIO_RZ_IOPORT_PFC_REG_BASE_GET(port, pin))
79 
80 #define GPIO_RZ_P_VALUE_GET(value, pin)   ((value >> pin) & 1U)
81 #define GPIO_RZ_PM_VALUE_GET(value, pin)  ((value >> (pin * 2)) & 3U)
82 #define GPIO_RZ_PFC_VALUE_GET(value, pin) ((value >> (pin * 4)) & 0xF)
83 
84 #define GPIO_RZ_IOPORT_PFC_SET(value) (value << 4)
85 
86 #define GPIO_RZ_PIN_DISCONNECT(port, pin)                                                          \
87 	*GPIO_RZ_IOPORT_PM_REG_GET((port >> 8U), pin) &= ~(3U << (pin * 2))
88 
89 #define GPIO_RZ_MAX_INT_NUM 16
90 
91 #define GPIO_RZ_INT_EDGE_FALLING 0x0
92 #define GPIO_RZ_INT_EDGE_RISING  0x1
93 #define GPIO_RZ_INT_BOTH_EDGE    0x2
94 #define GPIO_RZ_INT_LEVEL_LOW    0x3
95 #define GPIO_RZ_INT_LEVEL_HIGH   GPIO_RZ_INT_UNSUPPORTED
96 
97 #define GPIO_RZ_PIN_CONFIGURE_GET(flag) (((flag >> RZTN_GPIO_DRCTL_SHIFT) & 0x33) << 8U)
98 
99 #define GPIO_RZ_PIN_CONFIGURE_INT_ENABLE         (1U << 3)
100 #define GPIO_RZ_PIN_CONFIGURE_INT_DISABLE        (~(1U << 3))
101 #define GPIO_RZ_PIN_CONFIGURE_INPUT_OUTPUT_RESET (~(0x3 << 2))
102 #define GPIO_RZ_PIN_SPECIAL_FLAG_GET(flag)       IOPORT_CFG_REGION_NSAFETY
103 
104 #endif /* CONFIG_SOC_* */
105 
106 #endif /* ZEPHYR_DRIVERS_GPIO_RENESAS_RZ_H_ */
107