qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Hans de Goede <hdegoede@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH 14/23] usb-ohci: Add support for being a companion controller
Date: Fri,  8 Jul 2011 11:51:04 +0200	[thread overview]
Message-ID: <1310118673-26196-15-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1310118673-26196-1-git-send-email-kraxel@redhat.com>

From: Hans de Goede <hdegoede@redhat.com>

To use as a companion controller, use pci-ohci as device and set the
masterbus and num-ports properties, ie:

-device usb-ehci,addr=0b.1,multifunction=on,id=ehci0
-device pci-ohci,addr=0b.0,multifunction=on,masterbus=ehci0.0,num-ports=4

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/usb-ohci.c |   52 ++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c
index 46f0bcb..c77a20e 100644
--- a/hw/usb-ohci.c
+++ b/hw/usb-ohci.c
@@ -1716,8 +1716,9 @@ static USBPortOps ohci_port_ops = {
 static USBBusOps ohci_bus_ops = {
 };
 
-static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
-                          int num_ports, uint32_t localmem_base)
+static int usb_ohci_init(OHCIState *ohci, DeviceState *dev,
+                         int num_ports, uint32_t localmem_base,
+                         char *masterbus, uint32_t firstport)
 {
     int i;
 
@@ -1737,38 +1738,58 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
                 usb_frame_time, usb_bit_time);
     }
 
+    ohci->num_ports = num_ports;
+    if (masterbus) {
+        USBPort *ports[OHCI_MAX_PORTS];
+        for(i = 0; i < num_ports; i++) {
+            ports[i] = &ohci->rhport[i].port;
+        }
+        if (usb_register_companion(masterbus, ports, num_ports,
+                firstport, ohci, &ohci_port_ops,
+                USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL) != 0) {
+            return -1;
+        }
+    } else {
+        usb_bus_new(&ohci->bus, &ohci_bus_ops, dev);
+        for (i = 0; i < num_ports; i++) {
+            usb_register_port(&ohci->bus, &ohci->rhport[i].port,
+                              ohci, i, &ohci_port_ops,
+                              USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
+        }
+    }
+
     ohci->mem = cpu_register_io_memory(ohci_readfn, ohci_writefn, ohci,
                                        DEVICE_LITTLE_ENDIAN);
     ohci->localmem_base = localmem_base;
 
     ohci->name = dev->info->name;
 
-    usb_bus_new(&ohci->bus, &ohci_bus_ops, dev);
-    ohci->num_ports = num_ports;
-    for (i = 0; i < num_ports; i++) {
-        usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, &ohci_port_ops,
-                          USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
-    }
-
     ohci->async_td = 0;
     qemu_register_reset(ohci_reset, ohci);
+
+    return 0;
 }
 
 typedef struct {
     PCIDevice pci_dev;
     OHCIState state;
+    char *masterbus;
+    uint32_t num_ports;
+    uint32_t firstport;
 } OHCIPCIState;
 
 static int usb_ohci_initfn_pci(struct PCIDevice *dev)
 {
     OHCIPCIState *ohci = DO_UPCAST(OHCIPCIState, pci_dev, dev);
-    int num_ports = 3;
 
     ohci->pci_dev.config[PCI_CLASS_PROG] = 0x10; /* OHCI */
     /* TODO: RST# value should be 0. */
     ohci->pci_dev.config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin 1 */
 
-    usb_ohci_init(&ohci->state, &dev->qdev, num_ports, 0);
+    if (usb_ohci_init(&ohci->state, &dev->qdev, ohci->num_ports, 0,
+                      ohci->masterbus, ohci->firstport) != 0) {
+        return -1;
+    }
     ohci->state.irq = ohci->pci_dev.irq[0];
 
     /* TODO: avoid cast below by using dev */
@@ -1792,7 +1813,8 @@ static int ohci_init_pxa(SysBusDevice *dev)
 {
     OHCISysBusState *s = FROM_SYSBUS(OHCISysBusState, dev);
 
-    usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset);
+    /* Cannot fail as we pass NULL for masterbus */
+    usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset, NULL, 0);
     sysbus_init_irq(dev, &s->ohci.irq);
     sysbus_init_mmio(dev, 0x1000, s->ohci.mem);
 
@@ -1807,6 +1829,12 @@ static PCIDeviceInfo ohci_pci_info = {
     .vendor_id    = PCI_VENDOR_ID_APPLE,
     .device_id    = PCI_DEVICE_ID_APPLE_IPID_USB,
     .class_id     = PCI_CLASS_SERIAL_USB,
+    .qdev.props   = (Property[]) {
+        DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus),
+        DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3),
+        DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0),
+        DEFINE_PROP_END_OF_LIST(),
+    },
 };
 
 static SysBusDeviceInfo ohci_sysbus_info = {
-- 
1.7.1

  parent reply	other threads:[~2011-07-08  9:51 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-08  9:50 [Qemu-devel] [PULL] usb patch queue Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 01/23] hw/usb-musb.c: Don't misuse usb_packet_complete() Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 02/23] usb: Add a usb_fill_port helper function Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 03/23] usb: Move (initial) call of usb_port_location to usb_fill_port Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 04/23] usb: Add a register_companion USB bus op Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 05/23] usb: Make port wakeup and complete ops take a USBPort instead of a Device Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 06/23] usb: Replace device_destroy bus op with a child_detach port op Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 07/23] usb-ehci: drop unused num-ports state member Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 08/23] usb-ehci: Connect Status bit is read only, don't allow changing it by the guest Gerd Hoffmann
2011-07-08  9:50 ` [Qemu-devel] [PATCH 09/23] usb-ehci: cleanup port reset handling Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 10/23] usb: assert on calling usb_attach(port, NULL) on a port without a dev Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 11/23] usb-ehci: Fix handling of PED and PEDC port status bits Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 12/23] usb-ehci: Add support for registering companion controllers Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 13/23] usb-uhci: Add support for being a companion controller Gerd Hoffmann
2011-07-08  9:51 ` Gerd Hoffmann [this message]
2011-07-08  9:51 ` [Qemu-devel] [PATCH 15/23] pci: add ich9 usb controller ids Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 16/23] uhci: add ich9 controllers Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 17/23] ehci: fix port count Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 18/23] ehci: add ich9 controller Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 19/23] usb: update documentation Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 20/23] usb_register_port(): do not set port->opaque and port->index twice Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 21/23] usb: fixup bluetooth descriptors Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 22/23] usb-hub: remove unused descriptor arrays Gerd Hoffmann
2011-07-08  9:51 ` [Qemu-devel] [PATCH 23/23] usb-ohci: raise interrupt on attach Gerd Hoffmann
2011-07-12 14:52 ` [Qemu-devel] [PULL] usb patch queue Gerd Hoffmann
2011-07-19 15:59 ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1310118673-26196-15-git-send-email-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).