xref: /rk3399_ARM-atf/plat/hisilicon/hikey/hikey_ddr.c (revision 1d999558cfa764d38a4227f2aa3c8685977dc93b)
132e9fc1aSHaojian Zhuang /*
232e9fc1aSHaojian Zhuang  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
332e9fc1aSHaojian Zhuang  *
432e9fc1aSHaojian Zhuang  * SPDX-License-Identifier: BSD-3-Clause
532e9fc1aSHaojian Zhuang  */
632e9fc1aSHaojian Zhuang 
732e9fc1aSHaojian Zhuang #include <arch_helpers.h>
8483dce7eSHaojian Zhuang #include <assert.h>
932e9fc1aSHaojian Zhuang #include <debug.h>
1032e9fc1aSHaojian Zhuang #include <errno.h>
1132e9fc1aSHaojian Zhuang #include <hi6220.h>
1232e9fc1aSHaojian Zhuang #include <hi6553.h>
13*1d999558SHaojian Zhuang #include <hisi_sram_map.h>
1432e9fc1aSHaojian Zhuang #include <mmio.h>
1532e9fc1aSHaojian Zhuang #include <sp804_delay_timer.h>
1632e9fc1aSHaojian Zhuang 
17483dce7eSHaojian Zhuang #include "hikey_private.h"
1832e9fc1aSHaojian Zhuang 
1932e9fc1aSHaojian Zhuang static void init_pll(void)
2032e9fc1aSHaojian Zhuang {
2132e9fc1aSHaojian Zhuang 	unsigned int data;
2232e9fc1aSHaojian Zhuang 
2332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
2432e9fc1aSHaojian Zhuang 	data |= 0x1;
2532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
2632e9fc1aSHaojian Zhuang 	do {
2732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x000));
2832e9fc1aSHaojian Zhuang 	} while (!(data & (1 << 28)));
2932e9fc1aSHaojian Zhuang 
3032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7800000 + 0x000));
3132e9fc1aSHaojian Zhuang 	data &= ~0x007;
3232e9fc1aSHaojian Zhuang 	data |= 0x004;
3332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7800000 + 0x000), data);
3432e9fc1aSHaojian Zhuang 	do {
3532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7800000 + 0x014));
3632e9fc1aSHaojian Zhuang 		data &= 0x007;
3732e9fc1aSHaojian Zhuang 	} while (data != 0x004);
3832e9fc1aSHaojian Zhuang 
3932e9fc1aSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
40483dce7eSHaojian Zhuang 	dsb();
41483dce7eSHaojian Zhuang 	isb();
42483dce7eSHaojian Zhuang 	udelay(10);
43483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
44483dce7eSHaojian Zhuang 	dsb();
45483dce7eSHaojian Zhuang 	isb();
46483dce7eSHaojian Zhuang 	udelay(10);
47483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
48483dce7eSHaojian Zhuang 	dsb();
49483dce7eSHaojian Zhuang 	isb();
50483dce7eSHaojian Zhuang 	udelay(10);
5132e9fc1aSHaojian Zhuang 	mmio_write_32(0xf7032000 + 0x02c, 0x5110103e);
52483dce7eSHaojian Zhuang 	dsb();
53483dce7eSHaojian Zhuang 	isb();
54483dce7eSHaojian Zhuang 	udelay(10);
5532e9fc1aSHaojian Zhuang 	data = mmio_read_32(0xf7032000 + 0x050);
5632e9fc1aSHaojian Zhuang 	data |= 1 << 28;
5732e9fc1aSHaojian Zhuang 	mmio_write_32(0xf7032000 + 0x050, data);
58483dce7eSHaojian Zhuang 	dsb();
59483dce7eSHaojian Zhuang 	isb();
60483dce7eSHaojian Zhuang 	udelay(10);
6132e9fc1aSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
62483dce7eSHaojian Zhuang 	dsb();
63483dce7eSHaojian Zhuang 	isb();
64483dce7eSHaojian Zhuang 	udelay(10);
65483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
66483dce7eSHaojian Zhuang 	dsb();
67483dce7eSHaojian Zhuang 	isb();
68483dce7eSHaojian Zhuang 	udelay(10);
69483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
70483dce7eSHaojian Zhuang 	dsb();
71483dce7eSHaojian Zhuang 	isb();
72483dce7eSHaojian Zhuang 	udelay(10);
7332e9fc1aSHaojian Zhuang }
7432e9fc1aSHaojian Zhuang 
7532e9fc1aSHaojian Zhuang static void init_freq(void)
7632e9fc1aSHaojian Zhuang {
7732e9fc1aSHaojian Zhuang 	unsigned int data, tmp;
7832e9fc1aSHaojian Zhuang 	unsigned int cpuext_cfg, ddr_cfg;
7932e9fc1aSHaojian Zhuang 
8032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x374), 0x4a);
8132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x368), 0xda);
8232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x36c), 0x01);
8332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x370), 0x01);
8432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x360), 0x60);
8532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x364), 0x60);
8632e9fc1aSHaojian Zhuang 
8732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x114), 0x1000);
8832e9fc1aSHaojian Zhuang 
8932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
9032e9fc1aSHaojian Zhuang 	data |= (3 << 12);
9132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
9232e9fc1aSHaojian Zhuang 
9332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
9432e9fc1aSHaojian Zhuang 	data |= (1 << 4);
9532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
9632e9fc1aSHaojian Zhuang 
9732e9fc1aSHaojian Zhuang 
9832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
9932e9fc1aSHaojian Zhuang 	data &= ~0x7;
10032e9fc1aSHaojian Zhuang 	data |= 0x5;
10132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
10232e9fc1aSHaojian Zhuang 	dsb();
10332e9fc1aSHaojian Zhuang 	mdelay(10);
10432e9fc1aSHaojian Zhuang 
10532e9fc1aSHaojian Zhuang 
10632e9fc1aSHaojian Zhuang 	do {
10732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf6504000 + 0x008));
10832e9fc1aSHaojian Zhuang 		data &= (3 << 20);
10932e9fc1aSHaojian Zhuang 	} while (data != (3 << 20));
11032e9fc1aSHaojian Zhuang 	dsb();
11132e9fc1aSHaojian Zhuang 	mdelay(10);
11232e9fc1aSHaojian Zhuang 
11332e9fc1aSHaojian Zhuang 
11432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
11532e9fc1aSHaojian Zhuang 	data &= ~((1 << 0) | (1 << 11));
11632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
11732e9fc1aSHaojian Zhuang 	mdelay(10);
11832e9fc1aSHaojian Zhuang 
11932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
12032e9fc1aSHaojian Zhuang 	data &= ~(3 << 8);
12132e9fc1aSHaojian Zhuang 	data |= (1 << 8);
12232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
12332e9fc1aSHaojian Zhuang 
12432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x100));
12532e9fc1aSHaojian Zhuang 	data |= (1 << 0);
12632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x100), data);
12732e9fc1aSHaojian Zhuang 	dsb();
12832e9fc1aSHaojian Zhuang 
12932e9fc1aSHaojian Zhuang 	do {
13032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x100));
13132e9fc1aSHaojian Zhuang 		data &= (1 << 2);
13232e9fc1aSHaojian Zhuang 	} while (data != (1 << 2));
13332e9fc1aSHaojian Zhuang 
13432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x06c));
13532e9fc1aSHaojian Zhuang 	data &= ~0xffff;
13632e9fc1aSHaojian Zhuang 	data |= 0x56;
13732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x06c), data);
13832e9fc1aSHaojian Zhuang 
13932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x06c));
14032e9fc1aSHaojian Zhuang 	data &= ~(0xffffff << 8);
14132e9fc1aSHaojian Zhuang 	data |= 0xc7a << 8;
14232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x06c), data);
14332e9fc1aSHaojian Zhuang 
14432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x058));
14532e9fc1aSHaojian Zhuang 	data &= ((1 << 13) - 1);
14632e9fc1aSHaojian Zhuang 	data |= 0xccb;
14732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x058), data);
14832e9fc1aSHaojian Zhuang 
14932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x060), 0x1fff);
15032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x064), 0x1ffffff);
15132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x068), 0x7fffffff);
15232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x05c), 0x1);
15332e9fc1aSHaojian Zhuang 
15432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
15532e9fc1aSHaojian Zhuang 	data &= ~(0xf << 12);
15632e9fc1aSHaojian Zhuang 	data |= 1 << 12;
15732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
15832e9fc1aSHaojian Zhuang 	dsb();
15932e9fc1aSHaojian Zhuang 
16032e9fc1aSHaojian Zhuang 
16132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
16232e9fc1aSHaojian Zhuang 	data &= ~(1 << 0);
16332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
16432e9fc1aSHaojian Zhuang 
16532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x004), 0x5110207d);
16632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x134), 0x10000005);
16732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x134));
16832e9fc1aSHaojian Zhuang 
16932e9fc1aSHaojian Zhuang 
17032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
17132e9fc1aSHaojian Zhuang 	data |= (1 << 0);
17232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
17332e9fc1aSHaojian Zhuang 
17432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x368), 0x100da);
17532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x378));
17632e9fc1aSHaojian Zhuang 	data &= ~((1 << 7) - 1);
17732e9fc1aSHaojian Zhuang 	data |= 0x6b;
17832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x378), data);
17932e9fc1aSHaojian Zhuang 	dsb();
18032e9fc1aSHaojian Zhuang 	do {
18132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x378));
18232e9fc1aSHaojian Zhuang 		tmp = data & 0x7f;
18332e9fc1aSHaojian Zhuang 		data = (data & (0x7f << 8)) >> 8;
18432e9fc1aSHaojian Zhuang 		if (data != tmp)
18532e9fc1aSHaojian Zhuang 			continue;
18632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x37c));
18732e9fc1aSHaojian Zhuang 	} while (!(data & 1));
18832e9fc1aSHaojian Zhuang 
18932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
19032e9fc1aSHaojian Zhuang 	data &= ~((3 << 0) |
19132e9fc1aSHaojian Zhuang 			(3 << 8));
19232e9fc1aSHaojian Zhuang 	cpuext_cfg = 1;
19332e9fc1aSHaojian Zhuang 	ddr_cfg = 1;
19432e9fc1aSHaojian Zhuang 	data |= cpuext_cfg | (ddr_cfg << 8);
19532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
19632e9fc1aSHaojian Zhuang 	dsb();
19732e9fc1aSHaojian Zhuang 
19832e9fc1aSHaojian Zhuang 	do {
19932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x104));
20032e9fc1aSHaojian Zhuang 		tmp = (data & (3 << 16)) >> 16;
20132e9fc1aSHaojian Zhuang 		if (cpuext_cfg != tmp)
20232e9fc1aSHaojian Zhuang 			continue;
20332e9fc1aSHaojian Zhuang 		tmp = (data & (3 << 24)) >> 24;
20432e9fc1aSHaojian Zhuang 		if (ddr_cfg != tmp)
20532e9fc1aSHaojian Zhuang 			continue;
20632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x000));
20732e9fc1aSHaojian Zhuang 		data &= 1 << 28;
20832e9fc1aSHaojian Zhuang 	} while (!data);
20932e9fc1aSHaojian Zhuang 
21032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x100));
21132e9fc1aSHaojian Zhuang 	data &= ~(1 << 0);
21232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x100), data);
21332e9fc1aSHaojian Zhuang 	dsb();
21432e9fc1aSHaojian Zhuang 	do {
21532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x100));
21632e9fc1aSHaojian Zhuang 		data &= (1 << 1);
21732e9fc1aSHaojian Zhuang 	} while (data != (1 << 1));
21832e9fc1aSHaojian Zhuang 	mdelay(1000);
21932e9fc1aSHaojian Zhuang 
22032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
22132e9fc1aSHaojian Zhuang 	data &= ~(1 << 28);
22232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
22332e9fc1aSHaojian Zhuang 	dsb();
22432e9fc1aSHaojian Zhuang 
22532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
22632e9fc1aSHaojian Zhuang 	data &= ~((1 << 4) |
22732e9fc1aSHaojian Zhuang 			(3 << 12));
22832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
22932e9fc1aSHaojian Zhuang }
23032e9fc1aSHaojian Zhuang 
23132e9fc1aSHaojian Zhuang int cat_533mhz_800mhz(void)
23232e9fc1aSHaojian Zhuang {
23332e9fc1aSHaojian Zhuang 	unsigned int data, i;
23432e9fc1aSHaojian Zhuang 	unsigned int bdl[5];
23532e9fc1aSHaojian Zhuang 
23632e9fc1aSHaojian Zhuang 
23732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1c8));
23832e9fc1aSHaojian Zhuang 	data &= 0xfffff0f0;
239483dce7eSHaojian Zhuang 	data |= 0x100f01;
24032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1c8), data);
24132e9fc1aSHaojian Zhuang 
24232e9fc1aSHaojian Zhuang 	for (i = 0; i < 0x20; i++) {
24332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
24432e9fc1aSHaojian Zhuang 		data = (i << 0x10) + i;
24532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x140), data);
24632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x144), data);
24732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x148), data);
24832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x14c), data);
24932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x150), data);
25032e9fc1aSHaojian Zhuang 
25132e9fc1aSHaojian Zhuang 
25232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
25332e9fc1aSHaojian Zhuang 		data |= 0x80000;
25432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
25532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
25632e9fc1aSHaojian Zhuang 		data &= 0xfff7ffff;
25732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
25832e9fc1aSHaojian Zhuang 
25932e9fc1aSHaojian Zhuang 
26032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
26132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x0);
26232e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x801);
26332e9fc1aSHaojian Zhuang 		do {
26432e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
26532e9fc1aSHaojian Zhuang 		} while (data & 1);
26632e9fc1aSHaojian Zhuang 
26732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
268483dce7eSHaojian Zhuang 		if ((data & 0x400) == 0) {
26932e9fc1aSHaojian Zhuang 			mdelay(10);
27032e9fc1aSHaojian Zhuang 			return 0;
27132e9fc1aSHaojian Zhuang 		}
27232e9fc1aSHaojian Zhuang 		WARN("lpddr3 cat fail\n");
27332e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x1d4));
27432e9fc1aSHaojian Zhuang 		if ((data & 0x1f00) && ((data & 0x1f) == 0)) {
27532e9fc1aSHaojian Zhuang 			bdl[0] = mmio_read_32((0xf712c000 + 0x140));
27632e9fc1aSHaojian Zhuang 			bdl[1] = mmio_read_32((0xf712c000 + 0x144));
27732e9fc1aSHaojian Zhuang 			bdl[2] = mmio_read_32((0xf712c000 + 0x148));
27832e9fc1aSHaojian Zhuang 			bdl[3] = mmio_read_32((0xf712c000 + 0x14c));
27932e9fc1aSHaojian Zhuang 			bdl[4] = mmio_read_32((0xf712c000 + 0x150));
28032e9fc1aSHaojian Zhuang 			if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) ||
28132e9fc1aSHaojian Zhuang 					(!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) ||
28232e9fc1aSHaojian Zhuang 					(!(bdl[4] & 0x1f001f))) {
28332e9fc1aSHaojian Zhuang 				WARN("lpddr3 cat deskew error\n");
28432e9fc1aSHaojian Zhuang 				if (i == 0x1f) {
28532e9fc1aSHaojian Zhuang 					WARN("addrnbdl is max\n");
28632e9fc1aSHaojian Zhuang 					return -EINVAL;
28732e9fc1aSHaojian Zhuang 				}
28832e9fc1aSHaojian Zhuang 				mmio_write_32((0xf712c000 + 0x008), 0x400);
28932e9fc1aSHaojian Zhuang 			} else {
29032e9fc1aSHaojian Zhuang 				WARN("lpddr3 cat other error1\n");
29132e9fc1aSHaojian Zhuang 				return -EINVAL;
29232e9fc1aSHaojian Zhuang 			}
29332e9fc1aSHaojian Zhuang 		} else {
29432e9fc1aSHaojian Zhuang 			WARN("lpddr3 cat other error2\n");
29532e9fc1aSHaojian Zhuang 			return -EINVAL;
29632e9fc1aSHaojian Zhuang 		}
29732e9fc1aSHaojian Zhuang 	}
29832e9fc1aSHaojian Zhuang 	return -EINVAL;
29932e9fc1aSHaojian Zhuang }
30032e9fc1aSHaojian Zhuang 
30132e9fc1aSHaojian Zhuang static void ddrx_rdet(void)
30232e9fc1aSHaojian Zhuang {
30332e9fc1aSHaojian Zhuang 	unsigned int data, rdet, bdl[4];
30432e9fc1aSHaojian Zhuang 
30532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
30632e9fc1aSHaojian Zhuang 	data &= 0xf800ffff;
30732e9fc1aSHaojian Zhuang 	data |= 0x8f0000;
30832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
30932e9fc1aSHaojian Zhuang 
31032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0dc));
31132e9fc1aSHaojian Zhuang 	data &= 0xfffffff0;
31232e9fc1aSHaojian Zhuang 	data |= 0xf;
31332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0dc), data);
31432e9fc1aSHaojian Zhuang 
31532e9fc1aSHaojian Zhuang 
31632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
31732e9fc1aSHaojian Zhuang 	data |= 0x80000;
31832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
31932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
32032e9fc1aSHaojian Zhuang 	data &= 0xfff7ffff;
32132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
32232e9fc1aSHaojian Zhuang 
32332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
32432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0);
32532e9fc1aSHaojian Zhuang 
32632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
32732e9fc1aSHaojian Zhuang 	data &= ~0xf0000000;
32832e9fc1aSHaojian Zhuang 	data |= 0x80000000;
32932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
33032e9fc1aSHaojian Zhuang 
33132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x101);
33232e9fc1aSHaojian Zhuang 	do {
33332e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
33432e9fc1aSHaojian Zhuang 	} while (!(data & 1));
33532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
33632e9fc1aSHaojian Zhuang 	if (data & 0x100)
33732e9fc1aSHaojian Zhuang 		WARN("rdet lbs fail\n");
33832e9fc1aSHaojian Zhuang 
33932e9fc1aSHaojian Zhuang 	bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f;
34032e9fc1aSHaojian Zhuang 	bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f;
34132e9fc1aSHaojian Zhuang 	bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f;
34232e9fc1aSHaojian Zhuang 	bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f;
34332e9fc1aSHaojian Zhuang 	do {
34432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x22c));
34532e9fc1aSHaojian Zhuang 		data &= ~0x7f;
34632e9fc1aSHaojian Zhuang 		data |= bdl[0];
34732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x22c), data);
34832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x2ac));
34932e9fc1aSHaojian Zhuang 		data &= ~0x7f;
35032e9fc1aSHaojian Zhuang 		data |= bdl[1];
35132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x2ac), data);
35232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x32c));
35332e9fc1aSHaojian Zhuang 		data &= ~0x7f;
35432e9fc1aSHaojian Zhuang 		data |= bdl[2];
35532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x32c), data);
35632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x3ac));
35732e9fc1aSHaojian Zhuang 		data &= ~0x7f;
35832e9fc1aSHaojian Zhuang 		data |= bdl[3];
35932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x3ac), data);
36032e9fc1aSHaojian Zhuang 
36132e9fc1aSHaojian Zhuang 
36232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
36332e9fc1aSHaojian Zhuang 		data |= 0x80000;
36432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
36532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
36632e9fc1aSHaojian Zhuang 		data &= 0xfff7ffff;
36732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
36832e9fc1aSHaojian Zhuang 
36932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
37032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0);
37132e9fc1aSHaojian Zhuang 
37232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x0d0));
37332e9fc1aSHaojian Zhuang 		data &= ~0xf0000000;
37432e9fc1aSHaojian Zhuang 		data |= 0x40000000;
37532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x0d0), data);
37632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x101);
37732e9fc1aSHaojian Zhuang 		do {
37832e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
37932e9fc1aSHaojian Zhuang 		} while (data & 1);
38032e9fc1aSHaojian Zhuang 
38132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
38232e9fc1aSHaojian Zhuang 		rdet = data & 0x100;
38332e9fc1aSHaojian Zhuang 		if (rdet) {
38432e9fc1aSHaojian Zhuang 			INFO("rdet ds fail\n");
38532e9fc1aSHaojian Zhuang 			mmio_write_32((0xf712c000 + 0x008), 0x100);
38632e9fc1aSHaojian Zhuang 		}
38732e9fc1aSHaojian Zhuang 		bdl[0]++;
38832e9fc1aSHaojian Zhuang 		bdl[1]++;
38932e9fc1aSHaojian Zhuang 		bdl[2]++;
39032e9fc1aSHaojian Zhuang 		bdl[3]++;
39132e9fc1aSHaojian Zhuang 	} while (rdet);
39232e9fc1aSHaojian Zhuang 
39332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
39432e9fc1aSHaojian Zhuang 	data &= ~0xf0000000;
39532e9fc1aSHaojian Zhuang 	data |= 0x30000000;
39632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
39732e9fc1aSHaojian Zhuang 
39832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x101);
39932e9fc1aSHaojian Zhuang 	do {
40032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
40132e9fc1aSHaojian Zhuang 	} while (data & 1);
40232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
40332e9fc1aSHaojian Zhuang 	if (data & 0x100)
40432e9fc1aSHaojian Zhuang 		INFO("rdet rbs av fail\n");
40532e9fc1aSHaojian Zhuang }
40632e9fc1aSHaojian Zhuang 
40732e9fc1aSHaojian Zhuang static void ddrx_wdet(void)
40832e9fc1aSHaojian Zhuang {
40922db0167SHaojian Zhuang 	unsigned int data, wdet, zero_bdl = 0, dq[4];
41032e9fc1aSHaojian Zhuang 	int i;
41132e9fc1aSHaojian Zhuang 
41232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
41332e9fc1aSHaojian Zhuang 	data &= ~0xf;
41432e9fc1aSHaojian Zhuang 	data |= 0xf;
41532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
41632e9fc1aSHaojian Zhuang 
41732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
41832e9fc1aSHaojian Zhuang 	data |= 0x80000;
41932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
42032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
42132e9fc1aSHaojian Zhuang 	data &= ~0x80000;
42232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
42332e9fc1aSHaojian Zhuang 
42432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
42532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0);
42632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
42732e9fc1aSHaojian Zhuang 	data &= ~0xf000;
42832e9fc1aSHaojian Zhuang 	data |= 0x8000;
42932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
43032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x201);
43132e9fc1aSHaojian Zhuang 	do {
43232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
43332e9fc1aSHaojian Zhuang 	} while (data & 1);
43432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
43532e9fc1aSHaojian Zhuang 	if (data & 0x200)
43632e9fc1aSHaojian Zhuang 		INFO("wdet lbs fail\n");
43732e9fc1aSHaojian Zhuang 
43832e9fc1aSHaojian Zhuang 	dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00;
43932e9fc1aSHaojian Zhuang 	dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00;
44032e9fc1aSHaojian Zhuang 	dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00;
44132e9fc1aSHaojian Zhuang 	dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00;
44232e9fc1aSHaojian Zhuang 
44332e9fc1aSHaojian Zhuang 	do {
44432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x234), dq[0]);
44532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x2b4), dq[1]);
44632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x334), dq[2]);
44732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x3b4), dq[3]);
44832e9fc1aSHaojian Zhuang 
44932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
45032e9fc1aSHaojian Zhuang 		data |= 0x80000;
45132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
45232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
45332e9fc1aSHaojian Zhuang 		data &= ~0x80000;
45432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
45532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
45632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0);
45732e9fc1aSHaojian Zhuang 
45832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x0d0));
45932e9fc1aSHaojian Zhuang 		data &= ~0xf000;
46032e9fc1aSHaojian Zhuang 		data |= 0x4000;
46132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x0d0), data);
46232e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x201);
46332e9fc1aSHaojian Zhuang 		do {
46432e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
46532e9fc1aSHaojian Zhuang 		} while (data & 1);
46632e9fc1aSHaojian Zhuang 
46732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
46832e9fc1aSHaojian Zhuang 		wdet = data & 0x200;
46932e9fc1aSHaojian Zhuang 		if (wdet) {
47032e9fc1aSHaojian Zhuang 			INFO("wdet ds fail\n");
47132e9fc1aSHaojian Zhuang 			mmio_write_32((0xf712c000 + 0x008), 0x200);
47232e9fc1aSHaojian Zhuang 		}
47332e9fc1aSHaojian Zhuang 		mdelay(10);
47432e9fc1aSHaojian Zhuang 
47532e9fc1aSHaojian Zhuang 		for (i = 0; i < 4; i++) {
47632e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80));
47732e9fc1aSHaojian Zhuang 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
47832e9fc1aSHaojian Zhuang 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
47932e9fc1aSHaojian Zhuang 				zero_bdl = 1;
48032e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80));
48132e9fc1aSHaojian Zhuang 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
48232e9fc1aSHaojian Zhuang 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
48332e9fc1aSHaojian Zhuang 				zero_bdl = 1;
48432e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80));
48532e9fc1aSHaojian Zhuang 			if (!(data & 0x1f))
48632e9fc1aSHaojian Zhuang 				zero_bdl = 1;
48732e9fc1aSHaojian Zhuang 			if (zero_bdl) {
48832e9fc1aSHaojian Zhuang 				if (i == 0)
48932e9fc1aSHaojian Zhuang 					dq[0] = dq[0] - 0x100;
49032e9fc1aSHaojian Zhuang 				if (i == 1)
49132e9fc1aSHaojian Zhuang 					dq[1] = dq[1] - 0x100;
49232e9fc1aSHaojian Zhuang 				if (i == 2)
49332e9fc1aSHaojian Zhuang 					dq[2] = dq[2] - 0x100;
49432e9fc1aSHaojian Zhuang 				if (i == 3)
49532e9fc1aSHaojian Zhuang 					dq[3] = dq[3] - 0x100;
49632e9fc1aSHaojian Zhuang 			}
49732e9fc1aSHaojian Zhuang 		}
49832e9fc1aSHaojian Zhuang 	} while (wdet);
49932e9fc1aSHaojian Zhuang 
50032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
50132e9fc1aSHaojian Zhuang 	data &= ~0xf000;
50232e9fc1aSHaojian Zhuang 	data |= 0x3000;
50332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
50432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x201);
50532e9fc1aSHaojian Zhuang 	do {
50632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
50732e9fc1aSHaojian Zhuang 	} while (data & 1);
50832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
50932e9fc1aSHaojian Zhuang 	if (data & 0x200)
51032e9fc1aSHaojian Zhuang 		INFO("wdet rbs av fail\n");
51132e9fc1aSHaojian Zhuang }
51232e9fc1aSHaojian Zhuang 
513483dce7eSHaojian Zhuang void set_ddrc_150mhz(void)
514483dce7eSHaojian Zhuang {
515483dce7eSHaojian Zhuang 	unsigned int data;
516483dce7eSHaojian Zhuang 
517483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x1);
518483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x7);
519483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
520483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
521483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
522483dce7eSHaojian Zhuang 
523483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
524483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
525483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
526483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
527483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
528483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
529483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
530483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
531483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
532483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
533483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
534483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
535483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
536483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
537483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
538483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
539483dce7eSHaojian Zhuang 
540483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
541483dce7eSHaojian Zhuang 	data |= 4;
542483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
543483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
544483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
545483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
546483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
547483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
548483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
549483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
550483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
551483dce7eSHaojian Zhuang 	data &= 0xffffff00;
552483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
553483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x30c82355);
554483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0x62112bb);
555483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20041022);
556483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x63177497);
557483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008407);
558483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
559483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
560483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
561483dce7eSHaojian Zhuang 	data &= 0xffff0000;
562483dce7eSHaojian Zhuang 	data |= 0x184;
563483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
564483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
565483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
566483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
567483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
568483dce7eSHaojian Zhuang 	data &= ~0x10;
569483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
570483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
571483dce7eSHaojian Zhuang 	data &= ~0x2000;
572483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
573483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
574483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
575483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
576483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
577483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
578483dce7eSHaojian Zhuang 
579483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
580483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
581483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
582483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
583483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
584483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
585483dce7eSHaojian Zhuang 
586483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb3290d08);
587483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x9621821);
588483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x45009023);
589483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145);
590483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
591483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x11080806);
592483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
593483dce7eSHaojian Zhuang 	do {
594483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
595483dce7eSHaojian Zhuang 	} while (data & 1);
596483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
597483dce7eSHaojian Zhuang 	if (data & 8) {
598483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
599483dce7eSHaojian Zhuang 		return;
600483dce7eSHaojian Zhuang 	}
601483dce7eSHaojian Zhuang 
602483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
603483dce7eSHaojian Zhuang 	data |= 1;
604483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
605483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
606483dce7eSHaojian Zhuang 	do {
607483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
608483dce7eSHaojian Zhuang 	} while (data & 1);
609483dce7eSHaojian Zhuang 
610483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
611483dce7eSHaojian Zhuang 	if (data & 0x8)
612483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
613483dce7eSHaojian Zhuang 	else
614483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
615483dce7eSHaojian Zhuang 
616483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
617483dce7eSHaojian Zhuang 	data &= ~0xf;
618483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
619483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 150mhz\n");
620483dce7eSHaojian Zhuang }
621483dce7eSHaojian Zhuang 
622483dce7eSHaojian Zhuang void set_ddrc_266mhz(void)
623483dce7eSHaojian Zhuang {
624483dce7eSHaojian Zhuang 	unsigned int data;
625483dce7eSHaojian Zhuang 
626483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x3);
627483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
628483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
629483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
630483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
631483dce7eSHaojian Zhuang 
632483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
633483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
634483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
635483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
636483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
637483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
638483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
639483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
640483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
641483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
642483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
643483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
644483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
645483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
646483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
647483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
648483dce7eSHaojian Zhuang 
649483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
650483dce7eSHaojian Zhuang 	data |= 4;
651483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
652483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
653483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
654483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
655483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
656483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
657483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
658483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
659483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
660483dce7eSHaojian Zhuang 	data &= 0xffffff00;
661483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
662483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x510d4455);
663483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0x8391ebb);
664483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x2005103c);
665483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x6329950b);
666483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x300858c);
667483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
668483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
669483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
670483dce7eSHaojian Zhuang 	data &= 0xffff0000;
671483dce7eSHaojian Zhuang 	data |= 0x184;
672483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
673483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
674483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
675483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
676483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
677483dce7eSHaojian Zhuang 	data &= ~0x10;
678483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
679483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
680483dce7eSHaojian Zhuang 	data &= ~0x2000;
681483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
682483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
683483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
684483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
685483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
686483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
687483dce7eSHaojian Zhuang 
688483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
689483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
690483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
691483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
692483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
693483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
694483dce7eSHaojian Zhuang 
695483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb441d50d);
696483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0xf721839);
697483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x5500f03f);
698483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf486145);
699483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
700483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x12080d06);
701483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
702483dce7eSHaojian Zhuang 	do {
703483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
704483dce7eSHaojian Zhuang 	} while (data & 1);
705483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
706483dce7eSHaojian Zhuang 	if (data & 8) {
707483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
708483dce7eSHaojian Zhuang 		return;
709483dce7eSHaojian Zhuang 	}
710483dce7eSHaojian Zhuang 
711483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
712483dce7eSHaojian Zhuang 	data |= 1;
713483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
714483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
715483dce7eSHaojian Zhuang 	do {
716483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
717483dce7eSHaojian Zhuang 	} while (data & 1);
718483dce7eSHaojian Zhuang 
719483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
720483dce7eSHaojian Zhuang 	if (data & 0x8)
721483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
722483dce7eSHaojian Zhuang 	else
723483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
724483dce7eSHaojian Zhuang 
725483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
726483dce7eSHaojian Zhuang 	data &= ~0xf;
727483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
728483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 266mhz\n");
729483dce7eSHaojian Zhuang }
730483dce7eSHaojian Zhuang 
731483dce7eSHaojian Zhuang void set_ddrc_400mhz(void)
732483dce7eSHaojian Zhuang {
733483dce7eSHaojian Zhuang 	unsigned int data;
734483dce7eSHaojian Zhuang 
735483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x2);
736483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
737483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
738483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
739483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
740483dce7eSHaojian Zhuang 
741483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
742483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
743483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
744483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
745483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
746483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
747483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
748483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
749483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
750483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
751483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
752483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
753483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
754483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
755483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
756483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
757483dce7eSHaojian Zhuang 
758483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
759483dce7eSHaojian Zhuang 	data |= 4;
760483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
761483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
762483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
763483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
764483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
765483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
766483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
767483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
768483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
769483dce7eSHaojian Zhuang 	data &= 0xffffff00;
770483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
771483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x75525655);
772483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xa552abb);
773483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20071059);
774483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x633e8591);
775483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008691);
776483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
777483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
778483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
779483dce7eSHaojian Zhuang 	data &= 0xffff0000;
780483dce7eSHaojian Zhuang 	data |= 0x184;
781483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
782483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
783483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
784483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
785483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
786483dce7eSHaojian Zhuang 	data &= ~0x10;
787483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
788483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
789483dce7eSHaojian Zhuang 	data &= ~0x2000;
790483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
791483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
792483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
793483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
794483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
795483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
796483dce7eSHaojian Zhuang 
797483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
798483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
799483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
800483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
801483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
802483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
803483dce7eSHaojian Zhuang 
804483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12);
805483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x17721855);
806483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x7501505f);
807483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245);
808483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
809483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13081306);
810483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
811483dce7eSHaojian Zhuang 	do {
812483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
813483dce7eSHaojian Zhuang 	} while (data & 1);
814483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
815483dce7eSHaojian Zhuang 	if (data & 8) {
816483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
817483dce7eSHaojian Zhuang 		return;
818483dce7eSHaojian Zhuang 	}
819483dce7eSHaojian Zhuang 
820483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
821483dce7eSHaojian Zhuang 	data |= 1;
822483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
823483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
824483dce7eSHaojian Zhuang 	do {
825483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
826483dce7eSHaojian Zhuang 	} while (data & 1);
827483dce7eSHaojian Zhuang 
828483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
829483dce7eSHaojian Zhuang 	if (data & 0x8)
830483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
831483dce7eSHaojian Zhuang 	else
832483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
833483dce7eSHaojian Zhuang 
834483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
835483dce7eSHaojian Zhuang 	data &= ~0xf;
836483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
837483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 400mhz\n");
838483dce7eSHaojian Zhuang }
839483dce7eSHaojian Zhuang 
840483dce7eSHaojian Zhuang void set_ddrc_533mhz(void)
84132e9fc1aSHaojian Zhuang {
84232e9fc1aSHaojian Zhuang 	unsigned int data;
84332e9fc1aSHaojian Zhuang 
84432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x3);
84532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x11111);
84632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
84732e9fc1aSHaojian Zhuang 	data |= 0x100;
84832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
84932e9fc1aSHaojian Zhuang 
85032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x30);
85132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
85232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
85332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
854483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
85532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
85632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x6400000);
85732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x640);
85832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x640);
85932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x640);
86032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x640);
86132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x0);
86232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
86332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
86432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
86532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
86632e9fc1aSHaojian Zhuang 
86732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
86832e9fc1aSHaojian Zhuang 	data |= 4;
86932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
87032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
87132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
87232e9fc1aSHaojian Zhuang 	data &= 0xfffffffe;
87332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
87432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
87532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
87632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
87732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
87832e9fc1aSHaojian Zhuang 	data &= 0xffffff00;
87932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
88032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x9dd87855);
88132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xa7138bb);
88232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20091477);
88332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x84534e16);
88432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008817);
88532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x106c3);
88632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
88732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
88832e9fc1aSHaojian Zhuang 	data &= 0xffff0000;
88932e9fc1aSHaojian Zhuang 	data |= 0x305;
89032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
89132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
89232e9fc1aSHaojian Zhuang 	data |= 0x40000000;
89332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
89432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
89532e9fc1aSHaojian Zhuang 	data &= ~0x10;
89632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
89732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
89832e9fc1aSHaojian Zhuang 	data &= ~0x2000;
89932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
90032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
90132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
90232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
90332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
90432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
90532e9fc1aSHaojian Zhuang 
90632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
90732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
90832e9fc1aSHaojian Zhuang 	do {
90932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
91032e9fc1aSHaojian Zhuang 	} while (data & 1);
91132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
91232e9fc1aSHaojian Zhuang 	if (data & 0x7fe) {
91332e9fc1aSHaojian Zhuang 		NOTICE("failed to init lpddr3 rank0 dram phy\n");
91432e9fc1aSHaojian Zhuang 		return;
91532e9fc1aSHaojian Zhuang 	}
916483dce7eSHaojian Zhuang 	cat_533mhz_800mhz();
917483dce7eSHaojian Zhuang 
918483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
919483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
920483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
921483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
922483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
923483dce7eSHaojian Zhuang 
924483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb77b6718);
925483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x1e82a071);
926483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x9501c07e);
927483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255);
928483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
929483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13181908);
930483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
931483dce7eSHaojian Zhuang 	do {
932483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
933483dce7eSHaojian Zhuang 	} while (data & 1);
934483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
935483dce7eSHaojian Zhuang 	if (data & 0x7fe) {
936483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
937483dce7eSHaojian Zhuang 		return;
938483dce7eSHaojian Zhuang 	}
939483dce7eSHaojian Zhuang 	ddrx_rdet();
940483dce7eSHaojian Zhuang 	ddrx_wdet();
941483dce7eSHaojian Zhuang 
942483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
943483dce7eSHaojian Zhuang 	data |= 1;
944483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
945483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
946483dce7eSHaojian Zhuang 	do {
947483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
948483dce7eSHaojian Zhuang 	} while (data & 1);
949483dce7eSHaojian Zhuang 
950483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
951483dce7eSHaojian Zhuang 	if (data & 0x7fe)
952483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
953483dce7eSHaojian Zhuang 	else
954483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
955483dce7eSHaojian Zhuang 
956483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
957483dce7eSHaojian Zhuang 	data &= ~0xf;
958483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
959483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 533mhz\n");
96032e9fc1aSHaojian Zhuang }
96132e9fc1aSHaojian Zhuang 
962483dce7eSHaojian Zhuang void set_ddrc_800mhz(void)
96332e9fc1aSHaojian Zhuang {
96432e9fc1aSHaojian Zhuang 	unsigned int data;
96532e9fc1aSHaojian Zhuang 
96632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x2);
96732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
96832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
96932e9fc1aSHaojian Zhuang 	data &= 0xfffffcff;
97032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
97132e9fc1aSHaojian Zhuang 
97232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x30);
97332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
97432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
97532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
976483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
97732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
97832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x5400000);
97932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x540);
98032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x540);
98132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x540);
98232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x540);
98332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x0);
98432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
98532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
98632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
98732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
98832e9fc1aSHaojian Zhuang 
98932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
99032e9fc1aSHaojian Zhuang 	data |= 4;
99132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
99232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
99332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
99432e9fc1aSHaojian Zhuang 	data &= 0xfffffffe;
99532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
99632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
99732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
99832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
99932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
100032e9fc1aSHaojian Zhuang 	data &= 0xffffff00;
100132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
100232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0xe663ab77);
100332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xea952db);
100432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1);
100532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721);
100632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008aa1);
100732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x11a43);
100832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
100932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
101032e9fc1aSHaojian Zhuang 	data &= 0xffff0000;
101132e9fc1aSHaojian Zhuang 	data |= 0x507;
101232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
101332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
101432e9fc1aSHaojian Zhuang 	data |= 0x40000000;
101532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
101632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
101732e9fc1aSHaojian Zhuang 	data &= 0xffffffef;
101832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
101932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
102032e9fc1aSHaojian Zhuang 	data &= 0xffffdfff;
102132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
102232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
102332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
102432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
102532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
102632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
102732e9fc1aSHaojian Zhuang 
102832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x2001);
102932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
103032e9fc1aSHaojian Zhuang 	do {
103132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
103232e9fc1aSHaojian Zhuang 	} while (data & 1);
103332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
103432e9fc1aSHaojian Zhuang 	if (data & 0x7fe) {
103532e9fc1aSHaojian Zhuang 		WARN("failed to init lpddr3 rank0 dram phy\n");
103632e9fc1aSHaojian Zhuang 		return;
103732e9fc1aSHaojian Zhuang 	}
1038483dce7eSHaojian Zhuang 	cat_533mhz_800mhz();
1039483dce7eSHaojian Zhuang 
1040483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
1041483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100023);
1042483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
1043483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
1044483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
1045483dce7eSHaojian Zhuang 
1046483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0x755a9d12);
1047483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x1753b055);
1048483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x7401505f);
1049483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0x578ca244);
1050483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10700000);
1051483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13141306);
1052483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
1053483dce7eSHaojian Zhuang 	do {
1054483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
1055483dce7eSHaojian Zhuang 	} while (data & 1);
1056483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
1057483dce7eSHaojian Zhuang 	if (data & 0x7fe) {
1058483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
1059483dce7eSHaojian Zhuang 		return;
1060483dce7eSHaojian Zhuang 	}
1061483dce7eSHaojian Zhuang 	ddrx_rdet();
1062483dce7eSHaojian Zhuang 	ddrx_wdet();
1063483dce7eSHaojian Zhuang 
1064483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
1065483dce7eSHaojian Zhuang 	data |= 1;
1066483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
1067483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
1068483dce7eSHaojian Zhuang 	do {
1069483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
1070483dce7eSHaojian Zhuang 	} while (data & 1);
1071483dce7eSHaojian Zhuang 
1072483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
1073483dce7eSHaojian Zhuang 	if (data & 0x7fe)
1074483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
1075483dce7eSHaojian Zhuang 	else
1076483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
1077483dce7eSHaojian Zhuang 
1078483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
1079483dce7eSHaojian Zhuang 	data &= ~0xf;
1080483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
1081483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 800mhz\n");
108232e9fc1aSHaojian Zhuang }
108332e9fc1aSHaojian Zhuang 
1084483dce7eSHaojian Zhuang static void ddrc_common_init(int freq)
108532e9fc1aSHaojian Zhuang {
108632e9fc1aSHaojian Zhuang 	unsigned int data;
108732e9fc1aSHaojian Zhuang 
108832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x020), 0x1);
108932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x100), 0x1700);
109032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x104), 0x71040004);
109132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121400 + 0x104), 0xf);
109232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121800 + 0x104), 0xf);
109332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121c00 + 0x104), 0xf);
109432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7122000 + 0x104), 0xf);
109532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x02c), 0x6);
1096483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x020), 0x30003);
109732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x028), 0x310201);
109832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600);
109932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x01c), 0xaf001);
110032e9fc1aSHaojian Zhuang 
110132e9fc1aSHaojian Zhuang 
110232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x280));
110332e9fc1aSHaojian Zhuang 	data |= 1 << 7;
110432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x280), data);
110532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x244), 0x3);
110632e9fc1aSHaojian Zhuang 
1107483dce7eSHaojian Zhuang 	if (freq == DDR_FREQ_800M)
1108483dce7eSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024);
110932e9fc1aSHaojian Zhuang 	else
1110483dce7eSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024);
111132e9fc1aSHaojian Zhuang 
111232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
111332e9fc1aSHaojian Zhuang 	data &= 0xffff;
111432e9fc1aSHaojian Zhuang 	data |= 0x4002000;
111532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
111632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x000), 0x0);
111732e9fc1aSHaojian Zhuang 	do {
111832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x294));
111932e9fc1aSHaojian Zhuang 	} while (data & 1);
112032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x000), 0x2);
112132e9fc1aSHaojian Zhuang }
112232e9fc1aSHaojian Zhuang 
112332e9fc1aSHaojian Zhuang 
112432e9fc1aSHaojian Zhuang static int dienum_det_and_rowcol_cfg(void)
112532e9fc1aSHaojian Zhuang {
112632e9fc1aSHaojian Zhuang 	unsigned int data;
112732e9fc1aSHaojian Zhuang 
112832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x87);
112932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
113032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
113132e9fc1aSHaojian Zhuang 	do {
113232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
113332e9fc1aSHaojian Zhuang 	} while (data & 1);
113432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc;
113532e9fc1aSHaojian Zhuang 	switch (data) {
113632e9fc1aSHaojian Zhuang 	case 0x18:
113732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x132);
113832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x132);
113932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1600);
114032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1141*1d999558SHaojian Zhuang 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x40000000);
114232e9fc1aSHaojian Zhuang 		break;
114332e9fc1aSHaojian Zhuang 	case 0x1c:
114432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x142);
114532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x142);
114632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
114732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1148*1d999558SHaojian Zhuang 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
114932e9fc1aSHaojian Zhuang 		break;
115032e9fc1aSHaojian Zhuang 	case 0x58:
115132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x133);
115232e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x133);
115332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
115432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1155*1d999558SHaojian Zhuang 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
115632e9fc1aSHaojian Zhuang 		break;
115732e9fc1aSHaojian Zhuang 	default:
1158*1d999558SHaojian Zhuang 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
115932e9fc1aSHaojian Zhuang 		break;
116032e9fc1aSHaojian Zhuang 	}
116132e9fc1aSHaojian Zhuang 	if (!data)
116232e9fc1aSHaojian Zhuang 		return -EINVAL;
116332e9fc1aSHaojian Zhuang 	return 0;
116432e9fc1aSHaojian Zhuang }
116532e9fc1aSHaojian Zhuang 
116632e9fc1aSHaojian Zhuang static int detect_ddr_chip_info(void)
116732e9fc1aSHaojian Zhuang {
116832e9fc1aSHaojian Zhuang 	unsigned int data, mr5, mr6, mr7;
116932e9fc1aSHaojian Zhuang 
117032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x57);
117132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
117232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
117332e9fc1aSHaojian Zhuang 
117432e9fc1aSHaojian Zhuang 	do {
117532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
117632e9fc1aSHaojian Zhuang 	} while (data & 1);
117732e9fc1aSHaojian Zhuang 
117832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
117932e9fc1aSHaojian Zhuang 	mr5 = data & 0xff;
118032e9fc1aSHaojian Zhuang 	switch (mr5) {
118132e9fc1aSHaojian Zhuang 	case 1:
118232e9fc1aSHaojian Zhuang 		INFO("Samsung DDR\n");
118332e9fc1aSHaojian Zhuang 		break;
118432e9fc1aSHaojian Zhuang 	case 6:
118532e9fc1aSHaojian Zhuang 		INFO("Hynix DDR\n");
118632e9fc1aSHaojian Zhuang 		break;
118732e9fc1aSHaojian Zhuang 	case 3:
118832e9fc1aSHaojian Zhuang 		INFO("Elpida DDR\n");
118932e9fc1aSHaojian Zhuang 		break;
119032e9fc1aSHaojian Zhuang 	default:
119132e9fc1aSHaojian Zhuang 		INFO("DDR from other vendors\n");
119232e9fc1aSHaojian Zhuang 		break;
119332e9fc1aSHaojian Zhuang 	}
119432e9fc1aSHaojian Zhuang 
119532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x67);
119632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
119732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
119832e9fc1aSHaojian Zhuang 	do {
119932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
120032e9fc1aSHaojian Zhuang 	} while (data & 1);
120132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
120232e9fc1aSHaojian Zhuang 	mr6 = data & 0xff;
120332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x77);
120432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
120532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
120632e9fc1aSHaojian Zhuang 	do {
120732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
120832e9fc1aSHaojian Zhuang 	} while (data & 1);
120932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
121032e9fc1aSHaojian Zhuang 	mr7 = data & 0xff;
121132e9fc1aSHaojian Zhuang 	data = mr5 + (mr6 << 8) + (mr7 << 16);
121232e9fc1aSHaojian Zhuang 	return data;
121332e9fc1aSHaojian Zhuang }
121432e9fc1aSHaojian Zhuang 
1215483dce7eSHaojian Zhuang void ddr_phy_reset(void)
1216483dce7eSHaojian Zhuang {
1217483dce7eSHaojian Zhuang 	mmio_write_32(0xf7030340, 0xa000);
1218483dce7eSHaojian Zhuang 	mmio_write_32(0xf7030344, 0xa000);
1219483dce7eSHaojian Zhuang }
1220483dce7eSHaojian Zhuang 
1221*1d999558SHaojian Zhuang void lpddrx_save_ddl_para_bypass(uint32_t *ddr_ddl_para, unsigned int index)
1222*1d999558SHaojian Zhuang {
1223*1d999558SHaojian Zhuang 	uint32_t value;
1224*1d999558SHaojian Zhuang 	uint32_t cnt = index;
1225*1d999558SHaojian Zhuang 	uint32_t i;
1226*1d999558SHaojian Zhuang 
1227*1d999558SHaojian Zhuang 	for (i = 0; i < 4; i++) {
1228*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
1229*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1230*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
1231*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1232*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
1233*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1234*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
1235*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1236*1d999558SHaojian Zhuang 	}
1237*1d999558SHaojian Zhuang }
1238*1d999558SHaojian Zhuang 
1239*1d999558SHaojian Zhuang void lpddrx_save_ddl_para_mission(uint32_t *ddr_ddl_para, unsigned int index)
1240*1d999558SHaojian Zhuang {
1241*1d999558SHaojian Zhuang 	uint32_t value;
1242*1d999558SHaojian Zhuang 	uint32_t cnt = index;
1243*1d999558SHaojian Zhuang 	uint32_t i;
1244*1d999558SHaojian Zhuang 
1245*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x140);
1246*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1247*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x144);
1248*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1249*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x148);
1250*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1251*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x14c);
1252*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1253*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x150);
1254*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1255*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x1d4);
1256*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1257*1d999558SHaojian Zhuang 	for (i = 0; i < 4; i++) {
1258*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x210 + i * 0x80);
1259*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1260*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x214 + i * 0x80);
1261*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1262*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x218 + i * 0x80);
1263*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1264*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x21c + i * 0x80);
1265*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1266*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x220 + i * 0x80);
1267*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1268*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x224 + i * 0x80);
1269*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1270*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x228 + i * 0x80);
1271*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1272*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
1273*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1274*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x230 + i * 0x80);
1275*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1276*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x234 + i * 0x80);
1277*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1278*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x238 + i * 0x80);
1279*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1280*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
1281*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1282*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
1283*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1284*1d999558SHaojian Zhuang 		value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
1285*1d999558SHaojian Zhuang 		ddr_ddl_para[cnt++] = value;
1286*1d999558SHaojian Zhuang 	}
1287*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x168);
1288*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1289*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x24c + 0 * 0x80);
1290*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1291*1d999558SHaojian Zhuang 	value = mmio_read_32(0xf712c000 + 0x24c + 2 * 0x80);
1292*1d999558SHaojian Zhuang 	ddr_ddl_para[cnt++] = value;
1293*1d999558SHaojian Zhuang }
1294*1d999558SHaojian Zhuang 
129532e9fc1aSHaojian Zhuang int lpddr3_freq_init(int freq)
129632e9fc1aSHaojian Zhuang {
1297483dce7eSHaojian Zhuang 	set_ddrc_150mhz();
1298*1d999558SHaojian Zhuang 	lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 0);
1299483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_150M) {
1300483dce7eSHaojian Zhuang 		ddr_phy_reset();
1301483dce7eSHaojian Zhuang 		set_ddrc_266mhz();
1302*1d999558SHaojian Zhuang 		lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1303*1d999558SHaojian Zhuang 					    16);
1304483dce7eSHaojian Zhuang 	}
1305483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_266M) {
1306483dce7eSHaojian Zhuang 		ddr_phy_reset();
1307483dce7eSHaojian Zhuang 		set_ddrc_400mhz();
1308*1d999558SHaojian Zhuang 		lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1309*1d999558SHaojian Zhuang 					    16 * 2);
1310483dce7eSHaojian Zhuang 	}
1311483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_400M) {
1312483dce7eSHaojian Zhuang 		ddr_phy_reset();
131332e9fc1aSHaojian Zhuang 		set_ddrc_533mhz();
1314*1d999558SHaojian Zhuang 		lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1315*1d999558SHaojian Zhuang 					     16 * 3);
131632e9fc1aSHaojian Zhuang 	}
1317483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_533M) {
1318483dce7eSHaojian Zhuang 		ddr_phy_reset();
1319483dce7eSHaojian Zhuang 		set_ddrc_800mhz();
1320*1d999558SHaojian Zhuang 		lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1321*1d999558SHaojian Zhuang 					     16 * 3 + 61);
132232e9fc1aSHaojian Zhuang 	}
132332e9fc1aSHaojian Zhuang 	return 0;
132432e9fc1aSHaojian Zhuang }
132532e9fc1aSHaojian Zhuang 
132632e9fc1aSHaojian Zhuang static void init_ddr(int freq)
132732e9fc1aSHaojian Zhuang {
132832e9fc1aSHaojian Zhuang 	unsigned int data;
132932e9fc1aSHaojian Zhuang 	int ret;
133032e9fc1aSHaojian Zhuang 
133132e9fc1aSHaojian Zhuang 
133232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x030));
133332e9fc1aSHaojian Zhuang 	data |= 1;
133432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x030), data);
133532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x010));
133632e9fc1aSHaojian Zhuang 	data |= 1;
133732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x010), data);
133832e9fc1aSHaojian Zhuang 
1339483dce7eSHaojian Zhuang 	udelay(300);
134032e9fc1aSHaojian Zhuang 	do {
134132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x030));
134232e9fc1aSHaojian Zhuang 		data &= 3 << 28;
134332e9fc1aSHaojian Zhuang 	} while (data != (3 << 28));
134432e9fc1aSHaojian Zhuang 	do {
134532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x010));
134632e9fc1aSHaojian Zhuang 		data &= 3 << 28;
134732e9fc1aSHaojian Zhuang 	} while (data != (3 << 28));
134832e9fc1aSHaojian Zhuang 
134932e9fc1aSHaojian Zhuang 	ret = lpddr3_freq_init(freq);
135032e9fc1aSHaojian Zhuang 	if (ret)
135132e9fc1aSHaojian Zhuang 		return;
135232e9fc1aSHaojian Zhuang }
135332e9fc1aSHaojian Zhuang 
135432e9fc1aSHaojian Zhuang static void init_ddrc_qos(void)
135532e9fc1aSHaojian Zhuang {
135632e9fc1aSHaojian Zhuang 	unsigned int port, data;
135732e9fc1aSHaojian Zhuang 
135832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x088), 1);
135932e9fc1aSHaojian Zhuang 
136032e9fc1aSHaojian Zhuang 	port = 0;
136132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
136232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111);
136332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111);
136432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007);
136532e9fc1aSHaojian Zhuang 
136632e9fc1aSHaojian Zhuang 	for (port = 3; port <= 4; port++) {
136732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
136832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777);
136932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777);
137032e9fc1aSHaojian Zhuang 	}
137132e9fc1aSHaojian Zhuang 
137232e9fc1aSHaojian Zhuang 	port = 1;
137332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
137432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
137532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
137632e9fc1aSHaojian Zhuang 
137732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x1f0), 0);
137832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
137932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
138032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x1f4), 0x01000100);
138132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402);
138232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31);
138332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x000), 0x7);
138432e9fc1aSHaojian Zhuang 
138532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7124000 + 0x09c));
138632e9fc1aSHaojian Zhuang 	data &= ~0xff0000;
138732e9fc1aSHaojian Zhuang 	data |= 0x400000;
138832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x09c), data);
138932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7124000 + 0x0ac));
139032e9fc1aSHaojian Zhuang 	data &= ~0xff0000;
139132e9fc1aSHaojian Zhuang 	data |= 0x400000;
139232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0ac), data);
139332e9fc1aSHaojian Zhuang 	port = 2;
139432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
139532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
139632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
139732e9fc1aSHaojian Zhuang 
139832e9fc1aSHaojian Zhuang 
139932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x09c), 0xff7fff);
140032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0a0), 0xff);
140132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff);
140232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0b0), 0xff);
140332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
140432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
140532e9fc1aSHaojian Zhuang }
140632e9fc1aSHaojian Zhuang 
1407483dce7eSHaojian Zhuang void hikey_ddr_init(unsigned int ddr_freq)
140832e9fc1aSHaojian Zhuang {
140932e9fc1aSHaojian Zhuang 	uint32_t data;
141032e9fc1aSHaojian Zhuang 
1411483dce7eSHaojian Zhuang 	assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) ||
1412483dce7eSHaojian Zhuang 	       (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) ||
1413483dce7eSHaojian Zhuang 	       (ddr_freq == DDR_FREQ_800M));
141432e9fc1aSHaojian Zhuang 	init_pll();
141532e9fc1aSHaojian Zhuang 	init_freq();
141632e9fc1aSHaojian Zhuang 
1417483dce7eSHaojian Zhuang 	init_ddr(ddr_freq);
141832e9fc1aSHaojian Zhuang 
1419483dce7eSHaojian Zhuang 	ddrc_common_init(ddr_freq);
142032e9fc1aSHaojian Zhuang 	dienum_det_and_rowcol_cfg();
142132e9fc1aSHaojian Zhuang 	detect_ddr_chip_info();
142232e9fc1aSHaojian Zhuang 
1423483dce7eSHaojian Zhuang 	if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) {
142432e9fc1aSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x010);
142532e9fc1aSHaojian Zhuang 		data &= ~0x1;
142632e9fc1aSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x010, data);
1427483dce7eSHaojian Zhuang 	} else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) {
1428483dce7eSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x030);
1429483dce7eSHaojian Zhuang 		data &= ~0x1;
1430483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x030, data);
1431483dce7eSHaojian Zhuang 	} else {
143232e9fc1aSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x010);
1433483dce7eSHaojian Zhuang 		data &= ~0x1;
1434483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x010, data);
1435483dce7eSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x030);
1436483dce7eSHaojian Zhuang 		data &= ~0x1;
1437483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x030, data);
1438483dce7eSHaojian Zhuang 	}
1439483dce7eSHaojian Zhuang 	dsb();
1440483dce7eSHaojian Zhuang 	isb();
144132e9fc1aSHaojian Zhuang 
144232e9fc1aSHaojian Zhuang 	/*
144332e9fc1aSHaojian Zhuang 	 * Test memory access. Do not use address 0x0 because the compiler
144432e9fc1aSHaojian Zhuang 	 * may assume it is not a valid address and generate incorrect code
144532e9fc1aSHaojian Zhuang 	 * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance).
144632e9fc1aSHaojian Zhuang 	 */
144732e9fc1aSHaojian Zhuang 	mmio_write_32(0x4, 0xa5a55a5a);
144832e9fc1aSHaojian Zhuang 	INFO("ddr test value:0x%x\n", mmio_read_32(0x4));
144932e9fc1aSHaojian Zhuang 	init_ddrc_qos();
145032e9fc1aSHaojian Zhuang }
1451