[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/23] usb-ohci: Add support for being a companion c
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 14/23] usb-ohci: Add support for being a companion controller |
Date: |
Fri, 8 Jul 2011 11:51:04 +0200 |
From: Hans de Goede <address@hidden>
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 <address@hidden>
Signed-off-by: Gerd Hoffmann <address@hidden>
---
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
- [Qemu-devel] [PATCH 03/23] usb: Move (initial) call of usb_port_location to usb_fill_port, (continued)
- [Qemu-devel] [PATCH 03/23] usb: Move (initial) call of usb_port_location to usb_fill_port, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 04/23] usb: Add a register_companion USB bus op., Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 02/23] usb: Add a usb_fill_port helper function, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 10/23] usb: assert on calling usb_attach(port, NULL) on a port without a dev, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 09/23] usb-ehci: cleanup port reset handling, Gerd Hoffmann, 2011/07/08
- [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
- [Qemu-devel] [PATCH 11/23] usb-ehci: Fix handling of PED and PEDC port status bits, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 01/23] hw/usb-musb.c: Don't misuse usb_packet_complete(), Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 07/23] usb-ehci: drop unused num-ports state member, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 05/23] usb: Make port wakeup and complete ops take a USBPort instead of a Device, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 14/23] usb-ohci: Add support for being a companion controller,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 13/23] usb-uhci: Add support for being a companion controller, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 06/23] usb: Replace device_destroy bus op with a child_detach port op, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 12/23] usb-ehci: Add support for registering companion controllers, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 16/23] uhci: add ich9 controllers, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 17/23] ehci: fix port count., Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 15/23] pci: add ich9 usb controller ids, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 18/23] ehci: add ich9 controller., Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 19/23] usb: update documentation, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 23/23] usb-ohci: raise interrupt on attach, Gerd Hoffmann, 2011/07/08
- [Qemu-devel] [PATCH 20/23] usb_register_port(): do not set port->opaque and port->index twice, Gerd Hoffmann, 2011/07/08