root/headers/os/drivers/interrupt_controller.h
/*

 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.

 * All rights reserved. Distributed under the terms of the MIT License.

 */
#ifndef _INTERRUPT_CONTROLLER_H
#define _INTERRUPT_CONTROLLER_H

#include <device_manager.h>

enum {
        IRQ_TYPE_LEVEL  = 0,
        IRQ_TYPE_EDGE   = 1,
};

typedef struct interrupt_controller_info {
        int     cpu_count;              // number of supported CPUs

        int     irq_count;              // number of supported IRQs

} interrupt_controller_info;

// interrupt controller drivers

typedef struct interrupt_controller_module_info {
        driver_module_info info;

        status_t        (*get_controller_info)(void *cookie,
                                        interrupt_controller_info *info);

        status_t        (*enable_io_interrupt)(void *cookie, int irq, int type);
        status_t        (*disable_io_interrupt)(void *cookie, int irq);

        // Returns the IRQ number or a negative value, if the interrupt shall be

        // ignore (spurious interrupts). Since more than one interrupt can be

        // pending, the function should be called in a loop until it returns a

        // negative value.

        // Must be called with CPU interrupts disabled.

        int                     (*acknowledge_io_interrupt)(void *cookie);

} interrupt_controller_module_info;

#endif  // _INTERRUPT_CONTROLLER_H