diff mbox series

[v2,3/3] arm: allwinner: Wire up USB ports

Message ID 20200215001248.2642-4-linux@roeck-us.net
State New
Headers show
Series arm: allwinner: Wire up USB ports | expand

Commit Message

Guenter Roeck Feb. 15, 2020, 12:12 a.m. UTC
Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
modeled as companions of the respective EHCI ports.

With this patch applied, USB controllers are discovered and instantiated
when booting the cubieboard machine with a recent Linux kernel.

ehci-platform 1c14000.usb: EHCI Host Controller
ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
ehci-platform 1c1c000.usb: EHCI Host Controller
ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
ohci-platform 1c14400.usb: Generic Platform OHCI controller
ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
ohci-platform 1c1c400.usb: Generic Platform OHCI controller
ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
usb 2-1: new high-speed USB device number 2 using ehci-platform
usb-storage 2-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 2-1:1.0
usb 3-1: new full-speed USB device number 2 using ohci-platform
input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2: Instantiate EHCI and OHCI in a single patch
    Use define instead of ARRAY_SIZE to get the number of USB ports
    Instantiate OHCI in companion mode
    Use &error_fatal to handle error conditions

 hw/arm/allwinner-a10.c         | 43 ++++++++++++++++++++++++++++++++++
 include/hw/arm/allwinner-a10.h |  6 +++++
 2 files changed, 49 insertions(+)

Comments

Peter Maydell Feb. 17, 2020, 10:13 a.m. UTC | #1
On Sat, 15 Feb 2020 at 00:12, Guenter Roeck <linux@roeck-us.net> wrote:
>
> Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
> modeled as companions of the respective EHCI ports.
>
> With this patch applied, USB controllers are discovered and instantiated
> when booting the cubieboard machine with a recent Linux kernel.
>
> ehci-platform 1c14000.usb: EHCI Host Controller
> ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
> ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
> ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
> ehci-platform 1c1c000.usb: EHCI Host Controller
> ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
> ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
> ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
> ohci-platform 1c14400.usb: Generic Platform OHCI controller
> ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
> ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
> ohci-platform 1c1c400.usb: Generic Platform OHCI controller
> ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
> ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
> usb 2-1: new high-speed USB device number 2 using ehci-platform
> usb-storage 2-1:1.0: USB Mass Storage device detected
> scsi host1: usb-storage 2-1:1.0
> usb 3-1: new full-speed USB device number 2 using ohci-platform
> input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0
>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v2: Instantiate EHCI and OHCI in a single patch
>     Use define instead of ARRAY_SIZE to get the number of USB ports
>     Instantiate OHCI in companion mode
>     Use &error_fatal to handle error conditions
>
>  hw/arm/allwinner-a10.c         | 43 ++++++++++++++++++++++++++++++++++
>  include/hw/arm/allwinner-a10.h |  6 +++++
>  2 files changed, 49 insertions(+)
>
> diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
> index 45cd8d2db5..57275c92f5 100644
> --- a/hw/arm/allwinner-a10.c
> +++ b/hw/arm/allwinner-a10.c
> @@ -24,12 +24,16 @@
>  #include "hw/arm/allwinner-a10.h"
>  #include "hw/misc/unimp.h"
>  #include "sysemu/sysemu.h"
> +#include "hw/boards.h"
> +#include "hw/usb/hcd-ohci.h"
>
>  #define AW_A10_CCM_REG_BASE     0x01c20000
>  #define AW_A10_PIC_REG_BASE     0x01c20400
>  #define AW_A10_PIT_REG_BASE     0x01c20c00
>  #define AW_A10_UART0_REG_BASE   0x01c28000
>  #define AW_A10_EMAC_BASE        0x01c0b000
> +#define AW_A10_EHCI_BASE        0x01c14000
> +#define AW_A10_OHCI_BASE        0x01c14400
>  #define AW_A10_SATA_BASE        0x01c18000

Hi; I tried to apply this patchset, but it doesn't apply to master.
In particular, master doesn't have a #define for AW_A10_CCM_REG_BASE.

Is this patchset supposed to be based on some other patchset
you've already sent that's got lost in my mailbox?

thanks
-- PMM
Guenter Roeck Feb. 17, 2020, 6:05 p.m. UTC | #2
On 2/17/20 2:13 AM, Peter Maydell wrote:
> On Sat, 15 Feb 2020 at 00:12, Guenter Roeck <linux@roeck-us.net> wrote:
>>
[ ... ]

> Hi; I tried to apply this patchset, but it doesn't apply to master.
> In particular, master doesn't have a #define for AW_A10_CCM_REG_BASE.
>  > Is this patchset supposed to be based on some other patchset
> you've already sent that's got lost in my mailbox?
> 

It is not supposed to be based on anything, but in practice it is because
I also carry a patch adding basic CCM support (which I completely forgot
and which I didn't send upstream because it is hackish).

Sorry for that. I'll rebase to master and resend.

Guenter
diff mbox series

Patch

diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 45cd8d2db5..57275c92f5 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -24,12 +24,16 @@ 
 #include "hw/arm/allwinner-a10.h"
 #include "hw/misc/unimp.h"
 #include "sysemu/sysemu.h"
+#include "hw/boards.h"
+#include "hw/usb/hcd-ohci.h"
 
 #define AW_A10_CCM_REG_BASE     0x01c20000
 #define AW_A10_PIC_REG_BASE     0x01c20400
 #define AW_A10_PIT_REG_BASE     0x01c20c00
 #define AW_A10_UART0_REG_BASE   0x01c28000
 #define AW_A10_EMAC_BASE        0x01c0b000
+#define AW_A10_EHCI_BASE        0x01c14000
+#define AW_A10_OHCI_BASE        0x01c14400
 #define AW_A10_SATA_BASE        0x01c18000
 
 static void aw_a10_init(Object *obj)
@@ -53,6 +57,17 @@  static void aw_a10_init(Object *obj)
 
     sysbus_init_child_obj(obj, "sata", &s->sata, sizeof(s->sata),
                           TYPE_ALLWINNER_AHCI);
+
+    if (machine_usb(current_machine)) {
+        int i;
+
+        for (i = 0; i < AW_A10_NUM_USB; i++) {
+            sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
+                                  sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
+            sysbus_init_child_obj(obj, "ohci[*]", OBJECT(&s->ohci[i]),
+                                  sizeof(s->ohci[i]), TYPE_SYSBUS_OHCI);
+        }
+    }
 }
 
 static void aw_a10_realize(DeviceState *dev, Error **errp)
@@ -133,6 +148,34 @@  static void aw_a10_realize(DeviceState *dev, Error **errp)
     serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2,
                    qdev_get_gpio_in(dev, 1),
                    115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
+
+    if (machine_usb(current_machine)) {
+        int i;
+
+        for (i = 0; i < AW_A10_NUM_USB; i++) {
+            char bus[16];
+
+            sprintf(bus, "usb-bus.%d", i);
+
+            object_property_set_bool(OBJECT(&s->ehci[i]), true,
+                                     "companion-enable", &error_fatal);
+            object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized",
+                                     &error_fatal);
+            sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
+                            AW_A10_EHCI_BASE + i * 0x8000);
+            sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
+                               qdev_get_gpio_in(dev, 39 + i));
+
+            object_property_set_str(OBJECT(&s->ohci[i]), bus, "masterbus",
+                                    &error_fatal);
+            object_property_set_bool(OBJECT(&s->ohci[i]), true, "realized",
+                                     &error_fatal);
+            sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci[i]), 0,
+                            AW_A10_OHCI_BASE + i * 0x8000);
+            sysbus_connect_irq(SYS_BUS_DEVICE(&s->ohci[i]), 0,
+                               qdev_get_gpio_in(dev, 64 + i));
+        }
+    }
 }
 
 static void aw_a10_class_init(ObjectClass *oc, void *data)
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
index 0007a927bb..12ca731cb2 100644
--- a/include/hw/arm/allwinner-a10.h
+++ b/include/hw/arm/allwinner-a10.h
@@ -9,11 +9,15 @@ 
 #include "hw/intc/allwinner-a10-pic.h"
 #include "hw/net/allwinner_emac.h"
 #include "hw/ide/ahci.h"
+#include "hw/usb/hcd-ohci.h"
+#include "hw/usb/hcd-ehci.h"
 
 #include "target/arm/cpu.h"
 
 #define AW_A10_SDRAM_BASE       0x40000000
 
+#define AW_A10_NUM_USB          2
+
 #define TYPE_AW_A10 "allwinner-a10"
 #define AW_A10(obj) OBJECT_CHECK(AwA10State, (obj), TYPE_AW_A10)
 
@@ -29,6 +33,8 @@  typedef struct AwA10State {
     AwEmacState emac;
     AllwinnerAHCIState sata;
     MemoryRegion sram_a;
+    EHCISysBusState ehci[AW_A10_NUM_USB];
+    OHCISysBusState ohci[AW_A10_NUM_USB];
 } AwA10State;
 
 #endif