irq: Slim conversion of qemu_irq to QOM

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 <afaerber@suse.de>
[ 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 <peter.maydell@linaro.org>
Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2014-06-18 00:57:08 -07:00
parent f173d57a4c
commit 615c489570
2 changed files with 22 additions and 2 deletions

View File

@ -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)

View File

@ -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);