1*4e858ba0SHaojian Zhuang /* 2*4e858ba0SHaojian Zhuang * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*4e858ba0SHaojian Zhuang * 4*4e858ba0SHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause 5*4e858ba0SHaojian Zhuang */ 6*4e858ba0SHaojian Zhuang 7*4e858ba0SHaojian Zhuang #include <debug.h> 8*4e858ba0SHaojian Zhuang #include <delay_timer.h> 9*4e858ba0SHaojian Zhuang #include <hi3660.h> 10*4e858ba0SHaojian Zhuang #include <mmio.h> 11*4e858ba0SHaojian Zhuang 12*4e858ba0SHaojian Zhuang #include "hikey960_private.h" 13*4e858ba0SHaojian Zhuang 14*4e858ba0SHaojian Zhuang void hikey960_clk_init(void) 15*4e858ba0SHaojian Zhuang { 16*4e858ba0SHaojian Zhuang /* change ldi0 sel to ppll2 */ 17*4e858ba0SHaojian Zhuang mmio_write_32(0xfff350b4, 0xf0002000); 18*4e858ba0SHaojian Zhuang /* ldi0 20' */ 19*4e858ba0SHaojian Zhuang mmio_write_32(0xfff350bc, 0xfc004c00); 20*4e858ba0SHaojian Zhuang } 21*4e858ba0SHaojian Zhuang 22*4e858ba0SHaojian Zhuang void hikey960_pmu_init(void) 23*4e858ba0SHaojian Zhuang { 24*4e858ba0SHaojian Zhuang /* clear np_xo_abb_dig_START bit in PMIC_CLK_TOP_CTRL7 register */ 25*4e858ba0SHaojian Zhuang mmio_clrbits_32(PMU_SSI0_CLK_TOP_CTRL7_REG, NP_XO_ABB_DIG); 26*4e858ba0SHaojian Zhuang } 27*4e858ba0SHaojian Zhuang 28*4e858ba0SHaojian Zhuang static void hikey960_enable_ppll3(void) 29*4e858ba0SHaojian Zhuang { 30*4e858ba0SHaojian Zhuang /* enable ppll3 */ 31*4e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL0_REG, 0x4904305); 32*4e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL1_REG, 0x2300000); 33*4e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL1_REG, 0x6300000); 34*4e858ba0SHaojian Zhuang } 35*4e858ba0SHaojian Zhuang 36*4e858ba0SHaojian Zhuang static void bus_idle_clear(unsigned int value) 37*4e858ba0SHaojian Zhuang { 38*4e858ba0SHaojian Zhuang unsigned int pmc_value, value1, value2; 39*4e858ba0SHaojian Zhuang int timeout = 100; 40*4e858ba0SHaojian Zhuang 41*4e858ba0SHaojian Zhuang pmc_value = value << 16; 42*4e858ba0SHaojian Zhuang pmc_value &= ~value; 43*4e858ba0SHaojian Zhuang mmio_write_32(PMC_NOC_POWER_IDLEREQ_REG, pmc_value); 44*4e858ba0SHaojian Zhuang 45*4e858ba0SHaojian Zhuang for (;;) { 46*4e858ba0SHaojian Zhuang value1 = (unsigned int)mmio_read_32(PMC_NOC_POWER_IDLEACK_REG); 47*4e858ba0SHaojian Zhuang value2 = (unsigned int)mmio_read_32(PMC_NOC_POWER_IDLE_REG); 48*4e858ba0SHaojian Zhuang if (((value1 & value) == 0) && ((value2 & value) == 0)) 49*4e858ba0SHaojian Zhuang break; 50*4e858ba0SHaojian Zhuang udelay(1); 51*4e858ba0SHaojian Zhuang timeout--; 52*4e858ba0SHaojian Zhuang if (timeout <= 0) { 53*4e858ba0SHaojian Zhuang WARN("%s timeout\n", __func__); 54*4e858ba0SHaojian Zhuang break; 55*4e858ba0SHaojian Zhuang } 56*4e858ba0SHaojian Zhuang } 57*4e858ba0SHaojian Zhuang } 58*4e858ba0SHaojian Zhuang 59*4e858ba0SHaojian Zhuang static void set_vivobus_power_up(void) 60*4e858ba0SHaojian Zhuang { 61*4e858ba0SHaojian Zhuang /* clk enable */ 62*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00020002); 63*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00001000); 64*4e858ba0SHaojian Zhuang } 65*4e858ba0SHaojian Zhuang 66*4e858ba0SHaojian Zhuang static void set_dss_power_up(void) 67*4e858ba0SHaojian Zhuang { 68*4e858ba0SHaojian Zhuang /* set edc0 133MHz = 1600MHz / 12 */ 69*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0x003f000b); 70*4e858ba0SHaojian Zhuang /* set ldi0 ppl0 */ 71*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV3_REG, 0xf0001000); 72*4e858ba0SHaojian Zhuang /* set ldi0 133MHz, 1600MHz / 12 */ 73*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0xfc002c00); 74*4e858ba0SHaojian Zhuang /* mtcmos on */ 75*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000020); 76*4e858ba0SHaojian Zhuang udelay(100); 77*4e858ba0SHaojian Zhuang /* DISP CRG */ 78*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS4_REG, 0x00000010); 79*4e858ba0SHaojian Zhuang /* clk enable */ 80*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400140); 81*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00002000); 82*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0003b000); 83*4e858ba0SHaojian Zhuang udelay(1); 84*4e858ba0SHaojian Zhuang /* clk disable */ 85*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x0003b000); 86*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS0_REG, 0x00002000); 87*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400000); 88*4e858ba0SHaojian Zhuang udelay(1); 89*4e858ba0SHaojian Zhuang /* iso disable */ 90*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000040); 91*4e858ba0SHaojian Zhuang /* unreset */ 92*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS4_REG, 0x00000006); 93*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000c00); 94*4e858ba0SHaojian Zhuang /* clk enable */ 95*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400140); 96*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00002000); 97*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0003b000); 98*4e858ba0SHaojian Zhuang /* bus idle clear */ 99*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_DSS); 100*4e858ba0SHaojian Zhuang /* set edc0 400MHz for 2K 1600MHz / 4 */ 101*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0x003f0003); 102*4e858ba0SHaojian Zhuang /* set ldi 266MHz, 1600MHz / 6 */ 103*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0xfc001400); 104*4e858ba0SHaojian Zhuang } 105*4e858ba0SHaojian Zhuang 106*4e858ba0SHaojian Zhuang static void set_vcodec_power_up(void) 107*4e858ba0SHaojian Zhuang { 108*4e858ba0SHaojian Zhuang /* clk enable */ 109*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00040004); 110*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00000060); 111*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x10000000); 112*4e858ba0SHaojian Zhuang /* unreset */ 113*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS0_REG, 0x00000018); 114*4e858ba0SHaojian Zhuang /* bus idle clear */ 115*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VCODEC); 116*4e858ba0SHaojian Zhuang } 117*4e858ba0SHaojian Zhuang 118*4e858ba0SHaojian Zhuang static void set_vdec_power_up(void) 119*4e858ba0SHaojian Zhuang { 120*4e858ba0SHaojian Zhuang /* mtcmos on */ 121*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000004); 122*4e858ba0SHaojian Zhuang udelay(100); 123*4e858ba0SHaojian Zhuang /* clk enable */ 124*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80008000); 125*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x20080000); 126*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000800); 127*4e858ba0SHaojian Zhuang udelay(1); 128*4e858ba0SHaojian Zhuang /* clk disable */ 129*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x00000800); 130*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS2_REG, 0x20080000); 131*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80000000); 132*4e858ba0SHaojian Zhuang udelay(1); 133*4e858ba0SHaojian Zhuang /* iso disable */ 134*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000004); 135*4e858ba0SHaojian Zhuang /* unreset */ 136*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000200); 137*4e858ba0SHaojian Zhuang /* clk enable */ 138*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80008000); 139*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x20080000); 140*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000800); 141*4e858ba0SHaojian Zhuang /* bus idle clear */ 142*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VDEC); 143*4e858ba0SHaojian Zhuang } 144*4e858ba0SHaojian Zhuang 145*4e858ba0SHaojian Zhuang static void set_venc_power_up(void) 146*4e858ba0SHaojian Zhuang { 147*4e858ba0SHaojian Zhuang /* set venc ppll3 */ 148*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x18001000); 149*4e858ba0SHaojian Zhuang /* set venc 258MHz, 1290MHz / 5 */ 150*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x07c00100); 151*4e858ba0SHaojian Zhuang /* mtcmos on */ 152*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000002); 153*4e858ba0SHaojian Zhuang udelay(100); 154*4e858ba0SHaojian Zhuang /* clk enable */ 155*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010001); 156*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x40000100); 157*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000400); 158*4e858ba0SHaojian Zhuang udelay(1); 159*4e858ba0SHaojian Zhuang /* clk disable */ 160*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x00000400); 161*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS2_REG, 0x40000100); 162*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010000); 163*4e858ba0SHaojian Zhuang udelay(1); 164*4e858ba0SHaojian Zhuang /* iso disable */ 165*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000002); 166*4e858ba0SHaojian Zhuang /* unreset */ 167*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000100); 168*4e858ba0SHaojian Zhuang /* clk enable */ 169*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010001); 170*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x40000100); 171*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000400); 172*4e858ba0SHaojian Zhuang /* bus idle clear */ 173*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VENC); 174*4e858ba0SHaojian Zhuang /* set venc 645MHz, 1290MHz / 2 */ 175*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x07c00040); 176*4e858ba0SHaojian Zhuang } 177*4e858ba0SHaojian Zhuang 178*4e858ba0SHaojian Zhuang static void set_isp_power_up(void) 179*4e858ba0SHaojian Zhuang { 180*4e858ba0SHaojian Zhuang /* mtcmos on */ 181*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000001); 182*4e858ba0SHaojian Zhuang udelay(100); 183*4e858ba0SHaojian Zhuang /* clk enable */ 184*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70007000); 185*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100010); 186*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x01000010); 187*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0bf00000); 188*4e858ba0SHaojian Zhuang udelay(1); 189*4e858ba0SHaojian Zhuang /* clk disable */ 190*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS5_REG, 0x01000010); 191*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x0bf00000); 192*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70000000); 193*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100000); 194*4e858ba0SHaojian Zhuang udelay(1); 195*4e858ba0SHaojian Zhuang /* iso disable */ 196*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000001); 197*4e858ba0SHaojian Zhuang /* unreset */ 198*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISP_SEC_RSTDIS_REG, 0x0000002f); 199*4e858ba0SHaojian Zhuang /* clk enable */ 200*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70007000); 201*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100010); 202*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x01000010); 203*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0bf00000); 204*4e858ba0SHaojian Zhuang /* bus idle clear */ 205*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_ISP); 206*4e858ba0SHaojian Zhuang /* csi clk enable */ 207*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00700000); 208*4e858ba0SHaojian Zhuang } 209*4e858ba0SHaojian Zhuang 210*4e858ba0SHaojian Zhuang static void set_ivp_power_up(void) 211*4e858ba0SHaojian Zhuang { 212*4e858ba0SHaojian Zhuang /* set ivp ppll0 */ 213*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0xc0000000); 214*4e858ba0SHaojian Zhuang /* set ivp 267MHz, 1600MHz / 6 */ 215*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0x3c001400); 216*4e858ba0SHaojian Zhuang /* mtcmos on */ 217*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00200000); 218*4e858ba0SHaojian Zhuang udelay(100); 219*4e858ba0SHaojian Zhuang /* IVP CRG unreset */ 220*4e858ba0SHaojian Zhuang mmio_write_32(CRG_IVP_SEC_RSTDIS_REG, 0x00000001); 221*4e858ba0SHaojian Zhuang /* clk enable */ 222*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000200); 223*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN4_REG, 0x000000a8); 224*4e858ba0SHaojian Zhuang udelay(1); 225*4e858ba0SHaojian Zhuang /* clk disable */ 226*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS4_REG, 0x000000a8); 227*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000000); 228*4e858ba0SHaojian Zhuang udelay(1); 229*4e858ba0SHaojian Zhuang /* iso disable */ 230*4e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x01000000); 231*4e858ba0SHaojian Zhuang /* unreset */ 232*4e858ba0SHaojian Zhuang mmio_write_32(CRG_IVP_SEC_RSTDIS_REG, 0x00000002); 233*4e858ba0SHaojian Zhuang /* clk enable */ 234*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000200); 235*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN4_REG, 0x000000a8); 236*4e858ba0SHaojian Zhuang /* bus idle clear */ 237*4e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_IVP); 238*4e858ba0SHaojian Zhuang /* set ivp 533MHz, 1600MHz / 3 */ 239*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0x3c000800); 240*4e858ba0SHaojian Zhuang } 241*4e858ba0SHaojian Zhuang 242*4e858ba0SHaojian Zhuang static void set_audio_power_up(void) 243*4e858ba0SHaojian Zhuang { 244*4e858ba0SHaojian Zhuang unsigned int ret; 245*4e858ba0SHaojian Zhuang int timeout = 100; 246*4e858ba0SHaojian Zhuang /* mtcmos on */ 247*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPWREN_REG, 0x00000001); 248*4e858ba0SHaojian Zhuang udelay(100); 249*4e858ba0SHaojian Zhuang /* clk enable */ 250*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80108010); 251*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010001); 252*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN0_REG, 0x0c000000); 253*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x04000000); 254*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x00000080); 255*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN1_REG, 0x0000000f); 256*4e858ba0SHaojian Zhuang udelay(1); 257*4e858ba0SHaojian Zhuang /* clk disable */ 258*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS1_REG, 0x0000000f); 259*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS0_REG, 0x0c000000); 260*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS5_REG, 0x00000080); 261*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS0_REG, 0x04000000); 262*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010000); 263*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80100000); 264*4e858ba0SHaojian Zhuang udelay(1); 265*4e858ba0SHaojian Zhuang /* iso disable */ 266*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCISODIS_REG, 0x00000001); 267*4e858ba0SHaojian Zhuang udelay(1); 268*4e858ba0SHaojian Zhuang /* unreset */ 269*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_PERRSTDIS1_SEC_REG, 0x00000001); 270*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERRSTDIS0_REG, 0x00000780); 271*4e858ba0SHaojian Zhuang /* clk enable */ 272*4e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80108010); 273*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010001); 274*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN0_REG, 0x0c000000); 275*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x04000000); 276*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x00000080); 277*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN1_REG, 0x0000000f); 278*4e858ba0SHaojian Zhuang /* bus idle clear */ 279*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERCTRL7_REG, 0x00040000); 280*4e858ba0SHaojian Zhuang for (;;) { 281*4e858ba0SHaojian Zhuang ret = mmio_read_32(SCTRL_SCPERSTAT6_REG); 282*4e858ba0SHaojian Zhuang if (((ret & (1 << 5)) == 0) && ((ret & (1 << 8)) == 0)) 283*4e858ba0SHaojian Zhuang break; 284*4e858ba0SHaojian Zhuang udelay(1); 285*4e858ba0SHaojian Zhuang timeout--; 286*4e858ba0SHaojian Zhuang if (timeout <= 0) { 287*4e858ba0SHaojian Zhuang WARN("%s timeout\n", __func__); 288*4e858ba0SHaojian Zhuang break; 289*4e858ba0SHaojian Zhuang } 290*4e858ba0SHaojian Zhuang } 291*4e858ba0SHaojian Zhuang mmio_write_32(ASP_CFG_MMBUF_CTRL_REG, 0x00ff0000); 292*4e858ba0SHaojian Zhuang } 293*4e858ba0SHaojian Zhuang 294*4e858ba0SHaojian Zhuang static void set_pcie_power_up(void) 295*4e858ba0SHaojian Zhuang { 296*4e858ba0SHaojian Zhuang /* mtcmos on */ 297*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPWREN_REG, 0x00000010); 298*4e858ba0SHaojian Zhuang udelay(100); 299*4e858ba0SHaojian Zhuang /* clk enable */ 300*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000800); 301*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN2_REG, 0x00104000); 302*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN7_REG, 0x000003a0); 303*4e858ba0SHaojian Zhuang udelay(1); 304*4e858ba0SHaojian Zhuang /* clk disable */ 305*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS2_REG, 0x00104000); 306*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS7_REG, 0x000003a0); 307*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000000); 308*4e858ba0SHaojian Zhuang udelay(1); 309*4e858ba0SHaojian Zhuang /* iso disable */ 310*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCISODIS_REG, 0x00000030); 311*4e858ba0SHaojian Zhuang /* unreset */ 312*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x8c000000); 313*4e858ba0SHaojian Zhuang /* clk enable */ 314*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000800); 315*4e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN2_REG, 0x00104000); 316*4e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN7_REG, 0x000003a0); 317*4e858ba0SHaojian Zhuang } 318*4e858ba0SHaojian Zhuang 319*4e858ba0SHaojian Zhuang static void ispfunc_enable(void) 320*4e858ba0SHaojian Zhuang { 321*4e858ba0SHaojian Zhuang /* enable ispfunc. Otherwise powerup isp_srt causes exception. */ 322*4e858ba0SHaojian Zhuang mmio_write_32(0xfff35000, 0x00000008); 323*4e858ba0SHaojian Zhuang mmio_write_32(0xfff35460, 0xc004ffff); 324*4e858ba0SHaojian Zhuang mmio_write_32(0xfff35030, 0x02000000); 325*4e858ba0SHaojian Zhuang mdelay(10); 326*4e858ba0SHaojian Zhuang } 327*4e858ba0SHaojian Zhuang 328*4e858ba0SHaojian Zhuang static void isps_control_clock(int flag) 329*4e858ba0SHaojian Zhuang { 330*4e858ba0SHaojian Zhuang unsigned int ret; 331*4e858ba0SHaojian Zhuang 332*4e858ba0SHaojian Zhuang /* flag: 0 -- disable clock, 1 -- enable clock */ 333*4e858ba0SHaojian Zhuang if (flag) { 334*4e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420364); 335*4e858ba0SHaojian Zhuang ret |= 1; 336*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420364, ret); 337*4e858ba0SHaojian Zhuang } else { 338*4e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420364); 339*4e858ba0SHaojian Zhuang ret &= ~1; 340*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420364, ret); 341*4e858ba0SHaojian Zhuang } 342*4e858ba0SHaojian Zhuang } 343*4e858ba0SHaojian Zhuang 344*4e858ba0SHaojian Zhuang static void set_isp_srt_power_up(void) 345*4e858ba0SHaojian Zhuang { 346*4e858ba0SHaojian Zhuang unsigned int ret; 347*4e858ba0SHaojian Zhuang 348*4e858ba0SHaojian Zhuang ispfunc_enable(); 349*4e858ba0SHaojian Zhuang /* reset */ 350*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420374, 0x00000001); 351*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420350, 0x00000000); 352*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420358, 0x00000000); 353*4e858ba0SHaojian Zhuang /* mtcmos on */ 354*4e858ba0SHaojian Zhuang mmio_write_32(0xfff35150, 0x00400000); 355*4e858ba0SHaojian Zhuang udelay(100); 356*4e858ba0SHaojian Zhuang /* clk enable */ 357*4e858ba0SHaojian Zhuang isps_control_clock(1); 358*4e858ba0SHaojian Zhuang udelay(1); 359*4e858ba0SHaojian Zhuang isps_control_clock(0); 360*4e858ba0SHaojian Zhuang udelay(1); 361*4e858ba0SHaojian Zhuang /* iso disable */ 362*4e858ba0SHaojian Zhuang mmio_write_32(0xfff35148, 0x08000000); 363*4e858ba0SHaojian Zhuang /* unreset */ 364*4e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420374); 365*4e858ba0SHaojian Zhuang ret &= ~0x1; 366*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420374, ret); 367*4e858ba0SHaojian Zhuang /* clk enable */ 368*4e858ba0SHaojian Zhuang isps_control_clock(1); 369*4e858ba0SHaojian Zhuang /* enable clock gating for accessing csi registers */ 370*4e858ba0SHaojian Zhuang mmio_write_32(0xe8420010, ~0); 371*4e858ba0SHaojian Zhuang } 372*4e858ba0SHaojian Zhuang 373*4e858ba0SHaojian Zhuang void hikey960_regulator_enable(void) 374*4e858ba0SHaojian Zhuang { 375*4e858ba0SHaojian Zhuang set_vivobus_power_up(); 376*4e858ba0SHaojian Zhuang hikey960_enable_ppll3(); 377*4e858ba0SHaojian Zhuang set_dss_power_up(); 378*4e858ba0SHaojian Zhuang set_vcodec_power_up(); 379*4e858ba0SHaojian Zhuang set_vdec_power_up(); 380*4e858ba0SHaojian Zhuang set_venc_power_up(); 381*4e858ba0SHaojian Zhuang set_isp_power_up(); 382*4e858ba0SHaojian Zhuang set_ivp_power_up(); 383*4e858ba0SHaojian Zhuang set_audio_power_up(); 384*4e858ba0SHaojian Zhuang set_pcie_power_up(); 385*4e858ba0SHaojian Zhuang set_isp_srt_power_up(); 386*4e858ba0SHaojian Zhuang 387*4e858ba0SHaojian Zhuang /* set ISP_CORE_CTRL_S to unsecure mode */ 388*4e858ba0SHaojian Zhuang mmio_write_32(0xe8583800, 0x7); 389*4e858ba0SHaojian Zhuang /* set ISP_SUB_CTRL_S to unsecure mode */ 390*4e858ba0SHaojian Zhuang mmio_write_32(0xe8583804, 0xf); 391*4e858ba0SHaojian Zhuang } 392*4e858ba0SHaojian Zhuang 393*4e858ba0SHaojian Zhuang void hikey960_tzc_init(void) 394*4e858ba0SHaojian Zhuang { 395*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN0_REG, 0x7fbff066); 396*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN1_REG, 0xfffff5fc); 397*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN2_REG, 0x0007005c); 398*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN3_REG, 0x37030700); 399*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN4_REG, 0xf63fefae); 400*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN5_REG, 0x000410fd); 401*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN6_REG, 0x0063ff68); 402*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN7_REG, 0x030000f3); 403*4e858ba0SHaojian Zhuang mmio_write_32(TZC_EN8_REG, 0x00000007); 404*4e858ba0SHaojian Zhuang } 405*4e858ba0SHaojian Zhuang 406*4e858ba0SHaojian Zhuang void hikey960_peri_init(void) 407*4e858ba0SHaojian Zhuang { 408*4e858ba0SHaojian Zhuang /* unreset */ 409*4e858ba0SHaojian Zhuang mmio_setbits_32(CRG_PERRSTDIS4_REG, 1); 410*4e858ba0SHaojian Zhuang } 411*4e858ba0SHaojian Zhuang 412*4e858ba0SHaojian Zhuang void hikey960_pinmux_init(void) 413*4e858ba0SHaojian Zhuang { 414*4e858ba0SHaojian Zhuang unsigned int id; 415*4e858ba0SHaojian Zhuang 416*4e858ba0SHaojian Zhuang hikey960_read_boardid(&id); 417*4e858ba0SHaojian Zhuang if (id == 5301) { 418*4e858ba0SHaojian Zhuang /* hikey960 hardware v2 */ 419*4e858ba0SHaojian Zhuang /* GPIO150: LED */ 420*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_FIX_006_REG, 0); 421*4e858ba0SHaojian Zhuang /* GPIO151: LED */ 422*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_FIX_007_REG, 0); 423*4e858ba0SHaojian Zhuang /* GPIO189: LED */ 424*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_011_REG, 0); 425*4e858ba0SHaojian Zhuang /* GPIO190: LED */ 426*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_012_REG, 0); 427*4e858ba0SHaojian Zhuang /* GPIO46 */ 428*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_044_REG, 0); 429*4e858ba0SHaojian Zhuang /* GPIO202 */ 430*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_023_REG, 0); 431*4e858ba0SHaojian Zhuang /* GPIO206 */ 432*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_026_REG, 0); 433*4e858ba0SHaojian Zhuang /* GPIO219 - PD pullup */ 434*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_039_REG, 0); 435*4e858ba0SHaojian Zhuang mmio_write_32(IOCG_AO_043_REG, 1 << 0); 436*4e858ba0SHaojian Zhuang } 437*4e858ba0SHaojian Zhuang /* GPIO005 - PMU SSI, 10mA */ 438*4e858ba0SHaojian Zhuang mmio_write_32(IOCG_006_REG, 2 << 4); 439*4e858ba0SHaojian Zhuang /* GPIO213 - PCIE_CLKREQ_N */ 440*4e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_033_REG, 1); 441*4e858ba0SHaojian Zhuang } 442