/* * Copyright (c) 2017 Intel corporation * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Public interface for configuring interrupts */ #ifndef ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_ #define ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_ #ifdef __cplusplus extern "C" { #endif #if defined(CONFIG_MULTI_LEVEL_INTERRUPTS) || defined(__DOXYGEN__) /** * @cond INTERNAL_HIDDEN * * These are for internal use only, so skip these in * public documentation. */ typedef void (*irq_next_level_func_t)(const struct device *dev, unsigned int irq); typedef unsigned int (*irq_next_level_get_state_t)(const struct device *dev); typedef void (*irq_next_level_priority_t)(const struct device *dev, unsigned int irq, unsigned int prio, uint32_t flags); typedef int (*irq_next_level_get_line_state_t)(const struct device *dev, unsigned int irq); struct irq_next_level_api { irq_next_level_func_t intr_enable; irq_next_level_func_t intr_disable; irq_next_level_get_state_t intr_get_state; irq_next_level_priority_t intr_set_priority; irq_next_level_get_line_state_t intr_get_line_state; }; /** * @endcond */ /** * @brief Enable an IRQ in the next level. * * This routine enables interrupts present in the interrupt controller. * * @param dev Pointer to the device structure for the driver instance. * @param irq IRQ to be enabled. */ static inline void irq_enable_next_level(const struct device *dev, uint32_t irq) { const struct irq_next_level_api *api = (const struct irq_next_level_api *)dev->api; api->intr_enable(dev, irq); } /** * @brief Disable an IRQ in the next level. * * This routine disables interrupts present in the interrupt controller. * * @param dev Pointer to the device structure for the driver instance. * @param irq IRQ to be disabled. */ static inline void irq_disable_next_level(const struct device *dev, uint32_t irq) { const struct irq_next_level_api *api = (const struct irq_next_level_api *)dev->api; api->intr_disable(dev, irq); } /** * @brief Get IRQ enable state. * * This routine indicates if any interrupts are enabled in the interrupt * controller. * * @param dev Pointer to the device structure for the driver instance. * * @return interrupt enable state, true or false */ static inline unsigned int irq_is_enabled_next_level(const struct device *dev) { const struct irq_next_level_api *api = (const struct irq_next_level_api *)dev->api; return api->intr_get_state(dev); } /** * @brief Set IRQ priority. * * This routine indicates if any interrupts are enabled in the interrupt * controller. * * @param dev Pointer to the device structure for the driver instance. * @param irq IRQ to be disabled. * @param prio priority for irq in the interrupt controller. * @param flags controller specific flags. */ static inline void irq_set_priority_next_level(const struct device *dev, uint32_t irq, uint32_t prio, uint32_t flags) { const struct irq_next_level_api *api = (const struct irq_next_level_api *)dev->api; if (api->intr_set_priority) api->intr_set_priority(dev, irq, prio, flags); } /** * @brief Get IRQ line enable state. * * Query if a particular IRQ line is enabled. * * @param dev Pointer to the device structure for the driver instance. * @param irq IRQ line to be queried. * * @return interrupt enable state, true or false */ static inline unsigned int irq_line_is_enabled_next_level(const struct device *dev, unsigned int irq) { const struct irq_next_level_api *api = (const struct irq_next_level_api *)dev->api; return api->intr_get_line_state(dev, irq); } #endif /* CONFIG_MULTI_LEVEL_INTERRUPTS */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_ */