Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/amlogic more usb phy / clk init



details:   https://anonhg.NetBSD.org/src/rev/248e18991387
branches:  trunk
changeset: 336414:248e18991387
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat Feb 28 18:50:57 2015 +0000

description:
more usb phy / clk init

diffstat:

 sys/arch/arm/amlogic/amlogic_board.c  |  74 +++++++++++++++++++++++++++++++---
 sys/arch/arm/amlogic/amlogic_crureg.h |  18 ++++++++-
 sys/arch/arm/amlogic/amlogic_dwctwo.c |  44 ++++++++++----------
 3 files changed, 105 insertions(+), 31 deletions(-)

diffs (271 lines):

diff -r 4d0c0d2ec3d8 -r 248e18991387 sys/arch/arm/amlogic/amlogic_board.c
--- a/sys/arch/arm/amlogic/amlogic_board.c      Sat Feb 28 18:50:15 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_board.c      Sat Feb 28 18:50:57 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_board.c,v 1.3 2015/02/28 15:20:43 jmcneill Exp $ */
+/* $NetBSD: amlogic_board.c,v 1.4 2015/02/28 18:50:57 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -29,7 +29,7 @@
 #include "opt_amlogic.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.3 2015/02/28 15:20:43 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.4 2015/02/28 18:50:57 jmcneill Exp $");
 
 #define        _ARM32_BUS_DMA_PRIVATE
 #include <sys/param.h>
@@ -59,7 +59,7 @@
                         AMLOGIC_CBUS_OFFSET + (x))
 #define CBUS_WRITE(x, v)       \
        bus_space_write_4(&amlogic_bs_tag, amlogic_core_bsh, \
-                        AMLOGIC_CBUS_OFFSET + (x), (v))
+                         AMLOGIC_CBUS_OFFSET + (x), (v))
 
 void
 amlogic_bootstrap(void)
@@ -157,15 +157,40 @@
        return amlogic_get_rate_a9() / div;
 }
 
+static void
+amlogic_usbphy_clkgate_enable(int port)
+{
+       switch (port) {
+       case 0:
+               CBUS_WRITE(EE_CLK_GATING1_REG,
+                   CBUS_READ(EE_CLK_GATING1_REG) |
+                   EE_CLK_GATING1_USB_GENERAL |
+                   EE_CLK_GATING1_USB0);
+               CBUS_WRITE(EE_CLK_GATING2_REG,
+                   CBUS_READ(EE_CLK_GATING2_REG) |
+                   EE_CLK_GATING2_USB0_TO_DDR);
+               break;
+       case 1:
+               CBUS_WRITE(EE_CLK_GATING1_REG,
+                   CBUS_READ(EE_CLK_GATING1_REG) |
+                   EE_CLK_GATING1_USB_GENERAL |
+                   EE_CLK_GATING1_USB1);
+               CBUS_WRITE(EE_CLK_GATING2_REG,
+                   CBUS_READ(EE_CLK_GATING2_REG) |
+                   EE_CLK_GATING2_USB1_TO_DDR);
+               break;
+       }
+}
+
 void
 amlogic_usbphy_init(int port)
 {
        bus_space_tag_t bst = &amlogic_bs_tag;
        bus_space_handle_t bsh = amlogic_core_bsh;
-       bus_size_t ctrl_reg, cfg_reg, gpioao_reg;
-       uint32_t ctrl, cfg, gpioao;
+       bus_size_t ctrl_reg, cfg_reg, adp_bc_reg, gpioao_reg;
+       uint32_t ctrl, cfg, adp_bc, gpioao;
        u_int pin, pol;
-       bool gpio_power = false, gpio_reset = false;
+       bool gpio_power = false, gpio_reset = false, aca_enable = false;
 
        gpioao_reg = AMLOGIC_GPIOAO_OFFSET;
 
@@ -173,6 +198,7 @@
        case 0:
                cfg_reg = PREI_USB_PHY_A_CFG_REG;
                ctrl_reg = PREI_USB_PHY_A_CTRL_REG;
+               adp_bc_reg = PREI_USB_PHY_A_ADP_BC_REG;
                pin = 5;
                pol = 1;
                gpio_power = true;
@@ -180,17 +206,26 @@
        case 1:
                cfg_reg = PREI_USB_PHY_B_CFG_REG;
                ctrl_reg = PREI_USB_PHY_B_CTRL_REG;
+               adp_bc_reg = PREI_USB_PHY_B_ADP_BC_REG;
                pin = 4;
                pol = 0;
                gpio_reset = true;
+               aca_enable = true;
                break;
        default:
                return;
        }
 
+       if (port == 0) {
+               CBUS_WRITE(RESET1_REG, RESET1_USB);
+       }
+
+       amlogic_usbphy_clkgate_enable(port);
+
        if (gpio_power) {
                gpioao = bus_space_read_4(bst, bsh, gpioao_reg);
                gpioao |= __BIT(pin);           /* OEN */
+               bus_space_write_4(bst, bsh, gpioao_reg, gpioao);
                if (pol) {
                        gpioao |= __BIT(pin + 16);      /* OUT */
                } else {
@@ -199,8 +234,6 @@
                bus_space_write_4(bst, bsh, gpioao_reg, gpioao);
        }
 
-       CBUS_WRITE(RESET1_REG, RESET1_USB);
-
        delay(1000);
 
        cfg = CBUS_READ(cfg_reg);
@@ -229,15 +262,40 @@
        if ((ctrl & PREI_USB_PHY_CTRL_CLK_DET) == 0)
                printf("WARNING: USB PHY port %d clock not detected\n", port);
 
+       if (aca_enable) {
+               adp_bc = CBUS_READ(adp_bc_reg);
+               adp_bc |= PREI_USB_PHY_ADP_BC_ACA_ENABLE;
+               CBUS_WRITE(adp_bc_reg, adp_bc);
+
+               delay(1000);
+
+               adp_bc = CBUS_READ(adp_bc_reg);
+               if (adp_bc & PREI_USB_PHY_ADP_BC_ACA_FLOATING)
+                       printf("WARNING: USB PHY port %d failed to enable "
+                           "ACA detection\n", port);
+       }
+
        if (gpio_reset) {
                /* Reset */
                gpioao = bus_space_read_4(bst, bsh, gpioao_reg);
                gpioao |= __BIT(pin);           /* OEN */
+               bus_space_write_4(bst, bsh, gpioao_reg, gpioao);
                if (pol) {
                        gpioao |= __BIT(pin + 16);      /* OUT */
                } else {
                        gpioao &= ~__BIT(pin + 16);     /* OUT */
                }
                bus_space_write_4(bst, bsh, gpioao_reg, gpioao);
+
+               delay(1000);
+
+               if (pol) {
+                       gpioao &= ~__BIT(pin + 16);     /* OUT */
+               } else {
+                       gpioao |= __BIT(pin + 16);      /* OUT */
+               }
+               bus_space_write_4(bst, bsh, gpioao_reg, gpioao);
+
+               delay(60000);
        }
 }
diff -r 4d0c0d2ec3d8 -r 248e18991387 sys/arch/arm/amlogic/amlogic_crureg.h
--- a/sys/arch/arm/amlogic/amlogic_crureg.h     Sat Feb 28 18:50:15 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_crureg.h     Sat Feb 28 18:50:57 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_crureg.h,v 1.3 2015/02/28 15:20:43 jmcneill Exp $ */
+/* $NetBSD: amlogic_crureg.h,v 1.4 2015/02/28 18:50:57 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -31,6 +31,17 @@
 
 #define CBUS_REG(n)    ((n) << 2)
 
+#define EE_CLK_GATING0_REG             CBUS_REG(0x1050)
+#define EE_CLK_GATING1_REG             CBUS_REG(0x1051)
+#define EE_CLK_GATING2_REG             CBUS_REG(0x1052)
+#define EE_CLK_GATING3_REG             CBUS_REG(0x1054)
+
+#define EE_CLK_GATING1_USB_GENERAL     __BIT(26)
+#define EE_CLK_GATING1_USB1            __BIT(22)
+#define EE_CLK_GATING1_USB0            __BIT(21)
+#define EE_CLK_GATING2_USB0_TO_DDR     __BIT(9)
+#define EE_CLK_GATING2_USB1_TO_DDR     __BIT(8)
+
 #define HHI_SYS_CPU_CLK_CNTL1_REG      CBUS_REG(0x1057)
 #define HHI_SYS_CPU_CLK_CNTL1_SDIV     __BITS(29,20)
 #define HHI_SYS_CPU_CLK_CNTL1_PERIPH_CLK_MUX __BITS(8,6)
@@ -53,8 +64,10 @@
 
 #define PREI_USB_PHY_A_CFG_REG         CBUS_REG(0x2200)
 #define PREI_USB_PHY_A_CTRL_REG                CBUS_REG(0x2201)
+#define PREI_USB_PHY_A_ADP_BC_REG      CBUS_REG(0x2203)
 #define PREI_USB_PHY_B_CFG_REG         CBUS_REG(0x2208)
 #define PREI_USB_PHY_B_CTRL_REG                CBUS_REG(0x2209)
+#define PREI_USB_PHY_B_ADP_BC_REG      CBUS_REG(0x220b)
 
 #define PREI_USB_PHY_CFG_CLK_32K_ALT_SEL __BIT(15)
 
@@ -64,6 +77,9 @@
 #define PREI_USB_PHY_CTRL_POR          __BIT(15)
 #define PREI_USB_PHY_CTRL_CLK_DET      __BIT(8)
 
+#define PREI_USB_PHY_ADP_BC_ACA_FLOATING __BIT(26)
+#define PREI_USB_PHY_ADP_BC_ACA_ENABLE __BIT(16)
+
 #define WATCHDOG_TC_REG                        CBUS_REG(0x2640)
 #define WATCHDOG_TC_CPUS               __BITS(27,24)
 #define WATCHDOG_TC_ENABLE             __BIT(19)
diff -r 4d0c0d2ec3d8 -r 248e18991387 sys/arch/arm/amlogic/amlogic_dwctwo.c
--- a/sys/arch/arm/amlogic/amlogic_dwctwo.c     Sat Feb 28 18:50:15 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_dwctwo.c     Sat Feb 28 18:50:57 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: amlogic_dwctwo.c,v 1.1 2015/02/28 15:20:43 jmcneill Exp $      */
+/*     $NetBSD: amlogic_dwctwo.c,v 1.2 2015/02/28 18:50:57 jmcneill Exp $      */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_dwctwo.c,v 1.1 2015/02/28 15:20:43 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_dwctwo.c,v 1.2 2015/02/28 18:50:57 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -62,28 +62,28 @@
 static struct dwc2_core_params amlogic_dwctwo_params = {
        .otg_cap                        = 2,    /* 0 - HNP/SRP capable */
        .otg_ver                        = 1,    /* 1 - 2.0 */
-       .dma_enable                     = 1,    /* 1 - DMA (default, if available) */
-       .dma_desc_enable                = 1,    /* 1 - Descriptor DMA (default, if available) */
-       .speed                          = 0,    /* 0 - High Speed */
+       .dma_enable                     = -1,   /* 1 - DMA (default, if available) */
+       .dma_desc_enable                = 0,    /* 1 - Descriptor DMA (default, if available) */
+       .speed                          = -1,   /* 0 - High Speed */
        .enable_dynamic_fifo            = 1,    /* 1 - Allow dynamic FIFO sizing (default, if available) */
-       .en_multiple_tx_fifo            = 1,    /* Specifies whether dedicated per-endpoint transmit FIFOs are enabled */
-       .host_rx_fifo_size              = 520,  /* 520 DWORDs */
-       .host_nperio_tx_fifo_size       = 128,  /* 128 DWORDs */
-       .host_perio_tx_fifo_size        = 256,  /* 256 DWORDs */
-       .max_transfer_size              = 65535,/* 2047 to 65,535 */ 
-       .max_packet_count               = 511,  /* 15 to 511 */
-       .host_channels                  = 8,    /* 1 to 16 */
+       .en_multiple_tx_fifo            = -1,   /* Specifies whether dedicated per-endpoint transmit FIFOs are enabled */
+       .host_rx_fifo_size              = 512,  /* 512 DWORDs */
+       .host_nperio_tx_fifo_size       = 500,  /* 500 DWORDs */
+       .host_perio_tx_fifo_size        = -1,   /* 256 DWORDs */
+       .max_transfer_size              = -1,   /* 2047 to 65,535 */ 
+       .max_packet_count               = -1,   /* 15 to 511 */
+       .host_channels                  = -1,   /* 1 to 16 */
        .phy_type                       = 1,    /* 1- UTMI+ Phy */
-       .phy_utmi_width                 = 8,    /* 8 bits */
-       .phy_ulpi_ddr                   = 0,    /* Single */
-       .phy_ulpi_ext_vbus              = 0,
-       .i2c_enable                     = 0,
-       .ulpi_fs_ls                     = 0,    /* 0 - No (default) */
-       .host_support_fs_ls_low_power   = 0,    /* 0 - Don't support low power mode (default) */
-       .host_ls_low_power_phy_clk      = 0,    /* 1 - 48 MHz  default when phy_type is UTMI+ or ULPI*/
-       .ts_dline                       = 0,    /* 0 - No (default) */
-       .reload_ctl                     = 0,    /* 0 - No (default for core < 2.92a) */
-       .ahbcfg                         = 0x7,  /* INCR16 */
+       .phy_utmi_width                 = -1,   /* 8 bits */
+       .phy_ulpi_ddr                   = -1,   /* Single */
+       .phy_ulpi_ext_vbus              = -1,
+       .i2c_enable                     = -1,
+       .ulpi_fs_ls                     = -1,   /* 0 - No (default) */
+       .host_support_fs_ls_low_power   = -1,   /* 0 - Don't support low power mode (default) */
+       .host_ls_low_power_phy_clk      = -1,   /* 1 - 48 MHz  default when phy_type is UTMI+ or ULPI*/
+       .ts_dline                       = -1,   /* 0 - No (default) */
+       .reload_ctl                     = -1,   /* 0 - No (default for core < 2.92a) */
+       .ahbcfg                         = 0x3,  /* INCR4 */
        .uframe_sched                   = 1,    /* True to enable microframe scheduler */
 };
 



Home | Main Index | Thread Index | Old Index