Patchwork [12/26] usb/uhci: generalize initialization

login
register
mail settings
Submitter Isaku Yamahata
Date March 16, 2011, 9:29 a.m.
Message ID <a9cbca8d6d30f7a74c2acc06c8554c3b68e5c6fd.1300266238.git.yamahata@valinux.co.jp>
Download mbox | patch
Permalink /patch/87217/
State New
Headers show

Comments

Isaku Yamahata - March 16, 2011, 9:29 a.m.
generalize initialization to make vendir/device id
customizable.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
---
 hw/usb-uhci.c |   87 ++++++++++++++++++++++++++++-----------------------------
 1 files changed, 43 insertions(+), 44 deletions(-)

Patch

diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index b384e1d..2fb2a85 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -1115,12 +1115,25 @@  static USBPortOps uhci_port_ops = {
     .wakeup = uhci_wakeup,
 };
 
-static int usb_uhci_common_initfn(UHCIState *s)
+typedef struct UHCIDeviceInfo {
+    PCIDeviceInfo pci;
+    uint16_t vendor_id;
+    uint16_t device_id;
+    uint8_t revision_id;
+} UHCIDeviceInfo;
+
+static int usb_uhci_common_initfn(PCIDevice *dev)
 {
+    UHCIDeviceInfo *uhci_info = DO_UPCAST(UHCIDeviceInfo, pci.qdev,
+                                          dev->qdev.info);
+    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
     uint8_t *pci_conf = s->dev.config;
     int i;
 
-    pci_conf[PCI_REVISION_ID] = 0x01; // revision number
+    pci_config_set_vendor_id(pci_conf, uhci_info->vendor_id);
+    pci_config_set_device_id(pci_conf, uhci_info->device_id);
+    pci_config_set_revision(pci_conf, uhci_info->revision_id);
+
     pci_conf[PCI_CLASS_PROG] = 0x00;
     pci_config_set_class(pci_conf, PCI_CLASS_SERIAL_USB);
     /* TODO: reset value should be 0. */
@@ -1148,34 +1161,10 @@  static int usb_uhci_common_initfn(UHCIState *s)
     return 0;
 }
 
-static int usb_uhci_piix3_initfn(PCIDevice *dev)
-{
-    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
-    uint8_t *pci_conf = s->dev.config;
-
-    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
-    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371SB_2);
-    return usb_uhci_common_initfn(s);
-}
-
-static int usb_uhci_piix4_initfn(PCIDevice *dev)
-{
-    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
-    uint8_t *pci_conf = s->dev.config;
-
-    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
-    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_2);
-    return usb_uhci_common_initfn(s);
-}
-
 static int usb_uhci_vt82c686b_initfn(PCIDevice *dev)
 {
     UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
     uint8_t *pci_conf = s->dev.config;
-
-    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_VIA);
-    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_VIA_UHCI);
-
     /* USB misc control 1/2 */
     pci_set_long(pci_conf + 0x40,0x00001000);
     /* PM capability */
@@ -1183,33 +1172,43 @@  static int usb_uhci_vt82c686b_initfn(PCIDevice *dev)
     /* USB legacy support  */
     pci_set_long(pci_conf + 0xc0,0x00002000);
 
-    return usb_uhci_common_initfn(s);
+    return usb_uhci_common_initfn(dev);
 }
 
-static PCIDeviceInfo uhci_info[] = {
+static UHCIDeviceInfo uhci_info[] = {
     {
-        .qdev.name    = "piix3-usb-uhci",
-        .qdev.size    = sizeof(UHCIState),
-        .qdev.vmsd    = &vmstate_uhci,
-        .init         = usb_uhci_piix3_initfn,
-    },{
-        .qdev.name    = "piix4-usb-uhci",
-        .qdev.size    = sizeof(UHCIState),
-        .qdev.vmsd    = &vmstate_uhci,
-        .init         = usb_uhci_piix4_initfn,
+        .pci.qdev.name    = "piix3-usb-uhci",
+        .pci.qdev.size    = sizeof(UHCIState),
+        .pci.qdev.vmsd    = &vmstate_uhci,
+        .pci.init         = usb_uhci_common_initfn,
+        .vendor_id        = PCI_VENDOR_ID_INTEL,
+        .device_id        = PCI_DEVICE_ID_INTEL_82371SB_2,
+        .revision_id      = 0x01,
     },{
-        .qdev.name    = "vt82c686b-usb-uhci",
-        .qdev.size    = sizeof(UHCIState),
-        .qdev.vmsd    = &vmstate_uhci,
-        .init         = usb_uhci_vt82c686b_initfn,
+        .pci.qdev.name    = "piix4-usb-uhci",
+        .pci.qdev.size    = sizeof(UHCIState),
+        .pci.qdev.vmsd    = &vmstate_uhci,
+        .pci.init         = usb_uhci_common_initfn,
+        .vendor_id        = PCI_VENDOR_ID_INTEL,
+        .device_id        = PCI_DEVICE_ID_INTEL_82371AB_2,
+        .revision_id      = 0x01,
     },{
-        /* end of list */
-    }
+        .pci.qdev.name    = "vt82c686b-usb-uhci",
+        .pci.qdev.size    = sizeof(UHCIState),
+        .pci.qdev.vmsd    = &vmstate_uhci,
+        .pci.init         = usb_uhci_vt82c686b_initfn,
+        .vendor_id        = PCI_VENDOR_ID_VIA,
+        .device_id        = PCI_DEVICE_ID_VIA_UHCI,
+        .revision_id      = 0x01,
+    },
 };
 
 static void uhci_register(void)
 {
-    pci_qdev_register_many(uhci_info);
+    int i;
+    for (i = 0; i < ARRAY_SIZE(uhci_info); i++) {
+        pci_qdev_register(&uhci_info[i].pci);
+    }
 }
 device_init(uhci_register);