usb core: use qdev for -usbdevice

This patchs adds infrastructure to handle -usbdevice via qdev callbacks.
USBDeviceInfo gets a name field (for the -usbdevice driver name) and a
callback for -usbdevice parameter parsing.

The new usbdevice_create() function walks the qdev driver list and looks
for a usb driver with a matching name.  When a parameter parsing
callback is present it is called, otherwise the device is created via
usb_create_simple().

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Gerd Hoffmann 2009-10-26 15:56:45 +01:00 committed by Anthony Liguori
parent 51edd4e6b5
commit 0958b4cc8f
5 changed files with 59 additions and 1 deletions

View file

@ -252,3 +252,50 @@ void usb_info(Monitor *mon)
}
}
/* handle legacy -usbdevice cmd line option */
USBDevice *usbdevice_create(const char *cmdline)
{
USBBus *bus = usb_bus_find(-1 /* any */);
DeviceInfo *info;
USBDeviceInfo *usb;
char driver[32], *params;
int len;
params = strchr(cmdline,':');
if (params) {
params++;
len = params - cmdline;
if (len > sizeof(driver))
len = sizeof(driver);
pstrcpy(driver, len, cmdline);
} else {
pstrcpy(driver, sizeof(driver), cmdline);
}
for (info = device_info_list; info != NULL; info = info->next) {
if (info->bus_info != &usb_bus_info)
continue;
usb = DO_UPCAST(USBDeviceInfo, qdev, info);
if (usb->usbdevice_name == NULL)
continue;
if (strcmp(usb->usbdevice_name, driver) != 0)
continue;
break;
}
if (info == NULL) {
#if 0
/* no error because some drivers are not converted (yet) */
qemu_error("usbdevice %s not found\n", driver);
#endif
return NULL;
}
if (!usb->usbdevice_init) {
if (params) {
qemu_error("usbdevice %s accepts no params\n", driver);
return NULL;
}
return usb_create_simple(bus, usb->qdev.name);
}
return usb->usbdevice_init(params);
}