Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2016 Linaro Ltd.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef _GPIO_MMIO32_H_
#define _GPIO_MMIO32_H_

#include <device.h>
#include <gpio.h>
#include <zephyr/types.h>

struct gpio_mmio32_config {
	volatile u32_t *reg;
	u32_t mask;
};

struct gpio_mmio32_context {
	const struct gpio_mmio32_config *config;
	u32_t invert; /* Mask of 'reg' bits that should be inverted */
};

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 = {		\
	.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 /* _GPIO_MMIO32_H_ */