117 lines
2.9 KiB
C
117 lines
2.9 KiB
C
/*
|
|
* 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 <stdlib.h>
|
|
|
|
/** 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 <metal/system/generic/irq.h>
|
|
|
|
/** @} */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __METAL_IRQ__H__ */
|