@@ -22,17 +22,19 @@ LOG_MODULE_REGISTER(gpio_neorv32, CONFIG_GPIO_LOG_LEVEL);
22
22
#include <zephyr/drivers/gpio/gpio_utils.h>
23
23
24
24
/* Register offsets */
25
- #define NEORV32_GPIO_PORT_IN 0x00
26
- #define NEORV32_GPIO_PORT_OUT 0x04
27
-
28
- /* Maximum number of GPIOs supported */
29
- #define MAX_GPIOS 32
25
+ #define NEORV32_GPIO_PORT_IN 0x00
26
+ #define NEORV32_GPIO_PORT_OUT 0x04
27
+ #define NEORV32_GPIO_IRQ_TYPE 0x10
28
+ #define NEORV32_GPIO_IRQ_POLARITY 0x14
29
+ #define NEORV32_GPIO_IRQ_ENABLE 0x18
30
+ #define NEORV32_GPIO_IRQ_PENDING 0x1c
30
31
31
32
struct neorv32_gpio_config {
32
33
/* gpio_driver_config needs to be first */
33
34
struct gpio_driver_config common ;
34
35
const struct device * syscon ;
35
36
mm_reg_t base ;
37
+ void (* irq_config_func )(void );
36
38
};
37
39
38
40
struct neorv32_gpio_data {
@@ -41,24 +43,24 @@ struct neorv32_gpio_data {
41
43
/* Shadow register for output */
42
44
uint32_t output ;
43
45
struct k_spinlock lock ;
46
+ sys_slist_t callbacks ;
44
47
};
45
48
46
- static inline uint32_t neorv32_gpio_read (const struct device * dev )
49
+ static inline uint32_t neorv32_gpio_read (const struct device * dev , uint16_t reg )
47
50
{
48
51
const struct neorv32_gpio_config * config = dev -> config ;
49
52
50
- return sys_read32 (config -> base + NEORV32_GPIO_PORT_IN );
53
+ return sys_read32 (config -> base + reg );
51
54
}
52
55
53
- static inline void neorv32_gpio_write (const struct device * dev , uint32_t val )
56
+ static inline void neorv32_gpio_write (const struct device * dev , uint16_t reg , uint32_t val )
54
57
{
55
58
const struct neorv32_gpio_config * config = dev -> config ;
56
59
57
- sys_write32 (val , config -> base + NEORV32_GPIO_PORT_OUT );
60
+ sys_write32 (val , config -> base + reg );
58
61
}
59
62
60
- static int neorv32_gpio_pin_configure (const struct device * dev , gpio_pin_t pin ,
61
- gpio_flags_t flags )
63
+ static int neorv32_gpio_pin_configure (const struct device * dev , gpio_pin_t pin , gpio_flags_t flags )
62
64
{
63
65
const struct neorv32_gpio_config * config = dev -> config ;
64
66
struct neorv32_gpio_data * data = dev -> data ;
@@ -85,91 +87,156 @@ static int neorv32_gpio_pin_configure(const struct device *dev, gpio_pin_t pin,
85
87
data -> output &= ~BIT (pin );
86
88
}
87
89
88
- neorv32_gpio_write (dev , data -> output );
90
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
89
91
k_spin_unlock (& data -> lock , key );
90
92
}
91
93
92
94
return 0 ;
93
95
}
94
96
95
- static int neorv32_gpio_port_get_raw (const struct device * dev ,
96
- gpio_port_value_t * value )
97
+ static int neorv32_gpio_port_get_raw (const struct device * dev , gpio_port_value_t * value )
97
98
{
98
- * value = neorv32_gpio_read (dev );
99
+ * value = neorv32_gpio_read (dev , NEORV32_GPIO_PORT_IN );
99
100
return 0 ;
100
101
}
101
102
102
- static int neorv32_gpio_port_set_masked_raw (const struct device * dev ,
103
- gpio_port_pins_t mask ,
104
- gpio_port_value_t value )
103
+ static int neorv32_gpio_port_set_masked_raw (const struct device * dev , gpio_port_pins_t mask ,
104
+ gpio_port_value_t value )
105
105
{
106
106
struct neorv32_gpio_data * data = dev -> data ;
107
107
k_spinlock_key_t key ;
108
108
109
109
key = k_spin_lock (& data -> lock );
110
110
data -> output = (data -> output & ~mask ) | (mask & value );
111
- neorv32_gpio_write (dev , data -> output );
111
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
112
112
k_spin_unlock (& data -> lock , key );
113
113
114
114
return 0 ;
115
115
}
116
116
117
- static int neorv32_gpio_port_set_bits_raw (const struct device * dev ,
118
- gpio_port_pins_t pins )
117
+ static int neorv32_gpio_port_set_bits_raw (const struct device * dev , gpio_port_pins_t pins )
119
118
{
120
119
struct neorv32_gpio_data * data = dev -> data ;
121
120
k_spinlock_key_t key ;
122
121
123
122
key = k_spin_lock (& data -> lock );
124
123
data -> output |= pins ;
125
- neorv32_gpio_write (dev , data -> output );
124
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
126
125
k_spin_unlock (& data -> lock , key );
127
126
128
127
return 0 ;
129
128
}
130
129
131
- static int neorv32_gpio_port_clear_bits_raw (const struct device * dev ,
132
- gpio_port_pins_t pins )
130
+ static int neorv32_gpio_port_clear_bits_raw (const struct device * dev , gpio_port_pins_t pins )
133
131
{
134
132
struct neorv32_gpio_data * data = dev -> data ;
135
133
k_spinlock_key_t key ;
136
134
137
135
key = k_spin_lock (& data -> lock );
138
136
data -> output &= ~pins ;
139
- neorv32_gpio_write (dev , data -> output );
137
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
140
138
k_spin_unlock (& data -> lock , key );
141
139
142
140
return 0 ;
143
141
}
144
142
145
- static int neorv32_gpio_port_toggle_bits (const struct device * dev ,
146
- gpio_port_pins_t pins )
143
+ static int neorv32_gpio_port_toggle_bits (const struct device * dev , gpio_port_pins_t pins )
147
144
{
148
145
struct neorv32_gpio_data * data = dev -> data ;
149
146
k_spinlock_key_t key ;
150
147
151
148
key = k_spin_lock (& data -> lock );
152
149
data -> output ^= pins ;
153
- neorv32_gpio_write (dev , data -> output );
150
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
154
151
k_spin_unlock (& data -> lock , key );
155
152
156
153
return 0 ;
157
154
}
158
155
159
- static int neorv32_gpio_manage_callback (const struct device * dev ,
160
- struct gpio_callback * cb ,
156
+ static int neorv32_gpio_pin_interrupt_configure (const struct device * dev , gpio_pin_t pin ,
157
+ enum gpio_int_mode mode , enum gpio_int_trig trig )
158
+ {
159
+ const struct neorv32_gpio_config * config = dev -> config ;
160
+ struct neorv32_gpio_data * data = dev -> data ;
161
+ const uint32_t mask = BIT (pin );
162
+ k_spinlock_key_t key ;
163
+ uint32_t polarity ;
164
+ uint32_t enable ;
165
+ uint32_t type ;
166
+ int err = 0 ;
167
+
168
+ if (!(mask & config -> common .port_pin_mask )) {
169
+ return - EINVAL ;
170
+ }
171
+
172
+ key = k_spin_lock (& data -> lock );
173
+
174
+ type = neorv32_gpio_read (dev , NEORV32_GPIO_IRQ_TYPE );
175
+ polarity = neorv32_gpio_read (dev , NEORV32_GPIO_IRQ_POLARITY );
176
+ enable = neorv32_gpio_read (dev , NEORV32_GPIO_IRQ_ENABLE );
177
+
178
+ if (mode == GPIO_INT_MODE_DISABLED ) {
179
+ enable &= ~mask ;
180
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_ENABLE , enable );
181
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_PENDING , ~mask );
182
+ } else {
183
+ enable |= mask ;
184
+
185
+ if (mode == GPIO_INT_MODE_LEVEL ) {
186
+ type &= ~mask ;
187
+ } else if (mode == GPIO_INT_MODE_EDGE ) {
188
+ type |= mask ;
189
+ } else {
190
+ LOG_ERR ("unsupported interrupt mode 0x%02x" , mode );
191
+ err = - ENOTSUP ;
192
+ goto unlock ;
193
+ }
194
+
195
+ if (trig == GPIO_INT_TRIG_LOW ) {
196
+ polarity &= ~mask ;
197
+ } else if (trig == GPIO_INT_TRIG_HIGH ) {
198
+ polarity |= mask ;
199
+ } else {
200
+ LOG_ERR ("unsupported interrupt trig 0x%02x" , trig );
201
+ err = - ENOTSUP ;
202
+ goto unlock ;
203
+ }
204
+
205
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_TYPE , type );
206
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_POLARITY , polarity );
207
+
208
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_PENDING , ~mask );
209
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_ENABLE , enable );
210
+ }
211
+
212
+ unlock :
213
+ k_spin_unlock (& data -> lock , key );
214
+
215
+ return err ;
216
+ }
217
+
218
+ static int neorv32_gpio_manage_callback (const struct device * dev , struct gpio_callback * cb ,
161
219
bool set )
162
220
{
163
- ARG_UNUSED (dev );
164
- ARG_UNUSED (cb );
165
- ARG_UNUSED (set );
221
+ struct neorv32_gpio_data * data = dev -> data ;
166
222
167
- return - ENOTSUP ;
223
+ return gpio_manage_callback ( & data -> callbacks , cb , set ) ;
168
224
}
169
225
170
226
static uint32_t neorv32_gpio_get_pending_int (const struct device * dev )
171
227
{
172
- return 0 ;
228
+ return neorv32_gpio_read (dev , NEORV32_GPIO_IRQ_PENDING );
229
+ }
230
+
231
+ static void neorv32_gpio_isr (const struct device * dev )
232
+ {
233
+ struct neorv32_gpio_data * data = dev -> data ;
234
+ uint32_t pending ;
235
+
236
+ pending = neorv32_gpio_read (dev , NEORV32_GPIO_IRQ_PENDING );
237
+ neorv32_gpio_write (dev , NEORV32_GPIO_IRQ_PENDING , ~(pending ));
238
+
239
+ gpio_fire_callbacks (& data -> callbacks , dev , pending );
173
240
}
174
241
175
242
static int neorv32_gpio_init (const struct device * dev )
@@ -195,7 +262,9 @@ static int neorv32_gpio_init(const struct device *dev)
195
262
return - ENODEV ;
196
263
}
197
264
198
- neorv32_gpio_write (dev , data -> output );
265
+ neorv32_gpio_write (dev , NEORV32_GPIO_PORT_OUT , data -> output );
266
+
267
+ config -> irq_config_func ();
199
268
200
269
return 0 ;
201
270
}
@@ -207,11 +276,19 @@ static DEVICE_API(gpio, neorv32_gpio_driver_api) = {
207
276
.port_set_bits_raw = neorv32_gpio_port_set_bits_raw ,
208
277
.port_clear_bits_raw = neorv32_gpio_port_clear_bits_raw ,
209
278
.port_toggle_bits = neorv32_gpio_port_toggle_bits ,
279
+ .pin_interrupt_configure = neorv32_gpio_pin_interrupt_configure ,
210
280
.manage_callback = neorv32_gpio_manage_callback ,
211
281
.get_pending_int = neorv32_gpio_get_pending_int ,
212
282
};
213
283
214
284
#define NEORV32_GPIO_INIT (n ) \
285
+ static void neorv32_gpio_config_func_##n(void) \
286
+ { \
287
+ IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), \
288
+ neorv32_gpio_isr, DEVICE_DT_INST_GET(n), 0);\
289
+ irq_enable(DT_INST_IRQN(n)); \
290
+ } \
291
+ \
215
292
static struct neorv32_gpio_data neorv32_gpio_##n##_data = { \
216
293
.output = 0, \
217
294
}; \
@@ -222,6 +299,7 @@ static DEVICE_API(gpio, neorv32_gpio_driver_api) = {
222
299
}, \
223
300
.syscon = DEVICE_DT_GET(DT_INST_PHANDLE(n, syscon)), \
224
301
.base = DT_INST_REG_ADDR(n), \
302
+ .irq_config_func = neorv32_gpio_config_func_##n, \
225
303
}; \
226
304
\
227
305
DEVICE_DT_INST_DEFINE(n, \
0 commit comments