11
11
#include <zephyr/drivers/gpio.h>
12
12
#include <zephyr/drivers/syscon.h>
13
13
#include <zephyr/irq.h>
14
+ #include <zephyr/spinlock.h>
14
15
#include <zephyr/sys/sys_io.h>
15
16
#include <zephyr/logging/log.h>
16
17
@@ -39,6 +40,7 @@ struct neorv32_gpio_data {
39
40
struct gpio_driver_data common ;
40
41
/* Shadow register for output */
41
42
uint32_t output ;
43
+ struct k_spinlock lock ;
42
44
};
43
45
44
46
static inline uint32_t neorv32_gpio_read (const struct device * dev )
@@ -60,7 +62,7 @@ static int neorv32_gpio_pin_configure(const struct device *dev, gpio_pin_t pin,
60
62
{
61
63
const struct neorv32_gpio_config * config = dev -> config ;
62
64
struct neorv32_gpio_data * data = dev -> data ;
63
- unsigned int key ;
65
+ k_spinlock_key_t key ;
64
66
65
67
if (!(BIT (pin ) & config -> common .port_pin_mask )) {
66
68
return - EINVAL ;
@@ -75,7 +77,7 @@ static int neorv32_gpio_pin_configure(const struct device *dev, gpio_pin_t pin,
75
77
}
76
78
77
79
if ((flags & GPIO_OUTPUT ) != 0 ) {
78
- key = irq_lock ( );
80
+ key = k_spin_lock ( & data -> lock );
79
81
80
82
if ((flags & GPIO_OUTPUT_INIT_HIGH ) != 0 ) {
81
83
data -> output |= BIT (pin );
@@ -84,7 +86,7 @@ static int neorv32_gpio_pin_configure(const struct device *dev, gpio_pin_t pin,
84
86
}
85
87
86
88
neorv32_gpio_write (dev , data -> output );
87
- irq_unlock ( key );
89
+ k_spin_unlock ( & data -> lock , key );
88
90
}
89
91
90
92
return 0 ;
@@ -102,12 +104,12 @@ static int neorv32_gpio_port_set_masked_raw(const struct device *dev,
102
104
gpio_port_value_t value )
103
105
{
104
106
struct neorv32_gpio_data * data = dev -> data ;
105
- unsigned int key ;
107
+ k_spinlock_key_t key ;
106
108
107
- key = irq_lock ( );
109
+ key = k_spin_lock ( & data -> lock );
108
110
data -> output = (data -> output & ~mask ) | (mask & value );
109
111
neorv32_gpio_write (dev , data -> output );
110
- irq_unlock ( key );
112
+ k_spin_unlock ( & data -> lock , key );
111
113
112
114
return 0 ;
113
115
}
@@ -116,12 +118,12 @@ static int neorv32_gpio_port_set_bits_raw(const struct device *dev,
116
118
gpio_port_pins_t pins )
117
119
{
118
120
struct neorv32_gpio_data * data = dev -> data ;
119
- unsigned int key ;
121
+ k_spinlock_key_t key ;
120
122
121
- key = irq_lock ( );
123
+ key = k_spin_lock ( & data -> lock );
122
124
data -> output |= pins ;
123
125
neorv32_gpio_write (dev , data -> output );
124
- irq_unlock ( key );
126
+ k_spin_unlock ( & data -> lock , key );
125
127
126
128
return 0 ;
127
129
}
@@ -130,12 +132,12 @@ static int neorv32_gpio_port_clear_bits_raw(const struct device *dev,
130
132
gpio_port_pins_t pins )
131
133
{
132
134
struct neorv32_gpio_data * data = dev -> data ;
133
- unsigned int key ;
135
+ k_spinlock_key_t key ;
134
136
135
- key = irq_lock ( );
137
+ key = k_spin_lock ( & data -> lock );
136
138
data -> output &= ~pins ;
137
139
neorv32_gpio_write (dev , data -> output );
138
- irq_unlock ( key );
140
+ k_spin_unlock ( & data -> lock , key );
139
141
140
142
return 0 ;
141
143
}
@@ -144,12 +146,12 @@ static int neorv32_gpio_port_toggle_bits(const struct device *dev,
144
146
gpio_port_pins_t pins )
145
147
{
146
148
struct neorv32_gpio_data * data = dev -> data ;
147
- unsigned int key ;
149
+ k_spinlock_key_t key ;
148
150
149
- key = irq_lock ( );
151
+ key = k_spin_lock ( & data -> lock );
150
152
data -> output ^= pins ;
151
153
neorv32_gpio_write (dev , data -> output );
152
- irq_unlock ( key );
154
+ k_spin_unlock ( & data -> lock , key );
153
155
154
156
return 0 ;
155
157
}
0 commit comments