From 8437e12773cd43e7a7969fad33b6bd00b14b98ad Mon Sep 17 00:00:00 2001 From: Stephan Veigl Date: Sun, 3 Jul 2011 18:42:58 +0200 Subject: [PATCH] irq: add avr_unconnect_irq() and avr_irq_unregister_notify() Signed-off-by: Stephan Veigl --- simavr/sim/sim_irq.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ simavr/sim/sim_irq.h | 11 +++++++++ 2 files changed, 66 insertions(+) diff --git a/simavr/sim/sim_irq.c b/simavr/sim/sim_irq.c index 634ea9c..662a997 100644 --- a/simavr/sim/sim_irq.c +++ b/simavr/sim/sim_irq.c @@ -151,6 +151,33 @@ avr_irq_register_notify( hook->param = param; } +void +avr_irq_unregister_notify( + avr_irq_t * irq, + avr_irq_notify_t notify, + void * param) +{ + avr_irq_hook_t *hook, *prev; + if (!irq || !notify) + return; + + hook = irq->hook; + prev = NULL; + while (hook) { + if (hook->notify == notify && hook->param == param) + { + if ( prev ) + prev->next = hook->next; + else + irq->hook = hook->next; + free(hook); + return; + } + prev = hook; + hook = hook->next; + } +} + void avr_raise_irq( avr_irq_t * irq, @@ -199,3 +226,31 @@ avr_connect_irq( hook = _avr_alloc_irq_hook(src); hook->chain = dst; } + +void +avr_unconnect_irq( + avr_irq_t * src, + avr_irq_t * dst) +{ + avr_irq_hook_t *hook, *prev; + + if (!src || !dst || src == dst) { + printf("error: avr_connect_irq invalid irq %p/%p", src, dst); fflush(stdout); + return; + } + hook = src->hook; + prev = NULL; + while (hook) { + if (hook->chain == dst) + { + if ( prev ) + prev->next = hook->next; + else + src->hook = hook->next; + free(hook); + return; + } + prev = hook; + hook = hook->next; + } +} diff --git a/simavr/sim/sim_irq.h b/simavr/sim/sim_irq.h index 15faaae..d75c8e7 100644 --- a/simavr/sim/sim_irq.h +++ b/simavr/sim/sim_irq.h @@ -107,6 +107,11 @@ void avr_connect_irq( avr_irq_t * src, avr_irq_t * dst); +void +avr_unconnect_irq( + avr_irq_t * src, + avr_irq_t * dst); + //! register a notification 'hook' for 'irq' -- 'param' is anything that your want passed back as argument void avr_irq_register_notify( @@ -114,6 +119,12 @@ avr_irq_register_notify( avr_irq_notify_t notify, void * param); +void +avr_irq_unregister_notify( + avr_irq_t * irq, + avr_irq_notify_t notify, + void * param); + #ifdef __cplusplus }; #endif -- 2.20.1