xref: /rk3399_ARM-atf/plat/hisilicon/hikey/hikey_ddr.c (revision 483dce7eef371cffaa224090305e15516ae452e5)
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>
8*483dce7eSHaojian Zhuang #include <assert.h>
932e9fc1aSHaojian Zhuang #include <debug.h>
1032e9fc1aSHaojian Zhuang #include <errno.h>
1132e9fc1aSHaojian Zhuang #include <hi6220.h>
1232e9fc1aSHaojian Zhuang #include <hi6553.h>
1332e9fc1aSHaojian Zhuang #include <mmio.h>
1432e9fc1aSHaojian Zhuang #include <sp804_delay_timer.h>
1532e9fc1aSHaojian Zhuang 
16*483dce7eSHaojian Zhuang #include "hikey_private.h"
1732e9fc1aSHaojian Zhuang 
1832e9fc1aSHaojian Zhuang static void init_pll(void)
1932e9fc1aSHaojian Zhuang {
2032e9fc1aSHaojian Zhuang 	unsigned int data;
2132e9fc1aSHaojian Zhuang 
2232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
2332e9fc1aSHaojian Zhuang 	data |= 0x1;
2432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
2532e9fc1aSHaojian Zhuang 	do {
2632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x000));
2732e9fc1aSHaojian Zhuang 	} while (!(data & (1 << 28)));
2832e9fc1aSHaojian Zhuang 
2932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7800000 + 0x000));
3032e9fc1aSHaojian Zhuang 	data &= ~0x007;
3132e9fc1aSHaojian Zhuang 	data |= 0x004;
3232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7800000 + 0x000), data);
3332e9fc1aSHaojian Zhuang 	do {
3432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7800000 + 0x014));
3532e9fc1aSHaojian Zhuang 		data &= 0x007;
3632e9fc1aSHaojian Zhuang 	} while (data != 0x004);
3732e9fc1aSHaojian Zhuang 
3832e9fc1aSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
39*483dce7eSHaojian Zhuang 	dsb();
40*483dce7eSHaojian Zhuang 	isb();
41*483dce7eSHaojian Zhuang 	udelay(10);
42*483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
43*483dce7eSHaojian Zhuang 	dsb();
44*483dce7eSHaojian Zhuang 	isb();
45*483dce7eSHaojian Zhuang 	udelay(10);
46*483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
47*483dce7eSHaojian Zhuang 	dsb();
48*483dce7eSHaojian Zhuang 	isb();
49*483dce7eSHaojian Zhuang 	udelay(10);
5032e9fc1aSHaojian Zhuang 	mmio_write_32(0xf7032000 + 0x02c, 0x5110103e);
51*483dce7eSHaojian Zhuang 	dsb();
52*483dce7eSHaojian Zhuang 	isb();
53*483dce7eSHaojian Zhuang 	udelay(10);
5432e9fc1aSHaojian Zhuang 	data = mmio_read_32(0xf7032000 + 0x050);
5532e9fc1aSHaojian Zhuang 	data |= 1 << 28;
5632e9fc1aSHaojian Zhuang 	mmio_write_32(0xf7032000 + 0x050, data);
57*483dce7eSHaojian Zhuang 	dsb();
58*483dce7eSHaojian Zhuang 	isb();
59*483dce7eSHaojian Zhuang 	udelay(10);
6032e9fc1aSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
61*483dce7eSHaojian Zhuang 	dsb();
62*483dce7eSHaojian Zhuang 	isb();
63*483dce7eSHaojian Zhuang 	udelay(10);
64*483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
65*483dce7eSHaojian Zhuang 	dsb();
66*483dce7eSHaojian Zhuang 	isb();
67*483dce7eSHaojian Zhuang 	udelay(10);
68*483dce7eSHaojian Zhuang 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
69*483dce7eSHaojian Zhuang 	dsb();
70*483dce7eSHaojian Zhuang 	isb();
71*483dce7eSHaojian Zhuang 	udelay(10);
7232e9fc1aSHaojian Zhuang }
7332e9fc1aSHaojian Zhuang 
7432e9fc1aSHaojian Zhuang static void init_freq(void)
7532e9fc1aSHaojian Zhuang {
7632e9fc1aSHaojian Zhuang 	unsigned int data, tmp;
7732e9fc1aSHaojian Zhuang 	unsigned int cpuext_cfg, ddr_cfg;
7832e9fc1aSHaojian Zhuang 
7932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x374), 0x4a);
8032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x368), 0xda);
8132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x36c), 0x01);
8232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x370), 0x01);
8332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x360), 0x60);
8432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x364), 0x60);
8532e9fc1aSHaojian Zhuang 
8632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x114), 0x1000);
8732e9fc1aSHaojian Zhuang 
8832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
8932e9fc1aSHaojian Zhuang 	data |= (3 << 12);
9032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
9132e9fc1aSHaojian Zhuang 
9232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
9332e9fc1aSHaojian Zhuang 	data |= (1 << 4);
9432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
9532e9fc1aSHaojian Zhuang 
9632e9fc1aSHaojian Zhuang 
9732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
9832e9fc1aSHaojian Zhuang 	data &= ~0x7;
9932e9fc1aSHaojian Zhuang 	data |= 0x5;
10032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
10132e9fc1aSHaojian Zhuang 	dsb();
10232e9fc1aSHaojian Zhuang 	mdelay(10);
10332e9fc1aSHaojian Zhuang 
10432e9fc1aSHaojian Zhuang 
10532e9fc1aSHaojian Zhuang 	do {
10632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf6504000 + 0x008));
10732e9fc1aSHaojian Zhuang 		data &= (3 << 20);
10832e9fc1aSHaojian Zhuang 	} while (data != (3 << 20));
10932e9fc1aSHaojian Zhuang 	dsb();
11032e9fc1aSHaojian Zhuang 	mdelay(10);
11132e9fc1aSHaojian Zhuang 
11232e9fc1aSHaojian Zhuang 
11332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
11432e9fc1aSHaojian Zhuang 	data &= ~((1 << 0) | (1 << 11));
11532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
11632e9fc1aSHaojian Zhuang 	mdelay(10);
11732e9fc1aSHaojian Zhuang 
11832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
11932e9fc1aSHaojian Zhuang 	data &= ~(3 << 8);
12032e9fc1aSHaojian Zhuang 	data |= (1 << 8);
12132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
12232e9fc1aSHaojian Zhuang 
12332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x100));
12432e9fc1aSHaojian Zhuang 	data |= (1 << 0);
12532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x100), data);
12632e9fc1aSHaojian Zhuang 	dsb();
12732e9fc1aSHaojian Zhuang 
12832e9fc1aSHaojian Zhuang 	do {
12932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x100));
13032e9fc1aSHaojian Zhuang 		data &= (1 << 2);
13132e9fc1aSHaojian Zhuang 	} while (data != (1 << 2));
13232e9fc1aSHaojian Zhuang 
13332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x06c));
13432e9fc1aSHaojian Zhuang 	data &= ~0xffff;
13532e9fc1aSHaojian Zhuang 	data |= 0x56;
13632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x06c), data);
13732e9fc1aSHaojian Zhuang 
13832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x06c));
13932e9fc1aSHaojian Zhuang 	data &= ~(0xffffff << 8);
14032e9fc1aSHaojian Zhuang 	data |= 0xc7a << 8;
14132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x06c), data);
14232e9fc1aSHaojian Zhuang 
14332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x058));
14432e9fc1aSHaojian Zhuang 	data &= ((1 << 13) - 1);
14532e9fc1aSHaojian Zhuang 	data |= 0xccb;
14632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x058), data);
14732e9fc1aSHaojian Zhuang 
14832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x060), 0x1fff);
14932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x064), 0x1ffffff);
15032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x068), 0x7fffffff);
15132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x05c), 0x1);
15232e9fc1aSHaojian Zhuang 
15332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
15432e9fc1aSHaojian Zhuang 	data &= ~(0xf << 12);
15532e9fc1aSHaojian Zhuang 	data |= 1 << 12;
15632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
15732e9fc1aSHaojian Zhuang 	dsb();
15832e9fc1aSHaojian Zhuang 
15932e9fc1aSHaojian Zhuang 
16032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
16132e9fc1aSHaojian Zhuang 	data &= ~(1 << 0);
16232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
16332e9fc1aSHaojian Zhuang 
16432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x004), 0x5110207d);
16532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x134), 0x10000005);
16632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x134));
16732e9fc1aSHaojian Zhuang 
16832e9fc1aSHaojian Zhuang 
16932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x000));
17032e9fc1aSHaojian Zhuang 	data |= (1 << 0);
17132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x000), data);
17232e9fc1aSHaojian Zhuang 
17332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x368), 0x100da);
17432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x378));
17532e9fc1aSHaojian Zhuang 	data &= ~((1 << 7) - 1);
17632e9fc1aSHaojian Zhuang 	data |= 0x6b;
17732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x378), data);
17832e9fc1aSHaojian Zhuang 	dsb();
17932e9fc1aSHaojian Zhuang 	do {
18032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x378));
18132e9fc1aSHaojian Zhuang 		tmp = data & 0x7f;
18232e9fc1aSHaojian Zhuang 		data = (data & (0x7f << 8)) >> 8;
18332e9fc1aSHaojian Zhuang 		if (data != tmp)
18432e9fc1aSHaojian Zhuang 			continue;
18532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x37c));
18632e9fc1aSHaojian Zhuang 	} while (!(data & 1));
18732e9fc1aSHaojian Zhuang 
18832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
18932e9fc1aSHaojian Zhuang 	data &= ~((3 << 0) |
19032e9fc1aSHaojian Zhuang 			(3 << 8));
19132e9fc1aSHaojian Zhuang 	cpuext_cfg = 1;
19232e9fc1aSHaojian Zhuang 	ddr_cfg = 1;
19332e9fc1aSHaojian Zhuang 	data |= cpuext_cfg | (ddr_cfg << 8);
19432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
19532e9fc1aSHaojian Zhuang 	dsb();
19632e9fc1aSHaojian Zhuang 
19732e9fc1aSHaojian Zhuang 	do {
19832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x104));
19932e9fc1aSHaojian Zhuang 		tmp = (data & (3 << 16)) >> 16;
20032e9fc1aSHaojian Zhuang 		if (cpuext_cfg != tmp)
20132e9fc1aSHaojian Zhuang 			continue;
20232e9fc1aSHaojian Zhuang 		tmp = (data & (3 << 24)) >> 24;
20332e9fc1aSHaojian Zhuang 		if (ddr_cfg != tmp)
20432e9fc1aSHaojian Zhuang 			continue;
20532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x000));
20632e9fc1aSHaojian Zhuang 		data &= 1 << 28;
20732e9fc1aSHaojian Zhuang 	} while (!data);
20832e9fc1aSHaojian Zhuang 
20932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x100));
21032e9fc1aSHaojian Zhuang 	data &= ~(1 << 0);
21132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x100), data);
21232e9fc1aSHaojian Zhuang 	dsb();
21332e9fc1aSHaojian Zhuang 	do {
21432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x100));
21532e9fc1aSHaojian Zhuang 		data &= (1 << 1);
21632e9fc1aSHaojian Zhuang 	} while (data != (1 << 1));
21732e9fc1aSHaojian Zhuang 	mdelay(1000);
21832e9fc1aSHaojian Zhuang 
21932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf6504000 + 0x054));
22032e9fc1aSHaojian Zhuang 	data &= ~(1 << 28);
22132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf6504000 + 0x054), data);
22232e9fc1aSHaojian Zhuang 	dsb();
22332e9fc1aSHaojian Zhuang 
22432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x110));
22532e9fc1aSHaojian Zhuang 	data &= ~((1 << 4) |
22632e9fc1aSHaojian Zhuang 			(3 << 12));
22732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x110), data);
22832e9fc1aSHaojian Zhuang }
22932e9fc1aSHaojian Zhuang 
23032e9fc1aSHaojian Zhuang int cat_533mhz_800mhz(void)
23132e9fc1aSHaojian Zhuang {
23232e9fc1aSHaojian Zhuang 	unsigned int data, i;
23332e9fc1aSHaojian Zhuang 	unsigned int bdl[5];
23432e9fc1aSHaojian Zhuang 
23532e9fc1aSHaojian Zhuang 
23632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1c8));
23732e9fc1aSHaojian Zhuang 	data &= 0xfffff0f0;
238*483dce7eSHaojian Zhuang 	data |= 0x100f01;
23932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1c8), data);
24032e9fc1aSHaojian Zhuang 
24132e9fc1aSHaojian Zhuang 	for (i = 0; i < 0x20; i++) {
24232e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
24332e9fc1aSHaojian Zhuang 		data = (i << 0x10) + i;
24432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x140), data);
24532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x144), data);
24632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x148), data);
24732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x14c), data);
24832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x150), data);
24932e9fc1aSHaojian Zhuang 
25032e9fc1aSHaojian Zhuang 
25132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
25232e9fc1aSHaojian Zhuang 		data |= 0x80000;
25332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
25432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
25532e9fc1aSHaojian Zhuang 		data &= 0xfff7ffff;
25632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
25732e9fc1aSHaojian Zhuang 
25832e9fc1aSHaojian Zhuang 
25932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
26032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x0);
26132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x801);
26232e9fc1aSHaojian Zhuang 		do {
26332e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
26432e9fc1aSHaojian Zhuang 		} while (data & 1);
26532e9fc1aSHaojian Zhuang 
26632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
267*483dce7eSHaojian Zhuang 		if ((data & 0x400) == 0) {
26832e9fc1aSHaojian Zhuang 			mdelay(10);
26932e9fc1aSHaojian Zhuang 			return 0;
27032e9fc1aSHaojian Zhuang 		}
27132e9fc1aSHaojian Zhuang 		WARN("lpddr3 cat fail\n");
27232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x1d4));
27332e9fc1aSHaojian Zhuang 		if ((data & 0x1f00) && ((data & 0x1f) == 0)) {
27432e9fc1aSHaojian Zhuang 			bdl[0] = mmio_read_32((0xf712c000 + 0x140));
27532e9fc1aSHaojian Zhuang 			bdl[1] = mmio_read_32((0xf712c000 + 0x144));
27632e9fc1aSHaojian Zhuang 			bdl[2] = mmio_read_32((0xf712c000 + 0x148));
27732e9fc1aSHaojian Zhuang 			bdl[3] = mmio_read_32((0xf712c000 + 0x14c));
27832e9fc1aSHaojian Zhuang 			bdl[4] = mmio_read_32((0xf712c000 + 0x150));
27932e9fc1aSHaojian Zhuang 			if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) ||
28032e9fc1aSHaojian Zhuang 					(!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) ||
28132e9fc1aSHaojian Zhuang 					(!(bdl[4] & 0x1f001f))) {
28232e9fc1aSHaojian Zhuang 				WARN("lpddr3 cat deskew error\n");
28332e9fc1aSHaojian Zhuang 				if (i == 0x1f) {
28432e9fc1aSHaojian Zhuang 					WARN("addrnbdl is max\n");
28532e9fc1aSHaojian Zhuang 					return -EINVAL;
28632e9fc1aSHaojian Zhuang 				}
28732e9fc1aSHaojian Zhuang 				mmio_write_32((0xf712c000 + 0x008), 0x400);
28832e9fc1aSHaojian Zhuang 			} else {
28932e9fc1aSHaojian Zhuang 				WARN("lpddr3 cat other error1\n");
29032e9fc1aSHaojian Zhuang 				return -EINVAL;
29132e9fc1aSHaojian Zhuang 			}
29232e9fc1aSHaojian Zhuang 		} else {
29332e9fc1aSHaojian Zhuang 			WARN("lpddr3 cat other error2\n");
29432e9fc1aSHaojian Zhuang 			return -EINVAL;
29532e9fc1aSHaojian Zhuang 		}
29632e9fc1aSHaojian Zhuang 	}
29732e9fc1aSHaojian Zhuang 	return -EINVAL;
29832e9fc1aSHaojian Zhuang }
29932e9fc1aSHaojian Zhuang 
30032e9fc1aSHaojian Zhuang static void ddrx_rdet(void)
30132e9fc1aSHaojian Zhuang {
30232e9fc1aSHaojian Zhuang 	unsigned int data, rdet, bdl[4];
30332e9fc1aSHaojian Zhuang 
30432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
30532e9fc1aSHaojian Zhuang 	data &= 0xf800ffff;
30632e9fc1aSHaojian Zhuang 	data |= 0x8f0000;
30732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
30832e9fc1aSHaojian Zhuang 
30932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0dc));
31032e9fc1aSHaojian Zhuang 	data &= 0xfffffff0;
31132e9fc1aSHaojian Zhuang 	data |= 0xf;
31232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0dc), data);
31332e9fc1aSHaojian Zhuang 
31432e9fc1aSHaojian Zhuang 
31532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
31632e9fc1aSHaojian Zhuang 	data |= 0x80000;
31732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
31832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
31932e9fc1aSHaojian Zhuang 	data &= 0xfff7ffff;
32032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
32132e9fc1aSHaojian Zhuang 
32232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
32332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0);
32432e9fc1aSHaojian Zhuang 
32532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
32632e9fc1aSHaojian Zhuang 	data &= ~0xf0000000;
32732e9fc1aSHaojian Zhuang 	data |= 0x80000000;
32832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
32932e9fc1aSHaojian Zhuang 
33032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x101);
33132e9fc1aSHaojian Zhuang 	do {
33232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
33332e9fc1aSHaojian Zhuang 	} while (!(data & 1));
33432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
33532e9fc1aSHaojian Zhuang 	if (data & 0x100)
33632e9fc1aSHaojian Zhuang 		WARN("rdet lbs fail\n");
33732e9fc1aSHaojian Zhuang 
33832e9fc1aSHaojian Zhuang 	bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f;
33932e9fc1aSHaojian Zhuang 	bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f;
34032e9fc1aSHaojian Zhuang 	bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f;
34132e9fc1aSHaojian Zhuang 	bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f;
34232e9fc1aSHaojian Zhuang 	do {
34332e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x22c));
34432e9fc1aSHaojian Zhuang 		data &= ~0x7f;
34532e9fc1aSHaojian Zhuang 		data |= bdl[0];
34632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x22c), data);
34732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x2ac));
34832e9fc1aSHaojian Zhuang 		data &= ~0x7f;
34932e9fc1aSHaojian Zhuang 		data |= bdl[1];
35032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x2ac), data);
35132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x32c));
35232e9fc1aSHaojian Zhuang 		data &= ~0x7f;
35332e9fc1aSHaojian Zhuang 		data |= bdl[2];
35432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x32c), data);
35532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x3ac));
35632e9fc1aSHaojian Zhuang 		data &= ~0x7f;
35732e9fc1aSHaojian Zhuang 		data |= bdl[3];
35832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x3ac), data);
35932e9fc1aSHaojian Zhuang 
36032e9fc1aSHaojian Zhuang 
36132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
36232e9fc1aSHaojian Zhuang 		data |= 0x80000;
36332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
36432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
36532e9fc1aSHaojian Zhuang 		data &= 0xfff7ffff;
36632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
36732e9fc1aSHaojian Zhuang 
36832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
36932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0);
37032e9fc1aSHaojian Zhuang 
37132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x0d0));
37232e9fc1aSHaojian Zhuang 		data &= ~0xf0000000;
37332e9fc1aSHaojian Zhuang 		data |= 0x40000000;
37432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x0d0), data);
37532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x101);
37632e9fc1aSHaojian Zhuang 		do {
37732e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
37832e9fc1aSHaojian Zhuang 		} while (data & 1);
37932e9fc1aSHaojian Zhuang 
38032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
38132e9fc1aSHaojian Zhuang 		rdet = data & 0x100;
38232e9fc1aSHaojian Zhuang 		if (rdet) {
38332e9fc1aSHaojian Zhuang 			INFO("rdet ds fail\n");
38432e9fc1aSHaojian Zhuang 			mmio_write_32((0xf712c000 + 0x008), 0x100);
38532e9fc1aSHaojian Zhuang 		}
38632e9fc1aSHaojian Zhuang 		bdl[0]++;
38732e9fc1aSHaojian Zhuang 		bdl[1]++;
38832e9fc1aSHaojian Zhuang 		bdl[2]++;
38932e9fc1aSHaojian Zhuang 		bdl[3]++;
39032e9fc1aSHaojian Zhuang 	} while (rdet);
39132e9fc1aSHaojian Zhuang 
39232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
39332e9fc1aSHaojian Zhuang 	data &= ~0xf0000000;
39432e9fc1aSHaojian Zhuang 	data |= 0x30000000;
39532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
39632e9fc1aSHaojian Zhuang 
39732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x101);
39832e9fc1aSHaojian Zhuang 	do {
39932e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
40032e9fc1aSHaojian Zhuang 	} while (data & 1);
40132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
40232e9fc1aSHaojian Zhuang 	if (data & 0x100)
40332e9fc1aSHaojian Zhuang 		INFO("rdet rbs av fail\n");
40432e9fc1aSHaojian Zhuang }
40532e9fc1aSHaojian Zhuang 
40632e9fc1aSHaojian Zhuang static void ddrx_wdet(void)
40732e9fc1aSHaojian Zhuang {
40822db0167SHaojian Zhuang 	unsigned int data, wdet, zero_bdl = 0, dq[4];
40932e9fc1aSHaojian Zhuang 	int i;
41032e9fc1aSHaojian Zhuang 
41132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
41232e9fc1aSHaojian Zhuang 	data &= ~0xf;
41332e9fc1aSHaojian Zhuang 	data |= 0xf;
41432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
41532e9fc1aSHaojian Zhuang 
41632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
41732e9fc1aSHaojian Zhuang 	data |= 0x80000;
41832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
41932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
42032e9fc1aSHaojian Zhuang 	data &= ~0x80000;
42132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
42232e9fc1aSHaojian Zhuang 
42332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
42432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0);
42532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
42632e9fc1aSHaojian Zhuang 	data &= ~0xf000;
42732e9fc1aSHaojian Zhuang 	data |= 0x8000;
42832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
42932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x201);
43032e9fc1aSHaojian Zhuang 	do {
43132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
43232e9fc1aSHaojian Zhuang 	} while (data & 1);
43332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
43432e9fc1aSHaojian Zhuang 	if (data & 0x200)
43532e9fc1aSHaojian Zhuang 		INFO("wdet lbs fail\n");
43632e9fc1aSHaojian Zhuang 
43732e9fc1aSHaojian Zhuang 	dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00;
43832e9fc1aSHaojian Zhuang 	dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00;
43932e9fc1aSHaojian Zhuang 	dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00;
44032e9fc1aSHaojian Zhuang 	dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00;
44132e9fc1aSHaojian Zhuang 
44232e9fc1aSHaojian Zhuang 	do {
44332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x234), dq[0]);
44432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x2b4), dq[1]);
44532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x334), dq[2]);
44632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x3b4), dq[3]);
44732e9fc1aSHaojian Zhuang 
44832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
44932e9fc1aSHaojian Zhuang 		data |= 0x80000;
45032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
45132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x070));
45232e9fc1aSHaojian Zhuang 		data &= ~0x80000;
45332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x070), data);
45432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
45532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0);
45632e9fc1aSHaojian Zhuang 
45732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x0d0));
45832e9fc1aSHaojian Zhuang 		data &= ~0xf000;
45932e9fc1aSHaojian Zhuang 		data |= 0x4000;
46032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x0d0), data);
46132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf712c000 + 0x004), 0x201);
46232e9fc1aSHaojian Zhuang 		do {
46332e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x004));
46432e9fc1aSHaojian Zhuang 		} while (data & 1);
46532e9fc1aSHaojian Zhuang 
46632e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x008));
46732e9fc1aSHaojian Zhuang 		wdet = data & 0x200;
46832e9fc1aSHaojian Zhuang 		if (wdet) {
46932e9fc1aSHaojian Zhuang 			INFO("wdet ds fail\n");
47032e9fc1aSHaojian Zhuang 			mmio_write_32((0xf712c000 + 0x008), 0x200);
47132e9fc1aSHaojian Zhuang 		}
47232e9fc1aSHaojian Zhuang 		mdelay(10);
47332e9fc1aSHaojian Zhuang 
47432e9fc1aSHaojian Zhuang 		for (i = 0; i < 4; i++) {
47532e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80));
47632e9fc1aSHaojian Zhuang 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
47732e9fc1aSHaojian Zhuang 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
47832e9fc1aSHaojian Zhuang 				zero_bdl = 1;
47932e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80));
48032e9fc1aSHaojian Zhuang 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
48132e9fc1aSHaojian Zhuang 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
48232e9fc1aSHaojian Zhuang 				zero_bdl = 1;
48332e9fc1aSHaojian Zhuang 			data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80));
48432e9fc1aSHaojian Zhuang 			if (!(data & 0x1f))
48532e9fc1aSHaojian Zhuang 				zero_bdl = 1;
48632e9fc1aSHaojian Zhuang 			if (zero_bdl) {
48732e9fc1aSHaojian Zhuang 				if (i == 0)
48832e9fc1aSHaojian Zhuang 					dq[0] = dq[0] - 0x100;
48932e9fc1aSHaojian Zhuang 				if (i == 1)
49032e9fc1aSHaojian Zhuang 					dq[1] = dq[1] - 0x100;
49132e9fc1aSHaojian Zhuang 				if (i == 2)
49232e9fc1aSHaojian Zhuang 					dq[2] = dq[2] - 0x100;
49332e9fc1aSHaojian Zhuang 				if (i == 3)
49432e9fc1aSHaojian Zhuang 					dq[3] = dq[3] - 0x100;
49532e9fc1aSHaojian Zhuang 			}
49632e9fc1aSHaojian Zhuang 		}
49732e9fc1aSHaojian Zhuang 	} while (wdet);
49832e9fc1aSHaojian Zhuang 
49932e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x0d0));
50032e9fc1aSHaojian Zhuang 	data &= ~0xf000;
50132e9fc1aSHaojian Zhuang 	data |= 0x3000;
50232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0d0), data);
50332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x201);
50432e9fc1aSHaojian Zhuang 	do {
50532e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
50632e9fc1aSHaojian Zhuang 	} while (data & 1);
50732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
50832e9fc1aSHaojian Zhuang 	if (data & 0x200)
50932e9fc1aSHaojian Zhuang 		INFO("wdet rbs av fail\n");
51032e9fc1aSHaojian Zhuang }
51132e9fc1aSHaojian Zhuang 
512*483dce7eSHaojian Zhuang void set_ddrc_150mhz(void)
513*483dce7eSHaojian Zhuang {
514*483dce7eSHaojian Zhuang 	unsigned int data;
515*483dce7eSHaojian Zhuang 
516*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x1);
517*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x7);
518*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
519*483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
520*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
521*483dce7eSHaojian Zhuang 
522*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
523*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
524*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
525*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
526*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
527*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
528*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
529*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
530*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
531*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
532*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
533*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
534*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
535*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
536*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
537*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
538*483dce7eSHaojian Zhuang 
539*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
540*483dce7eSHaojian Zhuang 	data |= 4;
541*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
542*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
543*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
544*483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
545*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
546*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
547*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
548*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
549*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
550*483dce7eSHaojian Zhuang 	data &= 0xffffff00;
551*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
552*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x30c82355);
553*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0x62112bb);
554*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20041022);
555*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x63177497);
556*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008407);
557*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
558*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
559*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
560*483dce7eSHaojian Zhuang 	data &= 0xffff0000;
561*483dce7eSHaojian Zhuang 	data |= 0x184;
562*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
563*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
564*483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
565*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
566*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
567*483dce7eSHaojian Zhuang 	data &= ~0x10;
568*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
569*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
570*483dce7eSHaojian Zhuang 	data &= ~0x2000;
571*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
572*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
573*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
574*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
575*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
576*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
577*483dce7eSHaojian Zhuang 
578*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
579*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
580*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
581*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
582*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
583*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
584*483dce7eSHaojian Zhuang 
585*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb3290d08);
586*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x9621821);
587*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x45009023);
588*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145);
589*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
590*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x11080806);
591*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
592*483dce7eSHaojian Zhuang 	do {
593*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
594*483dce7eSHaojian Zhuang 	} while (data & 1);
595*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
596*483dce7eSHaojian Zhuang 	if (data & 8) {
597*483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
598*483dce7eSHaojian Zhuang 		return;
599*483dce7eSHaojian Zhuang 	}
600*483dce7eSHaojian Zhuang 
601*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
602*483dce7eSHaojian Zhuang 	data |= 1;
603*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
604*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
605*483dce7eSHaojian Zhuang 	do {
606*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
607*483dce7eSHaojian Zhuang 	} while (data & 1);
608*483dce7eSHaojian Zhuang 
609*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
610*483dce7eSHaojian Zhuang 	if (data & 0x8)
611*483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
612*483dce7eSHaojian Zhuang 	else
613*483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
614*483dce7eSHaojian Zhuang 
615*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
616*483dce7eSHaojian Zhuang 	data &= ~0xf;
617*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
618*483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 150mhz\n");
619*483dce7eSHaojian Zhuang }
620*483dce7eSHaojian Zhuang 
621*483dce7eSHaojian Zhuang void set_ddrc_266mhz(void)
622*483dce7eSHaojian Zhuang {
623*483dce7eSHaojian Zhuang 	unsigned int data;
624*483dce7eSHaojian Zhuang 
625*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x3);
626*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
627*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
628*483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
629*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
630*483dce7eSHaojian Zhuang 
631*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
632*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
633*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
634*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
635*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
636*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
637*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
638*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
639*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
640*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
641*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
642*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
643*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
644*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
645*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
646*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
647*483dce7eSHaojian Zhuang 
648*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
649*483dce7eSHaojian Zhuang 	data |= 4;
650*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
651*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
652*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
653*483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
654*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
655*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
656*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
657*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
658*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
659*483dce7eSHaojian Zhuang 	data &= 0xffffff00;
660*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
661*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x510d4455);
662*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0x8391ebb);
663*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x2005103c);
664*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x6329950b);
665*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x300858c);
666*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
667*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
668*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
669*483dce7eSHaojian Zhuang 	data &= 0xffff0000;
670*483dce7eSHaojian Zhuang 	data |= 0x184;
671*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
672*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
673*483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
674*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
675*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
676*483dce7eSHaojian Zhuang 	data &= ~0x10;
677*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
678*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
679*483dce7eSHaojian Zhuang 	data &= ~0x2000;
680*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
681*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
682*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
683*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
684*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
685*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
686*483dce7eSHaojian Zhuang 
687*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
688*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
689*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
690*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
691*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
692*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
693*483dce7eSHaojian Zhuang 
694*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb441d50d);
695*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0xf721839);
696*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x5500f03f);
697*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf486145);
698*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
699*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x12080d06);
700*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
701*483dce7eSHaojian Zhuang 	do {
702*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
703*483dce7eSHaojian Zhuang 	} while (data & 1);
704*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
705*483dce7eSHaojian Zhuang 	if (data & 8) {
706*483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
707*483dce7eSHaojian Zhuang 		return;
708*483dce7eSHaojian Zhuang 	}
709*483dce7eSHaojian Zhuang 
710*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
711*483dce7eSHaojian Zhuang 	data |= 1;
712*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
713*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
714*483dce7eSHaojian Zhuang 	do {
715*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
716*483dce7eSHaojian Zhuang 	} while (data & 1);
717*483dce7eSHaojian Zhuang 
718*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
719*483dce7eSHaojian Zhuang 	if (data & 0x8)
720*483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
721*483dce7eSHaojian Zhuang 	else
722*483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
723*483dce7eSHaojian Zhuang 
724*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
725*483dce7eSHaojian Zhuang 	data &= ~0xf;
726*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
727*483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 266mhz\n");
728*483dce7eSHaojian Zhuang }
729*483dce7eSHaojian Zhuang 
730*483dce7eSHaojian Zhuang void set_ddrc_400mhz(void)
731*483dce7eSHaojian Zhuang {
732*483dce7eSHaojian Zhuang 	unsigned int data;
733*483dce7eSHaojian Zhuang 
734*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x2);
735*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
736*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
737*483dce7eSHaojian Zhuang 	data &= 0xfffffcff;
738*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
739*483dce7eSHaojian Zhuang 
740*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x31);
741*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
742*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
743*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
744*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
745*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
746*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
747*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x720);
748*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
749*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x720);
750*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
751*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
752*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
753*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
754*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
755*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
756*483dce7eSHaojian Zhuang 
757*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
758*483dce7eSHaojian Zhuang 	data |= 4;
759*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
760*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
761*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
762*483dce7eSHaojian Zhuang 	data &= 0xfffffffe;
763*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
764*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
765*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
766*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
767*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
768*483dce7eSHaojian Zhuang 	data &= 0xffffff00;
769*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
770*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x75525655);
771*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xa552abb);
772*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20071059);
773*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x633e8591);
774*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008691);
775*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
776*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
777*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
778*483dce7eSHaojian Zhuang 	data &= 0xffff0000;
779*483dce7eSHaojian Zhuang 	data |= 0x184;
780*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
781*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
782*483dce7eSHaojian Zhuang 	data &= 0xbfffffff;
783*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
784*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
785*483dce7eSHaojian Zhuang 	data &= ~0x10;
786*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
787*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
788*483dce7eSHaojian Zhuang 	data &= ~0x2000;
789*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
790*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
791*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
792*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
793*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
794*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
795*483dce7eSHaojian Zhuang 
796*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
797*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
798*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
799*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
800*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
801*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
802*483dce7eSHaojian Zhuang 
803*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12);
804*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x17721855);
805*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x7501505f);
806*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245);
807*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
808*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13081306);
809*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
810*483dce7eSHaojian Zhuang 	do {
811*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
812*483dce7eSHaojian Zhuang 	} while (data & 1);
813*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
814*483dce7eSHaojian Zhuang 	if (data & 8) {
815*483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
816*483dce7eSHaojian Zhuang 		return;
817*483dce7eSHaojian Zhuang 	}
818*483dce7eSHaojian Zhuang 
819*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
820*483dce7eSHaojian Zhuang 	data |= 1;
821*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
822*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
823*483dce7eSHaojian Zhuang 	do {
824*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
825*483dce7eSHaojian Zhuang 	} while (data & 1);
826*483dce7eSHaojian Zhuang 
827*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
828*483dce7eSHaojian Zhuang 	if (data & 0x8)
829*483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
830*483dce7eSHaojian Zhuang 	else
831*483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
832*483dce7eSHaojian Zhuang 
833*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
834*483dce7eSHaojian Zhuang 	data &= ~0xf;
835*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
836*483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 400mhz\n");
837*483dce7eSHaojian Zhuang }
838*483dce7eSHaojian Zhuang 
839*483dce7eSHaojian Zhuang void set_ddrc_533mhz(void)
84032e9fc1aSHaojian Zhuang {
84132e9fc1aSHaojian Zhuang 	unsigned int data;
84232e9fc1aSHaojian Zhuang 
84332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x3);
84432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x11111);
84532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
84632e9fc1aSHaojian Zhuang 	data |= 0x100;
84732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
84832e9fc1aSHaojian Zhuang 
84932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x30);
85032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
85132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
85232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
853*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
85432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
85532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x6400000);
85632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x640);
85732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x640);
85832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x640);
85932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x640);
86032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x0);
86132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
86232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
86332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
86432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
86532e9fc1aSHaojian Zhuang 
86632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
86732e9fc1aSHaojian Zhuang 	data |= 4;
86832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
86932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
87032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
87132e9fc1aSHaojian Zhuang 	data &= 0xfffffffe;
87232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
87332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
87432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
87532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
87632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
87732e9fc1aSHaojian Zhuang 	data &= 0xffffff00;
87832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
87932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0x9dd87855);
88032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xa7138bb);
88132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x20091477);
88232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0x84534e16);
88332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008817);
88432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x106c3);
88532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
88632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
88732e9fc1aSHaojian Zhuang 	data &= 0xffff0000;
88832e9fc1aSHaojian Zhuang 	data |= 0x305;
88932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
89032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
89132e9fc1aSHaojian Zhuang 	data |= 0x40000000;
89232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
89332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
89432e9fc1aSHaojian Zhuang 	data &= ~0x10;
89532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
89632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
89732e9fc1aSHaojian Zhuang 	data &= ~0x2000;
89832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
89932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
90032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
90132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
90232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
90332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
90432e9fc1aSHaojian Zhuang 
90532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x0);
90632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
90732e9fc1aSHaojian Zhuang 	do {
90832e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
90932e9fc1aSHaojian Zhuang 	} while (data & 1);
91032e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
91132e9fc1aSHaojian Zhuang 	if (data & 0x7fe) {
91232e9fc1aSHaojian Zhuang 		NOTICE("failed to init lpddr3 rank0 dram phy\n");
91332e9fc1aSHaojian Zhuang 		return;
91432e9fc1aSHaojian Zhuang 	}
915*483dce7eSHaojian Zhuang 	cat_533mhz_800mhz();
916*483dce7eSHaojian Zhuang 
917*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
918*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
919*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
920*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
921*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
922*483dce7eSHaojian Zhuang 
923*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0xb77b6718);
924*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x1e82a071);
925*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x9501c07e);
926*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255);
927*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
928*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13181908);
929*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
930*483dce7eSHaojian Zhuang 	do {
931*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
932*483dce7eSHaojian Zhuang 	} while (data & 1);
933*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
934*483dce7eSHaojian Zhuang 	if (data & 0x7fe) {
935*483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
936*483dce7eSHaojian Zhuang 		return;
937*483dce7eSHaojian Zhuang 	}
938*483dce7eSHaojian Zhuang 	ddrx_rdet();
939*483dce7eSHaojian Zhuang 	ddrx_wdet();
940*483dce7eSHaojian Zhuang 
941*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
942*483dce7eSHaojian Zhuang 	data |= 1;
943*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
944*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
945*483dce7eSHaojian Zhuang 	do {
946*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
947*483dce7eSHaojian Zhuang 	} while (data & 1);
948*483dce7eSHaojian Zhuang 
949*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
950*483dce7eSHaojian Zhuang 	if (data & 0x7fe)
951*483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
952*483dce7eSHaojian Zhuang 	else
953*483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
954*483dce7eSHaojian Zhuang 
955*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
956*483dce7eSHaojian Zhuang 	data &= ~0xf;
957*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
958*483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 533mhz\n");
95932e9fc1aSHaojian Zhuang }
96032e9fc1aSHaojian Zhuang 
961*483dce7eSHaojian Zhuang void set_ddrc_800mhz(void)
96232e9fc1aSHaojian Zhuang {
96332e9fc1aSHaojian Zhuang 	unsigned int data;
96432e9fc1aSHaojian Zhuang 
96532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x580), 0x2);
96632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
96732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x104));
96832e9fc1aSHaojian Zhuang 	data &= 0xfffffcff;
96932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x104), data);
97032e9fc1aSHaojian Zhuang 
97132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x050), 0x30);
97232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
97332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
97432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
975*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
97632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x7);
97732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x090), 0x5400000);
97832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x258), 0x540);
97932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2d8), 0x540);
98032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x358), 0x540);
98132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3d8), 0x540);
98232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x018), 0x0);
98332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
98432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
98532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
98632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
98732e9fc1aSHaojian Zhuang 
98832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x078));
98932e9fc1aSHaojian Zhuang 	data |= 4;
99032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x078), data);
99132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
99232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
99332e9fc1aSHaojian Zhuang 	data &= 0xfffffffe;
99432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
99532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
99632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
99732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x014), 0x10);
99832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x1e4));
99932e9fc1aSHaojian Zhuang 	data &= 0xffffff00;
100032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), data);
100132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x030), 0xe663ab77);
100232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x034), 0xea952db);
100332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1);
100432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721);
100532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x040), 0x3008aa1);
100632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x064), 0x11a43);
100732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
100832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x070));
100932e9fc1aSHaojian Zhuang 	data &= 0xffff0000;
101032e9fc1aSHaojian Zhuang 	data |= 0x507;
101132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x070), data);
101232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
101332e9fc1aSHaojian Zhuang 	data |= 0x40000000;
101432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
101532e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x020));
101632e9fc1aSHaojian Zhuang 	data &= 0xffffffef;
101732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x020), data);
101832e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
101932e9fc1aSHaojian Zhuang 	data &= 0xffffdfff;
102032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
102132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x270), 0x3);
102232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
102332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x370), 0x3);
102432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
102532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
102632e9fc1aSHaojian Zhuang 
102732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x040), 0x2001);
102832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
102932e9fc1aSHaojian Zhuang 	do {
103032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
103132e9fc1aSHaojian Zhuang 	} while (data & 1);
103232e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
103332e9fc1aSHaojian Zhuang 	if (data & 0x7fe) {
103432e9fc1aSHaojian Zhuang 		WARN("failed to init lpddr3 rank0 dram phy\n");
103532e9fc1aSHaojian Zhuang 		return;
103632e9fc1aSHaojian Zhuang 	}
1037*483dce7eSHaojian Zhuang 	cat_533mhz_800mhz();
1038*483dce7eSHaojian Zhuang 
1039*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
1040*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x050), 0x100023);
1041*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x060), 0x133);
1042*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x064), 0x133);
1043*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
1044*483dce7eSHaojian Zhuang 
1045*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x100), 0x755a9d12);
1046*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x104), 0x1753b055);
1047*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x108), 0x7401505f);
1048*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x10c), 0x578ca244);
1049*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x110), 0x10700000);
1050*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x114), 0x13141306);
1051*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x118), 0x44);
1052*483dce7eSHaojian Zhuang 	do {
1053*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
1054*483dce7eSHaojian Zhuang 	} while (data & 1);
1055*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
1056*483dce7eSHaojian Zhuang 	if (data & 0x7fe) {
1057*483dce7eSHaojian Zhuang 		NOTICE("fail to init ddr3 rank0\n");
1058*483dce7eSHaojian Zhuang 		return;
1059*483dce7eSHaojian Zhuang 	}
1060*483dce7eSHaojian Zhuang 	ddrx_rdet();
1061*483dce7eSHaojian Zhuang 	ddrx_wdet();
1062*483dce7eSHaojian Zhuang 
1063*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
1064*483dce7eSHaojian Zhuang 	data |= 1;
1065*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
1066*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x004), 0x21);
1067*483dce7eSHaojian Zhuang 	do {
1068*483dce7eSHaojian Zhuang 		data = mmio_read_32((0xf712c000 + 0x004));
1069*483dce7eSHaojian Zhuang 	} while (data & 1);
1070*483dce7eSHaojian Zhuang 
1071*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x008));
1072*483dce7eSHaojian Zhuang 	if (data & 0x7fe)
1073*483dce7eSHaojian Zhuang 		NOTICE("ddr3 rank1 init failure\n");
1074*483dce7eSHaojian Zhuang 	else
1075*483dce7eSHaojian Zhuang 		INFO("ddr3 rank1 init pass\n");
1076*483dce7eSHaojian Zhuang 
1077*483dce7eSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x048));
1078*483dce7eSHaojian Zhuang 	data &= ~0xf;
1079*483dce7eSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x048), data);
1080*483dce7eSHaojian Zhuang 	INFO("succeed to set ddrc 800mhz\n");
108132e9fc1aSHaojian Zhuang }
108232e9fc1aSHaojian Zhuang 
1083*483dce7eSHaojian Zhuang static void ddrc_common_init(int freq)
108432e9fc1aSHaojian Zhuang {
108532e9fc1aSHaojian Zhuang 	unsigned int data;
108632e9fc1aSHaojian Zhuang 
108732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x020), 0x1);
108832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x100), 0x1700);
108932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x104), 0x71040004);
109032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121400 + 0x104), 0xf);
109132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121800 + 0x104), 0xf);
109232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7121c00 + 0x104), 0xf);
109332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7122000 + 0x104), 0xf);
109432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x02c), 0x6);
1095*483dce7eSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x020), 0x30003);
109632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x028), 0x310201);
109732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600);
109832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x01c), 0xaf001);
109932e9fc1aSHaojian Zhuang 
110032e9fc1aSHaojian Zhuang 
110132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x280));
110232e9fc1aSHaojian Zhuang 	data |= 1 << 7;
110332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x280), data);
110432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x244), 0x3);
110532e9fc1aSHaojian Zhuang 
1106*483dce7eSHaojian Zhuang 	if (freq == DDR_FREQ_800M)
1107*483dce7eSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024);
110832e9fc1aSHaojian Zhuang 	else
1109*483dce7eSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024);
111032e9fc1aSHaojian Zhuang 
111132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf712c000 + 0x080));
111232e9fc1aSHaojian Zhuang 	data &= 0xffff;
111332e9fc1aSHaojian Zhuang 	data |= 0x4002000;
111432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf712c000 + 0x080), data);
111532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x000), 0x0);
111632e9fc1aSHaojian Zhuang 	do {
111732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x294));
111832e9fc1aSHaojian Zhuang 	} while (data & 1);
111932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x000), 0x2);
112032e9fc1aSHaojian Zhuang }
112132e9fc1aSHaojian Zhuang 
112232e9fc1aSHaojian Zhuang 
112332e9fc1aSHaojian Zhuang static int dienum_det_and_rowcol_cfg(void)
112432e9fc1aSHaojian Zhuang {
112532e9fc1aSHaojian Zhuang 	unsigned int data;
112632e9fc1aSHaojian Zhuang 
112732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x87);
112832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
112932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
113032e9fc1aSHaojian Zhuang 	do {
113132e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
113232e9fc1aSHaojian Zhuang 	} while (data & 1);
113332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc;
113432e9fc1aSHaojian Zhuang 	switch (data) {
113532e9fc1aSHaojian Zhuang 	case 0x18:
113632e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x132);
113732e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x132);
113832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1600);
113932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
114032e9fc1aSHaojian Zhuang 		break;
114132e9fc1aSHaojian Zhuang 	case 0x1c:
114232e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x142);
114332e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x142);
114432e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
114532e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
114632e9fc1aSHaojian Zhuang 		break;
114732e9fc1aSHaojian Zhuang 	case 0x58:
114832e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x060), 0x133);
114932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7128000 + 0x064), 0x133);
115032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
115132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
115232e9fc1aSHaojian Zhuang 		break;
115332e9fc1aSHaojian Zhuang 	default:
115432e9fc1aSHaojian Zhuang 		break;
115532e9fc1aSHaojian Zhuang 	}
115632e9fc1aSHaojian Zhuang 	if (!data)
115732e9fc1aSHaojian Zhuang 		return -EINVAL;
115832e9fc1aSHaojian Zhuang 	return 0;
115932e9fc1aSHaojian Zhuang }
116032e9fc1aSHaojian Zhuang 
116132e9fc1aSHaojian Zhuang static int detect_ddr_chip_info(void)
116232e9fc1aSHaojian Zhuang {
116332e9fc1aSHaojian Zhuang 	unsigned int data, mr5, mr6, mr7;
116432e9fc1aSHaojian Zhuang 
116532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x57);
116632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
116732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
116832e9fc1aSHaojian Zhuang 
116932e9fc1aSHaojian Zhuang 	do {
117032e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
117132e9fc1aSHaojian Zhuang 	} while (data & 1);
117232e9fc1aSHaojian Zhuang 
117332e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
117432e9fc1aSHaojian Zhuang 	mr5 = data & 0xff;
117532e9fc1aSHaojian Zhuang 	switch (mr5) {
117632e9fc1aSHaojian Zhuang 	case 1:
117732e9fc1aSHaojian Zhuang 		INFO("Samsung DDR\n");
117832e9fc1aSHaojian Zhuang 		break;
117932e9fc1aSHaojian Zhuang 	case 6:
118032e9fc1aSHaojian Zhuang 		INFO("Hynix DDR\n");
118132e9fc1aSHaojian Zhuang 		break;
118232e9fc1aSHaojian Zhuang 	case 3:
118332e9fc1aSHaojian Zhuang 		INFO("Elpida DDR\n");
118432e9fc1aSHaojian Zhuang 		break;
118532e9fc1aSHaojian Zhuang 	default:
118632e9fc1aSHaojian Zhuang 		INFO("DDR from other vendors\n");
118732e9fc1aSHaojian Zhuang 		break;
118832e9fc1aSHaojian Zhuang 	}
118932e9fc1aSHaojian Zhuang 
119032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x67);
119132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
119232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
119332e9fc1aSHaojian Zhuang 	do {
119432e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
119532e9fc1aSHaojian Zhuang 	} while (data & 1);
119632e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
119732e9fc1aSHaojian Zhuang 	mr6 = data & 0xff;
119832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x210), 0x77);
119932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
120032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
120132e9fc1aSHaojian Zhuang 	do {
120232e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7128000 + 0x00c));
120332e9fc1aSHaojian Zhuang 	} while (data & 1);
120432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7128000 + 0x4a8));
120532e9fc1aSHaojian Zhuang 	mr7 = data & 0xff;
120632e9fc1aSHaojian Zhuang 	data = mr5 + (mr6 << 8) + (mr7 << 16);
120732e9fc1aSHaojian Zhuang 	return data;
120832e9fc1aSHaojian Zhuang }
120932e9fc1aSHaojian Zhuang 
1210*483dce7eSHaojian Zhuang void ddr_phy_reset(void)
1211*483dce7eSHaojian Zhuang {
1212*483dce7eSHaojian Zhuang 	mmio_write_32(0xf7030340, 0xa000);
1213*483dce7eSHaojian Zhuang 	mmio_write_32(0xf7030344, 0xa000);
1214*483dce7eSHaojian Zhuang }
1215*483dce7eSHaojian Zhuang 
121632e9fc1aSHaojian Zhuang int lpddr3_freq_init(int freq)
121732e9fc1aSHaojian Zhuang {
1218*483dce7eSHaojian Zhuang 	set_ddrc_150mhz();
1219*483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_150M) {
1220*483dce7eSHaojian Zhuang 		ddr_phy_reset();
1221*483dce7eSHaojian Zhuang 		set_ddrc_266mhz();
1222*483dce7eSHaojian Zhuang 	}
1223*483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_266M) {
1224*483dce7eSHaojian Zhuang 		ddr_phy_reset();
1225*483dce7eSHaojian Zhuang 		set_ddrc_400mhz();
1226*483dce7eSHaojian Zhuang 	}
1227*483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_400M) {
1228*483dce7eSHaojian Zhuang 		ddr_phy_reset();
122932e9fc1aSHaojian Zhuang 		set_ddrc_533mhz();
123032e9fc1aSHaojian Zhuang 	}
1231*483dce7eSHaojian Zhuang 	if (freq > DDR_FREQ_533M) {
1232*483dce7eSHaojian Zhuang 		ddr_phy_reset();
1233*483dce7eSHaojian Zhuang 		set_ddrc_800mhz();
123432e9fc1aSHaojian Zhuang 	}
123532e9fc1aSHaojian Zhuang 	return 0;
123632e9fc1aSHaojian Zhuang }
123732e9fc1aSHaojian Zhuang 
123832e9fc1aSHaojian Zhuang static void init_ddr(int freq)
123932e9fc1aSHaojian Zhuang {
124032e9fc1aSHaojian Zhuang 	unsigned int data;
124132e9fc1aSHaojian Zhuang 	int ret;
124232e9fc1aSHaojian Zhuang 
124332e9fc1aSHaojian Zhuang 
124432e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x030));
124532e9fc1aSHaojian Zhuang 	data |= 1;
124632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x030), data);
124732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7032000 + 0x010));
124832e9fc1aSHaojian Zhuang 	data |= 1;
124932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7032000 + 0x010), data);
125032e9fc1aSHaojian Zhuang 
1251*483dce7eSHaojian Zhuang 	udelay(300);
125232e9fc1aSHaojian Zhuang 	do {
125332e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x030));
125432e9fc1aSHaojian Zhuang 		data &= 3 << 28;
125532e9fc1aSHaojian Zhuang 	} while (data != (3 << 28));
125632e9fc1aSHaojian Zhuang 	do {
125732e9fc1aSHaojian Zhuang 		data = mmio_read_32((0xf7032000 + 0x010));
125832e9fc1aSHaojian Zhuang 		data &= 3 << 28;
125932e9fc1aSHaojian Zhuang 	} while (data != (3 << 28));
126032e9fc1aSHaojian Zhuang 
126132e9fc1aSHaojian Zhuang 	ret = lpddr3_freq_init(freq);
126232e9fc1aSHaojian Zhuang 	if (ret)
126332e9fc1aSHaojian Zhuang 		return;
126432e9fc1aSHaojian Zhuang }
126532e9fc1aSHaojian Zhuang 
126632e9fc1aSHaojian Zhuang static void init_ddrc_qos(void)
126732e9fc1aSHaojian Zhuang {
126832e9fc1aSHaojian Zhuang 	unsigned int port, data;
126932e9fc1aSHaojian Zhuang 
127032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x088), 1);
127132e9fc1aSHaojian Zhuang 
127232e9fc1aSHaojian Zhuang 	port = 0;
127332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
127432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111);
127532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111);
127632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007);
127732e9fc1aSHaojian Zhuang 
127832e9fc1aSHaojian Zhuang 	for (port = 3; port <= 4; port++) {
127932e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
128032e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777);
128132e9fc1aSHaojian Zhuang 		mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777);
128232e9fc1aSHaojian Zhuang 	}
128332e9fc1aSHaojian Zhuang 
128432e9fc1aSHaojian Zhuang 	port = 1;
128532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
128632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
128732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
128832e9fc1aSHaojian Zhuang 
128932e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x1f0), 0);
129032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
129132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
129232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x1f4), 0x01000100);
129332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402);
129432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31);
129532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x000), 0x7);
129632e9fc1aSHaojian Zhuang 
129732e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7124000 + 0x09c));
129832e9fc1aSHaojian Zhuang 	data &= ~0xff0000;
129932e9fc1aSHaojian Zhuang 	data |= 0x400000;
130032e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x09c), data);
130132e9fc1aSHaojian Zhuang 	data = mmio_read_32((0xf7124000 + 0x0ac));
130232e9fc1aSHaojian Zhuang 	data &= ~0xff0000;
130332e9fc1aSHaojian Zhuang 	data |= 0x400000;
130432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0ac), data);
130532e9fc1aSHaojian Zhuang 	port = 2;
130632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
130732e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
130832e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
130932e9fc1aSHaojian Zhuang 
131032e9fc1aSHaojian Zhuang 
131132e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x09c), 0xff7fff);
131232e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0a0), 0xff);
131332e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff);
131432e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0b0), 0xff);
131532e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
131632e9fc1aSHaojian Zhuang 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
131732e9fc1aSHaojian Zhuang }
131832e9fc1aSHaojian Zhuang 
1319*483dce7eSHaojian Zhuang void hikey_ddr_init(unsigned int ddr_freq)
132032e9fc1aSHaojian Zhuang {
132132e9fc1aSHaojian Zhuang 	uint32_t data;
132232e9fc1aSHaojian Zhuang 
1323*483dce7eSHaojian Zhuang 	assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) ||
1324*483dce7eSHaojian Zhuang 	       (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) ||
1325*483dce7eSHaojian Zhuang 	       (ddr_freq == DDR_FREQ_800M));
132632e9fc1aSHaojian Zhuang 	init_pll();
132732e9fc1aSHaojian Zhuang 	init_freq();
132832e9fc1aSHaojian Zhuang 
1329*483dce7eSHaojian Zhuang 	init_ddr(ddr_freq);
133032e9fc1aSHaojian Zhuang 
1331*483dce7eSHaojian Zhuang 	ddrc_common_init(ddr_freq);
133232e9fc1aSHaojian Zhuang 	dienum_det_and_rowcol_cfg();
133332e9fc1aSHaojian Zhuang 	detect_ddr_chip_info();
133432e9fc1aSHaojian Zhuang 
1335*483dce7eSHaojian Zhuang 	if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) {
133632e9fc1aSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x010);
133732e9fc1aSHaojian Zhuang 		data &= ~0x1;
133832e9fc1aSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x010, data);
1339*483dce7eSHaojian Zhuang 	} else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) {
1340*483dce7eSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x030);
1341*483dce7eSHaojian Zhuang 		data &= ~0x1;
1342*483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x030, data);
1343*483dce7eSHaojian Zhuang 	} else {
134432e9fc1aSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x010);
1345*483dce7eSHaojian Zhuang 		data &= ~0x1;
1346*483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x010, data);
1347*483dce7eSHaojian Zhuang 		data = mmio_read_32(0xf7032000 + 0x030);
1348*483dce7eSHaojian Zhuang 		data &= ~0x1;
1349*483dce7eSHaojian Zhuang 		mmio_write_32(0xf7032000 + 0x030, data);
1350*483dce7eSHaojian Zhuang 	}
1351*483dce7eSHaojian Zhuang 	dsb();
1352*483dce7eSHaojian Zhuang 	isb();
135332e9fc1aSHaojian Zhuang 
135432e9fc1aSHaojian Zhuang 	/*
135532e9fc1aSHaojian Zhuang 	 * Test memory access. Do not use address 0x0 because the compiler
135632e9fc1aSHaojian Zhuang 	 * may assume it is not a valid address and generate incorrect code
135732e9fc1aSHaojian Zhuang 	 * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance).
135832e9fc1aSHaojian Zhuang 	 */
135932e9fc1aSHaojian Zhuang 	mmio_write_32(0x4, 0xa5a55a5a);
136032e9fc1aSHaojian Zhuang 	INFO("ddr test value:0x%x\n", mmio_read_32(0x4));
136132e9fc1aSHaojian Zhuang 	init_ddrc_qos();
136232e9fc1aSHaojian Zhuang }
1363