hw/irq: New qemu_init_irq_child() function
The qemu_init_irq() function initializes a TYPE_IRQ QOM object. The caller is therefore responsible for eventually calling qemu_free_irq() to unref (and thus free) it. In many places where we want to initialize an IRQ we are in the init/realize of some other QOM object; if we have a variant of this function that calls object_initialize_child() then the IRQ will be automatically cleaned up when its parent object is destroyed, and we don't need to remember to manually free it. Implement qemu_init_irq_child(), which is to qemu_init_irq() what object_initialize_child() is to object_initialize(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20250821154053.2417090-2-peter.maydell@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
46d03bb23d
commit
01941107eb
2 changed files with 30 additions and 1 deletions
|
|
@ -49,6 +49,14 @@ void qemu_init_irq(IRQState *irq, qemu_irq_handler handler, void *opaque,
|
|||
init_irq_fields(irq, handler, opaque, n);
|
||||
}
|
||||
|
||||
void qemu_init_irq_child(Object *parent, const char *propname,
|
||||
IRQState *irq, qemu_irq_handler handler,
|
||||
void *opaque, int n)
|
||||
{
|
||||
object_initialize_child(parent, propname, irq, TYPE_IRQ);
|
||||
init_irq_fields(irq, handler, opaque, n);
|
||||
}
|
||||
|
||||
void qemu_init_irqs(IRQState irq[], size_t count,
|
||||
qemu_irq_handler handler, void *opaque)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -36,11 +36,32 @@ static inline void qemu_irq_pulse(qemu_irq irq)
|
|||
|
||||
/*
|
||||
* Init a single IRQ. The irq is assigned with a handler, an opaque data
|
||||
* and the interrupt number.
|
||||
* and the interrupt number. The caller must free this with qemu_free_irq().
|
||||
* If you are using this inside a device's init or realize method, then
|
||||
* qemu_init_irq_child() is probably a better choice to avoid the need
|
||||
* to manually clean up the IRQ.
|
||||
*/
|
||||
void qemu_init_irq(IRQState *irq, qemu_irq_handler handler, void *opaque,
|
||||
int n);
|
||||
|
||||
/**
|
||||
* qemu_init_irq_child: Initialize IRQ and make it a QOM child
|
||||
* @parent: QOM object which owns this IRQ
|
||||
* @propname: child property name
|
||||
* @irq: pointer to IRQState to initialize
|
||||
* @handler: handler function for incoming interrupts
|
||||
* @opaque: opaque data to pass to @handler
|
||||
* @n: interrupt number to pass to @handler
|
||||
*
|
||||
* Init a single IRQ and make the IRQ object a child of @parent with
|
||||
* the child-property name @propname. The IRQ object will thus be
|
||||
* automatically freed when @parent is destroyed.
|
||||
*/
|
||||
void qemu_init_irq_child(Object *parent, const char *propname,
|
||||
IRQState *irq, qemu_irq_handler handler,
|
||||
void *opaque, int n);
|
||||
|
||||
|
||||
/**
|
||||
* qemu_init_irqs: Initialize an array of IRQs.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue