zephyr/include/drivers/gpio/gpio_mmio32.h

71 lines
1.9 KiB
C

/*
* 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 <device.h>
#include <drivers/gpio.h>
#include <zephyr/types.h>
struct gpio_mmio32_config {
/* gpio_driver_config needs to be first */
struct gpio_driver_config common;
volatile u32_t *reg;
u32_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(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 _dev_name Device name.
* @param _drv_name The name this instance of the driver exposes to the system.
* @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.
*
* @see DEVICE_INIT
*/
#define GPIO_MMIO32_INIT(_dev_name, _drv_name, _address, _mask) \
\
static struct gpio_mmio32_context _dev_name##_dev_data; \
\
static const struct gpio_mmio32_config _dev_name##_dev_cfg = { \
.common = { \
.port_pin_mask = _mask, \
}, \
.reg = (volatile u32_t *)_address, \
.mask = _mask, \
}; \
\
DEVICE_INIT(_dev_name, _drv_name, \
&gpio_mmio32_init, \
&_dev_name##_dev_data, \
&_dev_name##_dev_cfg, \
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE)
#else /* CONFIG_GPIO_MMIO32 */
/* Null definition for when support not configured into kernel */
#define GPIO_MMIO32_INIT(_dev_name, _drv_name, _address, _mask)
#endif
#endif /* ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_MMIO32_H_ */