]> git.proxmox.com Git - mirror_qemu.git/commitdiff
usb-musb: Take a DeviceState* in init function
authorPeter Maydell <peter.maydell@linaro.org>
Wed, 31 Aug 2011 20:49:40 +0000 (21:49 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Wed, 7 Sep 2011 07:58:27 +0000 (09:58 +0200)
Initialise usb-musb by passing it a DeviceState* and the offset of the
IRQs in its gpio array, rather than a plain pointer to an irq array.
This is simpler for callers and also allows us to pass in a valid parent
to usb_bus_new(), so the USB bus actually appears in the qdev tree.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
hw/tusb6010.c
hw/usb-musb.c
hw/usb.h

index 78814f132c5d4b6bfb2f385feb0ed7e2cd317715..57fe8045b8d68a153a5d68a98fbecd681622cc69 100644 (file)
@@ -776,8 +776,6 @@ static void tusb6010_reset(DeviceState *dev)
 static int tusb6010_init(SysBusDevice *dev)
 {
     TUSBState *s = FROM_SYSBUS(TUSBState, dev);
-    qemu_irq *musb_irqs;
-    int i;
     s->otg_timer = qemu_new_timer_ns(vm_clock, tusb_otg_tick, s);
     s->pwr_timer = qemu_new_timer_ns(vm_clock, tusb_power_tick, s);
     memory_region_init_io(&s->iomem[1], &tusb_async_ops, s, "tusb-async",
@@ -786,11 +784,7 @@ static int tusb6010_init(SysBusDevice *dev)
     sysbus_init_mmio_region(dev, &s->iomem[1]);
     sysbus_init_irq(dev, &s->irq);
     qdev_init_gpio_in(&dev->qdev, tusb6010_irq, musb_irq_max + 1);
-    musb_irqs = g_new0(qemu_irq, musb_irq_max);
-    for (i = 0; i < musb_irq_max; i++) {
-        musb_irqs[i] = qdev_get_gpio_in(&dev->qdev, i + 1);
-    }
-    s->musb = musb_init(musb_irqs);
+    s->musb = musb_init(&dev->qdev, 1);
     return 0;
 }
 
index 799fa6e1872b9c932eb817cd5a2a6ebb3f6c1907..640037fab689d9952408cda1dc5624a2a5c0b639 100644 (file)
@@ -314,7 +314,7 @@ struct MUSBEndPoint {
 };
 
 struct MUSBState {
-    qemu_irq *irqs;
+    qemu_irq irqs[musb_irq_max];
     USBBus bus;
     USBPort port;
 
@@ -340,12 +340,14 @@ struct MUSBState {
     MUSBEndPoint ep[16];
 };
 
-struct MUSBState *musb_init(qemu_irq *irqs)
+struct MUSBState *musb_init(DeviceState *parent_device, int gpio_base)
 {
     MUSBState *s = g_malloc0(sizeof(*s));
     int i;
 
-    s->irqs = irqs;
+    for (i = 0; i < musb_irq_max; i++) {
+        s->irqs[i] = qdev_get_gpio_in(parent_device, gpio_base + i);
+    }
 
     s->faddr = 0x00;
     s->power = MGC_M_POWER_HSENAB;
@@ -369,7 +371,7 @@ struct MUSBState *musb_init(qemu_irq *irqs)
         usb_packet_init(&s->ep[i].packey[1].p);
     }
 
-    usb_bus_new(&s->bus, &musb_bus_ops, NULL /* FIXME */);
+    usb_bus_new(&s->bus, &musb_bus_ops, parent_device);
     usb_register_port(&s->bus, &s->port, s, 0, &musb_port_ops,
                       USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
 
index e251e616f4a9e39e8dc39cd5e0465338a68d6184..55c061e3f9734dde131edbebcaffe1ba9b19aa2f 100644 (file)
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -343,7 +343,7 @@ enum musb_irq_source_e {
 };
 
 typedef struct MUSBState MUSBState;
-MUSBState *musb_init(qemu_irq *irqs);
+MUSBState *musb_init(DeviceState *parent_device, int gpio_base);
 uint32_t musb_core_intr_get(MUSBState *s);
 void musb_core_intr_clear(MUSBState *s, uint32_t mask);
 void musb_set_size(MUSBState *s, int epnum, int size, int is_tx);