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