Patchwork [RFT,1/5] usb/ehci: Clean up SysBus and PCI EHCI split

login
register
mail settings
Submitter Andreas Färber
Date Dec. 2, 2012, 2:57 a.m.
Message ID <1354417042-8818-2-git-send-email-andreas.faerber@web.de>
Download mbox | patch
Permalink /patch/203181/
State New
Headers show

Comments

Andreas Färber - Dec. 2, 2012, 2:57 a.m.
SysBus EHCI was introduced in a hurry before 1.3 Soft Freeze.
To use QOM casts in place of DO_UPCAST() / FROM_SYSBUS(), we need an
identifying type. Introduce generic abstract base types for PCI and
SysBus EHCI to allow multiple types to access the shared fields.

The VMSTATE_PCI_DEVICE() macro does not play nice with the QOM
parent_obj naming convention, so defer that cleanup.

Signed-off-by: Andreas Färber <andreas.faerber@web.de>
Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
 hw/usb/hcd-ehci-pci.c    |   37 ++++++++++++++++++++++++++++---------
 hw/usb/hcd-ehci-sysbus.c |   20 ++++++++++++++++----
 2 Dateien geändert, 44 Zeilen hinzugefügt(+), 13 Zeilen entfernt(-)
Mitsyanko Igor - Dec. 3, 2012, 6:35 p.m.
On 12/02/2012 06:57 AM, Andreas Färber wrote:
> SysBus EHCI was introduced in a hurry before 1.3 Soft Freeze.
> To use QOM casts in place of DO_UPCAST() / FROM_SYSBUS(), we need an
> identifying type. Introduce generic abstract base types for PCI and
> SysBus EHCI to allow multiple types to access the shared fields.
>
> The VMSTATE_PCI_DEVICE() macro does not play nice with the QOM
> parent_obj naming convention, so defer that cleanup.
>
> Signed-off-by: Andreas Färber <andreas.faerber@web.de>
> Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
>   hw/usb/hcd-ehci-pci.c    |   37 ++++++++++++++++++++++++++++---------
>   hw/usb/hcd-ehci-sysbus.c |   20 ++++++++++++++++----
>   2 Dateien geändert, 44 Zeilen hinzugefügt(+), 13 Zeilen entfernt(-)
>
> diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
> index 41dbb53..bb1a197 100644
> --- a/hw/usb/hcd-ehci-pci.c
> +++ b/hw/usb/hcd-ehci-pci.c
> @@ -19,8 +19,12 @@
>   #include "hw/pci.h"
>   #include "range.h"
>
> +#define TYPE_PCI_EHCI "pci-ehci-usb"
> +#define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI)
> +
>   typedef struct EHCIPCIState {
>       PCIDevice pcidev;
> +
>       EHCIState ehci;
>   } EHCIPCIState;
>
> @@ -33,7 +37,7 @@ typedef struct EHCIPCIInfo {
>
>   static int usb_ehci_pci_initfn(PCIDevice *dev)
>   {
> -    EHCIPCIState *i = DO_UPCAST(EHCIPCIState, pcidev, dev);
> +    EHCIPCIState *i = PCI_EHCI(dev);
>       EHCIState *s = &i->ehci;
>       uint8_t *pci_conf = dev->config;
>
> @@ -83,7 +87,7 @@ static int usb_ehci_pci_initfn(PCIDevice *dev)
>   static void usb_ehci_pci_write_config(PCIDevice *dev, uint32_t addr,
>                                         uint32_t val, int l)
>   {
> -    EHCIPCIState *i = DO_UPCAST(EHCIPCIState, pcidev, dev);
> +    EHCIPCIState *i = PCI_EHCI(dev);
>       bool busmaster;
>
>       pci_default_write_config(dev, addr, val, l);
> @@ -115,12 +119,8 @@ static void ehci_class_init(ObjectClass *klass, void *data)
>   {
>       DeviceClass *dc = DEVICE_CLASS(klass);
>       PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> -    EHCIPCIInfo *i = data;
>
>       k->init = usb_ehci_pci_initfn;
> -    k->vendor_id = i->vendor_id;
> -    k->device_id = i->device_id;
> -    k->revision = i->revision;
>       k->class_id = PCI_CLASS_SERIAL_USB;
>       k->config_write = usb_ehci_pci_write_config;
>       k->no_hotplug = 1;
> @@ -128,6 +128,24 @@ static void ehci_class_init(ObjectClass *klass, void *data)
>       dc->props = ehci_pci_properties;
>   }
>
> +static const TypeInfo ehci_pci_type_info = {
> +    .name = TYPE_PCI_EHCI,
> +    .parent = TYPE_PCI_DEVICE,
> +    .instance_size = sizeof(EHCIPCIState),
> +    .abstract = true,
> +    .class_init = ehci_class_init,
> +};
> +
> +static void ehci_data_class_init(ObjectClass *klass, void *data)
> +{
> +    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +    EHCIPCIInfo *i = data;
> +
> +    k->vendor_id = i->vendor_id;
> +    k->device_id = i->device_id;
> +    k->revision = i->revision;
> +}
> +
>   static struct EHCIPCIInfo ehci_pci_info[] = {
>       {
>           .name      = "usb-ehci",
> @@ -150,12 +168,13 @@ static struct EHCIPCIInfo ehci_pci_info[] = {
>   static void ehci_pci_register_types(void)
>   {
>       TypeInfo ehci_type_info = {
> -        .parent        = TYPE_PCI_DEVICE,
> -        .instance_size = sizeof(EHCIPCIState),
> -        .class_init    = ehci_class_init,
> +        .parent        = TYPE_PCI_EHCI,
> +        .class_init    = ehci_data_class_init,
>       };
>       int i;
>
> +    type_register_static(&ehci_pci_type_info);
> +
>       for (i = 0; i < ARRAY_SIZE(ehci_pci_info); i++) {
>           ehci_type_info.name = ehci_pci_info[i].name;
>           ehci_type_info.class_data = ehci_pci_info + i;
> diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
> index 803df92..c7b68b2 100644
> --- a/hw/usb/hcd-ehci-sysbus.c
> +++ b/hw/usb/hcd-ehci-sysbus.c
> @@ -18,8 +18,13 @@
>   #include "hw/usb/hcd-ehci.h"
>   #include "hw/sysbus.h"
>
> +#define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb"
> +#define SYS_BUS_EHCI(obj) \
> +    OBJECT_CHECK(EHCISysBusState, (obj), TYPE_SYS_BUS_EHCI)
> +
>   typedef struct EHCISysBusState {
> -    SysBusDevice busdev;
> +    SysBusDevice parent_obj;
> +
>       EHCIState ehci;
>   } EHCISysBusState;
>
> @@ -40,7 +45,7 @@ static Property ehci_sysbus_properties[] = {
>
>   static int usb_ehci_sysbus_initfn(SysBusDevice *dev)
>   {
> -    EHCISysBusState *i = FROM_SYSBUS(EHCISysBusState, dev);
> +    EHCISysBusState *i = SYS_BUS_EHCI(dev);
>       EHCIState *s = &i->ehci;
>
>       s->capsbase = 0x100;
> @@ -63,15 +68,22 @@ static void ehci_sysbus_class_init(ObjectClass *klass, void *data)
>       dc->props = ehci_sysbus_properties;
>   }
>
> -TypeInfo ehci_xlnx_type_info = {
> -    .name          = "xlnx,ps7-usb",
> +static const TypeInfo ehci_type_info = {
> +    .name          = TYPE_SYS_BUS_EHCI,
>       .parent        = TYPE_SYS_BUS_DEVICE,
>       .instance_size = sizeof(EHCISysBusState),
> +    .abstract      = true,
>       .class_init    = ehci_sysbus_class_init,
>   };
>
> +static const TypeInfo ehci_xlnx_type_info = {
> +    .name          = "xlnx,ps7-usb",
> +    .parent        = TYPE_SYS_BUS_EHCI,
> +};
> +
>   static void ehci_sysbus_register_types(void)
>   {
> +    type_register_static(&ehci_type_info);
>       type_register_static(&ehci_xlnx_type_info);
>   }
>
>

Reviewed-by: Igor Mitsyanko <i.mitsyanko@samsung.com>

Patch

diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 41dbb53..bb1a197 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -19,8 +19,12 @@ 
 #include "hw/pci.h"
 #include "range.h"
 
+#define TYPE_PCI_EHCI "pci-ehci-usb"
+#define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI)
+
 typedef struct EHCIPCIState {
     PCIDevice pcidev;
+
     EHCIState ehci;
 } EHCIPCIState;
 
@@ -33,7 +37,7 @@  typedef struct EHCIPCIInfo {
 
 static int usb_ehci_pci_initfn(PCIDevice *dev)
 {
-    EHCIPCIState *i = DO_UPCAST(EHCIPCIState, pcidev, dev);
+    EHCIPCIState *i = PCI_EHCI(dev);
     EHCIState *s = &i->ehci;
     uint8_t *pci_conf = dev->config;
 
@@ -83,7 +87,7 @@  static int usb_ehci_pci_initfn(PCIDevice *dev)
 static void usb_ehci_pci_write_config(PCIDevice *dev, uint32_t addr,
                                       uint32_t val, int l)
 {
-    EHCIPCIState *i = DO_UPCAST(EHCIPCIState, pcidev, dev);
+    EHCIPCIState *i = PCI_EHCI(dev);
     bool busmaster;
 
     pci_default_write_config(dev, addr, val, l);
@@ -115,12 +119,8 @@  static void ehci_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
-    EHCIPCIInfo *i = data;
 
     k->init = usb_ehci_pci_initfn;
-    k->vendor_id = i->vendor_id;
-    k->device_id = i->device_id;
-    k->revision = i->revision;
     k->class_id = PCI_CLASS_SERIAL_USB;
     k->config_write = usb_ehci_pci_write_config;
     k->no_hotplug = 1;
@@ -128,6 +128,24 @@  static void ehci_class_init(ObjectClass *klass, void *data)
     dc->props = ehci_pci_properties;
 }
 
+static const TypeInfo ehci_pci_type_info = {
+    .name = TYPE_PCI_EHCI,
+    .parent = TYPE_PCI_DEVICE,
+    .instance_size = sizeof(EHCIPCIState),
+    .abstract = true,
+    .class_init = ehci_class_init,
+};
+
+static void ehci_data_class_init(ObjectClass *klass, void *data)
+{
+    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
+    EHCIPCIInfo *i = data;
+
+    k->vendor_id = i->vendor_id;
+    k->device_id = i->device_id;
+    k->revision = i->revision;
+}
+
 static struct EHCIPCIInfo ehci_pci_info[] = {
     {
         .name      = "usb-ehci",
@@ -150,12 +168,13 @@  static struct EHCIPCIInfo ehci_pci_info[] = {
 static void ehci_pci_register_types(void)
 {
     TypeInfo ehci_type_info = {
-        .parent        = TYPE_PCI_DEVICE,
-        .instance_size = sizeof(EHCIPCIState),
-        .class_init    = ehci_class_init,
+        .parent        = TYPE_PCI_EHCI,
+        .class_init    = ehci_data_class_init,
     };
     int i;
 
+    type_register_static(&ehci_pci_type_info);
+
     for (i = 0; i < ARRAY_SIZE(ehci_pci_info); i++) {
         ehci_type_info.name = ehci_pci_info[i].name;
         ehci_type_info.class_data = ehci_pci_info + i;
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index 803df92..c7b68b2 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -18,8 +18,13 @@ 
 #include "hw/usb/hcd-ehci.h"
 #include "hw/sysbus.h"
 
+#define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb"
+#define SYS_BUS_EHCI(obj) \
+    OBJECT_CHECK(EHCISysBusState, (obj), TYPE_SYS_BUS_EHCI)
+
 typedef struct EHCISysBusState {
-    SysBusDevice busdev;
+    SysBusDevice parent_obj;
+
     EHCIState ehci;
 } EHCISysBusState;
 
@@ -40,7 +45,7 @@  static Property ehci_sysbus_properties[] = {
 
 static int usb_ehci_sysbus_initfn(SysBusDevice *dev)
 {
-    EHCISysBusState *i = FROM_SYSBUS(EHCISysBusState, dev);
+    EHCISysBusState *i = SYS_BUS_EHCI(dev);
     EHCIState *s = &i->ehci;
 
     s->capsbase = 0x100;
@@ -63,15 +68,22 @@  static void ehci_sysbus_class_init(ObjectClass *klass, void *data)
     dc->props = ehci_sysbus_properties;
 }
 
-TypeInfo ehci_xlnx_type_info = {
-    .name          = "xlnx,ps7-usb",
+static const TypeInfo ehci_type_info = {
+    .name          = TYPE_SYS_BUS_EHCI,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(EHCISysBusState),
+    .abstract      = true,
     .class_init    = ehci_sysbus_class_init,
 };
 
+static const TypeInfo ehci_xlnx_type_info = {
+    .name          = "xlnx,ps7-usb",
+    .parent        = TYPE_SYS_BUS_EHCI,
+};
+
 static void ehci_sysbus_register_types(void)
 {
+    type_register_static(&ehci_type_info);
     type_register_static(&ehci_xlnx_type_info);
 }