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