]>
Commit | Line | Data |
---|---|---|
b614e16c | 1 | /* |
f6e7f07c | 2 | * Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com> |
b614e16c MY |
3 | * |
4 | * SPDX-License-Identifier: GPL-2.0+ | |
5 | */ | |
6 | ||
6257a0b0 MY |
7 | #include <common.h> |
8 | #include <linux/err.h> | |
b614e16c | 9 | #include <linux/types.h> |
f6e7f07c | 10 | #include <linux/io.h> |
107b3fb4 MY |
11 | |
12 | #include "ddrphy-regs.h" | |
b614e16c | 13 | |
6257a0b0 MY |
14 | enum dram_freq { |
15 | DRAM_FREQ_1333M, | |
16 | DRAM_FREQ_1600M, | |
17 | DRAM_FREQ_NR, | |
18 | }; | |
19 | ||
20 | static u32 ddrphy_ptr0[DRAM_FREQ_NR] = {0x0a806844, 0x0c807d04}; | |
21 | static u32 ddrphy_ptr1[DRAM_FREQ_NR] = {0x208e0124, 0x2710015E}; | |
22 | static u32 ddrphy_ptr3[DRAM_FREQ_NR] = {0x0f051616, 0x12061A80}; | |
23 | static u32 ddrphy_ptr4[DRAM_FREQ_NR] = {0x06ae08d6, 0x08027100}; | |
24 | static u32 ddrphy_dtpr0[DRAM_FREQ_NR] = {0x85589955, 0x999cbb66}; | |
25 | static u32 ddrphy_dtpr1[DRAM_FREQ_NR] = {0x1a8363c0, 0x1a878400}; | |
26 | static u32 ddrphy_dtpr2[DRAM_FREQ_NR] = {0x5002c200, 0xa00214f8}; | |
27 | static u32 ddrphy_mr0[DRAM_FREQ_NR] = {0x00000b51, 0x00000d71}; | |
28 | static u32 ddrphy_mr2[DRAM_FREQ_NR] = {0x00000290, 0x00000298}; | |
29 | ||
78876704 | 30 | int ph1_ld4_ddrphy_init(struct ddrphy __iomem *phy, int freq, bool ddr3plus) |
b614e16c | 31 | { |
6257a0b0 | 32 | enum dram_freq freq_e; |
b614e16c MY |
33 | u32 tmp; |
34 | ||
6257a0b0 MY |
35 | switch (freq) { |
36 | case 1333: | |
37 | freq_e = DRAM_FREQ_1333M; | |
38 | break; | |
39 | case 1600: | |
40 | freq_e = DRAM_FREQ_1600M; | |
41 | break; | |
42 | default: | |
43 | printf("unsupported DRAM frequency %d MHz\n", freq); | |
44 | return -EINVAL; | |
b614e16c | 45 | } |
6257a0b0 MY |
46 | |
47 | writel(0x0300c473, &phy->pgcr[1]); | |
48 | writel(ddrphy_ptr0[freq_e], &phy->ptr[0]); | |
49 | writel(ddrphy_ptr1[freq_e], &phy->ptr[1]); | |
b614e16c | 50 | writel(0x00083DEF, &phy->ptr[2]); |
6257a0b0 MY |
51 | writel(ddrphy_ptr3[freq_e], &phy->ptr[3]); |
52 | writel(ddrphy_ptr4[freq_e], &phy->ptr[4]); | |
b614e16c MY |
53 | writel(0xF004001A, &phy->dsgcr); |
54 | ||
55 | /* change the value of the on-die pull-up/pull-down registors */ | |
56 | tmp = readl(&phy->dxccr); | |
57 | tmp &= ~0x0ee0; | |
58 | tmp |= DXCCR_DQSNRES_688_OHM | DXCCR_DQSRES_688_OHM; | |
59 | writel(tmp, &phy->dxccr); | |
60 | ||
61 | writel(0x0000040B, &phy->dcr); | |
6257a0b0 MY |
62 | writel(ddrphy_dtpr0[freq_e], &phy->dtpr[0]); |
63 | writel(ddrphy_dtpr1[freq_e], &phy->dtpr[1]); | |
64 | writel(ddrphy_dtpr2[freq_e], &phy->dtpr[2]); | |
65 | writel(ddrphy_mr0[freq_e], &phy->mr0); | |
b614e16c | 66 | writel(0x00000006, &phy->mr1); |
6257a0b0 | 67 | writel(ddrphy_mr2[freq_e], &phy->mr2); |
4021b438 | 68 | writel(ddr3plus ? 0x00000800 : 0x00000000, &phy->mr3); |
b614e16c MY |
69 | |
70 | while (!(readl(&phy->pgsr[0]) & PGSR0_IDONE)) | |
71 | ; | |
72 | ||
73 | writel(0x0300C473, &phy->pgcr[1]); | |
74 | writel(0x0000005D, &phy->zq[0].cr[1]); | |
323d1f9d MY |
75 | |
76 | return 0; | |
b614e16c | 77 | } |