You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.7 KiB
144 lines
3.7 KiB
/* |
|
* 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_ */
|
|
|