xref: /arm-trusted-firmware/plat/hisilicon/hikey/hikey_bl_common.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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 <arch_helpers.h>
8*91f16700Schasinglulu #include <drivers/arm/pl061_gpio.h>
9*91f16700Schasinglulu #include <drivers/arm/sp804_delay_timer.h>
10*91f16700Schasinglulu #include <drivers/gpio.h>
11*91f16700Schasinglulu #include <lib/mmio.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include <hi6220.h>
14*91f16700Schasinglulu #include <hi6553.h>
15*91f16700Schasinglulu #include "hikey_private.h"
16*91f16700Schasinglulu 
17*91f16700Schasinglulu void hikey_sp804_init(void)
18*91f16700Schasinglulu {
19*91f16700Schasinglulu 	uint32_t data;
20*91f16700Schasinglulu 
21*91f16700Schasinglulu 	/* select the clock of dual timer0 */
22*91f16700Schasinglulu 	data = mmio_read_32(AO_SC_TIMER_EN0);
23*91f16700Schasinglulu 	while (data & 3) {
24*91f16700Schasinglulu 		data &= ~3;
25*91f16700Schasinglulu 		data |= 3 << 16;
26*91f16700Schasinglulu 		mmio_write_32(AO_SC_TIMER_EN0, data);
27*91f16700Schasinglulu 		data = mmio_read_32(AO_SC_TIMER_EN0);
28*91f16700Schasinglulu 	}
29*91f16700Schasinglulu 	/* enable the pclk of dual timer0 */
30*91f16700Schasinglulu 	data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
31*91f16700Schasinglulu 	while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0)) {
32*91f16700Schasinglulu 		mmio_write_32(AO_SC_PERIPH_CLKEN4, PCLK_TIMER1 | PCLK_TIMER0);
33*91f16700Schasinglulu 		data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
34*91f16700Schasinglulu 	}
35*91f16700Schasinglulu 	/* reset dual timer0 */
36*91f16700Schasinglulu 	data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
37*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_RSTEN4, PCLK_TIMER1 | PCLK_TIMER0);
38*91f16700Schasinglulu 	do {
39*91f16700Schasinglulu 		data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
40*91f16700Schasinglulu 	} while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0));
41*91f16700Schasinglulu 	/* unreset dual timer0 */
42*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_RSTDIS4, PCLK_TIMER1 | PCLK_TIMER0);
43*91f16700Schasinglulu 	do {
44*91f16700Schasinglulu 		data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
45*91f16700Schasinglulu 	} while ((data & PCLK_TIMER1) || (data & PCLK_TIMER0));
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	sp804_timer_init(SP804_TIMER0_BASE, 10, 192);
48*91f16700Schasinglulu }
49*91f16700Schasinglulu 
50*91f16700Schasinglulu void hikey_gpio_init(void)
51*91f16700Schasinglulu {
52*91f16700Schasinglulu 	pl061_gpio_init();
53*91f16700Schasinglulu 	pl061_gpio_register(GPIO0_BASE, 0);
54*91f16700Schasinglulu 	pl061_gpio_register(GPIO1_BASE, 1);
55*91f16700Schasinglulu 	pl061_gpio_register(GPIO2_BASE, 2);
56*91f16700Schasinglulu 	pl061_gpio_register(GPIO3_BASE, 3);
57*91f16700Schasinglulu 	pl061_gpio_register(GPIO4_BASE, 4);
58*91f16700Schasinglulu 	pl061_gpio_register(GPIO5_BASE, 5);
59*91f16700Schasinglulu 	pl061_gpio_register(GPIO6_BASE, 6);
60*91f16700Schasinglulu 	pl061_gpio_register(GPIO7_BASE, 7);
61*91f16700Schasinglulu 	pl061_gpio_register(GPIO8_BASE, 8);
62*91f16700Schasinglulu 	pl061_gpio_register(GPIO9_BASE, 9);
63*91f16700Schasinglulu 	pl061_gpio_register(GPIO10_BASE, 10);
64*91f16700Schasinglulu 	pl061_gpio_register(GPIO11_BASE, 11);
65*91f16700Schasinglulu 	pl061_gpio_register(GPIO12_BASE, 12);
66*91f16700Schasinglulu 	pl061_gpio_register(GPIO13_BASE, 13);
67*91f16700Schasinglulu 	pl061_gpio_register(GPIO14_BASE, 14);
68*91f16700Schasinglulu 	pl061_gpio_register(GPIO15_BASE, 15);
69*91f16700Schasinglulu 	pl061_gpio_register(GPIO16_BASE, 16);
70*91f16700Schasinglulu 	pl061_gpio_register(GPIO17_BASE, 17);
71*91f16700Schasinglulu 	pl061_gpio_register(GPIO18_BASE, 18);
72*91f16700Schasinglulu 	pl061_gpio_register(GPIO19_BASE, 19);
73*91f16700Schasinglulu 
74*91f16700Schasinglulu 	/* Power on indicator LED (USER_LED1). */
75*91f16700Schasinglulu 	gpio_set_direction(32, GPIO_DIR_OUT);	/* LED1 */
76*91f16700Schasinglulu 	gpio_set_value(32, GPIO_LEVEL_HIGH);
77*91f16700Schasinglulu 	gpio_set_direction(33, GPIO_DIR_OUT);	/* LED2 */
78*91f16700Schasinglulu 	gpio_set_value(33, GPIO_LEVEL_LOW);
79*91f16700Schasinglulu 	gpio_set_direction(34, GPIO_DIR_OUT);	/* LED3 */
80*91f16700Schasinglulu 	gpio_set_direction(35, GPIO_DIR_OUT);	/* LED4 */
81*91f16700Schasinglulu }
82*91f16700Schasinglulu 
83*91f16700Schasinglulu void hikey_pmussi_init(void)
84*91f16700Schasinglulu {
85*91f16700Schasinglulu 	uint32_t data;
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 	/* Initialize PWR_HOLD GPIO */
88*91f16700Schasinglulu 	gpio_set_direction(0, GPIO_DIR_OUT);
89*91f16700Schasinglulu 	gpio_set_value(0, GPIO_LEVEL_LOW);
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	/*
92*91f16700Schasinglulu 	 * After reset, PMUSSI stays in reset mode.
93*91f16700Schasinglulu 	 * Now make it out of reset.
94*91f16700Schasinglulu 	 */
95*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_RSTDIS4,
96*91f16700Schasinglulu 		      AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
97*91f16700Schasinglulu 	do {
98*91f16700Schasinglulu 		data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
99*91f16700Schasinglulu 	} while (data & AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
100*91f16700Schasinglulu 
101*91f16700Schasinglulu 	/* Set PMUSSI clock latency for read operation. */
102*91f16700Schasinglulu 	data = mmio_read_32(AO_SC_MCU_SUBSYS_CTRL3);
103*91f16700Schasinglulu 	data &= ~AO_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
104*91f16700Schasinglulu 	data |= AO_SC_MCU_SUBSYS_CTRL3_RCLK_3;
105*91f16700Schasinglulu 	mmio_write_32(AO_SC_MCU_SUBSYS_CTRL3, data);
106*91f16700Schasinglulu 
107*91f16700Schasinglulu 	/* enable PMUSSI clock */
108*91f16700Schasinglulu 	data = AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_CCPU |
109*91f16700Schasinglulu 	       AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_MCU;
110*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_CLKEN5, data);
111*91f16700Schasinglulu 	data = AO_SC_PERIPH_CLKEN4_PCLK_PMUSSI;
112*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_CLKEN4, data);
113*91f16700Schasinglulu 
114*91f16700Schasinglulu 	gpio_set_value(0, GPIO_LEVEL_HIGH);
115*91f16700Schasinglulu }
116*91f16700Schasinglulu 
117*91f16700Schasinglulu void hikey_hi6553_init(void)
118*91f16700Schasinglulu {
119*91f16700Schasinglulu 	uint8_t data;
120*91f16700Schasinglulu 
121*91f16700Schasinglulu 	mmio_write_8(HI6553_PERI_EN_MARK, 0x1e);
122*91f16700Schasinglulu 	mmio_write_8(HI6553_NP_REG_ADJ1, 0);
123*91f16700Schasinglulu 	data = DISABLE6_XO_CLK_CONN | DISABLE6_XO_CLK_NFC |
124*91f16700Schasinglulu 		DISABLE6_XO_CLK_RF1 | DISABLE6_XO_CLK_RF2;
125*91f16700Schasinglulu 	mmio_write_8(HI6553_DISABLE6_XO_CLK, data);
126*91f16700Schasinglulu 
127*91f16700Schasinglulu 	/* configure BUCK0 & BUCK1 */
128*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK01_CTRL2, 0x5e);
129*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK0_CTRL7, 0x10);
130*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK1_CTRL7, 0x10);
131*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK0_CTRL5, 0x1e);
132*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK1_CTRL5, 0x1e);
133*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK0_CTRL1, 0xfc);
134*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK1_CTRL1, 0xfc);
135*91f16700Schasinglulu 
136*91f16700Schasinglulu 	/* configure BUCK2 */
137*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK2_REG1, 0x4f);
138*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK2_REG5, 0x99);
139*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK2_REG6, 0x45);
140*91f16700Schasinglulu 	mdelay(1);
141*91f16700Schasinglulu 	mmio_write_8(HI6553_VSET_BUCK2_ADJ, 0x22);
142*91f16700Schasinglulu 	mdelay(1);
143*91f16700Schasinglulu 
144*91f16700Schasinglulu 	/* configure BUCK3 */
145*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK3_REG3, 0x02);
146*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK3_REG5, 0x99);
147*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK3_REG6, 0x41);
148*91f16700Schasinglulu 	mmio_write_8(HI6553_VSET_BUCK3_ADJ, 0x02);
149*91f16700Schasinglulu 	mdelay(1);
150*91f16700Schasinglulu 
151*91f16700Schasinglulu 	/* configure BUCK4 */
152*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK4_REG2, 0x9a);
153*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK4_REG5, 0x99);
154*91f16700Schasinglulu 	mmio_write_8(HI6553_BUCK4_REG6, 0x45);
155*91f16700Schasinglulu 
156*91f16700Schasinglulu 	/* configure LDO20 */
157*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO20_REG_ADJ, 0x50);
158*91f16700Schasinglulu 
159*91f16700Schasinglulu 	mmio_write_8(HI6553_NP_REG_CHG, 0x0f);
160*91f16700Schasinglulu 	mmio_write_8(HI6553_CLK_TOP0, 0x06);
161*91f16700Schasinglulu 	mmio_write_8(HI6553_CLK_TOP3, 0xc0);
162*91f16700Schasinglulu 	mmio_write_8(HI6553_CLK_TOP4, 0x00);
163*91f16700Schasinglulu 
164*91f16700Schasinglulu 	/* configure LDO7 & LDO10 for SD slot */
165*91f16700Schasinglulu 	/* enable LDO7 */
166*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO7_REG_ADJ);
167*91f16700Schasinglulu 	data = (data & 0xf8) | 0x2;
168*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO7_REG_ADJ, data);
169*91f16700Schasinglulu 	mdelay(5);
170*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE2_LDO1_8, 1 << 6);
171*91f16700Schasinglulu 	mdelay(5);
172*91f16700Schasinglulu 	/* enable LDO10 */
173*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO10_REG_ADJ);
174*91f16700Schasinglulu 	data = (data & 0xf8) | 0x5;
175*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO10_REG_ADJ, data);
176*91f16700Schasinglulu 	mdelay(5);
177*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 1);
178*91f16700Schasinglulu 	mdelay(5);
179*91f16700Schasinglulu 	/* enable LDO15 */
180*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO15_REG_ADJ);
181*91f16700Schasinglulu 	data = (data & 0xf8) | 0x4;
182*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO15_REG_ADJ, data);
183*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 6);
184*91f16700Schasinglulu 	mdelay(5);
185*91f16700Schasinglulu 	/* enable LDO19 */
186*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO19_REG_ADJ);
187*91f16700Schasinglulu 	data |= 0x7;
188*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO19_REG_ADJ, data);
189*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 2);
190*91f16700Schasinglulu 	mdelay(5);
191*91f16700Schasinglulu 	/* enable LDO21 */
192*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO21_REG_ADJ);
193*91f16700Schasinglulu 	data = (data & 0xf8) | 0x3;
194*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO21_REG_ADJ, data);
195*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 4);
196*91f16700Schasinglulu 	mdelay(5);
197*91f16700Schasinglulu 	/* enable LDO22 */
198*91f16700Schasinglulu 	data = mmio_read_8(HI6553_LDO22_REG_ADJ);
199*91f16700Schasinglulu 	data = (data & 0xf8) | 0x7;
200*91f16700Schasinglulu 	mmio_write_8(HI6553_LDO22_REG_ADJ, data);
201*91f16700Schasinglulu 	mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 5);
202*91f16700Schasinglulu 	mdelay(5);
203*91f16700Schasinglulu 
204*91f16700Schasinglulu 	/* select 32.764KHz */
205*91f16700Schasinglulu 	mmio_write_8(HI6553_CLK19M2_600_586_EN, 0x01);
206*91f16700Schasinglulu 
207*91f16700Schasinglulu 	/* Disable vbus_det interrupts */
208*91f16700Schasinglulu 	data = mmio_read_8(HI6553_IRQ2_MASK);
209*91f16700Schasinglulu 	data = data | 0x3;
210*91f16700Schasinglulu 	mmio_write_8(HI6553_IRQ2_MASK, data);
211*91f16700Schasinglulu }
212*91f16700Schasinglulu 
213*91f16700Schasinglulu void init_mmc0_pll(void)
214*91f16700Schasinglulu {
215*91f16700Schasinglulu 	unsigned int data;
216*91f16700Schasinglulu 
217*91f16700Schasinglulu 	/* select SYSPLL as the source of MMC0 */
218*91f16700Schasinglulu 	/* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
219*91f16700Schasinglulu 	mmio_write_32(PERI_SC_CLK_SEL0, 1 << 5 | 1 << 21);
220*91f16700Schasinglulu 	do {
221*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLK_SEL0);
222*91f16700Schasinglulu 	} while (!(data & (1 << 5)));
223*91f16700Schasinglulu 	/* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
224*91f16700Schasinglulu 	mmio_write_32(PERI_SC_CLK_SEL0, 1 << 29);
225*91f16700Schasinglulu 	do {
226*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLK_SEL0);
227*91f16700Schasinglulu 	} while (data & (1 << 13));
228*91f16700Schasinglulu 
229*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 0));
230*91f16700Schasinglulu 	do {
231*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
232*91f16700Schasinglulu 	} while (!(data & (1 << 0)));
233*91f16700Schasinglulu 
234*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
235*91f16700Schasinglulu 	data |= 1 << 1;
236*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
237*91f16700Schasinglulu 
238*91f16700Schasinglulu 	do {
239*91f16700Schasinglulu 		mmio_write_32(PERI_SC_CLKCFG8BIT1, (1 << 7) | 0xb);
240*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLKCFG8BIT1);
241*91f16700Schasinglulu 	} while ((data & 0xb) != 0xb);
242*91f16700Schasinglulu }
243*91f16700Schasinglulu 
244*91f16700Schasinglulu void reset_mmc0_clk(void)
245*91f16700Schasinglulu {
246*91f16700Schasinglulu 	unsigned int data;
247*91f16700Schasinglulu 
248*91f16700Schasinglulu 	/* disable mmc0 bus clock */
249*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC0);
250*91f16700Schasinglulu 	do {
251*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
252*91f16700Schasinglulu 	} while (data & PERI_CLK0_MMC0);
253*91f16700Schasinglulu 	/* enable mmc0 bus clock */
254*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC0);
255*91f16700Schasinglulu 	do {
256*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
257*91f16700Schasinglulu 	} while (!(data & PERI_CLK0_MMC0));
258*91f16700Schasinglulu 	/* reset mmc0 clock domain */
259*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC0);
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 	/* bypass mmc0 clock phase */
262*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
263*91f16700Schasinglulu 	data |= 3;
264*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
265*91f16700Schasinglulu 
266*91f16700Schasinglulu 	/* disable low power */
267*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
268*91f16700Schasinglulu 	data |= 1 << 3;
269*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
270*91f16700Schasinglulu 	do {
271*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
272*91f16700Schasinglulu 	} while (!(data & PERI_RST0_MMC0));
273*91f16700Schasinglulu 
274*91f16700Schasinglulu 	/* unreset mmc0 clock domain */
275*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC0);
276*91f16700Schasinglulu 	do {
277*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
278*91f16700Schasinglulu 	} while (data & PERI_RST0_MMC0);
279*91f16700Schasinglulu }
280*91f16700Schasinglulu 
281*91f16700Schasinglulu void init_media_clk(void)
282*91f16700Schasinglulu {
283*91f16700Schasinglulu 	unsigned int data, value;
284*91f16700Schasinglulu 
285*91f16700Schasinglulu 	data = mmio_read_32(PMCTRL_MEDPLLCTRL);
286*91f16700Schasinglulu 	data |= 1;
287*91f16700Schasinglulu 	mmio_write_32(PMCTRL_MEDPLLCTRL, data);
288*91f16700Schasinglulu 
289*91f16700Schasinglulu 	for (;;) {
290*91f16700Schasinglulu 		data = mmio_read_32(PMCTRL_MEDPLLCTRL);
291*91f16700Schasinglulu 		value = 1 << 28;
292*91f16700Schasinglulu 		if ((data & value) == value)
293*91f16700Schasinglulu 			break;
294*91f16700Schasinglulu 	}
295*91f16700Schasinglulu 
296*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
297*91f16700Schasinglulu 	data = 1 << 10;
298*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
299*91f16700Schasinglulu }
300*91f16700Schasinglulu 
301*91f16700Schasinglulu void init_mmc1_pll(void)
302*91f16700Schasinglulu {
303*91f16700Schasinglulu 	uint32_t data;
304*91f16700Schasinglulu 
305*91f16700Schasinglulu 	/* select SYSPLL as the source of MMC1 */
306*91f16700Schasinglulu 	/* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
307*91f16700Schasinglulu 	mmio_write_32(PERI_SC_CLK_SEL0, 1 << 11 | 1 << 27);
308*91f16700Schasinglulu 	do {
309*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLK_SEL0);
310*91f16700Schasinglulu 	} while (!(data & (1 << 11)));
311*91f16700Schasinglulu 	/* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
312*91f16700Schasinglulu 	mmio_write_32(PERI_SC_CLK_SEL0, 1 << 30);
313*91f16700Schasinglulu 	do {
314*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLK_SEL0);
315*91f16700Schasinglulu 	} while (data & (1 << 14));
316*91f16700Schasinglulu 
317*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 1));
318*91f16700Schasinglulu 	do {
319*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
320*91f16700Schasinglulu 	} while (!(data & (1 << 1)));
321*91f16700Schasinglulu 
322*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
323*91f16700Schasinglulu 	data |= 1 << 2;
324*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
325*91f16700Schasinglulu 
326*91f16700Schasinglulu 	do {
327*91f16700Schasinglulu 		/* 1.2GHz / 50 = 24MHz */
328*91f16700Schasinglulu 		mmio_write_32(PERI_SC_CLKCFG8BIT2, 0x31 | (1 << 7));
329*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_CLKCFG8BIT2);
330*91f16700Schasinglulu 	} while ((data & 0x31) != 0x31);
331*91f16700Schasinglulu }
332*91f16700Schasinglulu 
333*91f16700Schasinglulu void reset_mmc1_clk(void)
334*91f16700Schasinglulu {
335*91f16700Schasinglulu 	unsigned int data;
336*91f16700Schasinglulu 
337*91f16700Schasinglulu 	/* disable mmc1 bus clock */
338*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC1);
339*91f16700Schasinglulu 	do {
340*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
341*91f16700Schasinglulu 	} while (data & PERI_CLK0_MMC1);
342*91f16700Schasinglulu 	/* enable mmc1 bus clock */
343*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC1);
344*91f16700Schasinglulu 	do {
345*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
346*91f16700Schasinglulu 	} while (!(data & PERI_CLK0_MMC1));
347*91f16700Schasinglulu 	/* reset mmc1 clock domain */
348*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC1);
349*91f16700Schasinglulu 
350*91f16700Schasinglulu 	/* bypass mmc1 clock phase */
351*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
352*91f16700Schasinglulu 	data |= 3 << 2;
353*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
354*91f16700Schasinglulu 
355*91f16700Schasinglulu 	/* disable low power */
356*91f16700Schasinglulu 	data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
357*91f16700Schasinglulu 	data |= 1 << 4;
358*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
359*91f16700Schasinglulu 	do {
360*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
361*91f16700Schasinglulu 	} while (!(data & PERI_RST0_MMC1));
362*91f16700Schasinglulu 
363*91f16700Schasinglulu 	/* unreset mmc0 clock domain */
364*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC1);
365*91f16700Schasinglulu 	do {
366*91f16700Schasinglulu 		data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
367*91f16700Schasinglulu 	} while (data & PERI_RST0_MMC1);
368*91f16700Schasinglulu }
369*91f16700Schasinglulu 
370*91f16700Schasinglulu /* Initialize PLL of both eMMC and SD controllers. */
371*91f16700Schasinglulu void hikey_mmc_pll_init(void)
372*91f16700Schasinglulu {
373*91f16700Schasinglulu 	init_mmc0_pll();
374*91f16700Schasinglulu 	reset_mmc0_clk();
375*91f16700Schasinglulu 	init_media_clk();
376*91f16700Schasinglulu 
377*91f16700Schasinglulu 	dsb();
378*91f16700Schasinglulu 
379*91f16700Schasinglulu 	init_mmc1_pll();
380*91f16700Schasinglulu 	reset_mmc1_clk();
381*91f16700Schasinglulu }
382*91f16700Schasinglulu 
383*91f16700Schasinglulu void hikey_rtc_init(void)
384*91f16700Schasinglulu {
385*91f16700Schasinglulu 	uint32_t data;
386*91f16700Schasinglulu 
387*91f16700Schasinglulu 	data = mmio_read_32(AO_SC_PERIPH_CLKEN4);
388*91f16700Schasinglulu 	data |= AO_SC_PERIPH_RSTDIS4_RESET_RTC0_N;
389*91f16700Schasinglulu 	mmio_write_32(AO_SC_PERIPH_CLKEN4, data);
390*91f16700Schasinglulu }
391