text: /*
   * 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
  
  /**
   * @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.
   *
   * @return N/A
   */
  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.
   *
   * @return N/A
   */
  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.
   *
   * @return N/A
   */
  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);
  }
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_ */
  