00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #ifndef DDF_INTERRUPT_H_
00036 #define DDF_INTERRUPT_H_
00037
00038 #include <kernel/ddi/irq.h>
00039 #include <adt/list.h>
00040 #include <ddi.h>
00041 #include <fibril_synch.h>
00042
00043 #include "driver.h"
00044 #include "../dev_iface.h"
00045
00046
00047
00048
00049
00050 typedef void interrupt_handler_t(ddf_dev_t *, ipc_callid_t, ipc_call_t *);
00051
00052 typedef struct interrupt_context {
00053 int id;
00054 ddf_dev_t *dev;
00055 int irq;
00056 interrupt_handler_t *handler;
00057 link_t link;
00058 } interrupt_context_t;
00059
00060 typedef struct interrupt_context_list {
00061 int curr_id;
00062 link_t contexts;
00063 fibril_mutex_t mutex;
00064 } interrupt_context_list_t;
00065
00066 extern interrupt_context_t *create_interrupt_context(void);
00067 extern void delete_interrupt_context(interrupt_context_t *);
00068 extern void init_interrupt_context_list(interrupt_context_list_t *);
00069 extern void add_interrupt_context(interrupt_context_list_t *,
00070 interrupt_context_t *);
00071 extern void remove_interrupt_context(interrupt_context_list_t *,
00072 interrupt_context_t *);
00073 extern interrupt_context_t *find_interrupt_context_by_id(
00074 interrupt_context_list_t *, int);
00075 extern interrupt_context_t *find_interrupt_context(
00076 interrupt_context_list_t *, ddf_dev_t *, int);
00077
00078 extern int register_interrupt_handler(ddf_dev_t *, int, interrupt_handler_t *,
00079 irq_code_t *);
00080 extern int unregister_interrupt_handler(ddf_dev_t *, int);
00081
00082 #endif
00083