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