summaryrefslogtreecommitdiffstats
path: root/hw/usb
diff options
context:
space:
mode:
authorPeter Maydell2020-06-16 12:48:22 +0200
committerPeter Maydell2020-06-16 12:48:23 +0200
commit6675a653d2e57ab09c32c0ea7b44a1d6c40a7f58 (patch)
treef111fb308c19e2b4f2dd8b8482e057b4f3490362 /hw/usb
parentMerge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-jun-15-2020' ... (diff)
parentMAINTAINERS: Make section QOM cover hw/core/*bus.c as well (diff)
downloadqemu-6675a653d2e57ab09c32c0ea7b44a1d6c40a7f58.tar.gz
qemu-6675a653d2e57ab09c32c0ea7b44a1d6c40a7f58.tar.xz
qemu-6675a653d2e57ab09c32c0ea7b44a1d6c40a7f58.zip
Merge remote-tracking branch 'remotes/armbru/tags/pull-qom-2020-06-15' into staging
QOM patches for 2020-06-15 # gpg: Signature made Mon 15 Jun 2020 21:07:19 BST # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full] # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-qom-2020-06-15: (84 commits) MAINTAINERS: Make section QOM cover hw/core/*bus.c as well qdev: qdev_init_nofail() is now unused, drop qdev: Convert bus-less devices to qdev_realize() with Coccinelle qdev: Use qdev_realize() in qdev_device_add() qdev: Make qdev_realize() support bus-less devices s390x/event-facility: Simplify creation of SCLP event devices microbit: Eliminate two local variables in microbit_init() sysbus: sysbus_init_child_obj() is now unused, drop sysbus: Convert qdev_set_parent_bus() use with Coccinelle, part 4 sysbus: Convert qdev_set_parent_bus() use with Coccinelle, part 3 sysbus: Convert qdev_set_parent_bus() use with Coccinelle, part 2 sysbus: Convert qdev_set_parent_bus() use with Coccinelle, part 1 qdev: Drop qdev_realize() support for null bus sysbus: Convert to sysbus_realize() etc. with Coccinelle sysbus: New sysbus_realize(), sysbus_realize_and_unref() sysbus: Tidy up sysbus_init_child_obj()'s @childsize arg, part 2 hw/arm/armsse: Pass correct child size to sysbus_init_child_obj() sysbus: Tidy up sysbus_init_child_obj()'s @childsize arg, part 1 microbit: Tidy up sysbus_init_child_obj() @child argument sysbus: Drop useless OBJECT() in sysbus_init_child_obj() calls ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/usb')
-rw-r--r--hw/usb/bus.c52
-rw-r--r--hw/usb/dev-serial.c4
2 files changed, 24 insertions, 32 deletions
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index fa07df98a2..a81aee2051 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -296,14 +296,13 @@ typedef struct LegacyUSBFactory
{
const char *name;
const char *usbdevice_name;
- USBDevice *(*usbdevice_init)(USBBus *bus, const char *params);
+ USBDevice *(*usbdevice_init)(const char *params);
} LegacyUSBFactory;
static GSList *legacy_usb_factory;
void usb_legacy_register(const char *typename, const char *usbdevice_name,
- USBDevice *(*usbdevice_init)(USBBus *bus,
- const char *params))
+ USBDevice *(*usbdevice_init)(const char *params))
{
if (usbdevice_name) {
LegacyUSBFactory *f = g_malloc0(sizeof(*f));
@@ -314,38 +313,27 @@ void usb_legacy_register(const char *typename, const char *usbdevice_name,
}
}
-USBDevice *usb_create(USBBus *bus, const char *name)
+USBDevice *usb_new(const char *name)
{
- DeviceState *dev;
-
- dev = qdev_create(&bus->qbus, name);
- return USB_DEVICE(dev);
+ return USB_DEVICE(qdev_new(name));
}
-static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
- Error **errp)
+static USBDevice *usb_try_new(const char *name)
{
- Error *err = NULL;
- USBDevice *dev;
+ return USB_DEVICE(qdev_try_new(name));
+}
- dev = USB_DEVICE(qdev_try_create(&bus->qbus, name));
- if (!dev) {
- error_setg(errp, "Failed to create USB device '%s'", name);
- return NULL;
- }
- object_property_set_bool(OBJECT(dev), true, "realized", &err);
- if (err) {
- error_propagate_prepend(errp, err,
- "Failed to initialize USB device '%s': ",
- name);
- return NULL;
- }
- return dev;
+bool usb_realize_and_unref(USBDevice *dev, USBBus *bus, Error **errp)
+{
+ return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
USBDevice *usb_create_simple(USBBus *bus, const char *name)
{
- return usb_try_create_simple(bus, name, &error_abort);
+ USBDevice *dev = usb_new(name);
+
+ usb_realize_and_unref(dev, bus, &error_abort);
+ return dev;
}
static void usb_fill_port(USBPort *port, void *opaque, int index,
@@ -425,6 +413,7 @@ void usb_claim_port(USBDevice *dev, Error **errp)
{
USBBus *bus = usb_bus_from_device(dev);
USBPort *port;
+ USBDevice *hub;
assert(dev->port == NULL);
@@ -442,7 +431,10 @@ void usb_claim_port(USBDevice *dev, Error **errp)
} else {
if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
/* Create a new hub and chain it on */
- usb_try_create_simple(bus, "usb-hub", NULL);
+ hub = usb_try_new("usb-hub");
+ if (hub) {
+ usb_realize_and_unref(hub, bus, NULL);
+ }
}
if (bus->nfree == 0) {
error_setg(errp, "tried to attach usb device %s to a bus "
@@ -700,19 +692,19 @@ USBDevice *usbdevice_create(const char *cmdline)
}
if (f->usbdevice_init) {
- dev = f->usbdevice_init(bus, params);
+ dev = f->usbdevice_init(params);
} else {
if (*params) {
error_report("usbdevice %s accepts no params", driver);
return NULL;
}
- dev = usb_create(bus, f->name);
+ dev = usb_new(f->name);
}
if (!dev) {
error_report("Failed to create USB device '%s'", f->name);
return NULL;
}
- object_property_set_bool(OBJECT(dev), true, "realized", &err);
+ usb_realize_and_unref(dev, bus, &err);
if (err) {
error_reportf_err(err, "Failed to initialize USB device '%s': ",
f->name);
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index d2c03681b7..7e50e3ba47 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -542,7 +542,7 @@ static void usb_serial_realize(USBDevice *dev, Error **errp)
s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
}
-static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
+static USBDevice *usb_braille_init(const char *unused)
{
USBDevice *dev;
Chardev *cdrv;
@@ -551,7 +551,7 @@ static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
if (!cdrv)
return NULL;
- dev = usb_create(bus, "usb-braille");
+ dev = usb_new("usb-braille");
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
return dev;
}