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