blob: a04fe680c545e5e86544145c142a9f6c716b0abc [file] [log] [blame]
/*
* Copyright (c) 2016 Linaro Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_
#define ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/types.h>
extern const struct gpio_driver_api gpio_mmio32_api;
struct gpio_mmio32_config {
/* gpio_driver_config needs to be first */
struct gpio_driver_config common;
volatile uint32_t *reg;
uint32_t mask;
};
struct gpio_mmio32_context {
/* gpio_driver_data needs to be first */
struct gpio_driver_data common;
const struct gpio_mmio32_config *config;
};
int gpio_mmio32_init(const struct device *dev);
#ifdef CONFIG_GPIO_MMIO32
/**
* Create a device object for accessing a simple 32-bit i/o register using the
* same APIs as GPIO drivers.
*
* @param node_id The devicetree node identifier.
* @param _address The address of the 32-bit i/o register the device will
* provide access to.
* @param _mask Mask of bits in the register that it is valid to access.
* E.g. 0xffffffffu to allow access to all of them.
*
*/
#define GPIO_MMIO32_INIT(node_id, _address, _mask) \
static struct gpio_mmio32_context _CONCAT(Z_DEVICE_DT_DEV_NAME(node_id), _ctx); \
\
static const struct gpio_mmio32_config _CONCAT(Z_DEVICE_DT_DEV_NAME(node_id), _cfg) = { \
.common = { \
.port_pin_mask = _mask, \
}, \
.reg = (volatile uint32_t *)_address, \
.mask = _mask, \
}; \
\
DEVICE_DT_DEFINE(node_id, \
&gpio_mmio32_init, \
NULL, \
&_CONCAT(Z_DEVICE_DT_DEV_NAME(node_id), _ctx), \
&_CONCAT(Z_DEVICE_DT_DEV_NAME(node_id), _cfg), \
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
&gpio_mmio32_api)
#else /* CONFIG_GPIO_MMIO32 */
/* Null definition for when support not configured into kernel */
#define GPIO_MMIO32_INIT(node_id, _address, _mask)
#endif
#endif /* ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_ */