Module Name: src Committed By: jmcneill Date: Sun Oct 12 13:07:45 UTC 2014
Modified Files: src/sys/arch/arm/allwinner: awin_reg.h awin_usb.c Log Message: A31 USB support To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/allwinner/awin_reg.h cvs rdiff -u -r1.14 -r1.15 src/sys/arch/arm/allwinner/awin_usb.c 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_reg.h diff -u src/sys/arch/arm/allwinner/awin_reg.h:1.29 src/sys/arch/arm/allwinner/awin_reg.h:1.30 --- src/sys/arch/arm/allwinner/awin_reg.h:1.29 Sun Oct 12 12:14:43 2014 +++ src/sys/arch/arm/allwinner/awin_reg.h Sun Oct 12 13:07:45 2014 @@ -1718,6 +1718,10 @@ struct awin_mmc_idma_descriptor { #define AWIN_A31_CPU_AXI_CFG_REG 0x0050 +#define AWIN_A31_AHB_RESET0_REG 0x02C0 +#define AWIN_A31_AHB_RESET1_REG 0x02C4 +#define AWIN_A31_AHB_RESET2_REG 0x02C8 + #define AWIN_A31_CPUCFG_RST_CTRL_CORE_RESET __BIT(1) #define AWIN_A31_CPUCFG_RST_CTRL_CPU_RESET __BIT(0) @@ -1738,6 +1742,30 @@ struct awin_mmc_idma_descriptor { #define AWIN_A31_USB_CLK_PHY1_ENABLE __BIT(1) #define AWIN_A31_USB_CLK_PHY0_ENABLE __BIT(0) +#define AWIN_A31_AHB_RESET0_USBOHCI2_RST __BIT(31) +#define AWIN_A31_AHB_RESET0_USBOHCI1_RST __BIT(30) +#define AWIN_A31_AHB_RESET0_USBOHCI0_RST __BIT(29) +#define AWIN_A31_AHB_RESET0_USBEHCI1_RST __BIT(27) +#define AWIN_A31_AHB_RESET0_USBEHCI0_RST __BIT(26) +#define AWIN_A31_AHB_RESET0_USBOTG_RST __BIT(24) +#define AWIN_A31_AHB_RESET0_SPI3_RST __BIT(23) +#define AWIN_A31_AHB_RESET0_SPI2_RST __BIT(22) +#define AWIN_A31_AHB_RESET0_SPI1_RST __BIT(21) +#define AWIN_A31_AHB_RESET0_SPI0_RST __BIT(20) +#define AWIN_A31_AHB_RESET0_HSTMR_RST __BIT(19) +#define AWIN_A31_AHB_RESET0_TS_RST __BIT(18) +#define AWIN_A31_AHB_RESET0_GMAC_RST __BIT(17) +#define AWIN_A31_AHB_RESET0_SDRAM_RST __BIT(14) +#define AWIN_A31_AHB_RESET0_NAND0_RST __BIT(13) +#define AWIN_A31_AHB_RESET0_NAND1_RST __BIT(12) +#define AWIN_A31_AHB_RESET0_SD3_RST __BIT(11) +#define AWIN_A31_AHB_RESET0_SD2_RST __BIT(10) +#define AWIN_A31_AHB_RESET0_SD1_RST __BIT(9) +#define AWIN_A31_AHB_RESET0_SD0_RST __BIT(8) +#define AWIN_A31_AHB_RESET0_DMA_RST __BIT(6) +#define AWIN_A31_AHB_RESET0_SS_RST __BIT(5) +#define AWIN_A31_AHB_RESET0_MIPIDSI_RST __BIT(1) + #define AWIN_A31_WDOG1_IRQ_EN_REG 0x00A0 #define AWIN_A31_WDOG1_IRQ_STA_REG 0x00A4 #define AWIN_A31_WDOG1_CTRL_REG 0x00B0 Index: src/sys/arch/arm/allwinner/awin_usb.c diff -u src/sys/arch/arm/allwinner/awin_usb.c:1.14 src/sys/arch/arm/allwinner/awin_usb.c:1.15 --- src/sys/arch/arm/allwinner/awin_usb.c:1.14 Fri Oct 10 07:36:11 2014 +++ src/sys/arch/arm/allwinner/awin_usb.c Sun Oct 12 13:07:45 2014 @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: awin_usb.c,v 1.14 2014/10/10 07:36:11 jmcneill Exp $"); +__KERNEL_RCSID(1, "$NetBSD: awin_usb.c,v 1.15 2014/10/12 13:07:45 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -71,6 +71,7 @@ struct awinusb_softc { bus_space_handle_t usbsc_usb0_phy_csr_bsh; u_int usbsc_number; struct awin_gpio_pindata usbsc_drv_pin; + struct awin_gpio_pindata usbsc_restrict_pin; device_t usbsc_ohci_dev; device_t usbsc_ehci_dev; @@ -283,6 +284,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 bus_size_t awinusb_dram_hpcr_regs[2] = { AWIN_DRAM_HPCR_USB1_REG, AWIN_DRAM_HPCR_USB2_REG, @@ -331,6 +334,22 @@ static const uint32_t awinusb_usb_clk_se AWIN_A31_USB_CLK_USBPHY2_ENABLE | AWIN_A31_USB_CLK_PHY2_ENABLE, }; +static const uint32_t awinusb_usb_ahb_reset_a31[2] = { +#if NOHCI > 0 + AWIN_A31_AHB_RESET0_USBOHCI0_RST | +#endif +#if NEHCI > 0 + AWIN_A31_AHB_RESET0_USBEHCI0_RST | +#endif + 0, +#if NOHCI > 0 + AWIN_A31_AHB_RESET0_USBOHCI1_RST | +#endif +#if NEHCI > 0 + AWIN_A31_AHB_RESET0_USBEHCI1_RST | +#endif + 0, +}; int awinusb_match(device_t parent, cfdata_t cf, void *aux) @@ -374,19 +393,20 @@ awinusb_attach(device_t parent, device_t aprint_normal("\n"); if (awin_chip_id() == AWIN_CHIP_ID_A31) { - /* - * Access to the USB phy is off USB0 so make sure it's on. - */ + /* Enable USB PHY */ awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_ccm_bsh, - AWIN_AHB_GATING0_REG, - awinusb_ahb_gating_a31[loc->loc_port], 0); + AWIN_USB_CLK_REG, awinusb_usb_clk_set_a31[loc->loc_port], + 0); - /* - * Enable the USB phy for this port. - */ + /* AHB gate enable */ awin_reg_set_clear(usbsc->usbsc_bst, aio->aio_ccm_bsh, - AWIN_USB_CLK_REG, awinusb_usb_clk_set_a31[loc->loc_port], + AWIN_AHB_GATING0_REG, + AWIN_A31_AHB_GATING0_USB0 | awinusb_ahb_gating_a31[loc->loc_port], 0); + + /* 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 { /* * Access to the USB phy is off USB0 so make sure it's on. @@ -432,6 +452,13 @@ awinusb_attach(device_t parent, device_t aprint_error_dev(self, "no power gpio found\n"); } + if (awin_gpio_pin_reserve(awinusb_restrictpin_names[loc->loc_port], + &usbsc->usbsc_restrict_pin)) { + awin_gpio_pindata_write(&usbsc->usbsc_restrict_pin, 1); + } else { + aprint_error_dev(self, "no restrict gpio found\n"); + } + /* * Disable interrupts */