1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com> 3*4882a593Smuzhiyun * Based on Atheros LSDK/QSDK 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun#include <config.h> 9*4882a593Smuzhiyun#include <asm/asm.h> 10*4882a593Smuzhiyun#include <asm/regdef.h> 11*4882a593Smuzhiyun#include <asm/mipsregs.h> 12*4882a593Smuzhiyun#include <asm/addrspace.h> 13*4882a593Smuzhiyun#include <mach/ar71xx_regs.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun#define MK_PLL_CONF(divint, refdiv, range, outdiv) \ 16*4882a593Smuzhiyun (((0x3F & divint) << 10) | \ 17*4882a593Smuzhiyun ((0x1F & refdiv) << 16) | \ 18*4882a593Smuzhiyun ((0x1 & range) << 21) | \ 19*4882a593Smuzhiyun ((0x7 & outdiv) << 23) ) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \ 22*4882a593Smuzhiyun (((0x3 & (cpudiv - 1)) << 5) | \ 23*4882a593Smuzhiyun ((0x3 & (ddrdiv - 1)) << 10) | \ 24*4882a593Smuzhiyun ((0x3 & (ahbdiv - 1)) << 15) ) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun#define SET_FIELD(name, v) (((v) & QCA953X_##name##_MASK) << \ 27*4882a593Smuzhiyun QCA953X_##name##_SHIFT) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun#define DPLL2_KI(v) SET_FIELD(SRIF_DPLL2_KI, v) 30*4882a593Smuzhiyun#define DPLL2_KD(v) SET_FIELD(SRIF_DPLL2_KD, v) 31*4882a593Smuzhiyun#define DPLL2_PWD QCA953X_SRIF_DPLL2_PWD 32*4882a593Smuzhiyun#define MK_DPLL2(ki, kd) (DPLL2_KI(ki) | DPLL2_KD(kd) | DPLL2_PWD) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun#define PLL_CPU_NFRAC(v) SET_FIELD(PLL_CPU_CONFIG_NFRAC, v) 35*4882a593Smuzhiyun#define PLL_CPU_NINT(v) SET_FIELD(PLL_CPU_CONFIG_NINT, v) 36*4882a593Smuzhiyun#define PLL_CPU_REFDIV(v) SET_FIELD(PLL_CPU_CONFIG_REFDIV, v) 37*4882a593Smuzhiyun#define PLL_CPU_OUTDIV(v) SET_FIELD(PLL_CPU_CONFIG_OUTDIV, v) 38*4882a593Smuzhiyun#define MK_PLL_CPU_CONF(frac, nint, ref, outdiv) \ 39*4882a593Smuzhiyun (PLL_CPU_NFRAC(frac) | \ 40*4882a593Smuzhiyun PLL_CPU_NINT(nint) | \ 41*4882a593Smuzhiyun PLL_CPU_REFDIV(ref) | \ 42*4882a593Smuzhiyun PLL_CPU_OUTDIV(outdiv)) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun#define PLL_DDR_NFRAC(v) SET_FIELD(PLL_DDR_CONFIG_NFRAC, v) 45*4882a593Smuzhiyun#define PLL_DDR_NINT(v) SET_FIELD(PLL_DDR_CONFIG_NINT, v) 46*4882a593Smuzhiyun#define PLL_DDR_REFDIV(v) SET_FIELD(PLL_DDR_CONFIG_REFDIV, v) 47*4882a593Smuzhiyun#define PLL_DDR_OUTDIV(v) SET_FIELD(PLL_DDR_CONFIG_OUTDIV, v) 48*4882a593Smuzhiyun#define MK_PLL_DDR_CONF(frac, nint, ref, outdiv) \ 49*4882a593Smuzhiyun (PLL_DDR_NFRAC(frac) | \ 50*4882a593Smuzhiyun PLL_DDR_REFDIV(ref) | \ 51*4882a593Smuzhiyun PLL_DDR_NINT(nint) | \ 52*4882a593Smuzhiyun PLL_DDR_OUTDIV(outdiv) | \ 53*4882a593Smuzhiyun QCA953X_PLL_CONFIG_PWD) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun#define PLL_CPU_CONF_VAL MK_PLL_CPU_CONF(0, 26, 1, 0) 56*4882a593Smuzhiyun#define PLL_DDR_CONF_VAL MK_PLL_DDR_CONF(0, 15, 1, 0) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun#define PLL_CLK_CTRL_PLL_BYPASS (QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS | \ 59*4882a593Smuzhiyun QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS | \ 60*4882a593Smuzhiyun QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun#define PLL_CLK_CTRL_CPU_DIV(v) SET_FIELD(PLL_CLK_CTRL_CPU_POST_DIV, v) 63*4882a593Smuzhiyun#define PLL_CLK_CTRL_DDR_DIV(v) SET_FIELD(PLL_CLK_CTRL_DDR_POST_DIV, v) 64*4882a593Smuzhiyun#define PLL_CLK_CTRL_AHB_DIV(v) SET_FIELD(PLL_CLK_CTRL_AHB_POST_DIV, v) 65*4882a593Smuzhiyun#define MK_PLL_CLK_CTRL(cpu, ddr, ahb) \ 66*4882a593Smuzhiyun (PLL_CLK_CTRL_CPU_DIV(cpu) | \ 67*4882a593Smuzhiyun PLL_CLK_CTRL_DDR_DIV(ddr) | \ 68*4882a593Smuzhiyun PLL_CLK_CTRL_AHB_DIV(ahb)) 69*4882a593Smuzhiyun#define PLL_CLK_CTRL_VAL (MK_PLL_CLK_CTRL(0, 0, 2) | \ 70*4882a593Smuzhiyun PLL_CLK_CTRL_PLL_BYPASS | \ 71*4882a593Smuzhiyun QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL | \ 72*4882a593Smuzhiyun QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_MAX(v) SET_FIELD(PLL_DDR_DIT_FRAC_MAX, v) 75*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_MIN(v) SET_FIELD(PLL_DDR_DIT_FRAC_MIN, v) 76*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_STEP(v) SET_FIELD(PLL_DDR_DIT_FRAC_STEP, v) 77*4882a593Smuzhiyun#define PLL_DDR_DIT_UPD_CNT(v) SET_FIELD(PLL_DDR_DIT_UPD_CNT, v) 78*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_MAX(v) SET_FIELD(PLL_CPU_DIT_FRAC_MAX, v) 79*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_MIN(v) SET_FIELD(PLL_CPU_DIT_FRAC_MIN, v) 80*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_STEP(v) SET_FIELD(PLL_CPU_DIT_FRAC_STEP, v) 81*4882a593Smuzhiyun#define PLL_CPU_DIT_UPD_CNT(v) SET_FIELD(PLL_CPU_DIT_UPD_CNT, v) 82*4882a593Smuzhiyun#define MK_PLL_DDR_DIT_FRAC(max, min, step, cnt) \ 83*4882a593Smuzhiyun (QCA953X_PLL_DIT_FRAC_EN | \ 84*4882a593Smuzhiyun PLL_DDR_DIT_FRAC_MAX(max) | \ 85*4882a593Smuzhiyun PLL_DDR_DIT_FRAC_MIN(min) | \ 86*4882a593Smuzhiyun PLL_DDR_DIT_FRAC_STEP(step) | \ 87*4882a593Smuzhiyun PLL_DDR_DIT_UPD_CNT(cnt)) 88*4882a593Smuzhiyun#define MK_PLL_CPU_DIT_FRAC(max, min, step, cnt) \ 89*4882a593Smuzhiyun (QCA953X_PLL_DIT_FRAC_EN | \ 90*4882a593Smuzhiyun PLL_CPU_DIT_FRAC_MAX(max) | \ 91*4882a593Smuzhiyun PLL_CPU_DIT_FRAC_MIN(min) | \ 92*4882a593Smuzhiyun PLL_CPU_DIT_FRAC_STEP(step) | \ 93*4882a593Smuzhiyun PLL_CPU_DIT_UPD_CNT(cnt)) 94*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_VAL MK_PLL_CPU_DIT_FRAC(63, 0, 1, 15) 95*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_VAL MK_PLL_DDR_DIT_FRAC(763, 635, 1, 15) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun .text 98*4882a593Smuzhiyun .set noreorder 99*4882a593Smuzhiyun 100*4882a593SmuzhiyunLEAF(lowlevel_init) 101*4882a593Smuzhiyun /* RTC Reset */ 102*4882a593Smuzhiyun li t0, CKSEG1ADDR(AR71XX_RESET_BASE) 103*4882a593Smuzhiyun lw t1, QCA953X_RESET_REG_RESET_MODULE(t0) 104*4882a593Smuzhiyun li t2, 0x08000000 105*4882a593Smuzhiyun or t1, t1, t2 106*4882a593Smuzhiyun sw t1, QCA953X_RESET_REG_RESET_MODULE(t0) 107*4882a593Smuzhiyun nop 108*4882a593Smuzhiyun lw t1, QCA953X_RESET_REG_RESET_MODULE(t0) 109*4882a593Smuzhiyun li t2, 0xf7ffffff 110*4882a593Smuzhiyun and t1, t1, t2 111*4882a593Smuzhiyun sw t1, QCA953X_RESET_REG_RESET_MODULE(t0) 112*4882a593Smuzhiyun nop 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* RTC Force Wake */ 115*4882a593Smuzhiyun li t0, CKSEG1ADDR(QCA953X_RTC_BASE) 116*4882a593Smuzhiyun li t1, 0x01 117*4882a593Smuzhiyun sw t1, QCA953X_RTC_REG_SYNC_RESET(t0) 118*4882a593Smuzhiyun nop 119*4882a593Smuzhiyun nop 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* Wait for RTC in on state */ 122*4882a593Smuzhiyun1: 123*4882a593Smuzhiyun lw t1, QCA953X_RTC_REG_SYNC_STATUS(t0) 124*4882a593Smuzhiyun andi t1, t1, 0x02 125*4882a593Smuzhiyun beqz t1, 1b 126*4882a593Smuzhiyun nop 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun li t0, CKSEG1ADDR(QCA953X_SRIF_BASE) 129*4882a593Smuzhiyun li t1, MK_DPLL2(2, 16) 130*4882a593Smuzhiyun sw t1, QCA953X_SRIF_BB_DPLL2_REG(t0) 131*4882a593Smuzhiyun sw t1, QCA953X_SRIF_PCIE_DPLL2_REG(t0) 132*4882a593Smuzhiyun sw t1, QCA953X_SRIF_DDR_DPLL2_REG(t0) 133*4882a593Smuzhiyun sw t1, QCA953X_SRIF_CPU_DPLL2_REG(t0) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun li t0, CKSEG1ADDR(AR71XX_PLL_BASE) 136*4882a593Smuzhiyun lw t1, QCA953X_PLL_CLK_CTRL_REG(t0) 137*4882a593Smuzhiyun ori t1, PLL_CLK_CTRL_PLL_BYPASS 138*4882a593Smuzhiyun sw t1, QCA953X_PLL_CLK_CTRL_REG(t0) 139*4882a593Smuzhiyun nop 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun li t1, PLL_CPU_CONF_VAL 142*4882a593Smuzhiyun sw t1, QCA953X_PLL_CPU_CONFIG_REG(t0) 143*4882a593Smuzhiyun nop 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun li t1, PLL_DDR_CONF_VAL 146*4882a593Smuzhiyun sw t1, QCA953X_PLL_DDR_CONFIG_REG(t0) 147*4882a593Smuzhiyun nop 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun li t1, PLL_CLK_CTRL_VAL 150*4882a593Smuzhiyun sw t1, QCA953X_PLL_CLK_CTRL_REG(t0) 151*4882a593Smuzhiyun nop 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun lw t1, QCA953X_PLL_CPU_CONFIG_REG(t0) 154*4882a593Smuzhiyun li t2, ~QCA953X_PLL_CONFIG_PWD 155*4882a593Smuzhiyun and t1, t1, t2 156*4882a593Smuzhiyun sw t1, QCA953X_PLL_CPU_CONFIG_REG(t0) 157*4882a593Smuzhiyun nop 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun lw t1, QCA953X_PLL_DDR_CONFIG_REG(t0) 160*4882a593Smuzhiyun li t2, ~QCA953X_PLL_CONFIG_PWD 161*4882a593Smuzhiyun and t1, t1, t2 162*4882a593Smuzhiyun sw t1, QCA953X_PLL_DDR_CONFIG_REG(t0) 163*4882a593Smuzhiyun nop 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun lw t1, QCA953X_PLL_CLK_CTRL_REG(t0) 166*4882a593Smuzhiyun li t2, ~PLL_CLK_CTRL_PLL_BYPASS 167*4882a593Smuzhiyun and t1, t1, t2 168*4882a593Smuzhiyun sw t1, QCA953X_PLL_CLK_CTRL_REG(t0) 169*4882a593Smuzhiyun nop 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun li t1, PLL_DDR_DIT_FRAC_VAL 172*4882a593Smuzhiyun sw t1, QCA953X_PLL_DDR_DIT_FRAC_REG(t0) 173*4882a593Smuzhiyun nop 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun li t1, PLL_CPU_DIT_FRAC_VAL 176*4882a593Smuzhiyun sw t1, QCA953X_PLL_CPU_DIT_FRAC_REG(t0) 177*4882a593Smuzhiyun nop 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun li t0, CKSEG1ADDR(AR71XX_RESET_BASE) 180*4882a593Smuzhiyun lui t1, 0x03fc 181*4882a593Smuzhiyun sw t1, 0xb4(t0) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun nop 184*4882a593Smuzhiyun jr ra 185*4882a593Smuzhiyun nop 186*4882a593Smuzhiyun END(lowlevel_init) 187