diff --git a/arch/arm/include/asm/arch-devsoc/clk.h b/arch/arm/include/asm/arch-devsoc/clk.h index 3581c282a1..28011b95e6 100644 --- a/arch/arm/include/asm/arch-devsoc/clk.h +++ b/arch/arm/include/asm/arch-devsoc/clk.h @@ -197,6 +197,102 @@ #define PIPE3_PHYSTATUS_SW (0x1 << 3) #define PIPE_UTMI_CLK_DIS (0x1 << 8) +/* + * PCIE + * PCIE0 ---> PCIE3X1_0 + * PCIE1 ---> PCIE3X2 + * PCIE2 ---> PCIE3X1_1 + */ +#define GCC_CONFIG_PCIE0 0 +#define GCC_CONFIG_PCIE1 1 +#define GCC_CONFIG_PCIE2 2 + +#define GCC_SNOC_PCIE3_2LANE_S_CBCR 0x182E048 +#define GCC_SNOC_PCIE3_1LANE_S_CBCR 0x182E04C +#define GCC_SNOC_PCIE3_1LANE_1_M_CBCR 0x182E050 +#define GCC_SNOC_PCIE3_2LANE_M_CBCR 0x182E07C +#define GCC_SNOC_PCIE3_1LANE_M_CBCR 0x182E080 +#define GCC_SNOC_PCIE3_1LANE_1_S_CBCR 0x182E0AC + +#define GCC_PCIE3X2_BASE 0x1828000 +#define GCC_PCIE3X1_0_BASE 0x1829000 +#define GCC_PCIE3X1_1_BASE 0x182A000 +#define GCC_PCIE_AUX_CMD_RCGR 0x1828004 +#define GCC_PCIE_AUX_CFG_RCGR 0x1828008 +#define GCC_PCIE_AUX_M 0x182800C +#define GCC_PCIE_AUX_N 0x1828010 +#define GCC_PCIE_AUX_D 0x1828014 + +#define GCC_PCIE3X2_BCR (GCC_PCIE3X2_BASE+0x000) +#define GCC_PCIE3X2_AXI_M_CMD_RCGR (GCC_PCIE3X2_BASE+0x018) +#define GCC_PCIE3X2_AXI_M_CFG_RCGR (GCC_PCIE3X2_BASE+0x01C) +#define GCC_PCIE3X2_AHB_CBCR (GCC_PCIE3X2_BASE+0x030) +#define GCC_PCIE3X2_AXI_M_CBCR (GCC_PCIE3X2_BASE+0x038) +#define GCC_PCIE3X2_AXI_M_SREGR (GCC_PCIE3X2_BASE+0x03C) +#define GCC_PCIE3X2_AXI_S_CBCR (GCC_PCIE3X2_BASE+0x040) +#define GCC_PCIE3X2_AXI_S_SREGR (GCC_PCIE3X2_BASE+0x044) +#define GCC_PCIE3X2_AXI_S_BRIDGE_CBCR (GCC_PCIE3X2_BASE+0x048) +#define GCC_PCIE3X2_PIPE_CBCR (GCC_PCIE3X2_BASE+0x068) +#define GCC_PCIE3X2_AUX_CBCR (GCC_PCIE3X2_BASE+0x070) +#define GCC_PCIE3X2_RCHG_CMD_RCGR (GCC_PCIE3X2_BASE+0x078) +#define GCC_PCIE3X2_RCHG_CFG_RCGR (GCC_PCIE3X2_BASE+0x07C) +#define GCC_PCIE3X2_PHY_AHB_CBCR (GCC_PCIE3X2_BASE+0x080) +#define GCC_PCIE3X2_AXI_S_CMD_RCGR (GCC_PCIE3X2_BASE+0x084) +#define GCC_PCIE3X2_AXI_S_CFG_RCGR (GCC_PCIE3X2_BASE+0x088) + +#define GCC_PCIE3X1_0_BCR (GCC_PCIE3X1_0_BASE+0x000) +#define GCC_PCIE3X1_0_AXI_CMD_RCGR (GCC_PCIE3X1_0_BASE+0x018) +#define GCC_PCIE3X1_0_AXI_CFG_RCGR (GCC_PCIE3X1_0_BASE+0x01C) +#define GCC_PCIE3X1_0_AHB_CBCR (GCC_PCIE3X1_0_BASE+0x030) +#define GCC_PCIE3X1_0_AXI_M_CBCR (GCC_PCIE3X1_0_BASE+0x038) +#define GCC_PCIE3X1_0_AXI_M_SREGR (GCC_PCIE3X1_0_BASE+0x03C) +#define GCC_PCIE3X1_0_AXI_S_CBCR (GCC_PCIE3X1_0_BASE+0x040) +#define GCC_PCIE3X1_0_AXI_S_SREGR (GCC_PCIE3X1_0_BASE+0x044) +#define GCC_PCIE3X1_0_AXI_S_BRIDGE_CBCR (GCC_PCIE3X1_0_BASE+0x048) +#define GCC_PCIE3X1_0_PIPE_CBCR (GCC_PCIE3X1_0_BASE+0x068) +#define GCC_PCIE3X1_0_AUX_CBCR (GCC_PCIE3X1_0_BASE+0x070) +#define GCC_PCIE3X1_PHY_AHB_CBCR (GCC_PCIE3X1_0_BASE+0x078) +#define GCC_PCIE3X1_0_RCHG_CMD_RCGR (GCC_PCIE3X1_0_BASE+0x07C) +#define GCC_PCIE3X1_0_RCHG_CFG_RCGR (GCC_PCIE3X1_0_BASE+0x080) + +#define GCC_PCIE3X1_1_BCR (GCC_PCIE3X1_1_BASE+0x000) +#define GCC_PCIE3X1_1_AXI_CMD_RCGR (GCC_PCIE3X1_1_BASE+0x004) +#define GCC_PCIE3X1_1_AXI_CFG_RCGR (GCC_PCIE3X1_1_BASE+0x008) +#define GCC_PCIE3X1_1_AHB_CBCR (GCC_PCIE3X1_1_BASE+0x00C) +#define GCC_PCIE3X1_1_AXI_M_CBCR (GCC_PCIE3X1_1_BASE+0x014) +#define GCC_PCIE3X1_1_AXI_M_SREGR (GCC_PCIE3X1_1_BASE+0x018) +#define GCC_PCIE3X1_1_AXI_S_CBCR (GCC_PCIE3X1_1_BASE+0x01C) +#define GCC_PCIE3X1_1_AXI_S_SREGR (GCC_PCIE3X1_1_BASE+0x020) +#define GCC_PCIE3X1_1_AXI_S_BRIDGE_CBCR (GCC_PCIE3X1_1_BASE+0x024) +#define GCC_PCIE3X1_1_PIPE_CBCR (GCC_PCIE3X1_1_BASE+0x068) +#define GCC_PCIE3X1_1_AUX_CBCR (GCC_PCIE3X1_1_BASE+0x070) +#define GCC_PCIE3X1_1_AUX_SREGR (GCC_PCIE3X1_1_BASE+0x074) +#define GCC_PCIE3X1_1_RCHG_CMD_RCGR (GCC_PCIE3X1_1_BASE+0x078) +#define GCC_PCIE3X1_1_RCHG_CFG_RCGR (GCC_PCIE3X1_1_BASE+0x07C) + +#define GCC_PCIE_AUX_CFG_RCGR_MN_MODE (2 << 12) +#define GCC_PCIE_AUX_CFG_RCGR_SRC_SEL (2 << 8) +#define GCC_PCIE_AUX_CFG_RCGR_SRC_DIV (0x1F << 0) + +#define GCC_PCIE_AXI_CFG_RCGR_SRC_SEL (0x9 << 0) +#define GCC_PCIE_AXI_CFG_RCGR_SRC_DIV (2 << 8) + +#define GCC_PCIE_AXI_S_CFG_RCGR_SRC_SEL (2 << 8) +#define GCC_PCIE_AXI_S_CFG_RCGR_SRC_DIV (9 << 0) + +#define GCC_PCIE3X2_AXI_S_CFG_RCGR_SRC_SEL (2 << 8) +#define GCC_PCIE3X2_AXI_S_CFG_RCGR_SRC_DIV (9 << 0) + +#define GCC_PCIE_RCHG_CFG_RCGR_SRC_SEL (1 << 8) +#define GCC_PCIE_RCHG_CFG_RCGR_SRC_DIV (0xF << 0) + +#define CMD_UPDATE 0x1 +#define ROOT_EN 0x2 +#define PIPE_CLK_ENABLE 0x4FF1 +#define CLK_DISABLE 0x0 +#define NOC_HANDSHAKE_FSM_EN (1 << 15) +#define GCC_PCIE_PHY_PIPE_MISC_SRC_SEL (0x1 << 8) + #ifdef CONFIG_QCA_MMC void emmc_clock_init(void); void emmc_clock_reset(void); diff --git a/board/qca/arm/devsoc/clock.c b/board/qca/arm/devsoc/clock.c index 53e8910ace..242a544324 100644 --- a/board/qca/arm/devsoc/clock.c +++ b/board/qca/arm/devsoc/clock.c @@ -131,70 +131,92 @@ void emmc_clock_reset(void) void pcie_v2_clock_init(int pcie_id) { #ifdef QCA_CLOCK_ENABLE - int cfg, div; + int cfg, cfg1; + static int clk_configure; /* Configure pcie_aux_clk_src */ - cfg = (GCC_PCIE_AUX_CFG_RCGR_MN_MODE | - GCC_PCIE_AUX_CFG_RCGR_SRC_SEL | - GCC_PCIE_AUX_CFG_RCGR_SRC_DIV); - writel(cfg, GCC_PCIE_REG(GCC_PCIE_AUX_CFG_RCGR, 0)); - writel(0x1, GCC_PCIE_REG(GCC_PCIE_AUX_M, 0)); - writel(0xFFFC, GCC_PCIE_REG(GCC_PCIE_AUX_N, 0)); - writel(0xFFFB, GCC_PCIE_REG(GCC_PCIE_AUX_D, 0)); - writel(CMD_UPDATE, GCC_PCIE_REG(GCC_PCIE_AUX_CMD_RCGR, 0)); - mdelay(100); - writel(ROOT_EN, GCC_PCIE_REG(GCC_PCIE_AUX_CMD_RCGR, 0)); - - /* Configure pcie_axi_m__clk_src */ - if ((pcie_id == 2) || (pcie_id == 3)) - div = GCC_PCIE_AXI_M_CFG_RCGR_SRC_DIV_LANE2; - else - div = GCC_PCIE_AXI_M_CFG_RCGR_SRC_DIV_LANE1; - - cfg = (GCC_PCIE_AXI_M_CFG_RCGR_SRC_SEL | div); - writel(cfg, GCC_PCIE_REG(GCC_PCIE_AXI_M_CFG_RCGR, pcie_id)); - writel(CMD_UPDATE, GCC_PCIE_REG(GCC_PCIE_AXI_M_CMD_RCGR, pcie_id)); - mdelay(100); - writel(ROOT_EN, GCC_PCIE_REG(GCC_PCIE_AXI_M_CMD_RCGR, pcie_id)); - - /* Configure pcie_axi_s__clk_src */ - cfg = (GCC_PCIE_AXI_S_CFG_RCGR_SRC_SEL | GCC_PCIE_AXI_S_CFG_RCGR_SRC_DIV); - writel(cfg, GCC_PCIE_REG(GCC_PCIE_AXI_S_CFG_RCGR, pcie_id)); - writel(CMD_UPDATE, GCC_PCIE_REG(GCC_PCIE_AXI_S_CMD_RCGR, pcie_id)); - mdelay(100); - writel(ROOT_EN, GCC_PCIE_REG(GCC_PCIE_AXI_S_CMD_RCGR, pcie_id)); - - /* Configure CBCRs */ - writel(CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_AHB_CBCR, pcie_id)); - writel(CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_AXI_M_CBCR, pcie_id)); - writel(CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_AXI_S_CBCR, pcie_id)); - writel(CLK_ENABLE, GCC_SNOC_PCIE0_1LANE_S_CBCR + (0x4 * pcie_id)); - switch(pcie_id){ - case 0: - writel(CLK_ENABLE, GCC_ANOC_PCIE0_1LANE_M_CBCR); - break; - case 1: - writel(CLK_ENABLE, GCC_ANOC_PCIE1_1LANE_M_CBCR); - break; - case 2: - writel(CLK_ENABLE, GCC_ANOC_PCIE2_2LANE_M_CBCR); - break; - case 3: - writel(CLK_ENABLE, GCC_ANOC_PCIE3_2LANE_M_CBCR); - break; + if (clk_configure == 0) { + cfg = (GCC_PCIE_AUX_CFG_RCGR_MN_MODE | + GCC_PCIE_AUX_CFG_RCGR_SRC_SEL | + GCC_PCIE_AUX_CFG_RCGR_SRC_DIV); + writel(cfg, GCC_PCIE_AUX_CFG_RCGR); + writel(0x1, GCC_PCIE_AUX_M); + writel(0xFFFC, GCC_PCIE_AUX_N); + writel(0xFFFA, GCC_PCIE_AUX_D); + writel(CMD_UPDATE, GCC_PCIE_AUX_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE_AUX_CMD_RCGR); + clk_configure = 1; } - writel(CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_AXI_S_BRIDGE_CBCR, pcie_id)); - writel(PIPE_CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_PIPE_CBCR, pcie_id)); - - /* Configure pcie_rchng_clk_src */ - cfg = (GCC_PCIE_RCHNG_CFG_RCGR_SRC_SEL - | GCC_PCIE_RCHNG_CFG_RCGR_SRC_DIV); - writel(cfg, GCC_PCIE_REG(GCC_PCIE_RCHNG_CFG_RCGR, pcie_id)); - writel(CMD_UPDATE, GCC_PCIE_REG(GCC_PCIE_RCHNG_CMD_RCGR, pcie_id)); - mdelay(100); - writel(ROOT_EN, GCC_PCIE_REG(GCC_PCIE_RCHNG_CMD_RCGR, pcie_id)); - - writel(CLK_ENABLE, GCC_PCIE_REG(GCC_PCIE_AUX_CBCR, pcie_id)); + /* Configure pcie axi clk source */ + cfg = (GCC_PCIE_AXI_CFG_RCGR_SRC_SEL | + GCC_PCIE_AXI_CFG_RCGR_SRC_DIV); + cfg1 = (GCC_PCIE_RCHG_CFG_RCGR_SRC_SEL | + GCC_PCIE_RCHG_CFG_RCGR_SRC_DIV); + switch(pcie_id) { + case 0: + writel(cfg, GCC_PCIE3X1_0_AXI_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X1_0_AXI_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X1_0_AXI_CMD_RCGR); + writel(cfg1, GCC_PCIE3X1_0_RCHG_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X1_0_RCHG_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X1_0_RCHG_CMD_RCGR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_AHB_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_AXI_M_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_AXI_S_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_AXI_S_BRIDGE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_PIPE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_0_AUX_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_PHY_AHB_CBCR); + break; + case 1: + writel(cfg, GCC_PCIE3X2_AXI_M_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X2_AXI_M_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X2_AXI_M_CMD_RCGR); + cfg = (GCC_PCIE3X2_AXI_S_CFG_RCGR_SRC_SEL | + GCC_PCIE3X2_AXI_S_CFG_RCGR_SRC_DIV); + writel(cfg, GCC_PCIE3X2_AXI_S_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X2_AXI_S_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X2_AXI_S_CMD_RCGR); + writel(cfg1, GCC_PCIE3X2_RCHG_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X2_RCHG_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X2_RCHG_CMD_RCGR); + writel(CLK_ENABLE, GCC_PCIE3X2_AHB_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_AXI_M_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_AXI_S_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_AXI_S_BRIDGE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_PIPE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_AUX_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X2_PHY_AHB_CBCR); + break; + case 2: + writel(cfg, GCC_PCIE3X1_1_AXI_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X1_1_AXI_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X1_1_AXI_CMD_RCGR); + writel(cfg1, GCC_PCIE3X1_1_RCHG_CFG_RCGR); + writel(CMD_UPDATE, GCC_PCIE3X1_1_RCHG_CMD_RCGR); + mdelay(10); + writel(ROOT_EN, GCC_PCIE3X1_1_RCHG_CMD_RCGR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_AHB_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_AXI_M_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_AXI_S_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_AXI_S_BRIDGE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_PIPE_CBCR); + writel(CLK_ENABLE, GCC_PCIE3X1_1_AUX_CBCR); + break; + } + writel(CLK_ENABLE, GCC_SNOC_PCIE3_2LANE_M_CBCR); + writel(CLK_ENABLE, GCC_SNOC_PCIE3_2LANE_S_CBCR); + writel(CLK_ENABLE, GCC_SNOC_PCIE3_1LANE_M_CBCR); + writel(CLK_ENABLE, GCC_SNOC_PCIE3_1LANE_S_CBCR); + writel(CLK_ENABLE, GCC_SNOC_PCIE3_1LANE_1_M_CBCR); + writel(CLK_ENABLE, GCC_SNOC_PCIE3_1LANE_1_S_CBCR); #else return; #endif @@ -203,30 +225,39 @@ void pcie_v2_clock_init(int pcie_id) void pcie_v2_clock_deinit(int pcie_id) { #ifdef QCA_CLOCK_ENABLE - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AUX_CMD_RCGR, 0)); - mdelay(100); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AHB_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AXI_M_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AXI_S_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AUX_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_PIPE_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_AXI_S_BRIDGE_CBCR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_RCHNG_CFG_RCGR, pcie_id)); - writel(0x0, GCC_PCIE_REG(GCC_PCIE_RCHNG_CMD_RCGR, pcie_id)); - writel(0x0, GCC_SNOC_PCIE0_1LANE_S_CBCR + (0x4 * pcie_id)); - switch(pcie_id){ + writel(0x0, GCC_SNOC_PCIE3_2LANE_M_CBCR); + writel(0x0, GCC_SNOC_PCIE3_2LANE_S_CBCR); + writel(0x0, GCC_SNOC_PCIE3_1LANE_M_CBCR); + writel(0x0, GCC_SNOC_PCIE3_1LANE_S_CBCR); + writel(0x0, GCC_SNOC_PCIE3_1LANE_1_M_CBCR); + writel(0x0, GCC_SNOC_PCIE3_1LANE_1_S_CBCR); + switch(pcie_id) { case 0: - writel(0x0, GCC_ANOC_PCIE0_1LANE_M_CBCR); - break; + writel(0x0, GCC_PCIE3X1_0_AHB_CBCR); + writel(0x0, GCC_PCIE3X1_0_AXI_M_CBCR); + writel(0x0, GCC_PCIE3X1_0_AXI_S_CBCR); + writel(0x0, GCC_PCIE3X1_0_AXI_S_BRIDGE_CBCR); + writel(0x0, GCC_PCIE3X1_0_PIPE_CBCR); + writel(0x0, GCC_PCIE3X1_0_AUX_CBCR); + writel(0x0, GCC_PCIE3X1_PHY_AHB_CBCR); + break; case 1: - writel(0x0, GCC_ANOC_PCIE1_1LANE_M_CBCR); - break; + writel(0x0, GCC_PCIE3X2_AHB_CBCR); + writel(0x0, GCC_PCIE3X2_AXI_M_CBCR); + writel(0x0, GCC_PCIE3X2_AXI_S_CBCR); + writel(0x0, GCC_PCIE3X2_AXI_S_BRIDGE_CBCR); + writel(0x0, GCC_PCIE3X2_PIPE_CBCR); + writel(0x0, GCC_PCIE3X2_AUX_CBCR); + writel(0x0, GCC_PCIE3X2_PHY_AHB_CBCR); + break; case 2: - writel(0x0, GCC_ANOC_PCIE2_2LANE_M_CBCR); - break; - case 3: - writel(0x0, GCC_ANOC_PCIE3_2LANE_M_CBCR); - break; + writel(0x0, GCC_PCIE3X1_1_AHB_CBCR); + writel(0x0, GCC_PCIE3X1_1_AXI_M_CBCR); + writel(0x0, GCC_PCIE3X1_1_AXI_S_CBCR); + writel(0x0, GCC_PCIE3X1_1_AXI_S_BRIDGE_CBCR); + writel(0x0, GCC_PCIE3X1_1_PIPE_CBCR); + writel(0x0, GCC_PCIE3X1_1_AUX_CBCR); + break; } #else return;