Module Name: src Committed By: hkenken Date: Thu Nov 9 05:57:23 UTC 2017
Modified Files: src/sys/arch/arm/imx: files.imx6 imx6_ahcisata.c imx6_axi.c imx6_board.c imx6_ccm.c imx6_ccmreg.h imx6_ccmvar.h imx6_pcie.c imx6_reg.h src/sys/arch/evbarm/conf: CUBOX-I HUMMINGBOARD IMX6UL-STARTER NITROGEN6X src/sys/arch/evbarm/nitrogen6: nitrogen6_usb.c Added Files: src/sys/arch/arm/imx: imx6_usbphy.c imx6_usbphyreg.h Log Message: - Add imxusbphy driver for i.MX6. - Clean up CCM (Clock driver). Add imx6_ccm_analog_read/write() functions. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/imx/files.imx6 cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/imx/imx6_ahcisata.c \ src/sys/arch/arm/imx/imx6_ccmreg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/imx/imx6_axi.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/imx/imx6_board.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/imx/imx6_ccm.c \ src/sys/arch/arm/imx/imx6_reg.h cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/imx/imx6_ccmvar.h \ src/sys/arch/arm/imx/imx6_pcie.c cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/imx/imx6_usbphy.c \ src/sys/arch/arm/imx/imx6_usbphyreg.h cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbarm/conf/CUBOX-I cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/conf/HUMMINGBOARD cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbarm/conf/IMX6UL-STARTER cvs rdiff -u -r1.13 -r1.14 src/sys/arch/evbarm/conf/NITROGEN6X cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/nitrogen6/nitrogen6_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/imx/files.imx6 diff -u src/sys/arch/arm/imx/files.imx6:1.11 src/sys/arch/arm/imx/files.imx6:1.12 --- src/sys/arch/arm/imx/files.imx6:1.11 Fri Sep 8 05:29:12 2017 +++ src/sys/arch/arm/imx/files.imx6 Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -# $NetBSD: files.imx6,v 1.11 2017/09/08 05:29:12 hkenken Exp $ +# $NetBSD: files.imx6,v 1.12 2017/11/09 05:57:23 hkenken Exp $ # # Configuration info for the Freescale i.MX6 # @@ -90,6 +90,11 @@ file arch/arm/imx/if_enet_imx6.c enet device imxusbc { unit, irq } : bus_dma_generic file arch/arm/imx/imx6_usb.c imxusbc +# USB Phy +device imxusbphy +attach imxusbphy at axi +file arch/arm/imx/imx6_usbphy.c imxusbphy + attach ehci at imxusbc with imxehci file arch/arm/imx/imxusb.c imxehci Index: src/sys/arch/arm/imx/imx6_ahcisata.c diff -u src/sys/arch/arm/imx/imx6_ahcisata.c:1.5 src/sys/arch/arm/imx/imx6_ahcisata.c:1.6 --- src/sys/arch/arm/imx/imx6_ahcisata.c:1.5 Fri Jun 9 18:14:59 2017 +++ src/sys/arch/arm/imx/imx6_ahcisata.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ahcisata.c,v 1.5 2017/06/09 18:14:59 ryo Exp $ */ +/* $NetBSD: imx6_ahcisata.c,v 1.6 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2014 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_ahcisata.c,v 1.5 2017/06/09 18:14:59 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_ahcisata.c,v 1.6 2017/11/09 05:57:23 hkenken Exp $"); #include "locators.h" #include "opt_imx.h" @@ -273,9 +273,9 @@ ixm6_ahcisata_init(struct imx_ahci_softc "couldn't enable CCM_ANALOG_PLL_ENET\n"); return -1; } - v = imx6_ccm_read(CCM_ANALOG_PLL_ENET); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_ENET); v |= CCM_ANALOG_PLL_ENET_ENABLE_100M; - imx6_ccm_write(CCM_ANALOG_PLL_ENET, v); + imx6_ccm_analog_write(CCM_ANALOG_PLL_ENET, v); v = iomux_read(IOMUX_GPR13); /* clear */ Index: src/sys/arch/arm/imx/imx6_ccmreg.h diff -u src/sys/arch/arm/imx/imx6_ccmreg.h:1.5 src/sys/arch/arm/imx/imx6_ccmreg.h:1.6 --- src/sys/arch/arm/imx/imx6_ccmreg.h:1.5 Fri Jun 9 18:14:59 2017 +++ src/sys/arch/arm/imx/imx6_ccmreg.h Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccmreg.h,v 1.5 2017/06/09 18:14:59 ryo Exp $ */ +/* $NetBSD: imx6_ccmreg.h,v 1.6 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2014 Ryo Shimizu <r...@nerv.org> @@ -45,14 +45,29 @@ #define IMX6_OSC_FREQ (24 * 1000 * 1000) /* 24MHz */ #endif -#define IMX6_CCM_SIZE 0x8000 - /* 0x00000000 = 0x020c4000 */ #define CCM_CCR 0x00000000 +#define CCM_CCR_RBC_EN __BIT(27) +#define CCM_CCR_REG_BYPASS_COUNT __BITS(26, 21) +#define CCM_CCR_WB_COUNT __BITS(18, 16) +#define CCM_CCR_COSC_EN __BIT(12) +#define CCM_CCR_OSCNT __BITS(7, 0) + #define CCM_CCDR 0x00000004 #define CCM_CSR 0x00000008 #define CCM_CCSR 0x0000000c +#define CCM_CCSR_PLL3_PFD1_DIS_MASK __BIT(15) +#define CCM_CCSR_PLL3_PFD0_DIS_MASK __BIT(14) +#define CCM_CCSR_PLL3_PFD3_DIS_MASK __BIT(13) +#define CCM_CCSR_PLL3_PFD2_DIS_MASK __BIT(12) +#define CCM_CCSR_PLL2_PFD1_594M_DIS_MASK __BIT(11) +#define CCM_CCSR_PLL2_PFD0_DIS_MASK __BIT(10) +#define CCM_CCSR_PLL2_PFD2_DIS_MASK __BIT(9) +#define CCM_CCSR_STEP_SEL __BIT(8) +#define CCM_CCSR_PLL1_SW_CLK_SEL __BIT(2) +#define CCM_CCSR_PLL3_SW_CLK_SEL __BIT(0) #define CCM_CACRR 0x00000010 #define CCM_CACRR_ARM_PODF __BITS(2, 0) + #define CCM_CBCDR 0x00000014 #define CCM_CBCDR_PERIPH_CLK2_PODF __BITS(29, 27) /* source of mmdc_ch1_axi_clk_root */ @@ -64,7 +79,7 @@ #define CCM_CBCDR_AHB_PODF __BITS(12, 10) #define CCM_CBCDR_IPG_PODF __BITS(9, 8) #define CCM_CBCDR_AXI_ALT_SEL __BIT(7) -#define CCM_CBCDR_AXI_SEL __BIT(6) +#define CCM_CBCDR_AXI_SEL __BITS(7, 6) #define CCM_CBCDR_MMDC_CH1_AXI_PODF __BITS(5, 3) #define CCM_CBCDR_PERIPH2_CLK2_PODF __BITS(2, 0) @@ -105,16 +120,22 @@ #define CCM_CSCMR2_LDB_DI0_IPU_DIV __BIT(10) #define CCM_CSCMR2_CAN_CLK_PODF __BITS(7, 2) - #define CCM_CSCDR1 0x00000024 -#define CCM_CSCDR1_VPU_AXI_PODF __BITS(25, 27) -#define CCM_CSCDR1_USDHC4_PODF __BITS(22, 24) -#define CCM_CSCDR1_USDHC3_PODF __BITS(19, 21) -#define CCM_CSCDR1_USDHC2_PODF __BITS(16, 18) +#define CCM_CSCDR1_VPU_AXI_PODF __BITS(27, 25) +#define CCM_CSCDR1_USDHC4_PODF __BITS(24, 22) +#define CCM_CSCDR1_USDHC3_PODF __BITS(21, 19) +#define CCM_CSCDR1_USDHC2_PODF __BITS(18, 16) #define CCM_CSCDR1_USDHC1_PODF __BITS(13, 11) #define CCM_CSCDR1_UART_CLK_PODF __BITS(5, 0) #define CCM_CS1CDR 0x00000028 +#define CCM_CS1CDR_ESAI_CLK_PODF __BITS(27, 25) +#define CCM_CS1CDR_SSI3_CLK_PRED __BITS(24, 22) +#define CCM_CS1CDR_SSI3_CLK_PODF __BITS(21, 16) +#define CCM_CS1CDR_ESAI_CLK_PRED __BITS(11, 9) +#define CCM_CS1CDR_SSI1_CLK_PRED __BITS(8, 6) +#define CCM_CS1CDR_SSI1_CLK_PODF __BITS(5, 0) + #define CCM_CS2CDR 0x0000002c #define CCM_CS2CDR_ENFC_CLK_PODF __BITS(26, 21) #define CCM_CS2CDR_ENFC_CLK_PRED __BITS(20, 18) @@ -123,7 +144,17 @@ #define CCM_CS2CDR_LDB_DI0_CLK_SEL __BITS(11, 9) #define CCM_CS2CDR_SSI2_CLK_PRED __BITS(8, 6) #define CCM_CS2CDR_SSI2_CLK_PODF __BITS(5, 0) + #define CCM_CDCDR 0x00000030 +#define CCM_CDCDR_HSI_TX_PODF __BITS(31, 29) +#define CCM_CDCDR_HSI_TX_CLK_SEL __BIT(28) +#define CCM_CDCDR_SPDIF0_CLK_PRED __BITS(27, 25) +#define CCM_CDCDR_SPDIF0_CLK_PODF __BITS(24, 22) +#define CCM_CDCDR_SPDIF0_CLK_SEL __BITS(21, 20) +#define CCM_CDCDR_SPDIF1_CLK_PRED __BITS(14, 12) +#define CCM_CDCDR_SPDIF1_CLK_PODF __BITS(11, 9) +#define CCM_CDCDR_SPDIF1_CLK_SEL __BITS(8, 7) + #define CCM_CHSCCDR 0x00000034 #define CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL __BITS(17, 15) #define CCM_CHSCCDR_IPU1_DI1_PODF __BITS(14, 12) @@ -134,12 +165,38 @@ #define CCM_CSCDR2 0x00000038 +#define CCM_CSCDR2_ECSPI_CLK_PODF __BITS(24, 19) +#define CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL __BITS(17, 15) +#define CCM_CSCDR2_IPU2_DI1_PODF __BITS(14, 12) +#define CCM_CSCDR2_IPU2_DI1_CLK_SEL __BITS(11, 9) +#define CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL __BITS(8, 6) +#define CCM_CSCDR2_IPU2_DI0_PODF __BITS(5, 3) +#define CCM_CSCDR2_IPU2_DI0_CLK_SEL __BITS(2, 0) + +#define CCM_CDHIPR 0x00000048 +#define CCM_CDHIPR_ARM_PODF_BUSY __BIT(16) +#define CCM_CDHIPR_PERIPH_CLK_SEL_BUSY __BIT(5) +#define CCM_CDHIPR_MMDC_CH0_PODF_BUSY __BIT(4) +#define CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY __BIT(3) +#define CCM_CDHIPR_MMDC_CH1_PODF_BUSY __BIT(2) +#define CCM_CDHIPR_AHB_PODF_BUSY __BIT(1) +#define CCM_CDHIPR_AXI_PODF_BUSY __BIT(0) + #define CCM_CSCDR3 0x0000003c #define CCM_CSCDR3_IPU2_HSP_PODF __BITS(18, 16) #define CCM_CSCDR3_IPU2_HSP_CLK_SEL __BITS(15, 14) #define CCM_CSCDR3_IPU1_HSP_PODF __BITS(13, 11) #define CCM_CSCDR3_IPU1_HSP_CLK_SEL __BITS(10, 9) +#define CCM_CCOSR 0x00000060 +#define CCM_CCOSR_CLKO2_EN __BIT(24) +#define CCM_CCOSR_CLKO2_DIV __BITS(23, 21) +#define CCM_CCOSR_CLKO2_SEL __BITS(20, 16) +#define CCM_CCOSR_CLK_OUT_SEL __BIT(8) +#define CCM_CCOSR_CLKO1_EN __BIT(7) +#define CCM_CCOSR_CLKO1_DIV __BITS(6, 4) +#define CCM_CCOSR_CLKO1_SEL __BITS(3, 0) + #define CCM_CCGR2 0x00000070 #define CCM_CCGR2_IPSYNC_VDOA_IPG_CLK_ENABLE(n) __SHIFTIN(n, __BITS(27, 26)) #define CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_CLK_ENABLE(n) __SHIFTIN(n, __BITS(25, 24)) @@ -192,60 +249,92 @@ #define CCM_CCGR6_USDHC1_CLK_ENABLE(n) __SHIFTIN(n, __BITS(3, 2)) #define CCM_CCGR6_USBOH3_CLK_ENABLE(n) __SHIFTIN(n, __BITS(1, 0)) - /* 0x00004000 = 0x020c8000 */ -#define CCM_ANALOG_PLL_ARM 0x00004000 /* = 020c8000 */ -#define CCM_ANALOG_PLL_ARM_SET 0x00004004 -#define CCM_ANALOG_PLL_ARM_CLR 0x00004008 -#define CCM_ANALOG_PLL_ARM_TOG 0x0000400c +#define CCM_ANALOG_PLL_ARM 0x00000000 /* = 020c8000 */ +#define CCM_ANALOG_PLL_ARM_LOCK __BIT(31) +#define CCM_ANALOG_PLL_ARM_PLL_SEL __BIT(19) +#define CCM_ANALOG_PLL_ARM_LVDS_24MHZ_SEL __BIT(18) +#define CCM_ANALOG_PLL_ARM_LVDS_SEL __BIT(17) +#define CCM_ANALOG_PLL_ARM_BYPASS __BIT(16) +#define CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC __BITS(15, 14) +#define CCM_ANALOG_PLL_ARM_ENABLE __BIT(13) +#define CCM_ANALOG_PLL_ARM_POWERDOWN __BIT(12) #define CCM_ANALOG_PLL_ARM_DIV_SELECT __BITS(6, 0) -#define CCM_ANALOG_PLL_USB1 0x00004010 -#define CCM_ANALOG_PLL_USB1_SET 0x00004014 -#define CCM_ANALOG_PLL_USB1_CLR 0x00004018 -#define CCM_ANALOG_PLL_USB1_TOG 0x0000401c + +#define CCM_ANALOG_PLL_ARM_SET 0x00000004 +#define CCM_ANALOG_PLL_ARM_CLR 0x00000008 +#define CCM_ANALOG_PLL_ARM_TOG 0x0000000c +#define CCM_ANALOG_PLL_ARM_DIV_SELECT __BITS(6, 0) + +#define CCM_ANALOG_PLL_USB1 0x00000010 +#define CCM_ANALOG_PLL_USB1_SET 0x00000014 +#define CCM_ANALOG_PLL_USB1_CLR 0x00000018 +#define CCM_ANALOG_PLL_USB1_TOG 0x0000001c +#define CCM_ANALOG_PLL_USB1_LOCK __BIT(31) +#define CCM_ANALOG_PLL_USB1_BYPASS __BIT(16) +#define CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC __BITS(15, 14) +#define CCM_ANALOG_PLL_USB1_ENABLE __BIT(13) +#define CCM_ANALOG_PLL_USB1_POWER __BIT(12) +#define CCM_ANALOG_PLL_USB1_EN_USB_CLK __BIT(6) #define CCM_ANALOG_PLL_USB1_DIV_SELECT __BITS(1, 0) -#define CCM_ANALOG_PLL_USB2 0x00004020 -#define CCM_ANALOG_PLL_USB2_SET 0x00004024 -#define CCM_ANALOG_PLL_USB2_CLR 0x00004028 -#define CCM_ANALOG_PLL_USB2_TOG 0x0000402c + +#define CCM_ANALOG_PLL_USB2 0x00000020 +#define CCM_ANALOG_PLL_USB2_SET 0x00000024 +#define CCM_ANALOG_PLL_USB2_CLR 0x00000028 +#define CCM_ANALOG_PLL_USB2_TOG 0x0000002c +#define CCM_ANALOG_PLL_USB2_LOCK __BIT(31) +#define CCM_ANALOG_PLL_USB2_BYPASS __BIT(16) +#define CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC __BITS(15, 14) +#define CCM_ANALOG_PLL_USB2_ENABLE __BIT(13) +#define CCM_ANALOG_PLL_USB2_POWER __BIT(12) +#define CCM_ANALOG_PLL_USB2_EN_USB_CLK __BIT(6) +#define CCM_ANALOG_PLL_USB2_DIV_SELECT __BITS(1, 0) + #define CCM_ANALOG_PLL_USBn_LOCK __BIT(31) #define CCM_ANALOG_PLL_USBn_BYPASS __BIT(16) +#define CCM_ANALOG_PLL_USBn_BYPASS_CLK_SRC __BITS(15, 14) #define CCM_ANALOG_PLL_USBn_ENABLE __BIT(13) #define CCM_ANALOG_PLL_USBn_POWER __BIT(12) #define CCM_ANALOG_PLL_USBn_EN_USB_CLK __BIT(6) -#define CCM_ANALOG_PLL_USBn_DIV_SELECT(n) __BITS(1, 0) -#define CCM_ANALOG_PLL_SYS 0x00004030 -#define CCM_ANALOG_PLL_SYS_SET 0x00004034 -#define CCM_ANALOG_PLL_SYS_CLR 0x00004038 -#define CCM_ANALOG_PLL_SYS_TOG 0x0000403c +#define CCM_ANALOG_PLL_USBn_DIV_SELECT __BITS(1, 0) + +#define CCM_ANALOG_PLL_SYS 0x00000030 +#define CCM_ANALOG_PLL_SYS_SET 0x00000034 +#define CCM_ANALOG_PLL_SYS_CLR 0x00000038 +#define CCM_ANALOG_PLL_SYS_TOG 0x0000003c +#define CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC __BITS(15, 14) #define CCM_ANALOG_PLL_SYS_ENABLE __BIT(13) #define CCM_ANALOG_PLL_SYS_DIV_SELECT __BIT(0) -#define CCM_ANALOG_PLL_SYS_SS 0x00004040 -#define CCM_ANALOG_PLL_SYS_NUM 0x00004050 -#define CCM_ANALOG_PLL_SYS_DENOM 0x00004060 -#define CCM_ANALOG_PLL_AUDIO 0x00004070 -#define CCM_ANALOG_PLL_AUDIO_SET 0x00004074 -#define CCM_ANALOG_PLL_AUDIO_CLR 0x00004078 -#define CCM_ANALOG_PLL_AUDIO_TOG 0x0000407c +#define CCM_ANALOG_PLL_SYS_SS 0x00000040 +#define CCM_ANALOG_PLL_SYS_NUM 0x00000050 +#define CCM_ANALOG_PLL_SYS_DENOM 0x00000060 +#define CCM_ANALOG_PLL_AUDIO 0x00000070 +#define CCM_ANALOG_PLL_AUDIO_SET 0x00000074 +#define CCM_ANALOG_PLL_AUDIO_CLR 0x00000078 +#define CCM_ANALOG_PLL_AUDIO_TOG 0x0000007c #define CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT __BITS(20, 19) +#define CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC __BITS(15, 14) +#define CCM_ANALOG_PLL_AUDIO_ENABLE __BIT(13) #define CCM_ANALOG_PLL_AUDIO_DIV_SELECT __BITS(6, 0) -#define CCM_ANALOG_PLL_AUDIO_NUM 0x00004080 -#define CCM_ANALOG_PLL_AUDIO_DENOM 0x00004090 -#define CCM_ANALOG_PLL_VIDEO 0x000040a0 +#define CCM_ANALOG_PLL_AUDIO_NUM 0x00000080 +#define CCM_ANALOG_PLL_AUDIO_DENOM 0x00000090 +#define CCM_ANALOG_PLL_VIDEO 0x000000a0 #define CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT __BITS(20, 19) +#define CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC __BITS(15, 14) +#define CCM_ANALOG_PLL_VIDEO_ENABLE __BIT(13) #define CCM_ANALOG_PLL_VIDEO_DIV_SELECT __BITS(6, 0) -#define CCM_ANALOG_PLL_VIDEO_SET 0x000040a4 -#define CCM_ANALOG_PLL_VIDEO_CLR 0x000040a8 -#define CCM_ANALOG_PLL_VIDEO_TOG 0x000040ac -#define CCM_ANALOG_PLL_VIDEO_NUM 0x000040b0 -#define CCM_ANALOG_PLL_VIDEO_DENOM 0x000040c0 -#define CCM_ANALOG_PLL_MLB 0x000040d0 -#define CCM_ANALOG_PLL_MLB_SET 0x000040d4 -#define CCM_ANALOG_PLL_MLB_CLR 0x000040d8 -#define CCM_ANALOG_PLL_MLB_TOG 0x000040dc -#define CCM_ANALOG_PLL_ENET 0x000040e0 -#define CCM_ANALOG_PLL_ENET_SET 0x000040e4 -#define CCM_ANALOG_PLL_ENET_CLR 0x000040e8 -#define CCM_ANALOG_PLL_ENET_TOG 0x000040ec +#define CCM_ANALOG_PLL_VIDEO_SET 0x000000a4 +#define CCM_ANALOG_PLL_VIDEO_CLR 0x000000a8 +#define CCM_ANALOG_PLL_VIDEO_TOG 0x000000ac +#define CCM_ANALOG_PLL_VIDEO_NUM 0x000000b0 +#define CCM_ANALOG_PLL_VIDEO_DENOM 0x000000c0 +#define CCM_ANALOG_PLL_MLB 0x000000d0 +#define CCM_ANALOG_PLL_MLB_SET 0x000000d4 +#define CCM_ANALOG_PLL_MLB_CLR 0x000000d8 +#define CCM_ANALOG_PLL_MLB_TOG 0x000000dc +#define CCM_ANALOG_PLL_ENET 0x000000e0 +#define CCM_ANALOG_PLL_ENET_SET 0x000000e4 +#define CCM_ANALOG_PLL_ENET_CLR 0x000000e8 +#define CCM_ANALOG_PLL_ENET_TOG 0x000000ec #define CCM_ANALOG_PLL_ENET_LOCK __BIT(31) #define CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN __BIT(21) /* iMX6UL */ #define CCM_ANALOG_PLL_ENET_ENET2_125M_EN __BIT(20) /* iMX6UL */ @@ -253,7 +342,7 @@ #define CCM_ANALOG_PLL_ENET_ENABLE_125M __BIT(19) /* PCIe */ #define CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN __BIT(18) #define CCM_ANALOG_PLL_ENET_BYPASS __BIT(16) -#define CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC(s) __SHIFTIN(s, __BITS(15, 14)) +#define CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC __BITS(15, 14) #define CCM_ANALOG_PLL_ENET_ENET1_125M_EN __BIT(13) /* iMX6UL */ #define CCM_ANALOG_PLL_ENET_ENABLE __BIT(13) /* Ether */ #define CCM_ANALOG_PLL_ENET_POWERDOWN __BIT(12) @@ -261,10 +350,10 @@ #define CCM_ANALOG_PLL_ENET1_DIV_SELECT_MASK __BITS(3, 2) #define CCM_ANALOG_PLL_ENET_DIV_SELECT(d) __SHIFTIN(d, __BITS(1, 0)) #define CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK __BITS(1, 0) -#define CCM_ANALOG_PFD_480 0x000040f0 -#define CCM_ANALOG_PFD_480_SET 0x000040f4 -#define CCM_ANALOG_PFD_480_CLR 0x000040f8 -#define CCM_ANALOG_PFD_480_TOG 0x000040fc +#define CCM_ANALOG_PFD_480 0x000000f0 +#define CCM_ANALOG_PFD_480_SET 0x000000f4 +#define CCM_ANALOG_PFD_480_CLR 0x000000f8 +#define CCM_ANALOG_PFD_480_TOG 0x000000fc #define CCM_ANALOG_PFD_480_PFD3_CLKGATE __BIT(31) #define CCM_ANALOG_PFD_480_PFD3_STABLE __BIT(30) #define CCM_ANALOG_PFD_480_PFD3_FRAC __BITS(29, 24) @@ -277,10 +366,10 @@ #define CCM_ANALOG_PFD_480_PFD0_CLKGATE __BIT(7) #define CCM_ANALOG_PFD_480_PFD0_STABLE __BIT(6) #define CCM_ANALOG_PFD_480_PFD0_FRAC __BITS(5, 0) -#define CCM_ANALOG_PFD_528 0x00004100 -#define CCM_ANALOG_PFD_528_SET 0x00004104 -#define CCM_ANALOG_PFD_528_CLR 0x00004108 -#define CCM_ANALOG_PFD_528_TOG 0x0000410c +#define CCM_ANALOG_PFD_528 0x00000100 +#define CCM_ANALOG_PFD_528_SET 0x00000104 +#define CCM_ANALOG_PFD_528_CLR 0x00000108 +#define CCM_ANALOG_PFD_528_TOG 0x0000010c #define CCM_ANALOG_PFD_528_PFD2_CLKGATE __BIT(23) #define CCM_ANALOG_PFD_528_PFD2_STABLE __BIT(22) #define CCM_ANALOG_PFD_528_PFD2_FRAC __BITS(21, 16) @@ -290,14 +379,14 @@ #define CCM_ANALOG_PFD_528_PFD0_CLKGATE __BIT(7) #define CCM_ANALOG_PFD_528_PFD0_STABLE __BIT(6) #define CCM_ANALOG_PFD_528_PFD0_FRAC __BITS(5, 0) -#define CCM_ANALOG_MISC0 0x00004150 -#define CCM_ANALOG_MISC0_SET 0x00004154 -#define CCM_ANALOG_MISC0_CLR 0x00004158 -#define CCM_ANALOG_MISC0_TOG 0x0000415c -#define CCM_ANALOG_MISC1 0x00004160 -#define CCM_ANALOG_MISC1_SET 0x00004164 -#define CCM_ANALOG_MISC1_CLR 0x00004168 -#define CCM_ANALOG_MISC1_TOG 0x0000416c +#define CCM_ANALOG_MISC0 0x00000150 +#define CCM_ANALOG_MISC0_SET 0x00000154 +#define CCM_ANALOG_MISC0_CLR 0x00000158 +#define CCM_ANALOG_MISC0_TOG 0x0000015c +#define CCM_ANALOG_MISC1 0x00000160 +#define CCM_ANALOG_MISC1_SET 0x00000164 +#define CCM_ANALOG_MISC1_CLR 0x00000168 +#define CCM_ANALOG_MISC1_TOG 0x0000016c #define CCM_ANALOG_MISC1_LVDS_CLK1_SRC __BITS(4, 0) #define CCM_ANALOG_MISC1_LVDS_CLK1_SRC_PCIE __SHIFTIN(0xa, CCM_ANALOG_MISC1_LVDS_CLK1_SRC) #define CCM_ANALOG_MISC1_LVDS_CLK1_SRC_SATA __SHIFTIN(0xb, CCM_ANALOG_MISC1_LVDS_CLK1_SRC) @@ -305,91 +394,39 @@ #define CCM_ANALOG_MISC1_LVDS_CLK2_OBEN __BIT(11) #define CCM_ANALOG_MISC1_LVDS_CLK1_IBEN __BIT(12) #define CCM_ANALOG_MISC1_LVDS_CLK2_IBEN __BIT(13) -#define CCM_ANALOG_MISC2 0x00004170 -#define CCM_ANALOG_MISC2_SET 0x00004174 -#define CCM_ANALOG_MISC2_CLR 0x00004178 -#define CCM_ANALOG_MISC2_TOG 0x0000417C +#define CCM_ANALOG_MISC2 0x00000170 +#define CCM_ANALOG_MISC2_SET 0x00000174 +#define CCM_ANALOG_MISC2_CLR 0x00000178 +#define CCM_ANALOG_MISC2_TOG 0x0000017C -#define CCM_TEMPMON_TEMPSENSE0 0x00004180 +#define CCM_TEMPMON_TEMPSENSE0 0x00000180 #define CCM_TEMPMON_TEMPSENSE0_ALARM_VALUE __BIT(31, 30) #define CCM_TEMPMON_TEMPSENSE0_TEMP_CNT __BITS(19, 8) #define CCM_TEMPMON_TEMPSENSE0_FINISHED __BIT(2) #define CCM_TEMPMON_TEMPSENSE0_MEASURE_TEMP __BIT(1) #define CCM_TEMPMON_TEMPSENSE0_POWER_DOWN __BIT(0) -#define CCM_TEMPMON_TEMPSENSE1 0x00004180 +#define CCM_TEMPMON_TEMPSENSE1 0x00000180 #define CCM_TEMPMON_TEMPSENSE1_MEASURE_FREQ __BITS(15, 0) -#define USB_ANALOG_USB1_VBUS_DETECT 0x000041a0 -#define USB_ANALOG_USB1_CHRG_DETECT 0x000041b0 +#define USB_ANALOG_USB1_VBUS_DETECT 0x000001a0 +#define USB_ANALOG_USB1_CHRG_DETECT 0x000001b0 #define USB_ANALOG_USB_CHRG_DETECT_EN_B __BIT(20) #define USB_ANALOG_USB_CHRG_DETECT_CHK_CHRG_B __BIT(19) #define USB_ANALOG_USB_CHRG_DETECT_CHK_CHK_CONTACT __BIT(18) -#define USB_ANALOG_USB1_VBUS_DETECT_STAT 0x000041c0 -#define USB_ANALOG_USB1_CHRG_DETECT_STAT 0x000041d0 -#define USB_ANALOG_USB1_MISC 0x000041f0 -#define USB_ANALOG_USB2_VBUS_DETECT 0x00004200 -#define USB_ANALOG_USB2_CHRG_DETECT 0x00004210 -#define USB_ANALOG_USB2_VBUS_DETECT_STAT 0x00004220 -#define USB_ANALOG_USB2_CHRG_DETECT_STAT 0x00004230 -#define USB_ANALOG_USB2_MISC 0x00004250 +#define USB_ANALOG_USB1_VBUS_DETECT_STAT 0x000001c0 +#define USB_ANALOG_USB1_CHRG_DETECT_STAT 0x000001d0 +#define USB_ANALOG_USB1_MISC 0x000001f0 +#define USB_ANALOG_USB2_VBUS_DETECT 0x00000200 +#define USB_ANALOG_USB2_CHRG_DETECT 0x00000210 +#define USB_ANALOG_USB2_VBUS_DETECT_STAT 0x00000220 +#define USB_ANALOG_USB2_CHRG_DETECT_STAT 0x00000230 +#define USB_ANALOG_USB2_MISC 0x00000250 -#define USB_ANALOG_DIGPROG 0x00004260 -#define USB_ANALOG_DIGPROG_SOLOLITE 0x00004280 +#define USB_ANALOG_DIGPROG 0x00000260 +#define USB_ANALOG_DIGPROG_SOLOLITE 0x00000280 #define USB_ANALOG_DIGPROG_MAJOR __BITS(23, 8) #define USB_ANALOG_DIGPROG_MINOR __BITS(7, 0) - /* 0x00005000 = 0x020c9000 */ -#define USBPHY1_PWD 0x00005000 /* = 020c9000 */ -#define USBPHY1_PWD_SET 0x00005004 -#define USBPHY1_PWD_CLR 0x00005008 -#define USBPHY1_PWD_TOG 0x0000500c -#define USBPHY1_TX 0x00005010 -#define USBPHY1_TX_SET 0x00005014 -#define USBPHY1_TX_CLR 0x00005018 -#define USBPHY1_TX_TOG 0x0000501c -#define USBPHY_TX_USBPHY_TX_EDGECTRL __BITS(28, 26) -#define USBPHY_TX_TXCAL45DP __BITS(19, 16) -#define USBPHY_TX_TXCAL45DN __BITS(11, 8) -#define USBPHY_TX_D_CAL __BITS(3, 0) -#define USBPHY1_RX 0x00005020 -#define USBPHY1_RX_SET 0x00005024 -#define USBPHY1_RX_CLR 0x00005028 -#define USBPHY1_RX_TOG 0x0000502c -#define USBPHY1_CTRL 0x00005030 -#define USBPHY1_CTRL_SET 0x00005034 -#define USBPHY1_CTRL_CLR 0x00005038 -#define USBPHY1_CTRL_TOG 0x0000503c -#define USBPHY_CTRL_SFTRST __BIT(31) -#define USBPHY_CTRL_CLKGATE __BIT(30) -#define USBPHY_CTRL_ENUTMILEVEL3 __BIT(15) -#define USBPHY_CTRL_ENUTMILEVEL2 __BIT(14) -#define USBPHY1_STATUS 0x00005040 -#define USBPHY1_DEBUG 0x00005050 -#define USBPHY1_DEBUG0_STATUS 0x00005060 -#define USBPHY1_DEBUG1 0x00005070 -#define USBPHY1_VERSION 0x00005080 -#define USBPHY2_PWD 0x00006000 /* = 020ca000 */ -#define USBPHY2_PWD_SET 0x00006004 -#define USBPHY2_PWD_CLR 0x00006008 -#define USBPHY2_PWD_TOG 0x0000600c -#define USBPHY2_TX 0x00006010 -#define USBPHY2_TX_SET 0x00006014 -#define USBPHY2_TX_CLR 0x00006018 -#define USBPHY2_TX_TOG 0x0000601c -#define USBPHY2_RX 0x00006020 -#define USBPHY2_RX_SET 0x00006024 -#define USBPHY2_RX_CLR 0x00006028 -#define USBPHY2_RX_TOG 0x0000602c -#define USBPHY2_CTRL 0x00006030 -#define USBPHY2_CTRL_SET 0x00006034 -#define USBPHY2_CTRL_CLR 0x00006038 -#define USBPHY2_CTRL_TOG 0x0000603c -#define USBPHY2_STATUS 0x00006040 -#define USBPHY2_DEBUG 0x00006050 -#define USBPHY2_DEBUG0_STATUS 0x00006060 -#define USBPHY2_DEBUG1 0x00006070 -#define USBPHY2_VERSION 0x00006080 - #endif /* _ARM_IMX_IMX6_CCMREG_H */ Index: src/sys/arch/arm/imx/imx6_axi.c diff -u src/sys/arch/arm/imx/imx6_axi.c:1.3 src/sys/arch/arm/imx/imx6_axi.c:1.4 --- src/sys/arch/arm/imx/imx6_axi.c:1.3 Thu Aug 17 09:11:04 2017 +++ src/sys/arch/arm/imx/imx6_axi.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_axi.c,v 1.3 2017/08/17 09:11:04 hkenken Exp $ */ +/* $NetBSD: imx6_axi.c,v 1.4 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2014 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_axi.c,v 1.3 2017/08/17 09:11:04 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_axi.c,v 1.4 2017/11/09 05:57:23 hkenken Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -103,7 +103,8 @@ axi_critical_search(device_t parent, str (strcmp(cf->cf_name, "imxgpio") != 0) && (strcmp(cf->cf_name, "imxiomux") != 0) && (strcmp(cf->cf_name, "imxocotp") != 0) && - (strcmp(cf->cf_name, "imxuart") != 0)) + (strcmp(cf->cf_name, "imxuart") != 0) && + (strcmp(cf->cf_name, "imxusbphy") != 0)) return 0; aa->aa_name = cf->cf_name; Index: src/sys/arch/arm/imx/imx6_board.c diff -u src/sys/arch/arm/imx/imx6_board.c:1.8 src/sys/arch/arm/imx/imx6_board.c:1.9 --- src/sys/arch/arm/imx/imx6_board.c:1.8 Fri Jun 9 18:14:59 2017 +++ src/sys/arch/arm/imx/imx6_board.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_board.c,v 1.8 2017/06/09 18:14:59 ryo Exp $ */ +/* $NetBSD: imx6_board.c,v 1.9 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2012 Genetec Corporation. All rights reserved. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: imx6_board.c,v 1.8 2017/06/09 18:14:59 ryo Exp $"); +__KERNEL_RCSID(1, "$NetBSD: imx6_board.c,v 1.9 2017/11/09 05:57:23 hkenken Exp $"); #include "opt_imx.h" #include "arml2cc.h" @@ -189,7 +189,7 @@ imx6_armrootclk(void) uint32_t v; v = bus_space_read_4(imx6_ioreg_bst, imx6_ioreg_bsh, - AIPS1_CCM_BASE + CCM_ANALOG_PLL_ARM); + AIPS1_CCM_ANALOG_BASE + CCM_ANALOG_PLL_ARM); clk = IMX6_OSC_FREQ * (v & CCM_ANALOG_PLL_ARM_DIV_SELECT) / 2; v = bus_space_read_4(imx6_ioreg_bst, imx6_ioreg_bsh, AIPS1_CCM_BASE + CCM_CACRR); Index: src/sys/arch/arm/imx/imx6_ccm.c diff -u src/sys/arch/arm/imx/imx6_ccm.c:1.6 src/sys/arch/arm/imx/imx6_ccm.c:1.7 --- src/sys/arch/arm/imx/imx6_ccm.c:1.6 Fri Jun 9 18:14:59 2017 +++ src/sys/arch/arm/imx/imx6_ccm.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccm.c,v 1.6 2017/06/09 18:14:59 ryo Exp $ */ +/* $NetBSD: imx6_ccm.c,v 1.7 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2010-2012, 2014 Genetec Corporation. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.6 2017/06/09 18:14:59 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.7 2017/11/09 05:57:23 hkenken Exp $"); #include "opt_imx.h" #include "opt_imx6clk.h" @@ -63,6 +63,7 @@ struct imxccm_softc { device_t sc_dev; bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; + bus_space_handle_t sc_ioh_analog; /* for sysctl */ struct sysctllog *sc_log; @@ -118,8 +119,15 @@ imxccm_attach(device_t parent, device_t sc->sc_iot = iot; sc->sc_log = NULL; - if (bus_space_map(iot, aa->aa_addr, IMX6_CCM_SIZE, 0, &sc->sc_ioh)) { - aprint_error(": can't map registers\n"); + if (bus_space_map(iot, aa->aa_addr, AIPS1_CCM_SIZE, 0, &sc->sc_ioh)) { + aprint_error(": can't map CCM registers\n"); + return; + } + + if (bus_space_map(iot, IMX6_AIPS1_BASE + AIPS1_CCM_ANALOG_BASE, + AIPS1_CCM_ANALOG_SIZE, 0, &sc->sc_ioh_analog)) { + aprint_error(": can't map CCM_ANALOG registers\n"); + bus_space_unmap(iot, sc->sc_ioh, AIPS1_CCM_SIZE); return; } @@ -414,8 +422,29 @@ imx6_ccm_write(uint32_t reg, uint32_t va bus_space_write_4(ccm_softc->sc_iot, ccm_softc->sc_ioh, reg, val); } + +uint32_t +imx6_ccm_analog_read(uint32_t reg) +{ + if (ccm_softc == NULL) + return 0; + + return bus_space_read_4(ccm_softc->sc_iot, ccm_softc->sc_ioh_analog, + reg); +} + +void +imx6_ccm_analog_write(uint32_t reg, uint32_t val) +{ + if (ccm_softc == NULL) + return; + + bus_space_write_4(ccm_softc->sc_iot, ccm_softc->sc_ioh_analog, reg, + val); +} + int -imx6_set_clock(enum imx6_clock clk, uint32_t freq) +imx6_set_clock(enum imx6_clock_id clk, uint32_t freq) { uint32_t v; @@ -434,11 +463,13 @@ imx6_set_clock(enum imx6_clock clk, uint v = imx6_ccm_read(CCM_CACRR); v &= ~CCM_CACRR_ARM_PODF; - imx6_ccm_write(CCM_CACRR, v | __SHIFTIN(cacrr, CCM_CACRR_ARM_PODF)); + imx6_ccm_write(CCM_CACRR, + v | __SHIFTIN(cacrr, CCM_CACRR_ARM_PODF)); - v = imx6_ccm_read(CCM_ANALOG_PLL_ARM); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_ARM); v &= ~CCM_ANALOG_PLL_ARM_DIV_SELECT; - imx6_ccm_write(CCM_ANALOG_PLL_ARM, v | __SHIFTIN(pll, CCM_ANALOG_PLL_ARM_DIV_SELECT)); + imx6_ccm_analog_write(CCM_ANALOG_PLL_ARM, + v | __SHIFTIN(pll, CCM_ANALOG_PLL_ARM_DIV_SELECT)); v = imx6_get_clock(IMX6CLK_ARM_ROOT); cpufreq_set_all(v); @@ -462,7 +493,7 @@ imx6_set_clock(enum imx6_clock clk, uint } uint32_t -imx6_get_clock(enum imx6_clock clk) +imx6_get_clock(enum imx6_clock_id clk) { uint32_t d, denom, num, sel, v; uint64_t freq; @@ -473,33 +504,33 @@ imx6_get_clock(enum imx6_clock clk) switch (clk) { /* CLOCK SWITCHER */ case IMX6CLK_PLL1: - v = imx6_ccm_read(CCM_ANALOG_PLL_ARM); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_ARM); freq = IMX6_OSC_FREQ * (v & CCM_ANALOG_PLL_ARM_DIV_SELECT) / 2; break; case IMX6CLK_PLL2: - v = imx6_ccm_read(CCM_ANALOG_PLL_SYS); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_SYS); freq = IMX6_OSC_FREQ * ((v & CCM_ANALOG_PLL_SYS_DIV_SELECT) ? 22 : 20); break; case IMX6CLK_PLL3: - v = imx6_ccm_read(CCM_ANALOG_PLL_USB1); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_USB1); freq = IMX6_OSC_FREQ * ((v & CCM_ANALOG_PLL_USB1_DIV_SELECT) ? 22 : 20); break; case IMX6CLK_PLL4: - v = imx6_ccm_read(CCM_ANALOG_PLL_AUDIO); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_AUDIO); d = __SHIFTOUT(v, CCM_ANALOG_PLL_AUDIO_DIV_SELECT); - num = imx6_ccm_read(CCM_ANALOG_PLL_AUDIO_NUM); - denom = imx6_ccm_read(CCM_ANALOG_PLL_AUDIO_DENOM); + num = imx6_ccm_analog_read(CCM_ANALOG_PLL_AUDIO_NUM); + denom = imx6_ccm_analog_read(CCM_ANALOG_PLL_AUDIO_DENOM); freq = (uint64_t)IMX6_OSC_FREQ * (d + num / denom); d = __SHIFTOUT(v, CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT); freq = freq >> (2 - d); break; case IMX6CLK_PLL5: - v = imx6_ccm_read(CCM_ANALOG_PLL_VIDEO); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_VIDEO); d = __SHIFTOUT(v, CCM_ANALOG_PLL_VIDEO_DIV_SELECT); - num = imx6_ccm_read(CCM_ANALOG_PLL_VIDEO_NUM); - denom = imx6_ccm_read(CCM_ANALOG_PLL_VIDEO_DENOM); + num = imx6_ccm_analog_read(CCM_ANALOG_PLL_VIDEO_NUM); + denom = imx6_ccm_analog_read(CCM_ANALOG_PLL_VIDEO_DENOM); freq = (uint64_t)IMX6_OSC_FREQ * (d + num / denom); d = __SHIFTOUT(v, CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT); freq = freq >> (2 - d); @@ -507,7 +538,7 @@ imx6_get_clock(enum imx6_clock clk) case IMX6CLK_PLL6: /* XXX: iMX6UL has 2 div. which? */ - v = imx6_ccm_read(CCM_ANALOG_PLL_ENET); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_ENET); switch (v & CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK) { case 0: freq = 25 * 1000 * 1000; @@ -524,8 +555,8 @@ imx6_get_clock(enum imx6_clock clk) } break; case IMX6CLK_PLL7: - v = imx6_ccm_read(CCM_ANALOG_PLL_USB2); - freq = IMX6_OSC_FREQ * ((v & CCM_ANALOG_PLL_USBn_DIV_SELECT(1)) ? 22 : 20); + v = imx6_ccm_analog_read(CCM_ANALOG_PLL_USB2); + freq = IMX6_OSC_FREQ * ((v & CCM_ANALOG_PLL_USBn_DIV_SELECT) ? 22 : 20); break; #if 0 @@ -536,37 +567,37 @@ imx6_get_clock(enum imx6_clock clk) case IMX6CLK_PLL2_PFD0: freq = imx6_get_clock(IMX6CLK_PLL2); - v = imx6_ccm_read(CCM_ANALOG_PFD_528); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_528); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_528_PFD0_FRAC); break; case IMX6CLK_PLL2_PFD1: freq = imx6_get_clock(IMX6CLK_PLL2); - v = imx6_ccm_read(CCM_ANALOG_PFD_528); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_528); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_528_PFD1_FRAC); break; case IMX6CLK_PLL2_PFD2: freq = imx6_get_clock(IMX6CLK_PLL2); - v = imx6_ccm_read(CCM_ANALOG_PFD_528); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_528); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_528_PFD2_FRAC); break; case IMX6CLK_PLL3_PFD3: freq = imx6_get_clock(IMX6CLK_PLL3); - v = imx6_ccm_read(CCM_ANALOG_PFD_480); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_480); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_480_PFD3_FRAC); break; case IMX6CLK_PLL3_PFD2: freq = imx6_get_clock(IMX6CLK_PLL3); - v = imx6_ccm_read(CCM_ANALOG_PFD_480); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_480); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_480_PFD2_FRAC); break; case IMX6CLK_PLL3_PFD1: freq = imx6_get_clock(IMX6CLK_PLL3); - v = imx6_ccm_read(CCM_ANALOG_PFD_480); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_480); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_480_PFD1_FRAC); break; case IMX6CLK_PLL3_PFD0: freq = imx6_get_clock(IMX6CLK_PLL3); - v = imx6_ccm_read(CCM_ANALOG_PFD_480); + v = imx6_ccm_analog_read(CCM_ANALOG_PFD_480); freq = freq * 18 / __SHIFTOUT(v, CCM_ANALOG_PFD_480_PFD0_FRAC); break; @@ -865,26 +896,26 @@ imx6_pll_power(uint32_t pllreg, int on, switch (pllreg) { case CCM_ANALOG_PLL_USB1: case CCM_ANALOG_PLL_USB2: - v = imx6_ccm_read(pllreg); + v = imx6_ccm_analog_read(pllreg); if (on) { v |= en; v &= ~CCM_ANALOG_PLL_USBn_BYPASS; } else { v &= ~en; } - imx6_ccm_write(pllreg, v); + imx6_ccm_analog_write(pllreg, v); return 0; case CCM_ANALOG_PLL_ENET: - v = imx6_ccm_read(pllreg); + v = imx6_ccm_analog_read(pllreg); if (on) v &= ~CCM_ANALOG_PLL_ENET_POWERDOWN; else v |= CCM_ANALOG_PLL_ENET_POWERDOWN; - imx6_ccm_write(pllreg, v); + imx6_ccm_analog_write(pllreg, v); for (timeout = 100000; timeout > 0; timeout--) { - if (imx6_ccm_read(pllreg) & + if (imx6_ccm_analog_read(pllreg) & CCM_ANALOG_PLL_ENET_LOCK) break; } @@ -894,12 +925,12 @@ imx6_pll_power(uint32_t pllreg, int on, v |= CCM_ANALOG_PLL_ENET_ENABLE; if (on) { v &= ~CCM_ANALOG_PLL_ENET_BYPASS; - imx6_ccm_write(pllreg, v); + imx6_ccm_analog_write(pllreg, v); v |= en; } else { v &= ~en; } - imx6_ccm_write(pllreg, v); + imx6_ccm_analog_write(pllreg, v); return 0; case CCM_ANALOG_PLL_ARM: Index: src/sys/arch/arm/imx/imx6_reg.h diff -u src/sys/arch/arm/imx/imx6_reg.h:1.6 src/sys/arch/arm/imx/imx6_reg.h:1.7 --- src/sys/arch/arm/imx/imx6_reg.h:1.6 Fri Jun 9 18:14:59 2017 +++ src/sys/arch/arm/imx/imx6_reg.h Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_reg.h,v 1.6 2017/06/09 18:14:59 ryo Exp $ */ +/* $NetBSD: imx6_reg.h,v 1.7 2017/11/09 05:57:23 hkenken Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -141,8 +141,14 @@ #define AIPS1_SNVS_SIZE 0x00000c00 #define AIPS1_USBPHY2_BASE 0x000ca000 #define AIPS1_USBPHY1_BASE 0x000c9000 -#define AIPS1_ANATOP_DIG_BASE 0x000c8000 +#define AIPS1_USBPHY_SIZE 0x00001000 + +#define AIPS1_CCM_ANALOG_BASE 0x000c8000 +#define AIPS1_CCM_ANALOG_SIZE 0x00001000 + #define AIPS1_CCM_BASE 0x000c4000 +#define AIPS1_CCM_SIZE 0x00004000 + #define AIPS1_WDOG2_BASE 0x000c0000 #define AIPS1_WDOG1_BASE 0x000bc000 #define AIPS1_WDOG_SIZE 0x00000010 Index: src/sys/arch/arm/imx/imx6_ccmvar.h diff -u src/sys/arch/arm/imx/imx6_ccmvar.h:1.4 src/sys/arch/arm/imx/imx6_ccmvar.h:1.5 --- src/sys/arch/arm/imx/imx6_ccmvar.h:1.4 Thu Nov 24 03:59:36 2016 +++ src/sys/arch/arm/imx/imx6_ccmvar.h Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_ccmvar.h,v 1.4 2016/11/24 03:59:36 hkenken Exp $ */ +/* $NetBSD: imx6_ccmvar.h,v 1.5 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2012 Genetec Corporation. All rights reserved. * Written by Hashimoto Kenichi for Genetec Corporation. @@ -28,7 +28,7 @@ #ifndef _ARM_IMX_IMX6_CCMVAR_H_ #define _ARM_IMX_IMX6_CCMVAR_H_ -enum imx6_clock { +enum imx6_clock_id { IMX6CLK_PLL1, /* = PLL_ARM */ IMX6CLK_PLL2, /* = PLL_SYS = 528_PLL (24MHz * 22) */ IMX6CLK_PLL3, /* = PLL_USB1 = 480_PLL1 */ @@ -73,11 +73,13 @@ enum imx6_clock { IMX6CLK_LDB_DI1_SERIAL_CLK_ROOT, }; -uint32_t imx6_get_clock(enum imx6_clock); -int imx6_set_clock(enum imx6_clock, uint32_t); +uint32_t imx6_get_clock(enum imx6_clock_id); +int imx6_set_clock(enum imx6_clock_id, uint32_t); int imx6_pll_power(uint32_t, int, uint32_t); uint32_t imx6_ccm_read(uint32_t); void imx6_ccm_write(uint32_t, uint32_t); +uint32_t imx6_ccm_analog_read(uint32_t); +void imx6_ccm_analog_write(uint32_t, uint32_t); #endif /* _ARM_IMX_IMX6_CCMVAR_H_ */ Index: src/sys/arch/arm/imx/imx6_pcie.c diff -u src/sys/arch/arm/imx/imx6_pcie.c:1.4 src/sys/arch/arm/imx/imx6_pcie.c:1.5 --- src/sys/arch/arm/imx/imx6_pcie.c:1.4 Tue Oct 24 09:11:51 2017 +++ src/sys/arch/arm/imx/imx6_pcie.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_pcie.c,v 1.4 2017/10/24 09:11:51 hkenken Exp $ */ +/* $NetBSD: imx6_pcie.c,v 1.5 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2016 Genetec Corporation. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_pcie.c,v 1.4 2017/10/24 09:11:51 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_pcie.c,v 1.5 2017/11/09 05:57:23 hkenken Exp $"); #include "opt_pci.h" @@ -164,12 +164,12 @@ imx6pcie_clock_enable(struct imx6pcie_so { uint32_t v; - v = imx6_ccm_read(CCM_ANALOG_MISC1); + v = imx6_ccm_analog_read(CCM_ANALOG_MISC1); v &= ~CCM_ANALOG_MISC1_LVDS_CLK1_IBEN; v &= ~CCM_ANALOG_MISC1_LVDS_CLK1_SRC; v |= CCM_ANALOG_MISC1_LVDS_CLK1_OBEN; v |= CCM_ANALOG_MISC1_LVDS_CLK1_SRC_SATA; - imx6_ccm_write(CCM_ANALOG_MISC1, v); + imx6_ccm_analog_write(CCM_ANALOG_MISC1, v); /* select PCIe clock source from axi */ v = imx6_ccm_read(CCM_CBCMR); Index: src/sys/arch/evbarm/conf/CUBOX-I diff -u src/sys/arch/evbarm/conf/CUBOX-I:1.11 src/sys/arch/evbarm/conf/CUBOX-I:1.12 --- src/sys/arch/evbarm/conf/CUBOX-I:1.11 Thu Sep 14 07:58:40 2017 +++ src/sys/arch/evbarm/conf/CUBOX-I Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -# $NetBSD: CUBOX-I,v 1.11 2017/09/14 07:58:40 mrg Exp $ +# $NetBSD: CUBOX-I,v 1.12 2017/11/09 05:57:23 hkenken Exp $ # # CuBox-i # - http://www.solid-run.com/products/cubox-i-mini-computer/ @@ -296,6 +296,8 @@ ukphy* at mii? phy ? # generic unknown urlphy* at mii? phy ? # Realtek RTL8150L internal PHYs # USB Controller and Devices +imxusbphy0 at axi? addr 0x020c9000 +imxusbphy1 at axi? addr 0x020ca000 imxusbc0 at axi? addr 0x02184000 ehci0 at imxusbc0 unit 0 irq 75 # OTG ehci1 at imxusbc0 unit 1 irq 72 # Host1 Index: src/sys/arch/evbarm/conf/HUMMINGBOARD diff -u src/sys/arch/evbarm/conf/HUMMINGBOARD:1.1 src/sys/arch/evbarm/conf/HUMMINGBOARD:1.2 --- src/sys/arch/evbarm/conf/HUMMINGBOARD:1.1 Thu Nov 24 12:06:44 2016 +++ src/sys/arch/evbarm/conf/HUMMINGBOARD Thu Nov 9 05:57:23 2017 @@ -1,5 +1,5 @@ # -# $NetBSD: HUMMINGBOARD,v 1.1 2016/11/24 12:06:44 hkenken Exp $ +# $NetBSD: HUMMINGBOARD,v 1.2 2017/11/09 05:57:23 hkenken Exp $ # # Hummingboard -- Freescale i.MX6 Eval Board Kernel # @@ -132,6 +132,8 @@ ld* at sdmmc? # MMC/SD card #options SDMMC_DEBUG # USB +imxusbphy0 at axi? addr 0x020c9000 +imxusbphy1 at axi? addr 0x020ca000 imxusbc0 at axi? addr 0x02184000 ehci0 at imxusbc0 unit 0 irq 75 # OTG ehci1 at imxusbc0 unit 1 irq 72 # Host1 @@ -154,5 +156,5 @@ pci* at imxpcie0 ppb* at pci? dev ? function ? pci* at ppb? -iwn* at pci? dev ? function ? # Intel PRO/Wireless 4965AGN -iwm* at pci? dev ? function ? # Intel Centrino 7260 +# local configuration +cinclude "arch/evbarm/conf/HUMMINGBOARD.local" Index: src/sys/arch/evbarm/conf/IMX6UL-STARTER diff -u src/sys/arch/evbarm/conf/IMX6UL-STARTER:1.4 src/sys/arch/evbarm/conf/IMX6UL-STARTER:1.5 --- src/sys/arch/evbarm/conf/IMX6UL-STARTER:1.4 Thu Sep 14 07:58:40 2017 +++ src/sys/arch/evbarm/conf/IMX6UL-STARTER Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -# $NetBSD: IMX6UL-STARTER,v 1.4 2017/09/14 07:58:40 mrg Exp $ +# $NetBSD: IMX6UL-STARTER,v 1.5 2017/11/09 05:57:23 hkenken Exp $ # # IMX6UL-STARTER - Freescale i.MX6UL Evaluation Board # @@ -285,6 +285,8 @@ ukphy* at mii? phy ? # generic unknown urlphy* at mii? phy ? # Realtek RTL8150L internal PHYs # USB Controller and Devices +imxusbphy0 at axi? addr 0x020c9000 +imxusbphy1 at axi? addr 0x020ca000 imxusbc0 at axi? addr 0x02184000 ehci0 at imxusbc0 unit 0 irq 75 # USBOTG1 ehci1 at imxusbc0 unit 1 irq 74 # USBOTG2 Index: src/sys/arch/evbarm/conf/NITROGEN6X diff -u src/sys/arch/evbarm/conf/NITROGEN6X:1.13 src/sys/arch/evbarm/conf/NITROGEN6X:1.14 --- src/sys/arch/evbarm/conf/NITROGEN6X:1.13 Thu Sep 14 07:58:40 2017 +++ src/sys/arch/evbarm/conf/NITROGEN6X Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -# $NetBSD: NITROGEN6X,v 1.13 2017/09/14 07:58:40 mrg Exp $ +# $NetBSD: NITROGEN6X,v 1.14 2017/11/09 05:57:23 hkenken Exp $ # # Nitrogen6X # - http://boundarydevices.com/products/nitrogen6x-board-imx6-arm-cortex-a9-sbc/ @@ -285,6 +285,8 @@ ukphy* at mii? phy ? # generic unknown urlphy* at mii? phy ? # Realtek RTL8150L internal PHYs # USB Controller and Devices +imxusbphy0 at axi? addr 0x020c9000 +imxusbphy1 at axi? addr 0x020ca000 imxusbc0 at axi? addr 0x02184000 ehci0 at imxusbc0 unit 0 irq 75 # OTG ehci1 at imxusbc0 unit 1 irq 72 # Host1 Index: src/sys/arch/evbarm/nitrogen6/nitrogen6_usb.c diff -u src/sys/arch/evbarm/nitrogen6/nitrogen6_usb.c:1.2 src/sys/arch/evbarm/nitrogen6/nitrogen6_usb.c:1.3 --- src/sys/arch/evbarm/nitrogen6/nitrogen6_usb.c:1.2 Thu Nov 24 03:59:36 2016 +++ src/sys/arch/evbarm/nitrogen6/nitrogen6_usb.c Thu Nov 9 05:57:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: nitrogen6_usb.c,v 1.2 2016/11/24 03:59:36 hkenken Exp $ */ +/* $NetBSD: nitrogen6_usb.c,v 1.3 2017/11/09 05:57:23 hkenken Exp $ */ /* * Copyright (c) 2013 Genetec Corporation. All rights reserved. @@ -27,7 +27,7 @@ * */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nitrogen6_usb.c,v 1.2 2016/11/24 03:59:36 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nitrogen6_usb.c,v 1.3 2017/11/09 05:57:23 hkenken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -124,39 +124,19 @@ init_otg(struct imxehci_softc *sc) sc->sc_iftype = IMXUSBC_IF_UTMI_WIDE; /* USB1 power */ - imx6_ccm_write(USB_ANALOG_USB1_CHRG_DETECT, + imx6_ccm_analog_write(USB_ANALOG_USB1_CHRG_DETECT, USB_ANALOG_USB_CHRG_DETECT_EN_B | USB_ANALOG_USB_CHRG_DETECT_CHK_CHRG_B); imx6_pll_power(CCM_ANALOG_PLL_USB1, 1, CCM_ANALOG_PLL_USBn_ENABLE); - imx6_ccm_write(CCM_ANALOG_PLL_USB1_CLR, + imx6_ccm_analog_write(CCM_ANALOG_PLL_USB1_CLR, CCM_ANALOG_PLL_USBn_BYPASS); - imx6_ccm_write(CCM_ANALOG_PLL_USB1_SET, + imx6_ccm_analog_write(CCM_ANALOG_PLL_USB1_SET, CCM_ANALOG_PLL_USBn_ENABLE | CCM_ANALOG_PLL_USBn_POWER | CCM_ANALOG_PLL_USBn_EN_USB_CLK); - /* USBPHY enable */ - /* PHY1 */ - imx6_ccm_write(USBPHY1_CTRL, USBPHY_CTRL_CLKGATE); - imxehci_reset(sc); - v = imx6_ccm_read(USBPHY1_CTRL); - v |= USBPHY_CTRL_SFTRST; - imx6_ccm_write(USBPHY1_CTRL, v); - delay(100); - - v = imx6_ccm_read(USBPHY1_CTRL); - v &= ~(USBPHY_CTRL_SFTRST | USBPHY_CTRL_CLKGATE); - imx6_ccm_write(USBPHY1_CTRL, v); - delay(100); - - imx6_ccm_write(USBPHY1_PWD, 0); - - v = imx6_ccm_read(USBPHY1_CTRL); - v |= USBPHY_CTRL_ENUTMILEVEL2 | USBPHY_CTRL_ENUTMILEVEL3; - imx6_ccm_write(USBPHY1_CTRL, v); - v = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBNC_USB_OTG_CTRL); v |= USBNC_USB_OTG_CTRL_WKUP_VBUS_EN; v |= USBNC_USB_OTG_CTRL_OVER_CUR_DIS; @@ -173,12 +153,12 @@ init_h1(struct imxehci_softc *sc) sc->sc_iftype = IMXUSBC_IF_UTMI_WIDE; - imx6_ccm_write(USB_ANALOG_USB2_CHRG_DETECT, + imx6_ccm_analog_write(USB_ANALOG_USB2_CHRG_DETECT, USB_ANALOG_USB_CHRG_DETECT_EN_B | USB_ANALOG_USB_CHRG_DETECT_CHK_CHRG_B); - imx6_ccm_write(CCM_ANALOG_PLL_USB2_CLR, + imx6_ccm_analog_write(CCM_ANALOG_PLL_USB2_CLR, CCM_ANALOG_PLL_USBn_BYPASS); - imx6_ccm_write(CCM_ANALOG_PLL_USB2_SET, + imx6_ccm_analog_write(CCM_ANALOG_PLL_USB2_SET, CCM_ANALOG_PLL_USBn_ENABLE | CCM_ANALOG_PLL_USBn_POWER | CCM_ANALOG_PLL_USBn_EN_USB_CLK); @@ -188,24 +168,8 @@ init_h1(struct imxehci_softc *sc) v |= USBNC_USB_UH1_CTRL_OVER_CUR_DIS; bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBNC_USB_UH1_CTRL, v); - /* gate clocks */ - imx6_ccm_write(USBPHY2_CTRL_CLR, USBPHY_CTRL_CLKGATE); - /* do reset */ imxehci_reset(sc); - imx6_ccm_write(USBPHY2_CTRL_SET, USBPHY_CTRL_SFTRST); - delay(100); - - /* clear reset, and run clocks */ - imx6_ccm_write(USBPHY2_CTRL_CLR, USBPHY_CTRL_SFTRST | USBPHY_CTRL_CLKGATE); - delay(100); - - /* power on */ - imx6_ccm_write(USBPHY2_PWD, 0); - - /* UTMI+Level2, Level3 */ - imx6_ccm_write(USBPHY2_CTRL_SET, - USBPHY_CTRL_ENUTMILEVEL2 | USBPHY_CTRL_ENUTMILEVEL3); /* set mode */ v = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBC_UH1_USBMODE); Added files: Index: src/sys/arch/arm/imx/imx6_usbphy.c diff -u /dev/null src/sys/arch/arm/imx/imx6_usbphy.c:1.1 --- /dev/null Thu Nov 9 05:57:23 2017 +++ src/sys/arch/arm/imx/imx6_usbphy.c Thu Nov 9 05:57:23 2017 @@ -0,0 +1,139 @@ +/* $NetBSD: imx6_usbphy.c,v 1.1 2017/11/09 05:57:23 hkenken Exp $ */ + +/* + * Copyright (c) 2017 Genetec Corporation. All rights reserved. + * Written by Hashimoto Kenichi for Genetec Corporation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "locators.h" +#include "ohci.h" +#include "ehci.h" + +#include <sys/cdefs.h> + +__KERNEL_RCSID(1, "$NetBSD: imx6_usbphy.c,v 1.1 2017/11/09 05:57:23 hkenken Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/intr.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/proc.h> +#include <sys/queue.h> +#include <sys/kmem.h> +#include <sys/gpio.h> + +#include <dev/usb/usb.h> +#include <dev/usb/usbdi.h> +#include <dev/usb/usbdivar.h> +#include <dev/usb/usb_mem.h> + +#include <arm/imx/imx6_reg.h> +#include <arm/imx/imx6var.h> + +#include <arm/imx/imx6_usbphyreg.h> + +struct imx6_usbphy_softc { + device_t sc_dev; + bus_space_tag_t sc_bst; + bus_space_handle_t sc_bsh; +}; + +static int imx6_usbphy_match(device_t, cfdata_t, void *); +static void imx6_usbphy_attach(device_t, device_t, void *); + +CFATTACH_DECL_NEW(imxusbphy, sizeof(struct imx6_usbphy_softc), + imx6_usbphy_match, imx6_usbphy_attach, NULL, NULL); + +#define USBPHY_READ(sc, reg) \ + bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg)) +#define USBPHY_WRITE(sc, reg, val) \ + bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val)) + +static int +imx6_usbphy_enable(device_t dev, void *priv, bool enable) +{ + struct imx6_usbphy_softc * const sc = device_private(dev); + + /* USBPHY enable */ + USBPHY_WRITE(sc, USBPHY_CTRL, USBPHY_CTRL_CLKGATE); + + /* do reset */ + USBPHY_WRITE(sc, USBPHY_CTRL_SET, USBPHY_CTRL_SFTRST); + delay(100); + + /* clear reset, and run clocks */ + USBPHY_WRITE(sc, USBPHY_CTRL_CLR, USBPHY_CTRL_SFTRST | USBPHY_CTRL_CLKGATE); + delay(100); + + /* power on */ + USBPHY_WRITE(sc, USBPHY_PWD, 0); + + /* UTMI+Level2, Level3 */ + USBPHY_WRITE(sc, USBPHY_CTRL_SET, + USBPHY_CTRL_ENUTMILEVEL2 | USBPHY_CTRL_ENUTMILEVEL3); + + return 0; +} + +static int +imx6_usbphy_match(device_t parent, cfdata_t cf, void *aux) +{ + struct axi_attach_args *aa = aux; + + switch (aa->aa_addr) { + case IMX6_AIPS1_BASE + AIPS1_USBPHY1_BASE: + case IMX6_AIPS1_BASE + AIPS1_USBPHY2_BASE: + return 1; + } + + return 0; +} + + +static void +imx6_usbphy_attach(device_t parent, device_t self, void *aux) +{ + struct imx6_usbphy_softc *sc = device_private(self); + struct axi_attach_args *aa = aux; + bus_addr_t addr = aa->aa_addr; + bus_size_t size = AIPS1_USBPHY_SIZE; + int error; + + sc->sc_dev = self; + sc->sc_bst = aa->aa_iot; + + error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh); + if (error) { + aprint_error(": couldn't map %#llx: %d", + (uint64_t)addr, error); + return; + } + + aprint_naive("\n"); + aprint_normal(": USB PHY\n"); + + imx6_usbphy_enable(self, NULL, true); +} Index: src/sys/arch/arm/imx/imx6_usbphyreg.h diff -u /dev/null src/sys/arch/arm/imx/imx6_usbphyreg.h:1.1 --- /dev/null Thu Nov 9 05:57:23 2017 +++ src/sys/arch/arm/imx/imx6_usbphyreg.h Thu Nov 9 05:57:23 2017 @@ -0,0 +1,64 @@ +/* $NetBSD: imx6_usbphyreg.h,v 1.1 2017/11/09 05:57:23 hkenken Exp $ */ + +/* + * Copyright (c) 2017 Genetec Corporation. All rights reserved. + * Written by Hashimoto Kenichi for Genetec Corporation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ARM_IMX_IMX6_USBPHYREG_H +#define _ARM_IMX_IMX6_USBPHYREG_H + +#include <sys/cdefs.h> + +#define USBPHY_PWD 0x00000000 +#define USBPHY_PWD_SET 0x00000004 +#define USBPHY_PWD_CLR 0x00000008 +#define USBPHY_PWD_TOG 0x0000000c +#define USBPHY_TX 0x00000010 +#define USBPHY_TX_SET 0x00000014 +#define USBPHY_TX_CLR 0x00000018 +#define USBPHY_TX_TOG 0x0000001c +#define USBPHY_TX_USBPHY_TX_EDGECTRL __BITS(28, 26) +#define USBPHY_TX_TXCAL45DP __BITS(19, 16) +#define USBPHY_TX_TXCAL45DN __BITS(11, 8) +#define USBPHY_TX_D_CAL __BITS(3, 0) +#define USBPHY_RX 0x00000020 +#define USBPHY_RX_SET 0x00000024 +#define USBPHY_RX_CLR 0x00000028 +#define USBPHY_RX_TOG 0x0000002c +#define USBPHY_CTRL 0x00000030 +#define USBPHY_CTRL_SET 0x00000034 +#define USBPHY_CTRL_CLR 0x00000038 +#define USBPHY_CTRL_TOG 0x0000003c +#define USBPHY_CTRL_SFTRST __BIT(31) +#define USBPHY_CTRL_CLKGATE __BIT(30) +#define USBPHY_CTRL_ENUTMILEVEL3 __BIT(15) +#define USBPHY_CTRL_ENUTMILEVEL2 __BIT(14) +#define USBPHY_STATUS 0x00000040 +#define USBPHY_DEBUG 0x00000050 +#define USBPHY_DEBUG0_STATUS 0x00000060 +#define USBPHY_DEBUG1 0x00000070 +#define USBPHY_VERSION 0x00000080 + +#endif /* _ARM_IMX_IMX6_USBPHYREG_H */