]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/karo/tx53/lowlevel_init.S
merged tx6dl-devel into denx master branch
[karo-tx-uboot.git] / board / karo / tx53 / lowlevel_init.S
1 #include <config.h>
2 #include <configs/tx53.h>
3 #include <asm/arch/imx-regs.h>
4
5 #define DEBUG_LED_BIT           20
6 #define LED_GPIO_BASE           GPIO2_BASE_ADDR
7 #define LED_MUX_OFFSET          0x174
8 #define LED_MUX_MODE            0x11
9
10 #define SDRAM_CLK               CONFIG_SYS_SDRAM_CLK
11
12 #ifdef PHYS_SDRAM_2_SIZE
13 #define SDRAM_SIZE              (PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE)
14 #else
15 #define SDRAM_SIZE              PHYS_SDRAM_1_SIZE
16 #endif
17
18 #define REG_CCOSR               0x60
19
20 #define REG_CCGR0               0x68
21 #define REG_CCGR1               0x6c
22 #define REG_CCGR2               0x70
23 #define REG_CCGR3               0x74
24 #define REG_CCGR4               0x78
25 #define REG_CCGR5               0x7c
26 #define REG_CCGR6               0x80
27 #define REG_CCGR7               0x84
28 #define REG_CMEOR               0x88
29
30 #define CPU_2_BE_32(l)                  \
31         ((((l) << 24) & 0xFF000000) |   \
32         (((l) << 8) & 0x00FF0000) |     \
33         (((l) >> 8) & 0x0000FF00) |     \
34         (((l) >> 24) & 0x000000FF))
35
36 /*
37 CCM register set                 0x53FD4000 0x53FD7FFF
38 EIM register set                 0x63FDA000 0x63FDAFFF
39 NANDFC register set              0xF7FF0000 0xF7FFFFFF
40 IOMUX Control (IOMUXC) registers 0x53FA8000 0x53FABFFF
41 DPLLC1 register                  0x63F80000 0x63F83FFF
42 DPLLC2 register                  0x63F84000 0x63F87FFF
43 DPLLC3 register                  0x63F88000 0x63F8BFFF
44 DPLLC4 register                  0x63F8C000 0x63F8FFFF
45 ESD RAM controller register      0x63FD9000 0x63FD9FFF
46 M4IF register                    0x63FD8000 0x63FD8FFF
47 DDR                              0x70000000 0xEFFFFFFF
48 EIM                              0xF0000000 0xF7FEFFFF
49 NANDFC Buffers                   0xF7FF0000 0xF7FFFFFF
50 IRAM Free Space                  0xF8006000 0xF8017FF0
51 GPU Memory                       0xF8020000 0xF805FFFF
52 */
53 #define CHECK_DCD_ADDR(a)       (                                       \
54         ((a) >= 0x53fd4000 && (a) <= 0x53fd7fff) /* CCM */ ||           \
55         ((a) >= 0x63fda000 && (a) <= 0x63fdafff) /* EIM (CS0) */ ||     \
56         ((a) >= 0x53fa8000 && (a) <= 0x53fabfff) /* IOMUXC */ ||        \
57         ((a) >= 0x63f80000 && (a) <= 0x63f8ffff) /* DPLLC1..4 */ ||             \
58         ((a) >= 0x63fd8000 && (a) <= 0x63fd9fff) /* M4IF & SDRAM Contr. */ || \
59         ((a) >= 0x70000000 && (a) <= 0xefffffff) /* SDRAM */ ||         \
60         ((a) >= 0xf0000000 && (a) <= 0xf7ffffff) /* EIM & NANDFC buffers */ || \
61         ((a) >= 0xf8006000 && (a) <= 0xf8017ff0) /* IRAM free space */ || \
62         ((a) >= 0xf8020000 && (a) <= 0xf805ffff) /* GPU RAM */)
63
64         .macro  mxc_dcd_item    addr, val
65         .ifne   CHECK_DCD_ADDR(\addr)
66         .word   CPU_2_BE_32(\addr), CPU_2_BE_32(\val)
67         .else
68         .error  "Address \addr not accessible from DCD"
69         .endif
70         .endm
71
72 #define MXC_DCD_ITEM(addr, val)         mxc_dcd_item    addr, val
73
74 #define MXC_DCD_CMD_SZ_BYTE             1
75 #define MXC_DCD_CMD_SZ_SHORT            2
76 #define MXC_DCD_CMD_SZ_WORD             4
77 #define MXC_DCD_CMD_FLAG_WRITE          0x0
78 #define MXC_DCD_CMD_FLAG_CLR            0x1
79 #define MXC_DCD_CMD_FLAG_SET            0x3
80 #define MXC_DCD_CMD_FLAG_CHK_ANY        (1 << 0)
81 #define MXC_DCD_CMD_FLAG_CHK_SET        (1 << 1)
82 #define MXC_DCD_CMD_FLAG_CHK_CLR        (0 << 1)
83
84 #define MXC_DCD_CMD_WRT(type, flags, next)                                      \
85         .word   CPU_2_BE_32((0xcc << 24) | (((next) - .) << 8) | ((flags) << 3) | (type))
86
87 #define MXC_DCD_CMD_CHK(type, flags, addr, mask)                                \
88         .word   CPU_2_BE_32((0xcf << 24) | (12 << 8) | ((flags) << 3) | (type)),\
89                 CPU_2_BE_32(addr), CPU_2_BE_32(mask)
90
91 #define MXC_DCD_CMD_CHK_CNT(type, flags, addr, mask, count)                     \
92         .word   CPU_2_BE_32((0xcf << 24) | (16 << 8) | ((flags) << 3) | (type)),\
93                 CPU_2_BE_32(addr), CPU_2_BE_32(mask), CPU_2_BE_32(count)
94
95 #define MXC_DCD_CMD_NOP()                                                       \
96         .word   CPU_2_BE_32((0xc0 << 24) | (4 << 8))
97
98 #define CK_TO_NS(ck)    (((ck) * 1000 + SDRAM_CLK / 2) / SDRAM_CLK)
99 #define NS_TO_CK(ns)    (((ns) * SDRAM_CLK + 999) / 1000)
100 #define NS_TO_CK10(ns)  DIV_ROUND_UP(NS_TO_CK(ns), 10)
101
102         .macro          CK_VAL, name, clks, offs, max
103         .iflt           \clks - \offs
104         .set            \name, 0
105         .else
106         .ifle           \clks - \offs - \max
107         .set            \name, \clks - \offs
108         .else
109         .error          "Value \clks out of range for parameter \name"
110         .endif
111         .endif
112         .endm
113
114         .macro          NS_VAL, name, ns, offs, max
115         .iflt           \ns - \offs
116         .set            \name, 0
117         .else
118         CK_VAL          \name, NS_TO_CK(\ns), \offs, \max
119         .endif
120         .endm
121
122         .macro          CK_MAX, name, ck1, ck2, offs, max
123         .ifgt           \ck1 - \ck2
124         CK_VAL          \name, \ck1, \offs, \max
125         .else
126         CK_VAL          \name, \ck2, \offs, \max
127         .endif
128         .endm
129
130 #define ESDMISC_DDR_TYPE_DDR3           0
131 #define ESDMISC_DDR_TYPE_LPDDR2         1
132 #define ESDMISC_DDR_TYPE_DDR2           2
133
134 #define DIV_ROUND_UP(m,d)               (((m) + (d) - 1) / (d))
135
136 #define CKIL_FREQ_Hz                    32768
137 #define ESDOR_CLK_PERIOD_ns             (1000000000 / CKIL_FREQ_Hz / 2) /* base clock for ESDOR values */
138
139 /* DDR3 SDRAM */
140 #if SDRAM_SIZE > PHYS_SDRAM_1_SIZE
141 #define BANK_ADDR_BITS                  2
142 #else
143 #define BANK_ADDR_BITS                  1
144 #endif
145 #define SDRAM_BURST_LENGTH              8
146 #define RALAT                           5
147 #define WALAT                           0
148 #define BI_ON                           0
149 #define ADDR_MIRROR                     0
150 #define DDR_TYPE                        ESDMISC_DDR_TYPE_DDR3
151
152 /* 512/1024MiB SDRAM: NT5CB128M16FP-DII */
153 #if SDRAM_CLK > 666 && SDRAM_CLK <= 800
154 #define CL_VAL  11
155 #define CWL_VAL 8
156 #elif SDRAM_CLK > 533 && SDRAM_CLK <= 666
157 #define CL_VAL  9 // or 10
158 #define CWL_VAL 7
159 #elif SDRAM_CLK > 400 && SDRAM_CLK <= 533
160 #define CL_VAL  7 // or 8
161 #define CWL_VAL 6
162 #elif SDRAM_CLK > 333 && SDRAM_CLK <= 400
163 #define CL_VAL  6
164 #define CWL_VAL 5
165 #elif SDRAM_CLK >= 303 && SDRAM_CLK <= 333
166 #define CL_VAL  5
167 #define CWL_VAL 5
168 #else
169 #error SDRAM clock out of range: 303 .. 800
170 #endif
171
172 /* ESDCFG0 0x0c */
173 NS_VAL  tRFC,   160, 1, 255             /* clks - 1 (0..255) */
174 CK_MAX  tXS,    NS_TO_CK(CK_TO_NS(tRFC + 1) + 10), 5, 1, 255 /* clks - 1 (0..255) tRFC + 10 */
175 CK_MAX  tXP,    NS_TO_CK10(75), 3, 1, 7 /* clks - 1 (0..7) */ /* max(3tCK, 7.5ns) */
176 CK_MAX  tXPDLL, NS_TO_CK(24), 2, 1, 15  /* clks - 1 (0..15) */
177 NS_VAL  tFAW,   50, 1, 31               /* clks - 1 (0..31) */
178 CK_VAL  tCL,    CL_VAL, 3, 8            /* clks - 3 (0..8) CAS Latency */
179
180 /* ESDCFG1 0x10 */
181 CK_VAL  tRCD,   NS_TO_CK10(125), 1, 7   /* clks - 1 (0..7) */ /* 12.5 */
182 CK_VAL  tRP,    NS_TO_CK10(125), 1, 7   /* clks - 1 (0..7) */ /* 12.5 */
183 NS_VAL  tRC,    50, 1, 31               /* clks - 1 (0..31) */
184 CK_VAL  tRAS,   NS_TO_CK10(375), 1, 31  /* clks - 1 (0..31) */ /* 37.5 */
185 CK_VAL  tRPA,   1, 0, 1                 /* clks     (0..1) */
186 NS_VAL  tWR,    15, 1, 15               /* clks - 1 (0..15) */
187 CK_VAL  tMRD,   4, 1, 15                /* clks - 1 (0..15) */
188 CK_VAL  tCWL,   CWL_VAL, 2, 6           /* clks - 2 (0..6) */
189
190 /* ESDCFG2 0x14 */
191 CK_VAL  tDLLK,  512, 1, 511             /* clks - 1 (0..511) */
192 CK_MAX  tRTP,   NS_TO_CK10(75), 4, 1, 7 /* clks - 1 (0..7) */ /* max(4tCK, 7.5ns) */
193 CK_MAX  tWTR,   NS_TO_CK10(75), 4, 1, 7 /* clks - 1 (0..7) */ /* max(4tCK, 7.5ns) */
194 CK_MAX  tRRD,   NS_TO_CK(10), 4, 1, 7   /* clks - 1 (0..7) */
195
196 /* ESDOR 0x30 */
197 CK_MAX  tXPR,   NS_TO_CK(CK_TO_NS(tRFC + 1) + 10), 5, 1, 255 /* clks - 1 (0..255) max(tRFC + 10, 5CK) */
198 #define tSDE_RST                        (DIV_ROUND_UP(200000, ESDOR_CLK_PERIOD_ns) + 1)
199                                         /* Add an extra (or two?) ESDOR_CLK_PERIOD_ns according to
200                                          * erroneous Erratum Engcm12377
201                                          */
202 #define tRST_CKE                        (DIV_ROUND_UP(500000 + 2 * ESDOR_CLK_PERIOD_ns, ESDOR_CLK_PERIOD_ns) + 1)
203
204
205 /* ESDOTC 0x08 */
206 CK_VAL  tAOFPD, NS_TO_CK10(85), 1, 7    /* clks - 1 (0..7) */ /* 8.5ns */
207 CK_VAL  tAONPD, NS_TO_CK10(85), 1, 7    /* clks - 1 (0..7) */ /* 8.5ns */
208 CK_VAL  tANPD,  tCWL + 1, 1, 15         /* clks - 1 (0..15) */
209 CK_VAL  tAXPD,  tCWL + 1, 1, 15         /* clks - 1 (0..15) */
210 CK_VAL  tODTLon tCWL, 0, 7              /* clks - 1 (0..7) */ /* CWL+AL-2 */
211 CK_VAL  tODTLoff tCWL, 0, 31            /* clks - 1 (0..31) */ /* CWL+AL-2 */
212
213 /* ESDPDC 0x04 */
214 CK_MAX  tCKE,   NS_TO_CK(5), 3, 1, 7
215 CK_MAX  tCKSRX, NS_TO_CK(10), 5, 0, 7
216 CK_MAX  tCKSRE, NS_TO_CK(10), 5, 0, 7
217
218 #define PRCT            0
219 #define PWDT            5
220 #define SLOW_PD         0
221 #define BOTH_CS_PD      1
222
223 #define ESDPDC_VAL_0    (       \
224         (PRCT << 28) |          \
225         (PRCT << 24) |          \
226         (tCKE << 16) |          \
227         (SLOW_PD << 7) |        \
228         (BOTH_CS_PD << 6) |     \
229         (tCKSRX << 3) |         \
230         (tCKSRE << 0)           \
231         )
232
233 #define ESDPDC_VAL_1    (ESDPDC_VAL_0 |         \
234         (PWDT << 12) |                          \
235         (PWDT << 8)                             \
236         )
237
238 #define ROW_ADDR_BITS                   14
239 #define COL_ADDR_BITS                   10
240
241 #define Rtt_Nom                         1 /* ODT: 0: off 1: RZQ/4 2: RZQ/2 3: RZQ/6 4: RZQ/12 5: RZQ/8 */
242 #define Rtt_WR                          0 /* Dynamic ODT: 0: off 1: RZQ/4 2: RZQ/2 */
243 #define DLL_DISABLE                     0
244
245         .iflt   tWR - 7
246         .set    mr0_val, (((1 - DLL_DISABLE) << 8) /* DLL Reset */ |    \
247                         (SLOW_PD << 12) /* PD exit: 0: fast 1: slow */ |\
248                         ((tWR + 1 - 4) << 9) |                          \
249                         ((((tCL + 3) - 4) & 0x7) << 4) |                \
250                         ((((tCL + 3) - 4) & 0x8) >> 1))
251         .else
252         .set    mr0_val, ((1 << 8) /* DLL Reset */ |                    \
253                         (SLOW_PD << 12) /* PD exit: 0: fast 1: slow */ |\
254                         (((tWR + 1) / 2) << 9) |        \
255                         ((((tCL + 3) - 4) & 0x7) << 4) | \
256                         ((((tCL + 3) - 4) & 0x8) >> 1))
257         .endif
258
259 #define mr1_val                         (                                       \
260                                          ((Rtt_Nom & 1) << 2) |                 \
261                                          (((Rtt_Nom >> 1) & 1) << 6) |          \
262                                          (((Rtt_Nom >> 2) & 1) << 9) |          \
263                                          (DLL_DISABLE << 0) |                   \
264                                         0)
265 #define mr2_val                         (                                       \
266                                          (Rtt_WR << 9) /* dynamic ODT */ |      \
267                                          (0 << 7) /* SRT: Ext. temp. (mutually exclusive with ASR!) */ | \
268                                          (1 << 6) | /* ASR: Automatic Self Refresh */ \
269                                          (((tCWL + 2) - 5) << 3) |              \
270                                         0)
271 #define mr3_val                         0
272
273 #define ESDSCR_MRS_VAL(cs, mr, val)     (((val) << 16) |                \
274                                         (1 << 15) /* CON_REQ */ |       \
275                                         0x80 |                          \
276                                         (3 << 4) /* MRS command */ |    \
277                                         ((cs) << 3) |                   \
278                                         ((mr) << 0) |                   \
279                                         0)
280
281 #define ESDCFG0_VAL     (       \
282         (tRFC << 24) |          \
283         (tXS << 16) |           \
284         (tXP << 13) |           \
285         (tXPDLL << 9) |         \
286         (tFAW << 4) |           \
287         (tCL << 0))             \
288
289 #define ESDCFG1_VAL     (       \
290         (tRCD << 29) |          \
291         (tRP << 26) |           \
292         (tRC << 21) |           \
293         (tRAS << 16) |          \
294         (tRPA << 15) |          \
295         (tWR << 9) |            \
296         (tMRD << 5) |           \
297         (tCWL << 0))            \
298
299 #define ESDCFG2_VAL     (       \
300         (tDLLK << 16) |         \
301         (tRTP << 6) |           \
302         (tWTR << 3) |           \
303         (tRRD << 0))
304
305 #define BURST_LEN               (SDRAM_BURST_LENGTH / 8) /* 0: 4 byte 1: 8 byte */
306
307 #define ESDCTL_VAL              (((ROW_ADDR_BITS - 11) << 24) |         \
308                                 ((COL_ADDR_BITS - 9) << 20) |           \
309                                 (BURST_LEN << 19) |                     \
310                                 (1 << 16) | /* SDRAM bus width */       \
311                                 ((-1) << (32 - BANK_ADDR_BITS)))
312
313 #define ESDMISC_VAL             ((ADDR_MIRROR << 19) |  \
314                                 (WALAT << 16) |         \
315                                 (BI_ON << 12) |         \
316                                 (0x3 << 9) |            \
317                                 (RALAT << 6) |          \
318                                 (DDR_TYPE << 3))
319
320 #define ESDOR_VAL               ((tXPR << 16) | (tSDE_RST << 8) | (tRST_CKE << 0))
321
322 #define ESDOTC_VAL              ((tAOFPD << 27) |       \
323                                 (tAONPD << 24) |        \
324                                 (tANPD << 20) |         \
325                                 (tAXPD << 16) |         \
326                                 (tODTLon << 12) |       \
327                                 (tODTLoff << 4))
328
329 fcb_start:
330         b       _start
331         .word   0x20424346      /* "FCB " marker */
332         .word   0x01    /* FCB version number */
333         .org    0x68
334         .word   0x0     /* primary image starting page number */
335         .word   0x0     /* secondary image starting page number */
336         .word   0x6b
337         .word   0x6b
338         .word   0x0     /* DBBT start page (0 == NO DBBT) */
339         .word   0       /* Bad block marker offset in main area (unused) */
340         .org    0xac
341         .word   0       /* BI Swap disabled */
342         .word   0       /* Bad Block marker offset in spare area */
343 fcb_end:
344
345         .org    0x400
346 ivt_header:
347         .word   CPU_2_BE_32((0xd1 << 24) | (32 << 8) | 0x40)
348 app_start_addr:
349         .long   _start
350         .long   0x0
351 dcd_ptr:
352         .long   dcd_hdr
353 boot_data_ptr:
354         .word   boot_data
355 self_ptr:
356         .word   ivt_header
357 app_code_csf:
358         .word   0x0
359         .word   0x0
360 boot_data:
361         .long   fcb_start
362 image_len:
363         .long   CONFIG_U_BOOT_IMG_SIZE
364 plugin:
365         .word   0
366 ivt_end:
367 #define DCD_VERSION     0x40
368
369 dcd_hdr:
370         .word   CPU_2_BE_32((0xd2 << 24) | ((dcd_end - .) << 8) | DCD_VERSION)
371 dcd_start:
372         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, zq_calib)
373
374         MXC_DCD_ITEM(0x53fa8004, 0x00194005)    @ set LDO to 1.3V
375
376         /* disable all irrelevant clocks */
377         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR0, 0xffcf0fff)
378         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR1, 0x000fffc3)
379         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR2, 0x033c0000)
380         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR3, 0x000000ff)
381         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR4, 0x00000000)
382         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR5, 0x00fff033)
383         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR6, 0x0f00030f)
384         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR7, 0xfff00000)
385         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CMEOR, 0x00000000)
386 #if 1
387         MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCOSR, (1 << 24) | (0xe << 16))
388         MXC_DCD_ITEM(IOMUXC_BASE_ADDR + 0x320, 0x4)     /* GPIO_3 => CLKO2 */
389 #endif
390         MXC_DCD_ITEM(IOMUXC_BASE_ADDR + 0x340, 0x11)    /* GPIO_17 => RESET_OUT */
391
392         MXC_DCD_ITEM(0x63fd800c, 0x00000000)    /* M4IF: MUX NFC signals on WEIM */
393 #if SDRAM_CLK > 333
394         MXC_DCD_ITEM(0x53fd4014, 0x00888944)    /* CBCDR */
395 #else
396         MXC_DCD_ITEM(0x53fd4014, 0x00888644)    /* CBCDR */
397 #endif
398         MXC_DCD_ITEM(0x53fd4018, 0x00016154)    /* CBCMR */
399
400         MXC_DCD_ITEM(0x53fd401c, 0xa6a2a020)    /* CSCMR1 */
401         MXC_DCD_ITEM(0x53fd4020, 0xb6b12f0a)    /* CSCMR2 */
402         MXC_DCD_ITEM(0x53fd4024, 0x00080b18)    /* CSCDR1 */
403
404 #define DDR_SEL_VAL     2
405 #define DSE_VAL         5
406 #define ODT_VAL         2
407
408 #define DDR_SEL_SHIFT   25
409 #define ODT_SHIFT       22
410 #define DSE_SHIFT       19
411 #define DDR_INPUT_SHIFT 9
412 #define HYS_SHIFT       8
413 #define PKE_SHIFT       7
414 #define PUE_SHIFT       6
415 #define PUS_SHIFT       4
416
417 #define DDR_SEL_MASK    (DDR_SEL_VAL << DDR_SEL_SHIFT)
418 #define DSE_MASK        (DSE_VAL << DSE_SHIFT)
419 #define ODT_MASK        (ODT_VAL << ODT_SHIFT)
420
421 #define DQM_VAL         DSE_MASK
422 #define SDQS_VAL        (ODT_MASK | DSE_MASK | (1 << PUE_SHIFT))
423 #define SDODT_VAL       (DSE_MASK | (0 << PKE_SHIFT) | (1 << PUE_SHIFT) | (0 << PUS_SHIFT))
424 #define SDCLK_VAL       DSE_MASK
425 #define SDCKE_VAL       ((1 << PKE_SHIFT) | (1 << PUE_SHIFT) | (0 << PUS_SHIFT))
426
427         MXC_DCD_ITEM(0x53fa8724, DDR_SEL_MASK) /* DDR_TYPE: DDR3 */
428         MXC_DCD_ITEM(0x53fa86f4, 0 << DDR_INPUT_SHIFT) /* DDRMODE_CTL */
429         MXC_DCD_ITEM(0x53fa8714, 0 << DDR_INPUT_SHIFT) /* GRP_DDRMODE */
430         MXC_DCD_ITEM(0x53fa86fc, 1 << PKE_SHIFT) /* GRP_DDRPKE */
431         MXC_DCD_ITEM(0x53fa8710, 0 << HYS_SHIFT) /* GRP_DDRHYS */
432         MXC_DCD_ITEM(0x53fa8708, 1 << PUE_SHIFT) /* GRP_DDRPK */
433
434         MXC_DCD_ITEM(0x53fa8584, DQM_VAL) /* DQM0 */
435         MXC_DCD_ITEM(0x53fa8594, DQM_VAL) /* DQM1 */
436         MXC_DCD_ITEM(0x53fa8560, DQM_VAL) /* DQM2 */
437         MXC_DCD_ITEM(0x53fa8554, DQM_VAL) /* DQM3 */
438
439         MXC_DCD_ITEM(0x53fa857c, SDQS_VAL) /* SDQS0 */
440         MXC_DCD_ITEM(0x53fa8590, SDQS_VAL) /* SDQS1 */
441         MXC_DCD_ITEM(0x53fa8568, SDQS_VAL) /* SDQS2 */
442         MXC_DCD_ITEM(0x53fa8558, SDQS_VAL) /* SDQS3 */
443
444         MXC_DCD_ITEM(0x53fa8580, SDODT_VAL) /* SDODT0 */
445         MXC_DCD_ITEM(0x53fa8578, SDCLK_VAL) /* SDCLK0 */
446
447         MXC_DCD_ITEM(0x53fa8564, SDODT_VAL) /* SDODT1 */
448         MXC_DCD_ITEM(0x53fa8570, SDCLK_VAL) /* SDCLK1 */
449
450         MXC_DCD_ITEM(0x53fa858c, SDCKE_VAL) /* SDCKE0 */
451         MXC_DCD_ITEM(0x53fa855c, SDCKE_VAL) /* SDCKE1 */
452
453         MXC_DCD_ITEM(0x53fa8574, DSE_MASK) /* DRAM_CAS */
454         MXC_DCD_ITEM(0x53fa8588, DSE_MASK) /* DRAM_RAS */
455
456         MXC_DCD_ITEM(0x53fa86f0, DSE_MASK) /* GRP_ADDDS */
457         MXC_DCD_ITEM(0x53fa8720, DSE_MASK) /* GRP_CTLDS */
458         MXC_DCD_ITEM(0x53fa8718, DSE_MASK) /* GRP_B0DS */
459         MXC_DCD_ITEM(0x53fa871c, DSE_MASK) /* GRP_B1DS */
460         MXC_DCD_ITEM(0x53fa8728, DSE_MASK) /* GRP_B2DS */
461         MXC_DCD_ITEM(0x53fa872c, DSE_MASK) /* GRP_B3DS */
462
463         /* calibration defaults */
464         MXC_DCD_ITEM(0x63fd904c, 0x001f001f)
465         MXC_DCD_ITEM(0x63fd9050, 0x001f001f)
466         MXC_DCD_ITEM(0x63fd907c, 0x011e011e)
467         MXC_DCD_ITEM(0x63fd9080, 0x011f0120)
468         MXC_DCD_ITEM(0x63fd9088, 0x3a393d3b)
469         MXC_DCD_ITEM(0x63fd9090, 0x3f3f3f3f)
470
471         MXC_DCD_ITEM(0x63fd9018, ESDMISC_VAL)
472         MXC_DCD_ITEM(0x63fd9000, ESDCTL_VAL)
473         MXC_DCD_ITEM(0x63fd900c, ESDCFG0_VAL)
474         MXC_DCD_ITEM(0x63fd9010, ESDCFG1_VAL)
475         MXC_DCD_ITEM(0x63fd9014, ESDCFG2_VAL)
476
477         MXC_DCD_ITEM(0x63fd902c, 0x000026d2)
478         MXC_DCD_ITEM(0x63fd9030, ESDOR_VAL)
479         MXC_DCD_ITEM(0x63fd9008, ESDOTC_VAL)
480         MXC_DCD_ITEM(0x63fd9004, ESDPDC_VAL_0)
481
482         /* MR0..3 - CS0 */
483         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 2, mr2_val)) /* MRS: MR2 */
484         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, mr3_val)) /* MRS: MR3 */
485         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 1, mr1_val)) /* MRS: MR1 */
486         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 0, mr0_val)) /* MRS: MR0 */
487 #if BANK_ADDR_BITS > 1
488         /* MR0..3 - CS1 */
489         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(1, 2, 0x0000)) /* MRS: MR2 */
490         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(1, 3, 0x0000)) /* MRS: MR3 */
491         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(1, 1, 0x0040)) /* MRS: MR1 */
492         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(1, 0, mr0_val)) /* MRS: MR0 */
493 #endif
494         MXC_DCD_ITEM(0x63fd9020, 3 << 14) /* disable refresh during calibration */
495         MXC_DCD_ITEM(0x63fd9058, 0x00022222)
496
497         MXC_DCD_ITEM(0x63fd90d0, 0x00000003) /* select default compare pattern for calibration */
498
499         /* ZQ calibration */
500         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
501         MXC_DCD_ITEM(0x63fd901c, 0x00008040) /* MRS: ZQ calibration */
502         MXC_DCD_ITEM(0x63fd9040, 0x0539002b) /* Force ZQ calibration */
503 zq_calib:
504         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd9040, 0x00010000)
505         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, wl_calib)
506
507         /* Write Leveling */
508         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, (1 << 2))) /* MRS: select MPR */
509         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 1, mr1_val | (1 << 7)) | (1 << 9)) /* MRS: start write leveling */
510         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
511         MXC_DCD_ITEM(0x63fd9048, 0x00000001)
512 wl_calib:
513         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd9048, 0x00000001)
514         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, dqs_calib)
515         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 1, mr1_val)) /* MRS: end write leveling */
516         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, 0)) /* MRS: select normal data path */
517
518         /* DQS calibration */
519         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
520         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, (1 << 2))) /* MRS: select MPR */
521         MXC_DCD_ITEM(0x63fd907c, 0x90000000) /* reset RD fifo and start DQS calib. */
522 dqs_calib:
523         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd907c, 0x90000000)
524         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, wr_dl_calib)
525         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, 0)) /* MRS: select normal data path */
526
527         /* WR DL calibration */
528         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
529         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
530         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, (1 << 2))) /* MRS: select MPR */
531         MXC_DCD_ITEM(0x63fd90a4, 0x00000010)
532 wr_dl_calib: /* 6c4 */
533         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd90a4, 0x00000010)
534         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, rd_dl_calib)
535         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, 0)) /* MRS: select normal data path */
536
537         /* RD DL calibration */
538         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
539         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, (1 << 2))) /* MRS: select MPR */
540         MXC_DCD_ITEM(0x63fd90a0, 0x00000010)
541 rd_dl_calib: /* 70c */
542         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd90a0, 0x00000010)
543         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, dcd_end)
544         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0, 3, 0)) /* MRS: select normal data path */
545         MXC_DCD_ITEM(0x63fd9020, (3 << 11) | (0 << 14)) /* refresh interval: 4 cycles every 64kHz period */
546         MXC_DCD_ITEM(0x63fd9004, ESDPDC_VAL_1)
547
548         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
549
550         /* setup NFC pads */
551         /* MUX_SEL */
552         MXC_DCD_ITEM(0x53fa819c, 0x00000000)    @ EIM_DA0
553         MXC_DCD_ITEM(0x53fa81a0, 0x00000000)    @ EIM_DA1
554         MXC_DCD_ITEM(0x53fa81a4, 0x00000000)    @ EIM_DA2
555         MXC_DCD_ITEM(0x53fa81a8, 0x00000000)    @ EIM_DA3
556         MXC_DCD_ITEM(0x53fa81ac, 0x00000000)    @ EIM_DA4
557         MXC_DCD_ITEM(0x53fa81b0, 0x00000000)    @ EIM_DA5
558         MXC_DCD_ITEM(0x53fa81b4, 0x00000000)    @ EIM_DA6
559         MXC_DCD_ITEM(0x53fa81b8, 0x00000000)    @ EIM_DA7
560         MXC_DCD_ITEM(0x53fa81dc, 0x00000000)    @ WE_B
561         MXC_DCD_ITEM(0x53fa81e0, 0x00000000)    @ RE_B
562         MXC_DCD_ITEM(0x53fa8228, 0x00000000)    @ CLE
563         MXC_DCD_ITEM(0x53fa822c, 0x00000000)    @ ALE
564         MXC_DCD_ITEM(0x53fa8230, 0x00000000)    @ WP_B
565         MXC_DCD_ITEM(0x53fa8234, 0x00000000)    @ RB0
566         MXC_DCD_ITEM(0x53fa8238, 0x00000000)    @ CS0
567         /* PAD_CTL */
568         MXC_DCD_ITEM(0x53fa84ec, 0x000000e4)    @ EIM_DA0
569         MXC_DCD_ITEM(0x53fa84f0, 0x000000e4)    @ EIM_DA1
570         MXC_DCD_ITEM(0x53fa84f4, 0x000000e4)    @ EIM_DA2
571         MXC_DCD_ITEM(0x53fa84f8, 0x000000e4)    @ EIM_DA3
572         MXC_DCD_ITEM(0x53fa84fc, 0x000000e4)    @ EIM_DA4
573         MXC_DCD_ITEM(0x53fa8500, 0x000000e4)    @ EIM_DA5
574         MXC_DCD_ITEM(0x53fa8504, 0x000000e4)    @ EIM_DA6
575         MXC_DCD_ITEM(0x53fa8508, 0x000000e4)    @ EIM_DA7
576         MXC_DCD_ITEM(0x53fa852c, 0x00000004)    @ NANDF_WE_B
577         MXC_DCD_ITEM(0x53fa8530, 0x00000004)    @ NANDF_RE_B
578         MXC_DCD_ITEM(0x53fa85a0, 0x00000004)    @ NANDF_CLE_B
579         MXC_DCD_ITEM(0x53fa85a4, 0x00000004)    @ NANDF_ALE_B
580         MXC_DCD_ITEM(0x53fa85a8, 0x000000e4)    @ NANDF_WE_B
581         MXC_DCD_ITEM(0x53fa85ac, 0x000000e4)    @ NANDF_RB0
582         MXC_DCD_ITEM(0x53fa85b0, 0x00000004)    @ NANDF_CS0
583 dcd_end:
584         .ifgt   dcd_end - dcd_start - 1768
585         .error  "DCD too large!"
586         .endif