15
15
16
16
#include <zephyr/drivers/gpio/gpio_utils.h>
17
17
18
+ /* Is MSS GPIO module 'resets' line property defined */
19
+ #define MSS_GPIO_RESET_ENABLED DT_ANY_INST_HAS_PROP_STATUS_OKAY(resets)
20
+
21
+ #if MSS_GPIO_RESET_ENABLED
22
+ #include <zephyr/drivers/reset.h>
23
+ #endif
18
24
19
25
#define MSS_GPIO_INPUT_MODE 0x02
20
26
#define MSS_GPIO_OUTPUT_MODE 0x05
@@ -48,6 +54,9 @@ struct mss_gpio_config {
48
54
uintptr_t gpio_base_addr ;
49
55
uint32_t gpio_irq_base ;
50
56
mss_gpio_cfg_func_t gpio_cfg_func ;
57
+ #if MSS_GPIO_RESET_ENABLED
58
+ struct reset_dt_spec reset_spec ;
59
+ #endif
51
60
};
52
61
53
62
struct mss_gpio_data {
@@ -209,10 +218,15 @@ static DEVICE_API(gpio, mss_gpio_driver) = {
209
218
static int mss_gpio_init (const struct device * dev )
210
219
{
211
220
volatile struct mss_gpio_t * gpio = DEV_GPIO (dev );
221
+ const struct mss_gpio_config * cfg = DEV_GPIO_CFG (dev );
212
222
213
- gpio -> gpio_irq = 0xFFFFFFFFU ;
223
+ #if MSS_GPIO_RESET_ENABLED
224
+ if (cfg -> reset_spec .dev != NULL ) {
225
+ (void )reset_line_deassert_dt (& cfg -> reset_spec );
226
+ }
227
+ #endif
214
228
215
- const struct mss_gpio_config * cfg = DEV_GPIO_CFG ( dev ) ;
229
+ gpio -> gpio_irq = 0xFFFFFFFFU ;
216
230
/* Configure GPIO device */
217
231
cfg -> gpio_cfg_func ();
218
232
return 0 ;
@@ -239,7 +253,9 @@ static void mss_gpio_irq_handler(const struct device *dev)
239
253
}, \
240
254
.gpio_base_addr = DT_INST_REG_ADDR(n), \
241
255
.gpio_irq_base = DT_INST_IRQN(n), \
242
- .gpio_cfg_func = gpio_mss_gpio_cfg_func_##n \
256
+ .gpio_cfg_func = gpio_mss_gpio_cfg_func_##n, \
257
+ IF_ENABLED(DT_INST_NODE_HAS_PROP(n, resets), \
258
+ (.reset_spec = RESET_DT_SPEC_INST_GET(n),)) \
243
259
}; \
244
260
\
245
261
DEVICE_DT_INST_DEFINE(n, \
0 commit comments