1 /*
2  * Copyright (c) 2016 Linaro Ltd.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_
8 #define ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_
9 
10 #include <zephyr/device.h>
11 #include <zephyr/drivers/gpio.h>
12 #include <zephyr/types.h>
13 
14 extern const struct gpio_driver_api gpio_mmio32_api;
15 
16 struct gpio_mmio32_config {
17 	/* gpio_driver_config needs to be first */
18 	struct gpio_driver_config common;
19 	volatile uint32_t *reg;
20 	uint32_t mask;
21 };
22 
23 struct gpio_mmio32_context {
24 	/* gpio_driver_data needs to be first */
25 	struct gpio_driver_data common;
26 	const struct gpio_mmio32_config *config;
27 };
28 
29 int gpio_mmio32_init(const struct device *dev);
30 
31 #ifdef CONFIG_GPIO_MMIO32
32 
33 /**
34  * Create a device object for accessing a simple 32-bit i/o register using the
35  * same APIs as GPIO drivers.
36  *
37  * @param node_id   The devicetree node identifier.
38  * @param _address  The address of the 32-bit i/o register the device will
39  *		    provide access to.
40  * @param _mask     Mask of bits in the register that it is valid to access.
41  *		    E.g. 0xffffffffu to allow access to all of them.
42  *
43  */
44 #define GPIO_MMIO32_INIT(node_id, _address, _mask)					\
45 static struct gpio_mmio32_context _CONCAT(Z_DEVICE_DT_DEV_ID(node_id), _ctx);		\
46 											\
47 static const struct gpio_mmio32_config _CONCAT(Z_DEVICE_DT_DEV_ID(node_id), _cfg) = {	\
48 	.common = {									\
49 		 .port_pin_mask = _mask,						\
50 	},										\
51 	.reg	= (volatile uint32_t *)_address,					\
52 	.mask	= _mask,								\
53 };											\
54 											\
55 DEVICE_DT_DEFINE(node_id,								\
56 		    &gpio_mmio32_init,							\
57 		    NULL,								\
58 		    &_CONCAT(Z_DEVICE_DT_DEV_ID(node_id), _ctx),			\
59 		    &_CONCAT(Z_DEVICE_DT_DEV_ID(node_id), _cfg),			\
60 		    PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,			\
61 		    &gpio_mmio32_api)
62 
63 
64 #else /* CONFIG_GPIO_MMIO32 */
65 
66 /* Null definition for when support not configured into kernel */
67 #define GPIO_MMIO32_INIT(node_id, _address, _mask)
68 
69 #endif
70 
71 
72 #endif /* ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_ */
73