14e858ba0SHaojian Zhuang /* 24e858ba0SHaojian Zhuang * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 34e858ba0SHaojian Zhuang * 44e858ba0SHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause 54e858ba0SHaojian Zhuang */ 64e858ba0SHaojian Zhuang 709d40e0eSAntonio Nino Diaz #include <common/debug.h> 809d40e0eSAntonio Nino Diaz #include <drivers/arm/pl061_gpio.h> 909d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h> 1009d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 114e858ba0SHaojian Zhuang 1209d40e0eSAntonio Nino Diaz #include <hi3660.h> 134e858ba0SHaojian Zhuang #include "hikey960_private.h" 144e858ba0SHaojian Zhuang 154e858ba0SHaojian Zhuang void hikey960_clk_init(void) 164e858ba0SHaojian Zhuang { 174e858ba0SHaojian Zhuang /* change ldi0 sel to ppll2 */ 184e858ba0SHaojian Zhuang mmio_write_32(0xfff350b4, 0xf0002000); 194e858ba0SHaojian Zhuang /* ldi0 20' */ 204e858ba0SHaojian Zhuang mmio_write_32(0xfff350bc, 0xfc004c00); 214e858ba0SHaojian Zhuang } 224e858ba0SHaojian Zhuang 234e858ba0SHaojian Zhuang void hikey960_pmu_init(void) 244e858ba0SHaojian Zhuang { 254e858ba0SHaojian Zhuang /* clear np_xo_abb_dig_START bit in PMIC_CLK_TOP_CTRL7 register */ 264e858ba0SHaojian Zhuang mmio_clrbits_32(PMU_SSI0_CLK_TOP_CTRL7_REG, NP_XO_ABB_DIG); 274e858ba0SHaojian Zhuang } 284e858ba0SHaojian Zhuang 294e858ba0SHaojian Zhuang static void hikey960_enable_ppll3(void) 304e858ba0SHaojian Zhuang { 314e858ba0SHaojian Zhuang /* enable ppll3 */ 324e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL0_REG, 0x4904305); 334e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL1_REG, 0x2300000); 344e858ba0SHaojian Zhuang mmio_write_32(PMC_PPLL3_CTRL1_REG, 0x6300000); 354e858ba0SHaojian Zhuang } 364e858ba0SHaojian Zhuang 374e858ba0SHaojian Zhuang static void bus_idle_clear(unsigned int value) 384e858ba0SHaojian Zhuang { 394e858ba0SHaojian Zhuang unsigned int pmc_value, value1, value2; 404e858ba0SHaojian Zhuang int timeout = 100; 414e858ba0SHaojian Zhuang 424e858ba0SHaojian Zhuang pmc_value = value << 16; 434e858ba0SHaojian Zhuang pmc_value &= ~value; 444e858ba0SHaojian Zhuang mmio_write_32(PMC_NOC_POWER_IDLEREQ_REG, pmc_value); 454e858ba0SHaojian Zhuang 464e858ba0SHaojian Zhuang for (;;) { 474e858ba0SHaojian Zhuang value1 = (unsigned int)mmio_read_32(PMC_NOC_POWER_IDLEACK_REG); 484e858ba0SHaojian Zhuang value2 = (unsigned int)mmio_read_32(PMC_NOC_POWER_IDLE_REG); 494e858ba0SHaojian Zhuang if (((value1 & value) == 0) && ((value2 & value) == 0)) 504e858ba0SHaojian Zhuang break; 514e858ba0SHaojian Zhuang udelay(1); 524e858ba0SHaojian Zhuang timeout--; 534e858ba0SHaojian Zhuang if (timeout <= 0) { 544e858ba0SHaojian Zhuang WARN("%s timeout\n", __func__); 554e858ba0SHaojian Zhuang break; 564e858ba0SHaojian Zhuang } 574e858ba0SHaojian Zhuang } 584e858ba0SHaojian Zhuang } 594e858ba0SHaojian Zhuang 604e858ba0SHaojian Zhuang static void set_vivobus_power_up(void) 614e858ba0SHaojian Zhuang { 624e858ba0SHaojian Zhuang /* clk enable */ 634e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00020002); 644e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00001000); 654e858ba0SHaojian Zhuang } 664e858ba0SHaojian Zhuang 674e858ba0SHaojian Zhuang static void set_dss_power_up(void) 684e858ba0SHaojian Zhuang { 694e858ba0SHaojian Zhuang /* set edc0 133MHz = 1600MHz / 12 */ 704e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0x003f000b); 714e858ba0SHaojian Zhuang /* set ldi0 ppl0 */ 724e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV3_REG, 0xf0001000); 734e858ba0SHaojian Zhuang /* set ldi0 133MHz, 1600MHz / 12 */ 744e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0xfc002c00); 754e858ba0SHaojian Zhuang /* mtcmos on */ 764e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000020); 774e858ba0SHaojian Zhuang udelay(100); 784e858ba0SHaojian Zhuang /* DISP CRG */ 794e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS4_REG, 0x00000010); 804e858ba0SHaojian Zhuang /* clk enable */ 814e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400140); 824e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00002000); 834e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0003b000); 844e858ba0SHaojian Zhuang udelay(1); 854e858ba0SHaojian Zhuang /* clk disable */ 864e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x0003b000); 874e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS0_REG, 0x00002000); 884e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400000); 894e858ba0SHaojian Zhuang udelay(1); 904e858ba0SHaojian Zhuang /* iso disable */ 914e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000040); 924e858ba0SHaojian Zhuang /* unreset */ 934e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS4_REG, 0x00000006); 944e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000c00); 954e858ba0SHaojian Zhuang /* clk enable */ 964e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x01400140); 974e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00002000); 984e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0003b000); 994e858ba0SHaojian Zhuang /* bus idle clear */ 1004e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_DSS); 1014e858ba0SHaojian Zhuang /* set edc0 400MHz for 2K 1600MHz / 4 */ 1024e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0x003f0003); 1034e858ba0SHaojian Zhuang /* set ldi 266MHz, 1600MHz / 6 */ 1044e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV5_REG, 0xfc001400); 1054e858ba0SHaojian Zhuang } 1064e858ba0SHaojian Zhuang 1074e858ba0SHaojian Zhuang static void set_vcodec_power_up(void) 1084e858ba0SHaojian Zhuang { 1094e858ba0SHaojian Zhuang /* clk enable */ 1104e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00040004); 1114e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x00000060); 1124e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x10000000); 1134e858ba0SHaojian Zhuang /* unreset */ 1144e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS0_REG, 0x00000018); 1154e858ba0SHaojian Zhuang /* bus idle clear */ 1164e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VCODEC); 1174e858ba0SHaojian Zhuang } 1184e858ba0SHaojian Zhuang 1194e858ba0SHaojian Zhuang static void set_vdec_power_up(void) 1204e858ba0SHaojian Zhuang { 1214e858ba0SHaojian Zhuang /* mtcmos on */ 1224e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000004); 1234e858ba0SHaojian Zhuang udelay(100); 1244e858ba0SHaojian Zhuang /* clk enable */ 1254e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80008000); 1264e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x20080000); 1274e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000800); 1284e858ba0SHaojian Zhuang udelay(1); 1294e858ba0SHaojian Zhuang /* clk disable */ 1304e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x00000800); 1314e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS2_REG, 0x20080000); 1324e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80000000); 1334e858ba0SHaojian Zhuang udelay(1); 1344e858ba0SHaojian Zhuang /* iso disable */ 1354e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000004); 1364e858ba0SHaojian Zhuang /* unreset */ 1374e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000200); 1384e858ba0SHaojian Zhuang /* clk enable */ 1394e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x80008000); 1404e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x20080000); 1414e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000800); 1424e858ba0SHaojian Zhuang /* bus idle clear */ 1434e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VDEC); 1444e858ba0SHaojian Zhuang } 1454e858ba0SHaojian Zhuang 1464e858ba0SHaojian Zhuang static void set_venc_power_up(void) 1474e858ba0SHaojian Zhuang { 1484e858ba0SHaojian Zhuang /* set venc ppll3 */ 1494e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x18001000); 1504e858ba0SHaojian Zhuang /* set venc 258MHz, 1290MHz / 5 */ 1514e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x07c00100); 1524e858ba0SHaojian Zhuang /* mtcmos on */ 1534e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000002); 1544e858ba0SHaojian Zhuang udelay(100); 1554e858ba0SHaojian Zhuang /* clk enable */ 1564e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010001); 1574e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x40000100); 1584e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000400); 1594e858ba0SHaojian Zhuang udelay(1); 1604e858ba0SHaojian Zhuang /* clk disable */ 1614e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x00000400); 1624e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS2_REG, 0x40000100); 1634e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010000); 1644e858ba0SHaojian Zhuang udelay(1); 1654e858ba0SHaojian Zhuang /* iso disable */ 1664e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000002); 1674e858ba0SHaojian Zhuang /* unreset */ 1684e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x00000100); 1694e858ba0SHaojian Zhuang /* clk enable */ 1704e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x00010001); 1714e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN2_REG, 0x40000100); 1724e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00000400); 1734e858ba0SHaojian Zhuang /* bus idle clear */ 1744e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_VENC); 1754e858ba0SHaojian Zhuang /* set venc 645MHz, 1290MHz / 2 */ 1764e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV8_REG, 0x07c00040); 1774e858ba0SHaojian Zhuang } 1784e858ba0SHaojian Zhuang 1794e858ba0SHaojian Zhuang static void set_isp_power_up(void) 1804e858ba0SHaojian Zhuang { 1814e858ba0SHaojian Zhuang /* mtcmos on */ 1824e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00000001); 1834e858ba0SHaojian Zhuang udelay(100); 1844e858ba0SHaojian Zhuang /* clk enable */ 1854e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70007000); 1864e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100010); 1874e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x01000010); 1884e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0bf00000); 1894e858ba0SHaojian Zhuang udelay(1); 1904e858ba0SHaojian Zhuang /* clk disable */ 1914e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS5_REG, 0x01000010); 1924e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS3_REG, 0x0bf00000); 1934e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70000000); 1944e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100000); 1954e858ba0SHaojian Zhuang udelay(1); 1964e858ba0SHaojian Zhuang /* iso disable */ 1974e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x00000001); 1984e858ba0SHaojian Zhuang /* unreset */ 1994e858ba0SHaojian Zhuang mmio_write_32(CRG_ISP_SEC_RSTDIS_REG, 0x0000002f); 2004e858ba0SHaojian Zhuang /* clk enable */ 2014e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV18_REG, 0x70007000); 2024e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x00100010); 2034e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x01000010); 2044e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x0bf00000); 2054e858ba0SHaojian Zhuang /* bus idle clear */ 2064e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_ISP); 2074e858ba0SHaojian Zhuang /* csi clk enable */ 2084e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN3_REG, 0x00700000); 2094e858ba0SHaojian Zhuang } 2104e858ba0SHaojian Zhuang 2114e858ba0SHaojian Zhuang static void set_ivp_power_up(void) 2124e858ba0SHaojian Zhuang { 2134e858ba0SHaojian Zhuang /* set ivp ppll0 */ 2144e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0xc0000000); 2154e858ba0SHaojian Zhuang /* set ivp 267MHz, 1600MHz / 6 */ 2164e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0x3c001400); 2174e858ba0SHaojian Zhuang /* mtcmos on */ 2184e858ba0SHaojian Zhuang mmio_write_32(CRG_PERPWREN_REG, 0x00200000); 2194e858ba0SHaojian Zhuang udelay(100); 2204e858ba0SHaojian Zhuang /* IVP CRG unreset */ 2214e858ba0SHaojian Zhuang mmio_write_32(CRG_IVP_SEC_RSTDIS_REG, 0x00000001); 2224e858ba0SHaojian Zhuang /* clk enable */ 2234e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000200); 2244e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN4_REG, 0x000000a8); 2254e858ba0SHaojian Zhuang udelay(1); 2264e858ba0SHaojian Zhuang /* clk disable */ 2274e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS4_REG, 0x000000a8); 2284e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000000); 2294e858ba0SHaojian Zhuang udelay(1); 2304e858ba0SHaojian Zhuang /* iso disable */ 2314e858ba0SHaojian Zhuang mmio_write_32(CRG_ISODIS_REG, 0x01000000); 2324e858ba0SHaojian Zhuang /* unreset */ 2334e858ba0SHaojian Zhuang mmio_write_32(CRG_IVP_SEC_RSTDIS_REG, 0x00000002); 2344e858ba0SHaojian Zhuang /* clk enable */ 2354e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV20_REG, 0x02000200); 2364e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN4_REG, 0x000000a8); 2374e858ba0SHaojian Zhuang /* bus idle clear */ 2384e858ba0SHaojian Zhuang bus_idle_clear(PMC_NOC_POWER_IDLEREQ_IVP); 2394e858ba0SHaojian Zhuang /* set ivp 533MHz, 1600MHz / 3 */ 2404e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV0_REG, 0x3c000800); 2414e858ba0SHaojian Zhuang } 2424e858ba0SHaojian Zhuang 2434e858ba0SHaojian Zhuang static void set_audio_power_up(void) 2444e858ba0SHaojian Zhuang { 2454e858ba0SHaojian Zhuang unsigned int ret; 2464e858ba0SHaojian Zhuang int timeout = 100; 2474e858ba0SHaojian Zhuang /* mtcmos on */ 2484e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPWREN_REG, 0x00000001); 2494e858ba0SHaojian Zhuang udelay(100); 2504e858ba0SHaojian Zhuang /* clk enable */ 2514e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80108010); 2524e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010001); 2534e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN0_REG, 0x0c000000); 2544e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x04000000); 2554e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x00000080); 2564e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN1_REG, 0x0000000f); 2574e858ba0SHaojian Zhuang udelay(1); 2584e858ba0SHaojian Zhuang /* clk disable */ 2594e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS1_REG, 0x0000000f); 2604e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS0_REG, 0x0c000000); 2614e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS5_REG, 0x00000080); 2624e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS0_REG, 0x04000000); 2634e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010000); 2644e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80100000); 2654e858ba0SHaojian Zhuang udelay(1); 2664e858ba0SHaojian Zhuang /* iso disable */ 2674e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCISODIS_REG, 0x00000001); 2684e858ba0SHaojian Zhuang udelay(1); 2694e858ba0SHaojian Zhuang /* unreset */ 2704e858ba0SHaojian Zhuang mmio_write_32(SCTRL_PERRSTDIS1_SEC_REG, 0x00000001); 2714e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERRSTDIS0_REG, 0x00000780); 2724e858ba0SHaojian Zhuang /* clk enable */ 2734e858ba0SHaojian Zhuang mmio_write_32(CRG_CLKDIV19_REG, 0x80108010); 2744e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV2_REG, 0x00010001); 2754e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN0_REG, 0x0c000000); 2764e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN0_REG, 0x04000000); 2774e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN5_REG, 0x00000080); 2784e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN1_REG, 0x0000000f); 2794e858ba0SHaojian Zhuang /* bus idle clear */ 2804e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERCTRL7_REG, 0x00040000); 2814e858ba0SHaojian Zhuang for (;;) { 2824e858ba0SHaojian Zhuang ret = mmio_read_32(SCTRL_SCPERSTAT6_REG); 2834e858ba0SHaojian Zhuang if (((ret & (1 << 5)) == 0) && ((ret & (1 << 8)) == 0)) 2844e858ba0SHaojian Zhuang break; 2854e858ba0SHaojian Zhuang udelay(1); 2864e858ba0SHaojian Zhuang timeout--; 2874e858ba0SHaojian Zhuang if (timeout <= 0) { 2884e858ba0SHaojian Zhuang WARN("%s timeout\n", __func__); 2894e858ba0SHaojian Zhuang break; 2904e858ba0SHaojian Zhuang } 2914e858ba0SHaojian Zhuang } 2924e858ba0SHaojian Zhuang mmio_write_32(ASP_CFG_MMBUF_CTRL_REG, 0x00ff0000); 2934e858ba0SHaojian Zhuang } 2944e858ba0SHaojian Zhuang 2954e858ba0SHaojian Zhuang static void set_pcie_power_up(void) 2964e858ba0SHaojian Zhuang { 2974e858ba0SHaojian Zhuang /* mtcmos on */ 2984e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPWREN_REG, 0x00000010); 2994e858ba0SHaojian Zhuang udelay(100); 3004e858ba0SHaojian Zhuang /* clk enable */ 3014e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000800); 3024e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN2_REG, 0x00104000); 3034e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN7_REG, 0x000003a0); 3044e858ba0SHaojian Zhuang udelay(1); 3054e858ba0SHaojian Zhuang /* clk disable */ 3064e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPERDIS2_REG, 0x00104000); 3074e858ba0SHaojian Zhuang mmio_write_32(CRG_PERDIS7_REG, 0x000003a0); 3084e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000000); 3094e858ba0SHaojian Zhuang udelay(1); 3104e858ba0SHaojian Zhuang /* iso disable */ 3114e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCISODIS_REG, 0x00000030); 3124e858ba0SHaojian Zhuang /* unreset */ 3134e858ba0SHaojian Zhuang mmio_write_32(CRG_PERRSTDIS3_REG, 0x8c000000); 3144e858ba0SHaojian Zhuang /* clk enable */ 3154e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCCLKDIV6_REG, 0x08000800); 3164e858ba0SHaojian Zhuang mmio_write_32(SCTRL_SCPEREN2_REG, 0x00104000); 3174e858ba0SHaojian Zhuang mmio_write_32(CRG_PEREN7_REG, 0x000003a0); 3184e858ba0SHaojian Zhuang } 3194e858ba0SHaojian Zhuang 3204e858ba0SHaojian Zhuang static void ispfunc_enable(void) 3214e858ba0SHaojian Zhuang { 3224e858ba0SHaojian Zhuang /* enable ispfunc. Otherwise powerup isp_srt causes exception. */ 3234e858ba0SHaojian Zhuang mmio_write_32(0xfff35000, 0x00000008); 3244e858ba0SHaojian Zhuang mmio_write_32(0xfff35460, 0xc004ffff); 3254e858ba0SHaojian Zhuang mmio_write_32(0xfff35030, 0x02000000); 3264e858ba0SHaojian Zhuang mdelay(10); 3274e858ba0SHaojian Zhuang } 3284e858ba0SHaojian Zhuang 3294e858ba0SHaojian Zhuang static void isps_control_clock(int flag) 3304e858ba0SHaojian Zhuang { 3314e858ba0SHaojian Zhuang unsigned int ret; 3324e858ba0SHaojian Zhuang 3334e858ba0SHaojian Zhuang /* flag: 0 -- disable clock, 1 -- enable clock */ 3344e858ba0SHaojian Zhuang if (flag) { 3354e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420364); 3364e858ba0SHaojian Zhuang ret |= 1; 3374e858ba0SHaojian Zhuang mmio_write_32(0xe8420364, ret); 3384e858ba0SHaojian Zhuang } else { 3394e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420364); 3404e858ba0SHaojian Zhuang ret &= ~1; 3414e858ba0SHaojian Zhuang mmio_write_32(0xe8420364, ret); 3424e858ba0SHaojian Zhuang } 3434e858ba0SHaojian Zhuang } 3444e858ba0SHaojian Zhuang 3454e858ba0SHaojian Zhuang static void set_isp_srt_power_up(void) 3464e858ba0SHaojian Zhuang { 3474e858ba0SHaojian Zhuang unsigned int ret; 3484e858ba0SHaojian Zhuang 3494e858ba0SHaojian Zhuang ispfunc_enable(); 3504e858ba0SHaojian Zhuang /* reset */ 3514e858ba0SHaojian Zhuang mmio_write_32(0xe8420374, 0x00000001); 3524e858ba0SHaojian Zhuang mmio_write_32(0xe8420350, 0x00000000); 3534e858ba0SHaojian Zhuang mmio_write_32(0xe8420358, 0x00000000); 3544e858ba0SHaojian Zhuang /* mtcmos on */ 3554e858ba0SHaojian Zhuang mmio_write_32(0xfff35150, 0x00400000); 3564e858ba0SHaojian Zhuang udelay(100); 3574e858ba0SHaojian Zhuang /* clk enable */ 3584e858ba0SHaojian Zhuang isps_control_clock(1); 3594e858ba0SHaojian Zhuang udelay(1); 3604e858ba0SHaojian Zhuang isps_control_clock(0); 3614e858ba0SHaojian Zhuang udelay(1); 3624e858ba0SHaojian Zhuang /* iso disable */ 3634e858ba0SHaojian Zhuang mmio_write_32(0xfff35148, 0x08000000); 3644e858ba0SHaojian Zhuang /* unreset */ 3654e858ba0SHaojian Zhuang ret = mmio_read_32(0xe8420374); 3664e858ba0SHaojian Zhuang ret &= ~0x1; 3674e858ba0SHaojian Zhuang mmio_write_32(0xe8420374, ret); 3684e858ba0SHaojian Zhuang /* clk enable */ 3694e858ba0SHaojian Zhuang isps_control_clock(1); 3704e858ba0SHaojian Zhuang /* enable clock gating for accessing csi registers */ 3714e858ba0SHaojian Zhuang mmio_write_32(0xe8420010, ~0); 3724e858ba0SHaojian Zhuang } 3734e858ba0SHaojian Zhuang 3744e858ba0SHaojian Zhuang void hikey960_regulator_enable(void) 3754e858ba0SHaojian Zhuang { 3764e858ba0SHaojian Zhuang set_vivobus_power_up(); 3774e858ba0SHaojian Zhuang hikey960_enable_ppll3(); 3784e858ba0SHaojian Zhuang set_dss_power_up(); 3794e858ba0SHaojian Zhuang set_vcodec_power_up(); 3804e858ba0SHaojian Zhuang set_vdec_power_up(); 3814e858ba0SHaojian Zhuang set_venc_power_up(); 3824e858ba0SHaojian Zhuang set_isp_power_up(); 3834e858ba0SHaojian Zhuang set_ivp_power_up(); 3844e858ba0SHaojian Zhuang set_audio_power_up(); 3854e858ba0SHaojian Zhuang set_pcie_power_up(); 3864e858ba0SHaojian Zhuang set_isp_srt_power_up(); 3874e858ba0SHaojian Zhuang 3884e858ba0SHaojian Zhuang /* set ISP_CORE_CTRL_S to unsecure mode */ 3894e858ba0SHaojian Zhuang mmio_write_32(0xe8583800, 0x7); 3904e858ba0SHaojian Zhuang /* set ISP_SUB_CTRL_S to unsecure mode */ 3914e858ba0SHaojian Zhuang mmio_write_32(0xe8583804, 0xf); 3924e858ba0SHaojian Zhuang } 3934e858ba0SHaojian Zhuang 3944e858ba0SHaojian Zhuang void hikey960_tzc_init(void) 3954e858ba0SHaojian Zhuang { 3964e858ba0SHaojian Zhuang mmio_write_32(TZC_EN0_REG, 0x7fbff066); 3974e858ba0SHaojian Zhuang mmio_write_32(TZC_EN1_REG, 0xfffff5fc); 3984e858ba0SHaojian Zhuang mmio_write_32(TZC_EN2_REG, 0x0007005c); 3994e858ba0SHaojian Zhuang mmio_write_32(TZC_EN3_REG, 0x37030700); 4004e858ba0SHaojian Zhuang mmio_write_32(TZC_EN4_REG, 0xf63fefae); 4014e858ba0SHaojian Zhuang mmio_write_32(TZC_EN5_REG, 0x000410fd); 4024e858ba0SHaojian Zhuang mmio_write_32(TZC_EN6_REG, 0x0063ff68); 4034e858ba0SHaojian Zhuang mmio_write_32(TZC_EN7_REG, 0x030000f3); 4044e858ba0SHaojian Zhuang mmio_write_32(TZC_EN8_REG, 0x00000007); 4054e858ba0SHaojian Zhuang } 4064e858ba0SHaojian Zhuang 4074e858ba0SHaojian Zhuang void hikey960_peri_init(void) 4084e858ba0SHaojian Zhuang { 4094e858ba0SHaojian Zhuang /* unreset */ 4104e858ba0SHaojian Zhuang mmio_setbits_32(CRG_PERRSTDIS4_REG, 1); 4114e858ba0SHaojian Zhuang } 4124e858ba0SHaojian Zhuang 4134e858ba0SHaojian Zhuang void hikey960_pinmux_init(void) 4144e858ba0SHaojian Zhuang { 4154e858ba0SHaojian Zhuang unsigned int id; 4164e858ba0SHaojian Zhuang 4174e858ba0SHaojian Zhuang hikey960_read_boardid(&id); 4184e858ba0SHaojian Zhuang if (id == 5301) { 4194e858ba0SHaojian Zhuang /* hikey960 hardware v2 */ 4204e858ba0SHaojian Zhuang /* GPIO150: LED */ 4214e858ba0SHaojian Zhuang mmio_write_32(IOMG_FIX_006_REG, 0); 4224e858ba0SHaojian Zhuang /* GPIO151: LED */ 4234e858ba0SHaojian Zhuang mmio_write_32(IOMG_FIX_007_REG, 0); 4244e858ba0SHaojian Zhuang /* GPIO189: LED */ 4254e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_011_REG, 0); 4264e858ba0SHaojian Zhuang /* GPIO190: LED */ 4274e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_012_REG, 0); 4284e858ba0SHaojian Zhuang /* GPIO46 */ 4294e858ba0SHaojian Zhuang mmio_write_32(IOMG_044_REG, 0); 4304e858ba0SHaojian Zhuang /* GPIO202 */ 4314e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_023_REG, 0); 4324e858ba0SHaojian Zhuang /* GPIO206 */ 4334e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_026_REG, 0); 4344e858ba0SHaojian Zhuang /* GPIO219 - PD pullup */ 4354e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_039_REG, 0); 4364e858ba0SHaojian Zhuang mmio_write_32(IOCG_AO_043_REG, 1 << 0); 4374e858ba0SHaojian Zhuang } 4384e858ba0SHaojian Zhuang /* GPIO005 - PMU SSI, 10mA */ 4394e858ba0SHaojian Zhuang mmio_write_32(IOCG_006_REG, 2 << 4); 4404e858ba0SHaojian Zhuang /* GPIO213 - PCIE_CLKREQ_N */ 4414e858ba0SHaojian Zhuang mmio_write_32(IOMG_AO_033_REG, 1); 4424e858ba0SHaojian Zhuang } 44316bec9c2SKaihua Zhong 44416bec9c2SKaihua Zhong void hikey960_gpio_init(void) 44516bec9c2SKaihua Zhong { 44616bec9c2SKaihua Zhong pl061_gpio_init(); 44716bec9c2SKaihua Zhong pl061_gpio_register(GPIO0_BASE, 0); 44816bec9c2SKaihua Zhong pl061_gpio_register(GPIO1_BASE, 1); 44916bec9c2SKaihua Zhong pl061_gpio_register(GPIO2_BASE, 2); 45016bec9c2SKaihua Zhong pl061_gpio_register(GPIO3_BASE, 3); 45116bec9c2SKaihua Zhong pl061_gpio_register(GPIO4_BASE, 4); 45216bec9c2SKaihua Zhong pl061_gpio_register(GPIO5_BASE, 5); 45316bec9c2SKaihua Zhong pl061_gpio_register(GPIO6_BASE, 6); 45416bec9c2SKaihua Zhong pl061_gpio_register(GPIO7_BASE, 7); 45516bec9c2SKaihua Zhong pl061_gpio_register(GPIO8_BASE, 8); 45616bec9c2SKaihua Zhong pl061_gpio_register(GPIO9_BASE, 9); 45716bec9c2SKaihua Zhong pl061_gpio_register(GPIO10_BASE, 10); 45816bec9c2SKaihua Zhong pl061_gpio_register(GPIO11_BASE, 11); 45916bec9c2SKaihua Zhong pl061_gpio_register(GPIO12_BASE, 12); 46016bec9c2SKaihua Zhong pl061_gpio_register(GPIO13_BASE, 13); 46116bec9c2SKaihua Zhong pl061_gpio_register(GPIO14_BASE, 14); 46216bec9c2SKaihua Zhong pl061_gpio_register(GPIO15_BASE, 15); 46316bec9c2SKaihua Zhong pl061_gpio_register(GPIO16_BASE, 16); 46416bec9c2SKaihua Zhong pl061_gpio_register(GPIO17_BASE, 17); 46516bec9c2SKaihua Zhong pl061_gpio_register(GPIO18_BASE, 18); 46616bec9c2SKaihua Zhong pl061_gpio_register(GPIO19_BASE, 19); 46716bec9c2SKaihua Zhong pl061_gpio_register(GPIO20_BASE, 20); 46816bec9c2SKaihua Zhong pl061_gpio_register(GPIO21_BASE, 21); 469*cfde1870SLeo Yan pl061_gpio_register(GPIO22_BASE, 22); 470*cfde1870SLeo Yan pl061_gpio_register(GPIO23_BASE, 23); 471*cfde1870SLeo Yan pl061_gpio_register(GPIO24_BASE, 24); 472*cfde1870SLeo Yan pl061_gpio_register(GPIO25_BASE, 25); 473*cfde1870SLeo Yan pl061_gpio_register(GPIO26_BASE, 26); 474*cfde1870SLeo Yan pl061_gpio_register(GPIO27_BASE, 27); 475*cfde1870SLeo Yan pl061_gpio_register(GPIO28_BASE, 28); 47616bec9c2SKaihua Zhong 47716bec9c2SKaihua Zhong /* PCIE_PERST_N output low */ 47816bec9c2SKaihua Zhong gpio_set_direction(89, GPIO_DIR_OUT); 47916bec9c2SKaihua Zhong gpio_set_value(89, GPIO_LEVEL_LOW); 48016bec9c2SKaihua Zhong } 481