blob: 544cadc83f6f9a7f31ee4270e2c8c97c4b6ea9a5 [file] [log] [blame]
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001/*
Hiroyuki Nakano82e63c82019-05-16 09:21:37 +09002 * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02007#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008
9#include <common/debug.h>
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020010
11#include "boot_init_dram_regdef_e3.h"
12#include "ddr_init_e3.h"
13
14#include "../dram_sub_func.h"
15
16/* rev.0.04 add variables */
17/*******************************************************************************
18 * variables
19 ******************************************************************************/
20uint32_t ddrBackup;
21
22/* rev.0.03 add Prototypes */
23/*******************************************************************************
24 * Prototypes
25 ******************************************************************************/
26/* static uint32_t init_ddr(void); rev.0.04 */
27/* static uint32_t recovery_from_backup_mode(void); rev.0.04 */
28/* int32_t dram_update_boot_status(uint32_t status); rev.0.04 */
29
30/* rev.0.03 add Comment */
31/*******************************************************************************
32 * register write/read function
33 ******************************************************************************/
34static void WriteReg_32(uint32_t a, uint32_t v)
35{
36 (*(volatile uint32_t*)(uintptr_t)a) = v;
37} /* WriteReg_32 */
38
39static uint32_t ReadReg_32(uint32_t a)
40{
41 uint32_t w = (*(volatile uint32_t*)(uintptr_t)a);
42 return w;
43} /* ReadReg_32 */
44
45/* rev.0.04 add Comment */
46/*******************************************************************************
47 * Initialize ddr
48 ******************************************************************************/
49uint32_t init_ddr(void)
50{
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020051 uint32_t RegVal_R2, RegVal_R5, RegVal_R6, RegVal_R7, RegVal_R12, i;
52 uint32_t ddr_md;
53
54/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010055 uint32_t RegVal, j;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020056 uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4, bdlcount_0c_div8, bdlcount_0c_div16;
57 uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010058 uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
Marek Vasut432d7672018-12-12 18:06:39 +010059/* rev.0.10 */
60 uint32_t pdr_ctl;
61/* rev.0.11 */
62 uint32_t byp_ctl;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020063
64/* rev.0.08 */
65 if ((ReadReg_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
66 pdqsr_ctl = 1;
67 lcdl_ctl = 1;
Marek Vasut432d7672018-12-12 18:06:39 +010068 pdr_ctl = 1; /* rev.0.10 */
69 byp_ctl = 1; /* rev.0.11 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010070 } else {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020071 pdqsr_ctl = 0;
72 lcdl_ctl = 0;
Marek Vasut432d7672018-12-12 18:06:39 +010073 pdr_ctl = 0; /* rev.0.10 */
74 byp_ctl = 0; /* rev.0.11 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020075 }
76
77 /* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010078 ddr_md = (ReadReg_32(RST_MODEMR) >> 19) & BIT0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020079
80 /* 1584Mbps setting */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010081 if (ddr_md == 0) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020082 /* CPG setting ===============================================*/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010083 WriteReg_32(CPG_CPGWPR, 0x5A5AFFFF);
84 WriteReg_32(CPG_CPGWPCR, 0xA5A50000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020085
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010086 WriteReg_32(CPG_SRCR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020087
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010088 WriteReg_32(0xE61500DC, 0xe2200000); /* Change to 1584Mbps */
89 while ((BIT11 & ReadReg_32(CPG_PLLECR)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020090
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010091 WriteReg_32(CPG_SRSTCLR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020092
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010093 WriteReg_32(CPG_CPGWPCR, 0xA5A50001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020094
95 /* CPG setting ===============================================*/
96 } /* ddr_md */
97
Marek Vasut1ddb3bf2018-12-16 19:28:59 +010098 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00001234);
99 WriteReg_32(DBSC_E3_DBKIND, 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200100
101#if RCAR_DRAM_DDR3L_MEMCONF == 0
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100102 WriteReg_32(DBSC_E3_DBMEMCONF00, 0x0f030a02); /* 1GB */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200103#else
Hiroyuki Nakano82e63c82019-05-16 09:21:37 +0900104 WriteReg_32(DBSC_E3_DBMEMCONF00, 0x10030a02); /* 2GB(default) */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200105#endif
106
107#if RCAR_DRAM_DDR3L_MEMDUAL == 1
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100108 RegVal_R2 = (ReadReg_32(0xE6790614));
109 WriteReg_32(0xE6790614, RegVal_R2 | 0x00000003); /* MCS1_N/MODT1 are activated. */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200110#endif
111
112
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100113 WriteReg_32(DBSC_E3_DBPHYCONF0, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200114
115 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100116 if (ddr_md == 0) { /* 1584Mbps */
117 WriteReg_32(DBSC_E3_DBTR0, 0x0000000B);
118 WriteReg_32(DBSC_E3_DBTR1, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200119 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100120 WriteReg_32(DBSC_E3_DBTR0, 0x0000000D);
121 WriteReg_32(DBSC_E3_DBTR1, 0x00000009);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200122 } /* ddr_md */
123
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100124 WriteReg_32(DBSC_E3_DBTR2, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200125
126 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100127 if (ddr_md == 0) { /* 1584Mbps */
128 WriteReg_32(DBSC_E3_DBTR3, 0x0000000B);
129 WriteReg_32(DBSC_E3_DBTR4, 0x000B000B);
130 WriteReg_32(DBSC_E3_DBTR5, 0x00000027);
131 WriteReg_32(DBSC_E3_DBTR6, 0x0000001C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200132 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100133 WriteReg_32(DBSC_E3_DBTR3, 0x0000000D);
134 WriteReg_32(DBSC_E3_DBTR4, 0x000D000D);
135 WriteReg_32(DBSC_E3_DBTR5, 0x0000002D);
136 WriteReg_32(DBSC_E3_DBTR6, 0x00000020);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200137 } /* ddr_md */
138
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100139 WriteReg_32(DBSC_E3_DBTR7, 0x00060006);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200140
141 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100142 if (ddr_md == 0) { /* 1584Mbps */
143 WriteReg_32(DBSC_E3_DBTR8, 0x00000020);
144 WriteReg_32(DBSC_E3_DBTR9, 0x00000006);
145 WriteReg_32(DBSC_E3_DBTR10, 0x0000000C);
146 WriteReg_32(DBSC_E3_DBTR11, 0x0000000A);
147 WriteReg_32(DBSC_E3_DBTR12, 0x00120012);
148 WriteReg_32(DBSC_E3_DBTR13, 0x000000CE);
149 WriteReg_32(DBSC_E3_DBTR14, 0x00140005);
150 WriteReg_32(DBSC_E3_DBTR15, 0x00050004);
151 WriteReg_32(DBSC_E3_DBTR16, 0x071F0305);
152 WriteReg_32(DBSC_E3_DBTR17, 0x040C0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200153 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100154 WriteReg_32(DBSC_E3_DBTR8, 0x00000021);
155 WriteReg_32(DBSC_E3_DBTR9, 0x00000007);
156 WriteReg_32(DBSC_E3_DBTR10, 0x0000000E);
157 WriteReg_32(DBSC_E3_DBTR11, 0x0000000C);
158 WriteReg_32(DBSC_E3_DBTR12, 0x00140014);
159 WriteReg_32(DBSC_E3_DBTR13, 0x000000F2);
160 WriteReg_32(DBSC_E3_DBTR14, 0x00170006);
161 WriteReg_32(DBSC_E3_DBTR15, 0x00060005);
162 WriteReg_32(DBSC_E3_DBTR16, 0x09210507);
163 WriteReg_32(DBSC_E3_DBTR17, 0x040E0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200164 } /* ddr_md */
165
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100166 WriteReg_32(DBSC_E3_DBTR18, 0x00000200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200167
168 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100169 if (ddr_md == 0) { /* 1584Mbps */
170 WriteReg_32(DBSC_E3_DBTR19, 0x01000040);
171 WriteReg_32(DBSC_E3_DBTR20, 0x020000D6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200172 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100173 WriteReg_32(DBSC_E3_DBTR19, 0x0129004B);
174 WriteReg_32(DBSC_E3_DBTR20, 0x020000FB);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200175 } /* ddr_md */
176
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100177 WriteReg_32(DBSC_E3_DBTR21, 0x00040004);
178 WriteReg_32(DBSC_E3_DBBL, 0x00000000);
179 WriteReg_32(DBSC_E3_DBODT0, 0x00000001);
180 WriteReg_32(DBSC_E3_DBADJ0, 0x00000001);
181 WriteReg_32(DBSC_E3_DBSYSCONF1, 0x00000002);
182 WriteReg_32(DBSC_E3_DBDFICNT0, 0x00000010);
183 WriteReg_32(DBSC_E3_DBBCAMDIS, 0x00000001);
184 WriteReg_32(DBSC_E3_DBSCHRW1, 0x00000046);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200185
186 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100187 if (ddr_md == 0) { /* 1584Mbps */
188 WriteReg_32(DBSC_E3_SCFCTST0, 0x0D050B03);
189 WriteReg_32(DBSC_E3_SCFCTST1, 0x0306030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200190 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100191 WriteReg_32(DBSC_E3_SCFCTST0, 0x0C050B03);
192 WriteReg_32(DBSC_E3_SCFCTST1, 0x0305030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200193 } /* ddr_md */
194
195 /* rev.0.03 add Comment */
196 /****************************************************************************
197 * Initial_Step0( INITBYP )
198 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100199 WriteReg_32(DBSC_E3_DBPDLK0, 0x0000A55A);
200 WriteReg_32(DBSC_E3_DBCMD, 0x01840001);
201 WriteReg_32(DBSC_E3_DBCMD, 0x08840000);
Marek Vasut432d7672018-12-12 18:06:39 +0100202 NOTICE("BL2: [COLD_BOOT]\n"); /* rev.0.11 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100203 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
204 WriteReg_32(DBSC_E3_DBPDRGD0, 0x80010000);
205 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
206 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200207
208 /* rev.0.03 add Comment */
209 /****************************************************************************
210 * Initial_Step1( ZCAL,PLLINIT,DCAL,PHYRST training )
211 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100212 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000008);
213 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000B8000);
214 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200215
216 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100217 if (ddr_md == 0) { /* 1584Mbps */
218 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058904);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200219 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100220 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058A04);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200221 } /* ddr_md */
222
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100223 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000091);
224 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BB6B);
225 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000095);
226 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BBAD);
227 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000099);
228 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BB6B);
229 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200230
231 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100232 if (ddr_md == 0) { /* 1584Mbps */
233 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200234 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100235 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200236 } /* ddr_md */
237
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100238 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000021);
239 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0024641E);
240 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
241 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010073);
242 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
243 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200244
245 /* rev.0.03 add Comment */
246 /****************************************************************************
247 * Initial_Step2( DRAMRST/DRAMINT training )
248 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100249 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200250
251 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100252 if (ddr_md == 0) { /* 1584Mbps */
253 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200254 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100255 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200256 } /* ddr_md */
257
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100258 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200259
260 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100261 if (ddr_md == 0) { /* 1584Mbps */
262 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200263 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100264 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200265 } /* ddr_md */
266
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100267 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
268 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200269
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100270 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000003);
Marek Vasut432d7672018-12-12 18:06:39 +0100271 if (byp_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100272 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0780C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100273 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100274 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0780C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100275 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100276 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000007);
277 while ((BIT30 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200278
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100279 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000004);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200280
281 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100282 if (ddr_md == 0) { /* 1584Mbps */
283 WriteReg_32(DBSC_E3_DBPDRGD0, (uint32_t)(REFRESH_RATE * 792 / 125) - 400 + 0x08B00000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200284 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100285 WriteReg_32(DBSC_E3_DBPDRGD0, (uint32_t)(REFRESH_RATE * 928 / 125) - 400 + 0x0A300000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200286 } /* ddr_md */
287
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100288 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000022);
289 WriteReg_32(DBSC_E3_DBPDRGD0, 0x1000040B);
290 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000023);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200291
292 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100293 if (ddr_md == 0) { /* 1584Mbps */
294 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2D9C0B66);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200295 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100296 WriteReg_32(DBSC_E3_DBPDRGD0, 0x35A00D77);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200297 } /* ddr_md */
298
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100299 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000024);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200300
301 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100302 if (ddr_md == 0) { /* 1584Mbps */
303 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2A88B400);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200304 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100305 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2A8A2C28);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200306 } /* ddr_md */
307
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100308 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000025);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200309
310 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100311 if (ddr_md == 0) { /* 1584Mbps */
312 WriteReg_32(DBSC_E3_DBPDRGD0, 0x30005200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200313 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100314 WriteReg_32(DBSC_E3_DBPDRGD0, 0x30005E00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200315 } /* ddr_md */
316
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100317 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000026);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200318
319 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100320 if (ddr_md == 0) { /* 1584Mbps */
321 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0014A9C9);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200322 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100323 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0014CB49);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200324 } /* ddr_md */
325
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100326 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000027);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200327
328 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100329 if (ddr_md == 0) { /* 1584Mbps */
330 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000D70);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200331 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100332 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000F14);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200333 } /* ddr_md */
334
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100335 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000028);
336 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000046);
337 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000029);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200338
339 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100340 if (ddr_md == 0) { /* 1584Mbps */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200341 if (REFRESH_RATE > 3900) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100342 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000018); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200343 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100344 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000098); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200345 }
346 } else { /* 1856Mbps */
347 if (REFRESH_RATE > 3900) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100348 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000020); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200349 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100350 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000000A0); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200351 } /* REFRESH_RATE */
352 } /* ddr_md */
353
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100354 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000002C);
355 WriteReg_32(DBSC_E3_DBPDRGD0, 0x81003047);
356 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000020);
357 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00181884);
358 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000001A);
359 WriteReg_32(DBSC_E3_DBPDRGD0, 0x33C03C10);
360 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
361 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200362
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100363 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A7);
364 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
365 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A8);
366 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
367 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A9);
368 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
369 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C7);
370 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
371 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C8);
372 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
373 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C9);
374 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
375 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E7);
376 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
377 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E8);
378 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
379 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E9);
380 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
381 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000107);
382 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
383 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000108);
384 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
385 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000109);
386 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200387
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100388 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
389 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010181);
390 WriteReg_32(DBSC_E3_DBCMD, 0x08840001);
391 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
392 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200393
394 /* rev.0.03 add Comment */
395 /****************************************************************************
396 * Initial_Step3( WL/QSG training )
397 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100398 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
399 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010601);
400 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
401 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200402
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100403 for (i = 0; i < 4; i++) {
404 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200405 RegVal_R5 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 0x8;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100406 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B4 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200407 RegVal_R6 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100408 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B3 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200409 RegVal_R7 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100410 if (RegVal_R6 > 0) {
411 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
412 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
413 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
414 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
415 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
416 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
417 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
418 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | RegVal_R6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200419 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100420 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
421 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
422 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
423 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | RegVal_R7);
424 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
425 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
426 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
427 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + ((RegVal_R5) << 1)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200428 } /* RegVal_R6 */
429 } /* for i */
430
Marek Vasut432d7672018-12-12 18:06:39 +0100431 /* rev.0.10 move Comment */
432 /****************************************************************************
433 * Initial_Step4( WLADJ training )
434 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100435 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000005);
436 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC1AA00C0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200437
438 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100439 if (pdqsr_ctl == 1){} else {
440 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
441 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
442 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
443 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
444 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
445 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
446 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
447 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +0100448 }
449
450 /* PDR always off */ /* rev.0.10 */
451 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100452 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
453 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
454 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
455 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
456 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
457 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
458 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
459 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200460 }
461
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100462 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
463 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010801);
464 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
465 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200466
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200467 /****************************************************************************
Marek Vasut432d7672018-12-12 18:06:39 +0100468 * Initial_Step5(Read Data Bit Deskew)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200469 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100470 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000005);
471 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC1AA00D8);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200472
473 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100474 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
475 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00011001);
476 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
477 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200478
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100479if (pdqsr_ctl == 1) {
480 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
481 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
482 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
483 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
484 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
485 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
486 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
487 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200488}
489
Marek Vasut432d7672018-12-12 18:06:39 +0100490 /* PDR dynamic */ /* rev.0.10 */
491 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100492 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
493 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
494 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
495 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
496 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
497 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
498 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
499 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100500 }
501
502 /****************************************************************************
503 * Initial_Step6(Write Data Bit Deskew)
504 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100505 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
506 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00012001);
507 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
508 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200509
Marek Vasut432d7672018-12-12 18:06:39 +0100510 /****************************************************************************
511 * Initial_Step7(Read Data Eye Training)
512 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100513if (pdqsr_ctl == 1) {
514 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
515 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
516 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
517 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
518 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
519 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
520 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
521 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200522}
523
Marek Vasut432d7672018-12-12 18:06:39 +0100524 /* PDR always off */ /* rev.0.10 */
525 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100526 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
527 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
528 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
529 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
530 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
531 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
532 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
533 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +0100534 }
535
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100536 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
537 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00014001);
538 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
539 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200540
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100541if (pdqsr_ctl == 1) {
542 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
543 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
544 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
545 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
546 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
547 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
548 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
549 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200550}
551
Marek Vasut432d7672018-12-12 18:06:39 +0100552 /* PDR dynamic */ /* rev.0.10 */
553 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100554 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
555 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
556 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
557 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
558 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
559 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
560 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
561 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100562 }
563
564 /****************************************************************************
565 * Initial_Step8(Write Data Eye Training)
566 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100567 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
568 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00018001);
569 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
570 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200571
572 /* rev.0.03 add Comment */
573 /****************************************************************************
574 * Initial_Step3_2( DQS Gate Training )
575 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100576 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
577 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
578 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
579 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
580 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
581 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
582 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
583 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
584 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000002C);
585 WriteReg_32(DBSC_E3_DBPDRGD0, 0x81003087);
586 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
587 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010401);
588 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
589 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200590
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100591 for (i = 0; i < 4; i++) {
592 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200593 RegVal_R5 = ((ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 0x8);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100594 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B4 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200595 RegVal_R6 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100596 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B3 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200597 RegVal_R7 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
598 RegVal_R12 = (RegVal_R5 >> 0x2);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100599 if (RegVal_R12 < RegVal_R6) {
600 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
601 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
602 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
603 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
604 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
605 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
606 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
607 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 - (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200608 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100609 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
610 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
611 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
612 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | (RegVal_R7 & 0x00000007));
613 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
614 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
615 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
616 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + (RegVal_R5) + ((RegVal_R5) >> 1) + (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200617 } /* RegVal_R12 < RegVal_R6 */
618 } /* for i */
619
Marek Vasut432d7672018-12-12 18:06:39 +0100620 /* rev.0.10 move Comment */
621 /****************************************************************************
622 * Initial_Step5-2_7-2( Rd bit Rd eye )
623 ***************************************************************************/
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200624/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100625 if (pdqsr_ctl == 1){} else {
626 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
627 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
628 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
629 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
630 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
631 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
632 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
633 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +0100634 }
635
636 /* PDR always off */ /* rev.0.10 */
637 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100638 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
639 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
640 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
641 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
642 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
643 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
644 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
645 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200646 }
647
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100648 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
649 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00015001);
650 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
651 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200652
653/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100654 if (lcdl_ctl == 1) {
655 for (i = 0; i < 4; i++) {
656 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
657 dqsgd_0c = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
658 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
659 bdlcount_0c = ((ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 8);
660 bdlcount_0c_div2 = (bdlcount_0c >> 1);
661 bdlcount_0c_div4 = (bdlcount_0c >> 2);
662 bdlcount_0c_div8 = (bdlcount_0c >> 3);
663 bdlcount_0c_div16 = (bdlcount_0c >> 4);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200664
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100665 if (ddr_md == 0) { /* 1584Mbps */
666 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4 + bdlcount_0c_div8;
667 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4 + bdlcount_0c_div16;
668 } else { /* 1856Mbps */
669 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4;
670 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4;
671 } /* ddr_md */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200672
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100673 if (dqsgd_0c > lcdl_judge1) {
674 if (dqsgd_0c <= lcdl_judge2) {
675 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
676 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
677 WriteReg_32(DBSC_E3_DBPDRGD0, ((dqsgd_0c - bdlcount_0c_div8) | RegVal));
678 } else {
679 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
680 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
681 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
682 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
683 gatesl_0c = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
684 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
685 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
686 WriteReg_32(DBSC_E3_DBPDRGD0, (RegVal | (gatesl_0c + 1)));
687 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AF + i * 0x20);
688 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
689 rdqsd_0c = (RegVal & 0x0000FF00) >> 8;
690 rdqsnd_0c = (RegVal & 0x00FF0000) >> 16;
691 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AF + i * 0x20);
692 WriteReg_32(DBSC_E3_DBPDRGD0, ((RegVal & 0xFF0000FF) | ((rdqsd_0c + bdlcount_0c_div4) << 8) | ((rdqsnd_0c + bdlcount_0c_div4) << 16)));
693 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AA + i * 0x20);
694 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
695 rbd_0c[0] = (RegVal) &0x0000001f;
696 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
697 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
698 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
699 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AA + i * 0x20);
700 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xE0E0E0E0);
701 for (j = 0; j < 4; j++) {
702 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
703 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
704 RegVal = RegVal | (rbd_0c[j] << 8 * j);
705 }
706 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
707 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AB + i * 0x20);
708 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
709 rbd_0c[0] = (RegVal) &0x0000001f;
710 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
711 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
712 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
713 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AB + i * 0x20);
714 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xE0E0E0E0);
715 for (j = 0; j < 4; j++) {
716 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
717 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
718 RegVal = RegVal | (rbd_0c[j] << 8 * j);
719 }
720 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
721 }
722 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200723 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100724 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000002);
725 WriteReg_32(DBSC_E3_DBPDRGD0, 0x07D81E37);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200726 }
727
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100728 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000003);
Marek Vasut432d7672018-12-12 18:06:39 +0100729 if (byp_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100730 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0380C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100731 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100732 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0380C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100733 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100734 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000007);
735 while ((BIT30 & ReadReg_32(DBSC_E3_DBPDRGD0)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200736
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100737 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000021);
738 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0024643E);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200739
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100740 WriteReg_32(DBSC_E3_DBBUS0CNF1, 0x00000010);
741 WriteReg_32(DBSC_E3_DBCALCNF, (uint32_t)(64000000 / REFRESH_RATE) + 0x01000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200742 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100743 if (ddr_md == 0) { /* 1584Mbps */
744 WriteReg_32(DBSC_E3_DBRFCNF1, (uint32_t)(REFRESH_RATE * 99 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200745 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100746 WriteReg_32(DBSC_E3_DBRFCNF1, (uint32_t)(REFRESH_RATE * 116 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200747 } /* ddr_md */
748
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100749 WriteReg_32(DBSC_E3_DBRFCNF2, 0x00010000);
750 WriteReg_32(DBSC_E3_DBDFICUPDCNF, 0x40100001);
751 WriteReg_32(DBSC_E3_DBRFEN, 0x00000001);
752 WriteReg_32(DBSC_E3_DBACEN, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200753
754/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100755 if (pdqsr_ctl == 1) {
756 WriteReg_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200757 RegVal = ReadReg_32(0x40000000);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100758 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000000);
759 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
760 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
761 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
762 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
763 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
764 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
765 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
766 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
767 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200768 }
769
Marek Vasut432d7672018-12-12 18:06:39 +0100770 /* PDR dynamic */ /* rev.0.10 */
771 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100772 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
773 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
774 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
775 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
776 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
777 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
778 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
779 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +0100780 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200781
782 /* rev.0.03 add Comment */
783 /****************************************************************************
784 * Initial_Step9( Initial End )
785 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100786 WriteReg_32(DBSC_E3_DBPDLK0, 0x00000000);
787 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200788
789#ifdef ddr_qos_init_setting /* only for non qos_init */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100790 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00001234);
791 WriteReg_32(DBSC_E3_DBCAM0CNF1, 0x00043218);
792 WriteReg_32(DBSC_E3_DBCAM0CNF2, 0x000000F4);
793 WriteReg_32(DBSC_E3_DBSCHCNT0, 0x000f0037);
794 WriteReg_32(DBSC_E3_DBSCHSZ0, 0x00000001);
795 WriteReg_32(DBSC_E3_DBSCHRW0, 0x22421111);
796 WriteReg_32(DBSC_E3_SCFCTST2, 0x012F1123);
797 WriteReg_32(DBSC_E3_DBSCHQOS00, 0x00000F00);
798 WriteReg_32(DBSC_E3_DBSCHQOS01, 0x00000B00);
799 WriteReg_32(DBSC_E3_DBSCHQOS02, 0x00000000);
800 WriteReg_32(DBSC_E3_DBSCHQOS03, 0x00000000);
801 WriteReg_32(DBSC_E3_DBSCHQOS40, 0x00000300);
802 WriteReg_32(DBSC_E3_DBSCHQOS41, 0x000002F0);
803 WriteReg_32(DBSC_E3_DBSCHQOS42, 0x00000200);
804 WriteReg_32(DBSC_E3_DBSCHQOS43, 0x00000100);
805 WriteReg_32(DBSC_E3_DBSCHQOS90, 0x00000100);
806 WriteReg_32(DBSC_E3_DBSCHQOS91, 0x000000F0);
807 WriteReg_32(DBSC_E3_DBSCHQOS92, 0x000000A0);
808 WriteReg_32(DBSC_E3_DBSCHQOS93, 0x00000040);
809 WriteReg_32(DBSC_E3_DBSCHQOS130, 0x00000100);
810 WriteReg_32(DBSC_E3_DBSCHQOS131, 0x000000F0);
811 WriteReg_32(DBSC_E3_DBSCHQOS132, 0x000000A0);
812 WriteReg_32(DBSC_E3_DBSCHQOS133, 0x00000040);
813 WriteReg_32(DBSC_E3_DBSCHQOS140, 0x000000C0);
814 WriteReg_32(DBSC_E3_DBSCHQOS141, 0x000000B0);
815 WriteReg_32(DBSC_E3_DBSCHQOS142, 0x00000080);
816 WriteReg_32(DBSC_E3_DBSCHQOS143, 0x00000040);
817 WriteReg_32(DBSC_E3_DBSCHQOS150, 0x00000040);
818 WriteReg_32(DBSC_E3_DBSCHQOS151, 0x00000030);
819 WriteReg_32(DBSC_E3_DBSCHQOS152, 0x00000020);
820 WriteReg_32(DBSC_E3_DBSCHQOS153, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200821
822/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100823 if (pdqsr_ctl == 1){} else {
824 WriteReg_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200825 }
826
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100827 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200828#endif
829
830 return 1; /* rev.0.04 Restore the return code */
831
832} /* init_ddr */
833
834/* rev.0.04 add function */
835uint32_t recovery_from_backup_mode(void)
836{
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200837 /****************************************************************************
838 * recovery_Step0(DBSC Setting 1) / same "init_ddr"
839 ***************************************************************************/
840 uint32_t RegVal_R2, RegVal_R5, RegVal_R6, RegVal_R7, RegVal_R12, i;
841 uint32_t ddr_md;
842 uint32_t err;
843
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200844/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100845 uint32_t RegVal, j;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200846 uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4, bdlcount_0c_div8, bdlcount_0c_div16;
847 uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100848 uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
Marek Vasut432d7672018-12-12 18:06:39 +0100849 /* rev.0.10 */
850 uint32_t pdr_ctl;
851 /* rev.0.11 */
852 uint32_t byp_ctl;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200853
854/* rev.0.08 */
855 if ((ReadReg_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
856 pdqsr_ctl = 1;
857 lcdl_ctl = 1;
Marek Vasut432d7672018-12-12 18:06:39 +0100858 pdr_ctl = 1; /* rev.0.10 */
859 byp_ctl = 1; /* rev.0.11 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100860 } else {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200861 pdqsr_ctl = 0;
862 lcdl_ctl = 0;
Marek Vasut432d7672018-12-12 18:06:39 +0100863 pdr_ctl = 0; /* rev.0.10 */
864 byp_ctl = 0; /* rev.0.11 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200865 }
866
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200867 /* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100868 ddr_md = (ReadReg_32(RST_MODEMR) >> 19) & BIT0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200869
870 /* 1584Mbps setting */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100871 if (ddr_md == 0) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200872 /* CPG setting ===============================================*/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100873 WriteReg_32(CPG_CPGWPR, 0x5A5AFFFF);
874 WriteReg_32(CPG_CPGWPCR, 0xA5A50000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200875
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100876 WriteReg_32(CPG_SRCR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200877
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100878 WriteReg_32(0xE61500DC, 0xe2200000); /* Change to 1584Mbps */
879 while ((BIT11 & ReadReg_32(CPG_PLLECR)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200880
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100881 WriteReg_32(CPG_SRSTCLR4, 0x20000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200882
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100883 WriteReg_32(CPG_CPGWPCR, 0xA5A50001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200884
885 /* CPG setting ===============================================*/
886 } /* ddr_md */
887
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100888 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00001234);
889 WriteReg_32(DBSC_E3_DBKIND, 0x00000007);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200890
891#if RCAR_DRAM_DDR3L_MEMCONF == 0
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100892 WriteReg_32(DBSC_E3_DBMEMCONF00, 0x0f030a02);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200893#else
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100894 WriteReg_32(DBSC_E3_DBMEMCONF00, 0x10030a02);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200895#endif
896
897/* rev.0.08 */
898#if RCAR_DRAM_DDR3L_MEMDUAL == 1
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100899 RegVal_R2 = (ReadReg_32(0xE6790614));
900 WriteReg_32(0xE6790614, RegVal_R2 | 0x00000003); /* MCS1_N/MODT1 are activated. */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200901#endif
902
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100903 WriteReg_32(DBSC_E3_DBPHYCONF0, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200904
905 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100906 if (ddr_md == 0) { /* 1584Mbps */
907 WriteReg_32(DBSC_E3_DBTR0, 0x0000000B);
908 WriteReg_32(DBSC_E3_DBTR1, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200909 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100910 WriteReg_32(DBSC_E3_DBTR0, 0x0000000D);
911 WriteReg_32(DBSC_E3_DBTR1, 0x00000009);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200912 } /* ddr_md */
913
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100914 WriteReg_32(DBSC_E3_DBTR2, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200915
916 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100917 if (ddr_md == 0) { /* 1584Mbps */
918 WriteReg_32(DBSC_E3_DBTR3, 0x0000000B);
919 WriteReg_32(DBSC_E3_DBTR4, 0x000B000B);
920 WriteReg_32(DBSC_E3_DBTR5, 0x00000027);
921 WriteReg_32(DBSC_E3_DBTR6, 0x0000001C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200922 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100923 WriteReg_32(DBSC_E3_DBTR3, 0x0000000D);
924 WriteReg_32(DBSC_E3_DBTR4, 0x000D000D);
925 WriteReg_32(DBSC_E3_DBTR5, 0x0000002D);
926 WriteReg_32(DBSC_E3_DBTR6, 0x00000020);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200927 } /* ddr_md */
928
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100929 WriteReg_32(DBSC_E3_DBTR7, 0x00060006);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200930
931 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100932 if (ddr_md == 0) { /* 1584Mbps */
933 WriteReg_32(DBSC_E3_DBTR8, 0x00000020);
934 WriteReg_32(DBSC_E3_DBTR9, 0x00000006);
935 WriteReg_32(DBSC_E3_DBTR10, 0x0000000C);
936 WriteReg_32(DBSC_E3_DBTR11, 0x0000000A);
937 WriteReg_32(DBSC_E3_DBTR12, 0x00120012);
938 WriteReg_32(DBSC_E3_DBTR13, 0x000000CE);
939 WriteReg_32(DBSC_E3_DBTR14, 0x00140005);
940 WriteReg_32(DBSC_E3_DBTR15, 0x00050004);
941 WriteReg_32(DBSC_E3_DBTR16, 0x071F0305);
942 WriteReg_32(DBSC_E3_DBTR17, 0x040C0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200943 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100944 WriteReg_32(DBSC_E3_DBTR8, 0x00000021);
945 WriteReg_32(DBSC_E3_DBTR9, 0x00000007);
946 WriteReg_32(DBSC_E3_DBTR10, 0x0000000E);
947 WriteReg_32(DBSC_E3_DBTR11, 0x0000000C);
948 WriteReg_32(DBSC_E3_DBTR12, 0x00140014);
949 WriteReg_32(DBSC_E3_DBTR13, 0x000000F2);
950 WriteReg_32(DBSC_E3_DBTR14, 0x00170006);
951 WriteReg_32(DBSC_E3_DBTR15, 0x00060005);
952 WriteReg_32(DBSC_E3_DBTR16, 0x09210507);
953 WriteReg_32(DBSC_E3_DBTR17, 0x040E0000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200954 } /* ddr_md */
955
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100956 WriteReg_32(DBSC_E3_DBTR18, 0x00000200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200957
958 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100959 if (ddr_md == 0) { /* 1584Mbps */
960 WriteReg_32(DBSC_E3_DBTR19, 0x01000040);
961 WriteReg_32(DBSC_E3_DBTR20, 0x020000D6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200962 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100963 WriteReg_32(DBSC_E3_DBTR19, 0x0129004B);
964 WriteReg_32(DBSC_E3_DBTR20, 0x020000FB);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200965 } /* ddr_md */
966
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100967 WriteReg_32(DBSC_E3_DBTR21, 0x00040004);
968 WriteReg_32(DBSC_E3_DBBL, 0x00000000);
969 WriteReg_32(DBSC_E3_DBODT0, 0x00000001);
970 WriteReg_32(DBSC_E3_DBADJ0, 0x00000001);
971 WriteReg_32(DBSC_E3_DBSYSCONF1, 0x00000002);
972 WriteReg_32(DBSC_E3_DBDFICNT0, 0x00000010);
973 WriteReg_32(DBSC_E3_DBBCAMDIS, 0x00000001);
974 WriteReg_32(DBSC_E3_DBSCHRW1, 0x00000046);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200975
976 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100977 if (ddr_md == 0) { /* 1584Mbps */
978 WriteReg_32(DBSC_E3_SCFCTST0, 0x0D050B03);
979 WriteReg_32(DBSC_E3_SCFCTST1, 0x0306030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200980 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100981 WriteReg_32(DBSC_E3_SCFCTST0, 0x0C050B03);
982 WriteReg_32(DBSC_E3_SCFCTST1, 0x0305030C);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200983 } /* ddr_md */
984
985 /****************************************************************************
986 * recovery_Step1(PHY setting 1)
987 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100988 WriteReg_32(DBSC_E3_DBPDLK0, 0x0000A55A);
989 WriteReg_32(DBSC_E3_DBCMD, 0x01840001);
990 WriteReg_32(DBSC_E3_DBCMD, 0x0A840000);
991 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000008); /* DDR_PLLCR */
992 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000B8000);
993 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000003); /* DDR_PGCR1 */
Marek Vasut432d7672018-12-12 18:06:39 +0100994 if (byp_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100995 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0780C720);
Marek Vasut432d7672018-12-12 18:06:39 +0100996 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100997 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0780C700);
Marek Vasut432d7672018-12-12 18:06:39 +0100998 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +0100999 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000020); /* DDR_DXCCR */
1000 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00181884);
1001 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000001A); /* DDR_ACIOCR0 */
1002 WriteReg_32(DBSC_E3_DBPDRGD0, 0x33C03C10);
1003 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000007);
1004 while ((BIT30 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001005
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001006 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000004);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001007
1008 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001009 if (ddr_md == 0) { /* 1584Mbps */
1010 WriteReg_32(DBSC_E3_DBPDRGD0, (uint32_t)(REFRESH_RATE * 792 / 125) - 400 + 0x08B00000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001011 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001012 WriteReg_32(DBSC_E3_DBPDRGD0, (uint32_t)(REFRESH_RATE * 928 / 125) - 400 + 0x0A300000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001013 } /* ddr_md */
1014
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001015 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000022);
1016 WriteReg_32(DBSC_E3_DBPDRGD0, 0x1000040B);
1017 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000023);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001018
1019 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001020 if (ddr_md == 0) { /* 1584Mbps */
1021 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2D9C0B66);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001022 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001023 WriteReg_32(DBSC_E3_DBPDRGD0, 0x35A00D77);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001024 } /* ddr_md */
1025
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001026 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000024);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001027
1028 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001029 if (ddr_md == 0) { /* 1584Mbps */
1030 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2A88B400);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001031 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001032 WriteReg_32(DBSC_E3_DBPDRGD0, 0x2A8A2C28);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001033 } /* ddr_md */
1034
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001035 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000025);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001036
1037 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001038 if (ddr_md == 0) { /* 1584Mbps */
1039 WriteReg_32(DBSC_E3_DBPDRGD0, 0x30005200);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001040 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001041 WriteReg_32(DBSC_E3_DBPDRGD0, 0x30005E00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001042 } /* ddr_md */
1043
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001044 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000026);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001045
1046 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001047 if (ddr_md == 0) { /* 1584Mbps */
1048 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0014A9C9);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001049 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001050 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0014CB49);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001051 } /* ddr_md */
1052
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001053 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000027);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001054
1055 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001056 if (ddr_md == 0) { /* 1584Mbps */
1057 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000D70);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001058 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001059 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000F14);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001060 } /* ddr_md */
1061
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001062 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000028);
1063 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000046);
1064 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000029);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001065
1066 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001067 if (ddr_md == 0) { /* 1584Mbps */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001068 if (REFRESH_RATE > 3900) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001069 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000018); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001070 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001071 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000098); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001072 }
1073 } else { /* 1856Mbps */
1074 if (REFRESH_RATE > 3900) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001075 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000020); /* [7]SRT=0 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001076 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001077 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000000A0); /* [7]SRT=1 */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001078 } /* REFRESH_RATE */
1079 } /* ddr_md */
1080
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001081 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000002C);
1082 WriteReg_32(DBSC_E3_DBPDRGD0, 0x81003047);
1083 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000091);
1084 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BB6B);
1085 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000095);
1086 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BBAD);
1087 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000099);
1088 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0007BB6B);
1089 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000021); /* DDR_DSGCR */
1090 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0024641E);
1091 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1092 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001093
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001094 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1095 WriteReg_32(DBSC_E3_DBPDRGD0, 0x40010000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001096
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001097 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1098 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001099
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001100 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000092); /* DDR_ZQ0DR */
1101 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC2C59AB5);
1102 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000096); /* DDR_ZQ1DR */
1103 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC4285FBF);
1104 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000009A); /* DDR_ZQ2DR */
1105 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC2C59AB5);
1106 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001107
1108 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001109 if (ddr_md == 0) { /* 1584Mbps */
1110 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001111 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001112 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001113 } /* ddr_md */
1114
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001115 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001116
1117 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001118 if (ddr_md == 0) { /* 1584Mbps */
1119 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001120 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001121 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001122 } /* ddr_md */
1123
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001124 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1125 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00050001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001126
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001127 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1128 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001129
1130 /* ddr backupmode end */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001131 if (ddrBackup) {
Marek Vasut56519892019-01-21 23:11:33 +01001132 NOTICE("BL2: [WARM_BOOT]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001133 } else {
Marek Vasut56519892019-01-21 23:11:33 +01001134 NOTICE("BL2: [COLD_BOOT]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001135 } /* ddrBackup */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001136 err = rcar_dram_update_boot_status(ddrBackup);
1137 if (err) {
Marek Vasut56519892019-01-21 23:11:33 +01001138 NOTICE("BL2: [BOOT_STATUS_UPDATE_ERROR]\n");
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001139 return INITDRAM_ERR_I;
1140 } /* err */
1141
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001142 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000092); /* DDR_ZQ0DR */
1143 WriteReg_32(DBSC_E3_DBPDRGD0, 0x02C59AB5);
1144 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000096); /* DDR_ZQ1DR */
1145 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04285FBF);
1146 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000009A); /* DDR_ZQ2DR */
1147 WriteReg_32(DBSC_E3_DBPDRGD0, 0x02C59AB5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001148
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001149 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1150 WriteReg_32(DBSC_E3_DBPDRGD0, 0x08000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001151
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001152 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1153 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000003);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001154
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001155 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1156 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001157
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001158 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1159 WriteReg_32(DBSC_E3_DBPDRGD0, 0x80010000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001160
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001161 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1162 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001163
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001164 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1165 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010073);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001166
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001167 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1168 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001169
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001170 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001171
1172 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001173 if (ddr_md == 0) { /* 1584Mbps */
1174 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001175 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001176 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0C058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001177 } /* ddr_md */
1178
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001179 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000090); /* DDR_ZQCR */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001180
1181 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001182 if (ddr_md == 0) { /* 1584Mbps */
1183 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058900);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001184 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001185 WriteReg_32(DBSC_E3_DBPDRGD0, 0x04058A00);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001186 } /* ddr_md */
1187
1188/* rev0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001189 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000000C);
1190 WriteReg_32(DBSC_E3_DBPDRGD0, 0x18000040);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001191
1192 /****************************************************************************
1193 * recovery_Step2(PHY setting 2)
1194 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001195 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1196 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001197
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001198 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A7);
1199 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1200 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A8);
1201 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1202 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A9);
1203 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
1204 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C7);
1205 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1206 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C8);
1207 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1208 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C9);
1209 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
1210 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E7);
1211 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1212 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E8);
1213 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1214 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E9);
1215 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
1216 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000107);
1217 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1218 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000108);
1219 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0D0D0D0D);
1220 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000109);
1221 WriteReg_32(DBSC_E3_DBPDRGD0, 0x000D0D0D);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001222
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001223 WriteReg_32(DBSC_E3_DBCALCNF, (uint32_t)(64000000 / REFRESH_RATE) + 0x01000000);
1224 WriteReg_32(DBSC_E3_DBBUS0CNF1, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001225
1226 /* Select setting value in bps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001227 if (ddr_md == 0) { /* 1584Mbps */
1228 WriteReg_32(DBSC_E3_DBRFCNF1, (uint32_t)(REFRESH_RATE * 99 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001229 } else { /* 1856Mbps */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001230 WriteReg_32(DBSC_E3_DBRFCNF1, (uint32_t)(REFRESH_RATE * 116 / 125) + 0x00080000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001231 } /* ddr_md */
1232
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001233 WriteReg_32(DBSC_E3_DBRFCNF2, 0x00010000);
1234 WriteReg_32(DBSC_E3_DBRFEN, 0x00000001);
1235 WriteReg_32(DBSC_E3_DBCMD, 0x0A840001);
1236 while ((BIT0 & ReadReg_32(DBSC_E3_DBWAIT)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001237
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001238 WriteReg_32(DBSC_E3_DBCMD, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001239
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001240 WriteReg_32(DBSC_E3_DBCMD, 0x04840010);
1241 while ((BIT0 & ReadReg_32(DBSC_E3_DBWAIT)) != 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001242
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001243 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1244 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001245
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001246 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001); /* DDR_PIR */
1247 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010701);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001248
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001249 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006); /* DDR_PGSR0 */
1250 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001251
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001252 for (i = 0; i < 4; i++)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001253 {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001254 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001255 RegVal_R5 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 0x8;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001256 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B4 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001257 RegVal_R6 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001258 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B3 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001259 RegVal_R7 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
1260
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001261 if (RegVal_R6 > 0) {
1262 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1263 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
1264 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1265 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
1266 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1267 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1268 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1269 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | RegVal_R6);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001270 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001271 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1272 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
1273 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1274 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | RegVal_R7);
1275 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1276 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1277 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1278 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + ((RegVal_R5) << 1)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001279 } /* RegVal_R6 */
1280 } /* for i */
1281
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001282 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000005);
1283 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC1AA00C0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001284
1285 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001286 if (pdqsr_ctl == 1){} else {
1287 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1288 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1289 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1290 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1291 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1292 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1293 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1294 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +01001295 }
1296
1297 /* PDR always off */ /* rev.0.10 */
1298 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001299 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1300 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1301 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1302 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1303 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1304 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1305 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1306 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001307 }
1308
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001309 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1310 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010801);
1311 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1312 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001313
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001314 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000005);
1315 WriteReg_32(DBSC_E3_DBPDRGD0, 0xC1AA00D8);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001316
1317 /* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001318 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1319 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00011001);
1320 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1321 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001322
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001323if (pdqsr_ctl == 1) {
1324 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1325 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1326 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1327 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1328 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1329 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1330 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1331 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001332}
1333
Marek Vasut432d7672018-12-12 18:06:39 +01001334 /* PDR dynamic */ /* rev.0.10 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001335 if (pdr_ctl == 1) {
1336 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1337 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1338 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1339 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1340 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1341 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1342 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1343 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +01001344 }
1345
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001346 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1347 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00012001);
1348 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1349 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001350
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001351if (pdqsr_ctl == 1) {
1352 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1353 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1354 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1355 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1356 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1357 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1358 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1359 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001360}
1361
Marek Vasut432d7672018-12-12 18:06:39 +01001362 /* PDR always off */ /* rev.0.10 */
1363 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001364 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1365 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1366 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1367 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1368 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1369 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1370 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1371 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +01001372 }
1373
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001374 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1375 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00014001);
1376 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1377 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001378
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001379if (pdqsr_ctl == 1) {
1380 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1381 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1382 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1383 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1384 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1385 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1386 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1387 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001388}
1389
Marek Vasut432d7672018-12-12 18:06:39 +01001390 /* PDR dynamic */ /* rev.0.10 */
1391 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001392 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1393 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1394 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1395 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1396 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1397 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1398 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1399 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Marek Vasut432d7672018-12-12 18:06:39 +01001400 }
1401
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001402 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1403 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00018001);
1404 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1405 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001406
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001407 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1408 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1409 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1410 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1411 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1412 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1413 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1414 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C000285);
1415 WriteReg_32(DBSC_E3_DBPDRGA0, 0x0000002C);
1416 WriteReg_32(DBSC_E3_DBPDRGD0, 0x81003087);
1417 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1418 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00010401);
1419 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1420 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001421
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001422 for (i = 0; i < 4; i++) {
1423 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001424 RegVal_R5 = ((ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 0x8);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001425 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B4 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001426 RegVal_R6 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001427 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B3 + i * 0x20);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001428 RegVal_R7 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
1429 RegVal_R12 = (RegVal_R5 >> 0x2);
1430
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001431 if (RegVal_R12 < RegVal_R6) {
1432 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1433 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
1434 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1435 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R7 + 0x1) & 0x00000007));
1436 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1437 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1438 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1439 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 - (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001440 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001441 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1442 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
1443 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1444 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | (RegVal_R7 & 0x00000007));
1445 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1446 RegVal_R2 = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1447 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1448 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal_R2 | ((RegVal_R6 + (RegVal_R5) + ((RegVal_R5) >> 1) + (RegVal_R12)) & 0x000000FF));
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001449 } /* RegVal_R12 < RegVal_R6 */
1450 } /* for i */
1451
1452/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001453 if (pdqsr_ctl == 1){} else {
1454 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1455 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1456 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1457 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1458 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1459 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1460 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1461 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001462 }
1463
Marek Vasut432d7672018-12-12 18:06:39 +01001464 /* PDR always off */ /* rev.0.10 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001465 if (pdr_ctl == 1) {
1466 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1467 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1468 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1469 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1470 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1471 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
1472 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1473 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000008);
Marek Vasut432d7672018-12-12 18:06:39 +01001474 }
1475
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001476 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000001);
1477 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00015001);
1478 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000006);
1479 while ((BIT0 & ReadReg_32(DBSC_E3_DBPDRGD0)) == 0);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001480
1481/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001482 if (lcdl_ctl == 1) {
1483 for (i = 0; i < 4; i++) {
1484 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1485 dqsgd_0c = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x000000FF);
1486 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B1 + i * 0x20);
1487 bdlcount_0c = ((ReadReg_32(DBSC_E3_DBPDRGD0) & 0x0000FF00) >> 8);
1488 bdlcount_0c_div2 = (bdlcount_0c >> 1);
1489 bdlcount_0c_div4 = (bdlcount_0c >> 2);
1490 bdlcount_0c_div8 = (bdlcount_0c >> 3);
1491 bdlcount_0c_div16 = (bdlcount_0c >> 4);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001492
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001493 if (ddr_md == 0) { /* 1584Mbps */
1494 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4 + bdlcount_0c_div8;
1495 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4 + bdlcount_0c_div16;
1496 } else { /* 1856Mbps */
1497 lcdl_judge1 = bdlcount_0c_div2 + bdlcount_0c_div4;
1498 lcdl_judge2 = bdlcount_0c + bdlcount_0c_div4;
1499 } /* ddr_md */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001500
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001501 if (dqsgd_0c > lcdl_judge1) {
1502 if (dqsgd_0c <= lcdl_judge2) {
1503 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1504 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1505 WriteReg_32(DBSC_E3_DBPDRGD0, ((dqsgd_0c - bdlcount_0c_div8) | RegVal));
1506 } else {
1507 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B0 + i * 0x20);
1508 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFF00);
1509 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
1510 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1511 gatesl_0c = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0x00000007);
1512 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000B2 + i * 0x20);
1513 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xFFFFFFF8);
1514 WriteReg_32(DBSC_E3_DBPDRGD0, (RegVal | (gatesl_0c + 1)));
1515 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AF + i * 0x20);
1516 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
1517 rdqsd_0c = (RegVal & 0x0000FF00) >> 8;
1518 rdqsnd_0c = (RegVal & 0x00FF0000) >> 16;
1519 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AF + i * 0x20);
1520 WriteReg_32(DBSC_E3_DBPDRGD0, ((RegVal & 0xFF0000FF) | ((rdqsd_0c + bdlcount_0c_div4) << 8) | ((rdqsnd_0c + bdlcount_0c_div4) << 16)));
1521 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AA + i * 0x20);
1522 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
1523 rbd_0c[0] = (RegVal) &0x0000001f;
1524 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
1525 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
1526 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
1527 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AA + i * 0x20);
1528 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xE0E0E0E0);
1529 for (j = 0; j < 4; j++) {
1530 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
1531 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
1532 RegVal = RegVal | (rbd_0c[j] << 8 * j);
1533 }
1534 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
1535 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AB + i * 0x20);
1536 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0));
1537 rbd_0c[0] = (RegVal) &0x0000001f;
1538 rbd_0c[1] = (RegVal >> 8) & 0x0000001f;
1539 rbd_0c[2] = (RegVal >> 16) & 0x0000001f;
1540 rbd_0c[3] = (RegVal >> 24) & 0x0000001f;
1541 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000AB + i * 0x20);
1542 RegVal = (ReadReg_32(DBSC_E3_DBPDRGD0) & 0xE0E0E0E0);
1543 for (j = 0; j < 4; j++) {
1544 rbd_0c[j] = (rbd_0c[j] + bdlcount_0c_div4);
1545 if (rbd_0c[j] > 0x1F) rbd_0c[j] = 0x1F;
1546 RegVal = RegVal | (rbd_0c[j] << 8 * j);
1547 }
1548 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
1549 }
1550 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001551 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001552 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000002);
1553 WriteReg_32(DBSC_E3_DBPDRGD0, 0x07D81E37);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001554 }
1555
1556
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001557 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000003);
1558 if (byp_ctl == 1) {
1559 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0380C720);
Marek Vasut432d7672018-12-12 18:06:39 +01001560 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001561 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0380C700);
Marek Vasut432d7672018-12-12 18:06:39 +01001562 }
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001563 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000007);
1564 while ((BIT30 & ReadReg_32(DBSC_E3_DBPDRGD0)) != 0);
1565 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000021);
1566 WriteReg_32(DBSC_E3_DBPDRGD0, 0x0024643E);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001567
1568 /****************************************************************************
1569 * recovery_Step3(DBSC Setting 2)
1570 ***************************************************************************/
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001571 WriteReg_32(DBSC_E3_DBDFICUPDCNF, 0x40100001);
1572 WriteReg_32(DBSC_E3_DBACEN, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001573
1574/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001575 if (pdqsr_ctl == 1) {
1576 WriteReg_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001577 RegVal = ReadReg_32(0x40000000);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001578 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000000);
1579 WriteReg_32(DBSC_E3_DBPDRGD0, RegVal);
1580 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A0);
1581 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1582 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C0);
1583 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1584 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E0);
1585 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
1586 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000100);
1587 WriteReg_32(DBSC_E3_DBPDRGD0, 0x7C0002C5);
Marek Vasut432d7672018-12-12 18:06:39 +01001588 }
1589
1590 /* PDR dynamic */ /* rev.0.10 */
1591 if (pdr_ctl == 1) {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001592 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000A3);
1593 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1594 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000C3);
1595 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1596 WriteReg_32(DBSC_E3_DBPDRGA0, 0x000000E3);
1597 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
1598 WriteReg_32(DBSC_E3_DBPDRGA0, 0x00000103);
1599 WriteReg_32(DBSC_E3_DBPDRGD0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001600 }
1601
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001602 WriteReg_32(DBSC_E3_DBPDLK0, 0x00000000);
1603 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001604
1605#ifdef ddr_qos_init_setting /* only for non qos_init */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001606 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00001234);
1607 WriteReg_32(DBSC_E3_DBCAM0CNF1, 0x00043218);
1608 WriteReg_32(DBSC_E3_DBCAM0CNF2, 0x000000F4);
1609 WriteReg_32(DBSC_E3_DBSCHCNT0, 0x000f0037);
1610 WriteReg_32(DBSC_E3_DBSCHSZ0, 0x00000001);
1611 WriteReg_32(DBSC_E3_DBSCHRW0, 0x22421111);
1612 WriteReg_32(DBSC_E3_SCFCTST2, 0x012F1123);
1613 WriteReg_32(DBSC_E3_DBSCHQOS00, 0x00000F00);
1614 WriteReg_32(DBSC_E3_DBSCHQOS01, 0x00000B00);
1615 WriteReg_32(DBSC_E3_DBSCHQOS02, 0x00000000);
1616 WriteReg_32(DBSC_E3_DBSCHQOS03, 0x00000000);
1617 WriteReg_32(DBSC_E3_DBSCHQOS40, 0x00000300);
1618 WriteReg_32(DBSC_E3_DBSCHQOS41, 0x000002F0);
1619 WriteReg_32(DBSC_E3_DBSCHQOS42, 0x00000200);
1620 WriteReg_32(DBSC_E3_DBSCHQOS43, 0x00000100);
1621 WriteReg_32(DBSC_E3_DBSCHQOS90, 0x00000100);
1622 WriteReg_32(DBSC_E3_DBSCHQOS91, 0x000000F0);
1623 WriteReg_32(DBSC_E3_DBSCHQOS92, 0x000000A0);
1624 WriteReg_32(DBSC_E3_DBSCHQOS93, 0x00000040);
1625 WriteReg_32(DBSC_E3_DBSCHQOS130, 0x00000100);
1626 WriteReg_32(DBSC_E3_DBSCHQOS131, 0x000000F0);
1627 WriteReg_32(DBSC_E3_DBSCHQOS132, 0x000000A0);
1628 WriteReg_32(DBSC_E3_DBSCHQOS133, 0x00000040);
1629 WriteReg_32(DBSC_E3_DBSCHQOS140, 0x000000C0);
1630 WriteReg_32(DBSC_E3_DBSCHQOS141, 0x000000B0);
1631 WriteReg_32(DBSC_E3_DBSCHQOS142, 0x00000080);
1632 WriteReg_32(DBSC_E3_DBSCHQOS143, 0x00000040);
1633 WriteReg_32(DBSC_E3_DBSCHQOS150, 0x00000040);
1634 WriteReg_32(DBSC_E3_DBSCHQOS151, 0x00000030);
1635 WriteReg_32(DBSC_E3_DBSCHQOS152, 0x00000020);
1636 WriteReg_32(DBSC_E3_DBSCHQOS153, 0x00000010);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001637
1638/* rev.0.08 */
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001639 if (pdqsr_ctl == 1){} else {
1640 WriteReg_32(0xE67F0018, 0x00000001);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001641 }
1642
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001643 WriteReg_32(DBSC_E3_DBSYSCNT0, 0x00000000);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001644#endif
1645
1646 return 1;
1647
1648} /* recovery_from_backup_mode */
1649
1650/*******************************************************************************
1651 * init_ddr : MD19=0,DDR3L,1584Mbps / MD19=1,DDR3L,1856Mbps
1652 ******************************************************************************/
1653
1654/*******************************************************************************
1655 * DDR Initialize entry for IPL
1656 ******************************************************************************/
ldts0a596b42018-11-06 10:17:12 +01001657int32_t rcar_dram_init(void)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001658{
1659 uint32_t dataL;
1660 uint32_t failcount;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001661 uint32_t md = 0;
1662 uint32_t ddr = 0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001663
1664 md = *((volatile uint32_t*)RST_MODEMR);
1665 ddr = (md & 0x00080000) >> 19;
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001666 if (ddr == 0x0) {
Marek Vasut56519892019-01-21 23:11:33 +01001667 NOTICE("BL2: DDR1584(%s)\n", RCAR_E3_DDR_VERSION);
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001668 } else if(ddr == 0x1){
Marek Vasut56519892019-01-21 23:11:33 +01001669 NOTICE("BL2: DDR1856(%s)\n", RCAR_E3_DDR_VERSION);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001670 } /* ddr */
1671
ldts0a596b42018-11-06 10:17:12 +01001672 rcar_dram_get_boot_status(&ddrBackup);
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001673
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001674 if (ddrBackup == DRAM_BOOT_STATUS_WARM) {
1675 dataL = recovery_from_backup_mode(); /* WARM boot */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001676 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001677 dataL = init_ddr(); /* COLD boot */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001678 } /* ddrBackup */
1679
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001680 if (dataL == 1) {
1681 failcount = 0;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001682 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001683 failcount = 1;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001684 } /* dataL */
1685
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001686 if (failcount == 0) {
1687 return INITDRAM_OK;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001688 } else {
Marek Vasut1ddb3bf2018-12-16 19:28:59 +01001689 return INITDRAM_NG;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001690 } /* failcount */
1691} /* InitDram */
1692
1693/*******************************************************************************
1694 * END
1695 ******************************************************************************/