Module Name:    src
Committed By:   jmcneill
Date:           Fri Dec  5 17:32:08 UTC 2014

Modified Files:
        src/sys/arch/arm/allwinner: awin_io.c awin_reg.h awin_usb.c awin_var.h
        src/sys/arch/evbarm/awin: awin_machdep.c platform.h
        src/sys/arch/evbarm/conf: ALLWINNER_A80

Log Message:
A80 EHCI and OHCI support


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/arm/allwinner/awin_io.c
cvs rdiff -u -r1.61 -r1.62 src/sys/arch/arm/allwinner/awin_reg.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/allwinner/awin_usb.c
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/allwinner/awin_var.h
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/evbarm/awin/awin_machdep.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/awin/platform.h
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbarm/conf/ALLWINNER_A80

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/allwinner/awin_io.c
diff -u src/sys/arch/arm/allwinner/awin_io.c:1.33 src/sys/arch/arm/allwinner/awin_io.c:1.34
--- src/sys/arch/arm/allwinner/awin_io.c:1.33	Fri Dec  5 15:25:27 2014
+++ src/sys/arch/arm/allwinner/awin_io.c	Fri Dec  5 17:32:08 2014
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: awin_io.c,v 1.33 2014/12/05 15:25:27 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: awin_io.c,v 1.34 2014/12/05 17:32:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -55,6 +55,7 @@ static struct awinio_softc {
 	bus_space_tag_t sc_a4x_bst;
 	bus_space_handle_t sc_bsh;
 	bus_space_handle_t sc_ccm_bsh;
+	bus_space_handle_t sc_a80_usb_bsh;
 	bus_dma_tag_t sc_dmat;
 	bus_dma_tag_t sc_coherent_dmat;
 } awinio_sc;
@@ -126,6 +127,9 @@ static const struct awin_locators awin_l
 	{ "awinusb", OFFANDSIZE(USB2), 1, NOINTR, A10|A20 },
 	{ "awinusb", OFFANDSIZE(A31_USB1), 0, NOINTR, A31 },
 	{ "awinusb", OFFANDSIZE(A31_USB2), 1, NOINTR, A31 },
+	{ "awinusb", OFFANDSIZE(A80_USB0), 0, NOINTR, A80 },
+	{ "awinusb", OFFANDSIZE(A80_USB1), 1, NOINTR, A80 },
+	{ "awinusb", OFFANDSIZE(A80_USB2), 2, NOINTR, A80 },
 	{ "motg", OFFANDSIZE(USB0), NOPORT, AWIN_IRQ_USB0, A10|A20 },
 	{ "motg", OFFANDSIZE(A31_USB0), NOPORT, AWIN_A31_IRQ_USB0, A31 },
 	{ "awinmmc", OFFANDSIZE(SDMMC0), 0, AWIN_IRQ_SDMMC0, A10|A20 },
@@ -213,6 +217,8 @@ awinio_attach(device_t parent, device_t 
 	case AWIN_CHIP_ID_A80:
 		bus_space_subregion(sc->sc_bst, sc->sc_bsh,
 		    AWIN_A80_CCU_SCLK_OFFSET, 0x1000, &sc->sc_ccm_bsh);
+		bus_space_map(sc->sc_bst, AWIN_A80_USB_PBASE,
+		    AWIN_A80_USB_SIZE, 0, &sc->sc_a80_usb_bsh);
 		break;
 	default:
 		bus_space_subregion(sc->sc_bst, sc->sc_bsh, AWIN_CCM_OFFSET,
@@ -259,6 +265,7 @@ awinio_attach(device_t parent, device_t 
 			.aio_core_a4x_bst = sc->sc_a4x_bst,
 			.aio_core_bsh = sc->sc_bsh,
 			.aio_ccm_bsh = sc->sc_ccm_bsh,
+			.aio_a80_usb_bsh = sc->sc_a80_usb_bsh,
 			.aio_dmat = sc->sc_dmat,
 			.aio_coherent_dmat = sc->sc_coherent_dmat,
 		};

Index: src/sys/arch/arm/allwinner/awin_reg.h
diff -u src/sys/arch/arm/allwinner/awin_reg.h:1.61 src/sys/arch/arm/allwinner/awin_reg.h:1.62
--- src/sys/arch/arm/allwinner/awin_reg.h:1.61	Fri Dec  5 15:25:27 2014
+++ src/sys/arch/arm/allwinner/awin_reg.h	Fri Dec  5 17:32:08 2014
@@ -54,6 +54,10 @@
 #define AWIN_CORE_PBASE			0x01C00000
 #if defined(ALLWINNER_A80)
 #define AWIN_CORE_SIZE			0x06400000	/* XXX */
+#define AWIN_A80_CORE2_PBASE		0x00800000
+#define AWIN_A80_CORE2_SIZE		0x00005000
+#define AWIN_A80_USB_PBASE		0x00a00000
+#define AWIN_A80_USB_SIZE		0x00010000
 #else
 #define AWIN_CORE_SIZE			0x00400000
 #endif
@@ -1207,9 +1211,12 @@ struct awin_mmc_idma_descriptor {
 #define AWIN_USB0_PHY_CTL_CLK1		__BIT(1)
 #define AWIN_USB0_PHY_CTL_CLK0		__BIT(0)
 
+#define AWIN_USB_PMU_IRQ_EHCI_HS_FORCE	__BIT(20)	/* A80 */
+#define AWIN_USB_PMU_IRQ_HSIC_CONNECT_DET __BIT(17)	/* A80 */
 #define AWIN_USB_PMU_IRQ_AHB_INCR8	__BIT(10)
 #define AWIN_USB_PMU_IRQ_AHB_INCR4	__BIT(9)
 #define AWIN_USB_PMU_IRQ_AHB_INCRX	__BIT(8)
+#define AWIN_USB_PMU_IRQ_HSIC		__BIT(1)	/* A80 */
 #define AWIN_USB_PMU_IRQ_ULPI_BYPASS	__BIT(0)
 
 /* PATA Definitions */
@@ -2656,6 +2663,9 @@ struct awin_a31_dma_desc {
  */
 #define AWIN_A80_GIC_BASE		0x01c40000
 
+/*
+ * These offsets are relative to AWIN_CORE_PBASE
+ */
 #define AWIN_A80_SDMMC_COMM_OFFSET	0x00013000
 #define AWIN_A80_CCU_OFFSET		0x04400000
 #define AWIN_A80_CCU_SCLK_OFFSET	0x04400400
@@ -2665,7 +2675,6 @@ struct awin_a31_dma_desc {
 #define AWIN_A80_KEYADC_OFFSET		0x04401800
 #define AWIN_A80_SMTA_OFFSET		0x04403400
 #define AWIN_A80_GPADC_OFFSET		0x04404c00
-
 #define AWIN_A80_UART0_OFFSET		0x05400000
 #define AWIN_A80_UART1_OFFSET		0x05400400
 #define AWIN_A80_UART2_OFFSET		0x05400800
@@ -2678,6 +2687,14 @@ struct awin_a31_dma_desc {
 #define AWIN_A80_TWI3_OFFSET		0x05403400
 #define AWIN_A80_TWI4_OFFSET		0x05403800
 
+/*
+ * These offsets are relative to AWIN_A80_USB_PBASE
+ */
+#define AWIN_A80_USB0_OFFSET		0x00000000
+#define AWIN_A80_USB1_OFFSET		0x00001000
+#define AWIN_A80_USB2_OFFSET		0x00002000
+#define AWIN_A80_USBPHY_OFFSET		0x00008000
+
 #define AWIN_A80_SDMMC_COMM_SDC_RESET_SW	__BIT(18)
 #define AWIN_A80_SDMMC_COMM_SDC_CLOCK_SW	__BIT(16)
 
@@ -2725,6 +2742,8 @@ struct awin_a31_dma_desc {
 
 #define AWIN_A80_CCU_SCLK_BUS_CLK_GATING0_SD	__BIT(8)
 
+#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING1_USB_HOST __BIT(1)
+
 #define AWIN_A80_CCU_SCLK_BUS_CLK_GATING4_TWI4	__BIT(4)
 #define AWIN_A80_CCU_SCLK_BUS_CLK_GATING4_TWI2	__BIT(3)
 #define AWIN_A80_CCU_SCLK_BUS_CLK_GATING4_TWI3	__BIT(2)
@@ -2733,6 +2752,8 @@ struct awin_a31_dma_desc {
 
 #define AWIN_A80_CCU_SCLK_BUS_SOFT_RST0_SD	__BIT(8)
 
+#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST1_USB_HOST __BIT(1)
+
 #define AWIN_A80_CCU_SCLK_BUS_SOFT_RST4_TWI4	__BIT(4)
 #define AWIN_A80_CCU_SCLK_BUS_SOFT_RST4_TWI3	__BIT(3)
 #define AWIN_A80_CCU_SCLK_BUS_SOFT_RST4_TWI2	__BIT(2)
@@ -2748,6 +2769,27 @@ struct awin_a31_dma_desc {
 #define AWIN_A80_CCU_SCLK_SDMMC_OUTPUT_CLK_PHASE_CTR __BITS(10,8)
 #define AWIN_A80_CCU_SCLK_SDMMC_CLK_DIV_RATIO_M	__BITS(3,0)
 
+#define AWIN_A80_USBPHY_HCI_SCR_REG		0x0000
+#define AWIN_A80_USBPHY_HCI_PCR_REG		0x0004
+
+#define AWIN_A80_USBPHY_HCI_SCR_HCI2_RST	__BIT(19)
+#define AWIN_A80_USBPHY_HCI_SCR_HCI1_RST	__BIT(18)
+#define AWIN_A80_USBPHY_HCI_SCR_HCI0_RST	__BIT(17)
+#define AWIN_A80_USBPHY_HCI_SCR_OHCI2_SCLK_GATING __BIT(6)
+#define AWIN_A80_USBPHY_HCI_SCR_HCI2_AHB_GATING	__BIT(5)
+#define AWIN_A80_USBPHY_HCI_SCR_HCI1_AHB_GATING __BIT(3)
+#define AWIN_A80_USBPHY_HCI_SCR_OHCI0_SCLK_GATING __BIT(2)
+#define AWIN_A80_USBPHY_HCI_SCR_HCI0_AHB_GATING	__BIT(1)
+
+#define AWIN_A80_USBPHY_HCI_PCR_HCI2_UTMIPHY_RST __BIT(21)
+#define AWIN_A80_USBPHY_HCI_PCR_HCI1_HSIC_RST	__BIT(18)
+#define AWIN_A80_USBPHY_HCI_PCR_HCI0_PHY_RST	__BIT(17)
+#define AWIN_A80_USBPHY_HCI_PCR_12M_GATING_HCI1_HSIC __BIT(10)
+#define AWIN_A80_USBPHY_HCI_PCR_SCLK_GATING_HCI2_UTMIPHY __BIT(5)
+#define AWIN_A80_USBPHY_HCI_PCR_480M_GATING_HCI2_HSIC __BIT(4)
+#define AWIN_A80_USBPHY_HCI_PCR_480M_GATING_HCI1_HSIC __BIT(2)
+#define AWIN_A80_USBPHY_HCI_PCR_SCLK_GATING_HCI0_PHY __BIT(1)
+
 #define AWIN_A80_PIO_PA_PINS		18
 
 #define AWIN_A80_PIO_PB_PINS		20

Index: src/sys/arch/arm/allwinner/awin_usb.c
diff -u src/sys/arch/arm/allwinner/awin_usb.c:1.17 src/sys/arch/arm/allwinner/awin_usb.c:1.18
--- src/sys/arch/arm/allwinner/awin_usb.c:1.17	Fri Nov 14 08:20:22 2014
+++ src/sys/arch/arm/allwinner/awin_usb.c	Fri Dec  5 17:32:08 2014
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: awin_usb.c,v 1.17 2014/11/14 08:20:22 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: awin_usb.c,v 1.18 2014/12/05 17:32:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -93,6 +93,9 @@ struct awinusb_attach_args {
 static const int awinusb_ohci_irqs[2] = { AWIN_IRQ_USB3, AWIN_IRQ_USB4 };
 static const int awinusb_ohci_irqs_a31[2] = { AWIN_A31_IRQ_USB3,
 					      AWIN_A31_IRQ_USB4 };
+static const int awinusb_ohci_irqs_a80[3] = { AWIN_A80_IRQ_USB_OHCI0,
+					      -1,
+					      AWIN_A80_IRQ_USB_OHCI2 };
 
 #ifdef OHCI_DEBUG
 #define OHCI_DPRINTF(x)	if (ohcidebug) printf x
@@ -124,6 +127,7 @@ ohci_awinusb_attach(device_t parent, dev
 	struct awinusb_softc * const usbsc = device_private(parent);
 	struct ohci_softc * const sc = device_private(self);
 	struct awinusb_attach_args * const usbaa = aux;
+	int irq;
 
 	sc->sc_dev = self;
 
@@ -148,9 +152,18 @@ ohci_awinusb_attach(device_t parent, dev
 	/* Attach usb device. */
 	sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint);
 
-	const int irq = awin_chip_id() == AWIN_CHIP_ID_A31 ?
-			awinusb_ohci_irqs_a31[usbaa->usbaa_port] :
-			awinusb_ohci_irqs[usbaa->usbaa_port];
+	switch (awin_chip_id()) {
+	case AWIN_CHIP_ID_A80:
+		irq = awinusb_ohci_irqs_a80[usbaa->usbaa_port];
+		break;
+	case AWIN_CHIP_ID_A31:
+		irq = awinusb_ohci_irqs_a31[usbaa->usbaa_port];
+		break;
+	default:
+		irq = awinusb_ohci_irqs[usbaa->usbaa_port];
+		break;
+	}
+
 	usbsc->usbsc_ohci_ih = intr_establish(irq, IPL_VM,
 	    IST_LEVEL, ohci_intr, sc);
 	if (usbsc->usbsc_ohci_ih == NULL) {
@@ -176,6 +189,9 @@ static void ehci_awinusb_attach(device_t
 static const int awinusb_ehci_irqs[2] = { AWIN_IRQ_USB1, AWIN_IRQ_USB2 };
 static const int awinusb_ehci_irqs_a31[2] = { AWIN_A31_IRQ_USB1,
 					      AWIN_A31_IRQ_USB2 };
+static const int awinusb_ehci_irqs_a80[3] = { AWIN_A80_IRQ_USB_EHCI0,
+					      AWIN_A80_IRQ_USB_EHCI1,
+					      AWIN_A80_IRQ_USB_EHCI2 };
 
 CFATTACH_DECL_NEW(ehci_awinusb, sizeof(struct ehci_softc),
 	ehci_awinusb_match, ehci_awinusb_attach, NULL, NULL);
@@ -197,6 +213,7 @@ ehci_awinusb_attach(device_t parent, dev
 	struct awinusb_softc * const usbsc = device_private(parent);
 	struct ehci_softc * const sc = device_private(self);
 	struct awinusb_attach_args * const usbaa = aux;
+	int irq;
 
 	sc->sc_dev = self;
 
@@ -225,9 +242,18 @@ ehci_awinusb_attach(device_t parent, dev
 	/* Attach usb device. */
 	sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint);
 
-	const int irq = awin_chip_id() == AWIN_CHIP_ID_A31 ?
-			awinusb_ehci_irqs_a31[usbaa->usbaa_port] :
-			awinusb_ehci_irqs[usbaa->usbaa_port];
+	switch (awin_chip_id()) {
+	case AWIN_CHIP_ID_A80:
+		irq = awinusb_ehci_irqs_a80[usbaa->usbaa_port];
+		break;
+	case AWIN_CHIP_ID_A31:
+		irq = awinusb_ehci_irqs_a31[usbaa->usbaa_port];
+		break;
+	default:
+		irq = awinusb_ehci_irqs[usbaa->usbaa_port];
+		break;
+	}
+
 	usbsc->usbsc_ehci_ih = intr_establish(irq, IPL_VM,
 	    IST_LEVEL, ehci_intr, sc);
 	if (usbsc->usbsc_ehci_ih == NULL) {
@@ -283,8 +309,8 @@ CFATTACH_DECL_NEW(awin_usb, sizeof(struc
 
 static int awinusb_ports;
 
-static const char awinusb_drvpin_names[2][8] = { "usb1drv", "usb2drv" };
-static const char awinusb_restrictpin_names[2][13] = { "usb1restrict", "usb2restrict" };
+static const char awinusb_drvpin_names[3][8] = { "usb1drv", "usb2drv", "usb3drv" };
+static const char awinusb_restrictpin_names[3][13] = { "usb1restrict", "usb2restrict", "usb3restrict" };
 
 static const bus_size_t awinusb_dram_hpcr_regs[2] = {
 	AWIN_DRAM_HPCR_USB1_REG,
@@ -350,6 +376,29 @@ static const uint32_t awinusb_usb_ahb_re
 #endif
 	0,
 };
+static const uint32_t awinusb_usb_scr_a80[3] = {
+	AWIN_A80_USBPHY_HCI_SCR_HCI0_AHB_GATING |
+#if NOHCI > 0
+	AWIN_A80_USBPHY_HCI_SCR_OHCI0_SCLK_GATING |
+#endif
+	AWIN_A80_USBPHY_HCI_SCR_HCI0_RST,
+	AWIN_A80_USBPHY_HCI_SCR_HCI1_AHB_GATING |
+	AWIN_A80_USBPHY_HCI_SCR_HCI1_RST,
+	AWIN_A80_USBPHY_HCI_SCR_HCI2_AHB_GATING |
+#if NOHCI > 0
+	AWIN_A80_USBPHY_HCI_SCR_OHCI2_SCLK_GATING |
+#endif
+	AWIN_A80_USBPHY_HCI_SCR_HCI2_RST,
+};
+static const uint32_t awinusb_usb_pcr_a80[3] = {
+	AWIN_A80_USBPHY_HCI_PCR_SCLK_GATING_HCI0_PHY |
+	AWIN_A80_USBPHY_HCI_PCR_HCI0_PHY_RST,
+	AWIN_A80_USBPHY_HCI_PCR_480M_GATING_HCI1_HSIC |
+	AWIN_A80_USBPHY_HCI_PCR_12M_GATING_HCI1_HSIC |
+	AWIN_A80_USBPHY_HCI_PCR_HCI1_HSIC_RST,
+	AWIN_A80_USBPHY_HCI_PCR_SCLK_GATING_HCI2_UTMIPHY |
+	AWIN_A80_USBPHY_HCI_PCR_HCI2_UTMIPHY_RST,
+};
 
 int
 awinusb_match(device_t parent, cfdata_t cf, void *aux)
@@ -372,6 +421,8 @@ awinusb_attach(device_t parent, device_t
 	struct awinusb_softc * const usbsc = device_private(self);
 	const struct awinio_attach_args * const aio = aux;
 	const struct awin_locators * const loc = &aio->aio_loc;
+	bus_space_handle_t usb_bsh;
+	bool has_ohci = true;
 
 	awinusb_ports |= __BIT(loc->loc_port);
 
@@ -379,15 +430,25 @@ awinusb_attach(device_t parent, device_t
 	usbsc->usbsc_dmat = aio->aio_dmat;
 	usbsc->usbsc_number = loc->loc_port + 1;
 
-	bus_space_subregion(usbsc->usbsc_bst, aio->aio_core_bsh,
+	usb_bsh = awin_chip_id() == AWIN_CHIP_ID_A80 ?
+	    aio->aio_a80_usb_bsh : aio->aio_core_bsh;
+
+	bus_space_subregion(usbsc->usbsc_bst, usb_bsh,
 	    loc->loc_offset + AWIN_EHCI_OFFSET, AWIN_EHCI_SIZE,
 	    &usbsc->usbsc_ehci_bsh);
-	bus_space_subregion(usbsc->usbsc_bst, aio->aio_core_bsh,
+	bus_space_subregion(usbsc->usbsc_bst, usb_bsh,
 	    loc->loc_offset + AWIN_OHCI_OFFSET, AWIN_OHCI_SIZE,
 	    &usbsc->usbsc_ohci_bsh);
-	bus_space_subregion(usbsc->usbsc_bst, aio->aio_core_bsh,
-	    AWIN_USB0_OFFSET + AWIN_USB0_PHY_CTL_REG, 4,
-	    &usbsc->usbsc_usb0_phy_csr_bsh);
+
+	if (awin_chip_id() != AWIN_CHIP_ID_A80) {
+		bus_space_subregion(usbsc->usbsc_bst, usb_bsh,
+		    AWIN_USB0_OFFSET + AWIN_USB0_PHY_CTL_REG, 4,
+		    &usbsc->usbsc_usb0_phy_csr_bsh);
+	}
+
+	if (awin_chip_id() == AWIN_CHIP_ID_A80 && loc->loc_port == 1) {
+		has_ohci = false;
+	}
 
 	aprint_naive("\n");
 	aprint_normal("\n");
@@ -407,6 +468,32 @@ awinusb_attach(device_t parent, device_t
 		/* Soft reset */
 		awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_ccm_bsh,
 		    AWIN_A31_AHB_RESET0_REG, awinusb_usb_ahb_reset_a31[loc->loc_port], 0);
+	} else if (awin_chip_id() == AWIN_CHIP_ID_A80) {
+		/* Gate enable */
+		awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_ccm_bsh,
+		    AWIN_A80_CCU_SCLK_BUS_CLK_GATING1_REG,
+		    AWIN_A80_CCU_SCLK_BUS_CLK_GATING1_USB_HOST, 0);
+		/* Soft reset */
+		awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_ccm_bsh,
+		    AWIN_A80_CCU_SCLK_BUS_SOFT_RST1_REG,
+		    AWIN_A80_CCU_SCLK_BUS_SOFT_RST1_USB_HOST, 0);
+
+		/* Enable USB PHY */
+		awin_reg_set_clear(usbsc->usbsc_bst, usb_bsh,
+		    AWIN_A80_USBPHY_OFFSET + AWIN_A80_USBPHY_HCI_PCR_REG,
+		    awinusb_usb_pcr_a80[loc->loc_port], 0);
+		awin_reg_set_clear(usbsc->usbsc_bst, usb_bsh,
+		    AWIN_A80_USBPHY_OFFSET + AWIN_A80_USBPHY_HCI_SCR_REG,
+		    awinusb_usb_scr_a80[loc->loc_port], 0);
+
+		if (!has_ohci) {
+			/* No OHCI for USB1, force EHCI mode */
+			awin_reg_set_clear(usbsc->usbsc_bst, usb_bsh,
+			    loc->loc_offset + AWIN_USB_PMU_IRQ_REG,
+			    AWIN_USB_PMU_IRQ_EHCI_HS_FORCE |
+			    AWIN_USB_PMU_IRQ_HSIC_CONNECT_DET |
+			    AWIN_USB_PMU_IRQ_HSIC, 0);
+		}
 	} else {
 		/*
 		 * Access to the USB phy is off USB0 so make sure it's on.
@@ -426,20 +513,22 @@ awinusb_attach(device_t parent, device_t
 	/*
 	 * Allow USB DMA engine access to the DRAM.
 	 */
-	awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_core_bsh,
+	awin_reg_set_clear(usbsc->usbsc_bst, usb_bsh,
 	    loc->loc_offset + AWIN_USB_PMU_IRQ_REG,
 	    AWIN_USB_PMU_IRQ_AHB_INCR8 | AWIN_USB_PMU_IRQ_AHB_INCR4
 	       | AWIN_USB_PMU_IRQ_AHB_INCRX | AWIN_USB_PMU_IRQ_ULPI_BYPASS, 0);
 
-	if (awin_chip_id() != AWIN_CHIP_ID_A31) {
+	if (awin_chip_id() == AWIN_CHIP_ID_A20) {
 		awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_core_bsh,
 		    AWIN_DRAM_OFFSET + awinusb_dram_hpcr_regs[loc->loc_port],
 		    AWIN_DRAM_HPCR_ACCESS_EN, 0);
 	}
 
 	/* initialize the USB phy */
-	awin_usb_phy_write(usbsc, 0x20, 0x14, 5);
-	awin_usb_phy_write(usbsc, 0x2a, 0x03, 2);
+	if (awin_chip_id() != AWIN_CHIP_ID_A80) {
+		awin_usb_phy_write(usbsc, 0x20, 0x14, 5);
+		awin_usb_phy_write(usbsc, 0x2a, 0x03, 2);
+	}
 
 	/*
 	 * Now get the GPIO that enables the power to the port and
@@ -456,15 +545,17 @@ awinusb_attach(device_t parent, device_t
 		    &usbsc->usbsc_restrict_pin)) {
 		awin_gpio_pindata_write(&usbsc->usbsc_restrict_pin, 1);
 	} else {
-		aprint_error_dev(self, "no restrict gpio found\n");
+		aprint_debug_dev(self, "no restrict gpio found\n");
 	}
 
 	/*
 	 * Disable interrupts
 	 */
 #if NOHCI > 0
-	bus_space_write_4(usbsc->usbsc_bst, usbsc->usbsc_ohci_bsh,
-	    OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS);
+	if (has_ohci) {
+		bus_space_write_4(usbsc->usbsc_bst, usbsc->usbsc_ohci_bsh,
+		    OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS);
+	}
 #endif
 #if NEHCI > 0
 	bus_size_t caplength = bus_space_read_1(usbsc->usbsc_bst,
@@ -474,17 +565,19 @@ awinusb_attach(device_t parent, device_t
 #endif
 
 #if NOHCI > 0
-	struct awinusb_attach_args usbaa_ohci = {
-		.usbaa_name = "ohci",
-		.usbaa_dmat = usbsc->usbsc_dmat,
-		.usbaa_bst = usbsc->usbsc_bst,
-		.usbaa_bsh = usbsc->usbsc_ohci_bsh,
-		.usbaa_ccm_bsh = aio->aio_ccm_bsh,
-		.usbaa_size = AWIN_OHCI_SIZE,
-		.usbaa_port = loc->loc_port,
-	};
+	if (has_ohci) {
+		struct awinusb_attach_args usbaa_ohci = {
+			.usbaa_name = "ohci",
+			.usbaa_dmat = usbsc->usbsc_dmat,
+			.usbaa_bst = usbsc->usbsc_bst,
+			.usbaa_bsh = usbsc->usbsc_ohci_bsh,
+			.usbaa_ccm_bsh = aio->aio_ccm_bsh,
+			.usbaa_size = AWIN_OHCI_SIZE,
+			.usbaa_port = loc->loc_port,
+		};
 
-	usbsc->usbsc_ohci_dev = config_found(self, &usbaa_ohci, NULL);
+		usbsc->usbsc_ohci_dev = config_found(self, &usbaa_ohci, NULL);
+	}
 #endif
 
 #if NEHCI > 0

Index: src/sys/arch/arm/allwinner/awin_var.h
diff -u src/sys/arch/arm/allwinner/awin_var.h:1.29 src/sys/arch/arm/allwinner/awin_var.h:1.30
--- src/sys/arch/arm/allwinner/awin_var.h:1.29	Fri Dec  5 14:36:44 2014
+++ src/sys/arch/arm/allwinner/awin_var.h	Fri Dec  5 17:32:08 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_var.h,v 1.29 2014/12/05 14:36:44 jmcneill Exp $ */
+/* $NetBSD: awin_var.h,v 1.30 2014/12/05 17:32:08 jmcneill Exp $ */
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -59,6 +59,7 @@ struct awinio_attach_args {
 	bus_space_tag_t aio_core_a4x_bst;
 	bus_space_handle_t aio_core_bsh;
 	bus_space_handle_t aio_ccm_bsh;
+	bus_space_handle_t aio_a80_usb_bsh;
 	bus_dma_tag_t aio_dmat;
 	bus_dma_tag_t aio_coherent_dmat;
 };

Index: src/sys/arch/evbarm/awin/awin_machdep.c
diff -u src/sys/arch/evbarm/awin/awin_machdep.c:1.32 src/sys/arch/evbarm/awin/awin_machdep.c:1.33
--- src/sys/arch/evbarm/awin/awin_machdep.c:1.32	Fri Dec  5 14:46:04 2014
+++ src/sys/arch/evbarm/awin/awin_machdep.c	Fri Dec  5 17:32:08 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: awin_machdep.c,v 1.32 2014/12/05 14:46:04 jmcneill Exp $ */
+/*	$NetBSD: awin_machdep.c,v 1.33 2014/12/05 17:32:08 jmcneill Exp $ */
 
 /*
  * Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_machdep.c,v 1.32 2014/12/05 14:46:04 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_machdep.c,v 1.33 2014/12/05 17:32:08 jmcneill Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -287,6 +287,28 @@ static const struct pmap_devmap devmap[]
 		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
 		.pd_cache = PTE_NOCACHE
 	},
+#if defined(ALLWINNER_A80)
+	{
+		/*
+		 * A80 SYS_CTRL, HS TIMER, DMA, MSG-BOX, SPINLOCK
+		 */
+		.pd_va = _A(AWIN_A80_CORE2_VBASE),
+		.pd_pa = _A(AWIN_A80_CORE2_PBASE),
+		.pd_size = _S(AWIN_A80_CORE2_SIZE),
+		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
+		.pd_cache = PTE_NOCACHE
+	},
+	{
+		/*
+		 * A80 USB-EHCI0/OHCI0, USB-EHCI1, USB-EHCI2/OHCI2
+		 */
+		.pd_va = _A(AWIN_A80_USB_VBASE),
+		.pd_pa = _A(AWIN_A80_USB_PBASE),
+		.pd_size = _S(AWIN_A80_USB_SIZE),
+		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
+		.pd_cache = PTE_NOCACHE
+	},
+#endif
 	{
 		/*
 		 * Map all 1MB of SRAM area.
@@ -640,15 +662,6 @@ awin_device_register(device_t self, void
 		 */
 		prop_dictionary_set_cstring(dict, "satapwren",
 		    (cubietruck_p ? ">PH12" : ">PB8"));
-#if AWIN_board == AWIN_cubieboard || AWIN_board == AWIN_cubietruck || AWIN_board == AWIN_bpi
-		if (cubietruck_p) {
-			prop_dictionary_set_cstring(dict, "usb0drv", ">PH17");
-		} else if (awin_chip_id() == AWIN_CHIP_ID_A20) {
-			prop_dictionary_set_cstring(dict, "usb0drv", ">PB9");
-		} else {
-			prop_dictionary_set_cstring(dict, "usb0drv", ">PB2");
-		}
-#endif
 #if AWIN_board == AWIN_hummingbird_a31
 		prop_dictionary_set_cstring(dict, "usb0iddet", "<PA15");
 		prop_dictionary_set_cstring(dict, "usb0vbusdet", "<PA16");
@@ -657,7 +670,17 @@ awin_device_register(device_t self, void
 		prop_dictionary_set_cstring(dict, "usb1drv", ">PH27");
 		prop_dictionary_set_cstring(dict, "usb1restrict", ">PH26");
 		prop_dictionary_set_cstring(dict, "usb2drv", ">PH24");
+#elif AWIN_board == AWIN_allwinner_a80
+		prop_dictionary_set_cstring(dict, "usb1drv", ">PH14");
+		prop_dictionary_set_cstring(dict, "usb2drv", ">PH15");
 #else
+		if (cubietruck_p) {
+			prop_dictionary_set_cstring(dict, "usb0drv", ">PH17");
+		} else if (awin_chip_id() == AWIN_CHIP_ID_A20) {
+			prop_dictionary_set_cstring(dict, "usb0drv", ">PB9");
+		} else {
+			prop_dictionary_set_cstring(dict, "usb0drv", ">PB2");
+		}
 		prop_dictionary_set_cstring(dict, "usb2drv", ">PH3");
 		prop_dictionary_set_cstring(dict, "usb0iddet",
 		    (cubietruck_p ? "<PH19" : "<PH4"));

Index: src/sys/arch/evbarm/awin/platform.h
diff -u src/sys/arch/evbarm/awin/platform.h:1.2 src/sys/arch/evbarm/awin/platform.h:1.3
--- src/sys/arch/evbarm/awin/platform.h:1.2	Fri Dec  5 14:45:45 2014
+++ src/sys/arch/evbarm/awin/platform.h	Fri Dec  5 17:32:08 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: platform.h,v 1.2 2014/12/05 14:45:45 jmcneill Exp $	*/
+/*	$NetBSD: platform.h,v 1.3 2014/12/05 17:32:08 jmcneill Exp $	*/
 /*
  * Copyright (c) 2007 Microsoft
  * All rights reserved.
@@ -52,7 +52,13 @@
 #define AWIN_KERNEL_IO_VBASE	(KERNEL_VM_BASE + KERNEL_VM_SIZE)
 #define AWIN_CORE_VBASE		AWIN_KERNEL_IO_VBASE
 #define AWIN_SRAM_VBASE		(AWIN_CORE_VBASE + AWIN_CORE_SIZE)
+#if defined(ALLWINNER_A80)
+#define AWIN_A80_CORE2_VBASE	(AWIN_SRAM_VBASE + AWIN_SRAM_SIZE)
+#define AWIN_A80_USB_VBASE	(AWIN_A80_CORE2_VBASE + AWIN_A80_CORE2_SIZE)
+#define AWIN_KERNEL_IO_VEND	(AWIN_A80_USB_VBASE + AWIN_A80_USB_SIZE)
+#else
 #define AWIN_KERNEL_IO_VEND	(AWIN_SRAM_VBASE + AWIN_SRAM_SIZE)
+#endif
 #define CONADDR_VA		((CONADDR - AWIN_CORE_PBASE) + AWIN_CORE_VBASE)
 #ifndef _LOCORE
 CTASSERT(AWIN_KERNEL_IO_VEND <= VM_MAX_KERNEL_ADDRESS);

Index: src/sys/arch/evbarm/conf/ALLWINNER_A80
diff -u src/sys/arch/evbarm/conf/ALLWINNER_A80:1.3 src/sys/arch/evbarm/conf/ALLWINNER_A80:1.4
--- src/sys/arch/evbarm/conf/ALLWINNER_A80:1.3	Fri Dec  5 15:25:27 2014
+++ src/sys/arch/evbarm/conf/ALLWINNER_A80	Fri Dec  5 17:32:08 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: ALLWINNER_A80,v 1.3 2014/12/05 15:25:27 jmcneill Exp $
+#	$NetBSD: ALLWINNER_A80,v 1.4 2014/12/05 17:32:08 jmcneill Exp $
 #
 #	ALLWINNER_A80 - Allwinner A80 boards (Cubieboard4, OptimusBoard, etc)
 #
@@ -278,24 +278,25 @@ options 	CONADDR=0x07000000, CONSPEED=11
 #options 	WSDISPLAY_DEFAULTSCREENS=4
 
 # On-board USB
-#awinusb0	at awinio0 port 0
-#awinusb1	at awinio0 port 1
-#ohci*		at awinusb?
-#ehci*		at awinusb?
-#usb*		at ohci?
-#usb*		at ehci?
+awinusb0	at awinio0 port 0
+awinusb1	at awinio0 port 1
+awinusb2	at awinio0 port 2
+ohci*		at awinusb?
+ehci*		at awinusb?
+usb*		at ohci?
+usb*		at ehci?
 
 # USB OTG
 #motg0		at awinio0
 #usb*		at motg?
 
-#include "dev/usb/usbdevices.config"
+include "dev/usb/usbdevices.config"
 
-#midi*		at midibus?
+midi*		at midibus?
 
-#rlphy*		at mii? phy ?
-#rgephy* 	at mii? phy ?
-#ukphy*		at mii? phy ?
+rlphy*		at mii? phy ?
+rgephy* 	at mii? phy ?
+ukphy*		at mii? phy ?
 
 # Pseudo-Devices
 

Reply via email to