/* * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ /* * @file irq.h * @brief Interrupt handling primitives for libmetal. */ #ifndef __METAL_IRQ__H__ #define __METAL_IRQ__H__ #ifdef __cplusplus extern "C" { #endif /** \defgroup irq Interrupt Handling Interfaces * @{ */ #include /** IRQ handled status */ #define METAL_IRQ_NOT_HANDLED 0 #define METAL_IRQ_HANDLED 1 /** * @brief type of interrupt handler * @param[in] irq interrupt id * @param[in] priv private data * @return irq handled status */ typedef int (*metal_irq_handler) (int irq, void *priv); struct metal_device; /** * @brief Register interrupt handler for driver ID/device. * * @param[in] irq interrupt id * @param[in] irq_handler interrupt handler * @param[in] dev metal device this irq belongs to (can be NULL). * @param[in] drv_id driver id is a unique interrupt handler identifier. * It can also be used for driver data. * @return 0 for success, non-zero on failure */ int metal_irq_register(int irq, metal_irq_handler irq_handler, struct metal_device *dev, void *drv_id); /** * @brief Unregister interrupt handler for driver ID and/or device. * * If interrupt handler (hd), driver ID (drv_id) and device (dev) * are NULL, unregister all handlers for this interrupt. * * If interrupt handler (hd), device (dev) or driver ID (drv_id), * are not NULL, unregister handlers matching non NULL criterias. * e.g: when call is made with drv_id and dev non NULL, * all handlers matching both are unregistered. * * If interrupt is not found, or other criterias not matching, * return -ENOENT * * @param[in] irq interrupt id * @param[in] irq_handler interrupt handler * @param[in] dev metal device this irq belongs to * @param[in] drv_id driver id. It can be used for driver data. * @return 0 for success, non-zero on failure */ int metal_irq_unregister(int irq, metal_irq_handler irq_handler, struct metal_device *dev, void *drv_id); /** * @brief disable interrupts * @return interrupts state */ unsigned int metal_irq_save_disable(void); /** * @brief restore interrupts to their previous state * @param[in] flags previous interrupts state */ void metal_irq_restore_enable(unsigned int flags); /** * @brief metal_irq_enable * * Enables the given interrupt * * @param vector - interrupt vector number */ void metal_irq_enable(unsigned int vector); /** * @brief metal_irq_disable * * Disables the given interrupt * * @param vector - interrupt vector number */ void metal_irq_disable(unsigned int vector); #include /** @} */ #ifdef __cplusplus } #endif #endif /* __METAL_IRQ__H__ */