From 615c4895703164134379b68214130dd502721174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 18 Jun 2014 00:57:08 -0700 Subject: [PATCH] irq: Slim conversion of qemu_irq to QOM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As a prequel to any big Pin refactoring plans, do an in-place conversion of qemu_irq to an Object, so that we can reference it in link<> properties. Signed-off-by: Andreas Färber [ PC Changes: * Removed array-alloctor ref counting logic (limit changes just to * single IRQ allocator) * Removed WIP marking from subject line ] Reviewed-by: Peter Maydell Signed-off-by: Peter Crosthwaite Acked-by: Paolo Bonzini Signed-off-by: Andreas Färber --- hw/core/irq.c | 22 ++++++++++++++++++++-- include/hw/irq.h | 2 ++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/hw/core/irq.c b/hw/core/irq.c index bc982a7dfa..cffced040f 100644 --- a/hw/core/irq.c +++ b/hw/core/irq.c @@ -23,8 +23,13 @@ */ #include "qemu-common.h" #include "hw/irq.h" +#include "qom/object.h" + +#define IRQ(obj) OBJECT_CHECK(struct IRQState, (obj), TYPE_IRQ) struct IRQState { + Object parent_obj; + qemu_irq_handler handler; void *opaque; int n; @@ -63,7 +68,7 @@ qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n) { struct IRQState *irq; - irq = g_new(struct IRQState, 1); + irq = IRQ(object_new(TYPE_IRQ)); irq->handler = handler; irq->opaque = opaque; irq->n = n; @@ -82,7 +87,7 @@ void qemu_free_irqs(qemu_irq *s, int n) void qemu_free_irq(qemu_irq irq) { - g_free(irq); + object_unref(OBJECT(irq)); } static void qemu_notirq(void *opaque, int line, int level) @@ -144,3 +149,16 @@ void qemu_irq_intercept_out(qemu_irq **gpio_out, qemu_irq_handler handler, int n qemu_irq *old_irqs = *gpio_out; *gpio_out = qemu_allocate_irqs(handler, old_irqs, n); } + +static const TypeInfo irq_type_info = { + .name = TYPE_IRQ, + .parent = TYPE_OBJECT, + .instance_size = sizeof(struct IRQState), +}; + +static void irq_register_types(void) +{ + type_register_static(&irq_type_info); +} + +type_init(irq_register_types) diff --git a/include/hw/irq.h b/include/hw/irq.h index 9f34c96aab..6f874f5ac0 100644 --- a/include/hw/irq.h +++ b/include/hw/irq.h @@ -3,6 +3,8 @@ /* Generic IRQ/GPIO pin infrastructure. */ +#define TYPE_IRQ "irq" + typedef struct IRQState *qemu_irq; typedef void (*qemu_irq_handler)(void *opaque, int n, int level);