qdev: gpio: Define qdev_pass_gpios()
Allows a container to take ownership of GPIOs in a contained device and automatically connect them as GPIOs to the container. This prepares for deprecation of the SYSBUS IRQ functionality, which has this feature. We push it up to the device level instead of sysbus level. There's nothing sysbus specific about passing GPIOs to containers so its a legitimate device-level generic feature. Reviewed-by: Alexander Graf <agraf@suse.de> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
aef0869e8e
commit
17a96a146c
|
@ -483,6 +483,32 @@ void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
|
||||||
qdev_connect_gpio_out_named(dev, NULL, n, pin);
|
qdev_connect_gpio_out_named(dev, NULL, n, pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
|
||||||
|
|
||||||
|
for (i = 0; i < ngl->num_in; i++) {
|
||||||
|
const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
|
||||||
|
char *propname = g_strdup_printf("%s[%d]", nm, i);
|
||||||
|
|
||||||
|
object_property_add_alias(OBJECT(container), propname,
|
||||||
|
OBJECT(dev), propname,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
for (i = 0; i < ngl->num_out; i++) {
|
||||||
|
const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
|
||||||
|
char *propname = g_strdup_printf("%s[%d]", nm, i);
|
||||||
|
|
||||||
|
object_property_add_alias(OBJECT(container), propname,
|
||||||
|
OBJECT(dev), propname,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
QLIST_REMOVE(ngl, node);
|
||||||
|
QLIST_INSERT_HEAD(&container->gpios, ngl, node);
|
||||||
|
}
|
||||||
|
|
||||||
BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
|
BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
|
||||||
{
|
{
|
||||||
BusState *bus;
|
BusState *bus;
|
||||||
|
|
|
@ -288,6 +288,9 @@ void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
|
||||||
void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
|
void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
|
||||||
const char *name, int n);
|
const char *name, int n);
|
||||||
|
|
||||||
|
void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
BusState *qdev_get_parent_bus(DeviceState *dev);
|
BusState *qdev_get_parent_bus(DeviceState *dev);
|
||||||
|
|
||||||
/*** BUS API. ***/
|
/*** BUS API. ***/
|
||||||
|
|
Loading…
Reference in a new issue