common: Drop linux/delay.h from common header
[oweals/u-boot.git] / drivers / ddr / marvell / axp / ddr3_dfs.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Marvell International Ltd. and its affiliates
4  */
5
6 #include <common.h>
7 #include <i2c.h>
8 #include <spl.h>
9 #include <asm/io.h>
10 #include <asm/arch/cpu.h>
11 #include <asm/arch/soc.h>
12 #include <linux/delay.h>
13
14 #include "ddr3_hw_training.h"
15
16 /*
17  * Debug
18  */
19 #define DEBUG_DFS_C(s, d, l) \
20         DEBUG_DFS_S(s); DEBUG_DFS_D(d, l); DEBUG_DFS_S("\n")
21 #define DEBUG_DFS_FULL_C(s, d, l) \
22         DEBUG_DFS_FULL_S(s); DEBUG_DFS_FULL_D(d, l); DEBUG_DFS_FULL_S("\n")
23
24 #ifdef MV_DEBUG_DFS
25 #define DEBUG_DFS_S(s)                  puts(s)
26 #define DEBUG_DFS_D(d, l)               printf("%x", d)
27 #else
28 #define DEBUG_DFS_S(s)
29 #define DEBUG_DFS_D(d, l)
30 #endif
31
32 #ifdef MV_DEBUG_DFS_FULL
33 #define DEBUG_DFS_FULL_S(s)             puts(s)
34 #define DEBUG_DFS_FULL_D(d, l)          printf("%x", d)
35 #else
36 #define DEBUG_DFS_FULL_S(s)
37 #define DEBUG_DFS_FULL_D(d, l)
38 #endif
39
40 #if defined(MV88F672X)
41 extern u8 div_ratio[CLK_VCO][CLK_DDR];
42 extern void get_target_freq(u32 freq_mode, u32 *ddr_freq, u32 *hclk_ps);
43 #else
44 extern u16 odt_dynamic[ODT_OPT][MAX_CS];
45 extern u8 div_ratio1to1[CLK_CPU][CLK_DDR];
46 extern u8 div_ratio2to1[CLK_CPU][CLK_DDR];
47 #endif
48 extern u16 odt_static[ODT_OPT][MAX_CS];
49
50 extern u32 cpu_fab_clk_to_hclk[FAB_OPT][CLK_CPU];
51
52 extern u32 ddr3_get_vco_freq(void);
53
54 u32 ddr3_get_freq_parameter(u32 target_freq, int ratio_2to1);
55
56 #ifdef MV_DEBUG_DFS
57 static inline void dfs_reg_write(u32 addr, u32 val)
58 {
59         printf("\n write reg 0x%08x = 0x%08x", addr, val);
60         writel(val, INTER_REGS_BASE + addr);
61 }
62 #else
63 static inline void dfs_reg_write(u32 addr, u32 val)
64 {
65         writel(val, INTER_REGS_BASE + addr);
66 }
67 #endif
68
69 static void wait_refresh_op_complete(void)
70 {
71         u32 reg;
72
73         /* Poll - Wait for Refresh operation completion */
74         do {
75                 reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
76                         REG_SDRAM_OPERATION_CMD_RFRS_DONE;
77         } while (reg);          /* Wait for '0' */
78 }
79
80 /*
81  * Name:     ddr3_get_freq_parameter
82  * Desc:     Finds CPU/DDR frequency ratio according to Sample@reset and table.
83  * Args:     target_freq - target frequency
84  * Notes:
85  * Returns:  freq_par - the ratio parameter
86  */
87 u32 ddr3_get_freq_parameter(u32 target_freq, int ratio_2to1)
88 {
89         u32 ui_vco_freq, freq_par;
90
91         ui_vco_freq = ddr3_get_vco_freq();
92
93 #if defined(MV88F672X)
94         freq_par = div_ratio[ui_vco_freq][target_freq];
95 #else
96         /* Find the ratio between PLL frequency and ddr-clk */
97         if (ratio_2to1)
98                 freq_par = div_ratio2to1[ui_vco_freq][target_freq];
99         else
100                 freq_par = div_ratio1to1[ui_vco_freq][target_freq];
101 #endif
102
103         return freq_par;
104 }
105
106 /*
107  * Name:     ddr3_dfs_high_2_low
108  * Desc:
109  * Args:     freq - target frequency
110  * Notes:
111  * Returns:  MV_OK - success, MV_FAIL - fail
112  */
113 int ddr3_dfs_high_2_low(u32 freq, MV_DRAM_INFO *dram_info)
114 {
115 #if defined(MV88F78X60) || defined(MV88F672X)
116         /* This Flow is relevant for ArmadaXP A0 */
117         u32 reg, freq_par, tmp;
118         u32 cs = 0;
119
120         DEBUG_DFS_C("DDR3 - DFS - High To Low - Starting DFS procedure to Frequency - ",
121                     freq, 1);
122
123         /* target frequency - 100MHz */
124         freq_par = ddr3_get_freq_parameter(freq, 0);
125
126 #if defined(MV88F672X)
127         u32 hclk;
128         u32 cpu_freq = ddr3_get_cpu_freq();
129         get_target_freq(cpu_freq, &tmp, &hclk);
130 #endif
131
132         /* Configure - DRAM DLL final state after DFS is complete - Enable */
133         reg = reg_read(REG_DFS_ADDR);
134         /* [0] - DfsDllNextState - Disable */
135         reg |= (1 << REG_DFS_DLLNEXTSTATE_OFFS);
136         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
137
138         /*
139          * Configure - XBAR Retry response during Block to enable internal
140          * access - Disable
141          */
142         reg = reg_read(REG_METAL_MASK_ADDR);
143         /* [0] - RetryMask - Disable */
144         reg &= ~(1 << REG_METAL_MASK_RETRY_OFFS);
145         /* 0x14B0 - Dunit MMask Register */
146         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
147
148         /* Configure - Block new external transactions - Enable */
149         reg = reg_read(REG_DFS_ADDR);
150         reg |= (1 << REG_DFS_BLOCK_OFFS);       /* [1] - DfsBlock - Enable  */
151         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
152
153         /* Registered DIMM support */
154         if (dram_info->reg_dimm) {
155                 /*
156                  * Configure - Disable Register DIMM CKE Power
157                  * Down mode - CWA_RC
158                  */
159                 reg = (0x9 & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
160                         REG_SDRAM_OPERATION_CWA_RC_OFFS;
161                 /*
162                  * Configure - Disable Register DIMM CKE Power
163                  * Down mode - CWA_DATA
164                  */
165                 reg |= ((0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
166                         REG_SDRAM_OPERATION_CWA_DATA_OFFS);
167
168                 /*
169                  * Configure - Disable Register DIMM CKE Power
170                  * Down mode - Set Delay - tMRD
171                  */
172                 reg |= (0 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
173
174                 /* Configure - Issue CWA command with the above parameters */
175                 reg |= (REG_SDRAM_OPERATION_CMD_CWA &
176                         ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
177
178                 /* 0x1418 - SDRAM Operation Register */
179                 dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
180
181                 /* Poll - Wait for CWA operation completion */
182                 do {
183                         reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
184                                (REG_SDRAM_OPERATION_CMD_MASK);
185                 } while (reg);
186
187                 /* Configure - Disable outputs floating during Self Refresh */
188                 reg = reg_read(REG_REGISTERED_DRAM_CTRL_ADDR);
189                 /* [15] - SRFloatEn - Disable */
190                 reg &= ~(1 << REG_REGISTERED_DRAM_CTRL_SR_FLOAT_OFFS);
191                 /* 0x16D0 - DDR3 Registered DRAM Control */
192                 dfs_reg_write(REG_REGISTERED_DRAM_CTRL_ADDR, reg);
193         }
194
195         /* Optional - Configure - DDR3_Rtt_nom_CS# */
196         for (cs = 0; cs < MAX_CS; cs++) {
197                 if (dram_info->cs_ena & (1 << cs)) {
198                         reg = reg_read(REG_DDR3_MR1_CS_ADDR +
199                                        (cs << MR_CS_ADDR_OFFS));
200                         reg &= REG_DDR3_MR1_RTT_MASK;
201                         dfs_reg_write(REG_DDR3_MR1_CS_ADDR +
202                                       (cs << MR_CS_ADDR_OFFS), reg);
203                 }
204         }
205
206         /* Configure - Move DRAM into Self Refresh */
207         reg = reg_read(REG_DFS_ADDR);
208         reg |= (1 << REG_DFS_SR_OFFS);  /* [2] - DfsSR - Enable */
209         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
210
211         /* Poll - Wait for Self Refresh indication */
212         do {
213                 reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
214         } while (reg == 0x0);   /* 0x1528 [3] - DfsAtSR - Wait for '1' */
215
216         /* Start of clock change procedure (PLL) */
217 #if defined(MV88F672X)
218         /* avantaLP */
219         /* Configure    cpupll_clkdiv_reset_mask */
220         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
221         reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL0_MASK;
222         /* 0xE8264[7:0]   0xff CPU Clock Dividers Reset mask */
223         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, (reg + 0xFF));
224
225         /* Configure    cpu_clkdiv_reload_smooth    */
226         reg = reg_read(CPU_PLL_CNTRL0);
227         reg &= CPU_PLL_CNTRL0_RELOAD_SMOOTH_MASK;
228         /* 0xE8260   [15:8]  0x2 CPU Clock Dividers Reload Smooth enable */
229         dfs_reg_write(CPU_PLL_CNTRL0,
230                       (reg + (2 << CPU_PLL_CNTRL0_RELOAD_SMOOTH_OFFS)));
231
232         /* Configure    cpupll_clkdiv_relax_en */
233         reg = reg_read(CPU_PLL_CNTRL0);
234         reg &= CPU_PLL_CNTRL0_RELAX_EN_MASK;
235         /* 0xE8260 [31:24] 0x2 Relax Enable */
236         dfs_reg_write(CPU_PLL_CNTRL0,
237                       (reg + (2 << CPU_PLL_CNTRL0_RELAX_EN_OFFS)));
238
239         /* Configure    cpupll_clkdiv_ddr_clk_ratio */
240         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL1);
241         /*
242          * 0xE8268  [13:8]  N   Set Training clock:
243          * APLL Out Clock (VCO freq) / N = 100 MHz
244          */
245         reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL1_MASK;
246         reg |= (freq_par << 8); /* full Integer ratio from PLL-out to ddr-clk */
247         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL1, reg);
248
249         /* Configure    cpupll_clkdiv_reload_ratio  */
250         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
251         reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
252         /* 0xE8264 [8]=0x1 CPU Clock Dividers Reload Ratio trigger set */
253         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0,
254                       (reg + (1 << CPU_PLL_CLOCK_RELOAD_RATIO_OFFS)));
255
256         udelay(1);
257
258         /* Configure    cpupll_clkdiv_reload_ratio  */
259         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
260         reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
261         /* 0xE8264 [8]=0x0 CPU Clock Dividers Reload Ratio trigger clear */
262         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, reg);
263
264         udelay(5);
265
266 #else
267         /*
268          * Initial Setup - assure that the "load new ratio" is clear (bit 24)
269          * and in the same chance, block reassertions of reset [15:8] and
270          * force reserved bits[7:0].
271          */
272         reg = 0x0000FDFF;
273         /* 0x18700 - CPU Div CLK control 0 */
274         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
275
276         /*
277          * RelaX whenever reset is asserted to that channel
278          * (good for any case)
279          */
280         reg = 0x0000FF00;
281         /* 0x18704 - CPU Div CLK control 0 */
282         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
283
284         reg = reg_read(REG_CPU_DIV_CLK_CTRL_2_ADDR) &
285                 REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
286
287         /* full Integer ratio from PLL-out to ddr-clk */
288         reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
289         /* 0x1870C - CPU Div CLK control 3 register */
290         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_2_ADDR, reg);
291
292         /*
293          * Shut off clock enable to the DDRPHY clock channel (this is the "D").
294          * All the rest are kept as is (forced, but could be read-modify-write).
295          * This is done now by RMW above.
296          */
297
298         /* Clock is not shut off gracefully - keep it running */
299         reg = 0x000FFF02;
300         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
301
302         /* Wait before replacing the clock on the DDR Phy Channel. */
303         udelay(1);
304
305         /*
306          * This for triggering the frequency update. Bit[24] is the
307          * central control
308          * bits [23:16] == which channels to change ==2 ==>
309          *                 only DDR Phy (smooth transition)
310          * bits [15:8] == mask reset reassertion due to clock modification
311          *                to these channels.
312          * bits [7:0] == not in use
313          */
314         reg = 0x0102FDFF;
315         /* 0x18700 - CPU Div CLK control 0 register */
316         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
317
318         udelay(1);              /* Wait 1usec */
319
320         /*
321          * Poll Div CLK status 0 register - indication that the clocks
322          * are active - 0x18718 [8]
323          */
324         do {
325                 reg = (reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR)) &
326                         (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
327         } while (reg == 0);
328
329         /*
330          * Clean the CTRL0, to be ready for next resets and next requests
331          * of ratio modifications.
332          */
333         reg = 0x000000FF;
334         /* 0x18700 - CPU Div CLK control 0 register */
335         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
336
337         udelay(5);
338 #endif
339         /* End of clock change procedure (PLL) */
340
341         /* Configure - Select normal clock for the DDR PHY - Enable */
342         reg = reg_read(REG_DRAM_INIT_CTRL_STATUS_ADDR);
343         /* [16] - ddr_phy_trn_clk_sel - Enable  */
344         reg |= (1 << REG_DRAM_INIT_CTRL_TRN_CLK_OFFS);
345         /* 0x18488 - DRAM Init control status register */
346         dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
347
348         /* Configure - Set Correct Ratio - 1:1 */
349         /* [15] - Phy2UnitClkRatio = 0 - Set 1:1 Ratio between Dunit and Phy */
350
351         reg = reg_read(REG_DDR_IO_ADDR) & ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
352         dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
353
354         /* Configure - 2T Mode - Restore original configuration */
355         reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
356         /* [3:4] 2T - 1T Mode - low freq */
357         reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
358         /* 0x1404 - DDR Controller Control Low Register */
359         dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
360
361         /* Configure - Restore CL and CWL - MRS Commands */
362         reg = reg_read(REG_DFS_ADDR);
363         reg &= ~(REG_DFS_CL_NEXT_STATE_MASK << REG_DFS_CL_NEXT_STATE_OFFS);
364         reg &= ~(REG_DFS_CWL_NEXT_STATE_MASK << REG_DFS_CWL_NEXT_STATE_OFFS);
365         /* [8] - DfsCLNextState - MRS CL=6 after DFS (due to DLL-off mode) */
366         reg |= (0x4 << REG_DFS_CL_NEXT_STATE_OFFS);
367         /* [12] - DfsCWLNextState - MRS CWL=6 after DFS (due to DLL-off mode) */
368         reg |= (0x1 << REG_DFS_CWL_NEXT_STATE_OFFS);
369         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
370
371         /* Poll - Wait for APLL + ADLLs lock on new frequency */
372         do {
373                 reg = (reg_read(REG_PHY_LOCK_STATUS_ADDR)) &
374                         REG_PHY_LOCK_APLL_ADLL_STATUS_MASK;
375                 /* 0x1674 [10:0] - Phy lock status Register */
376         } while (reg != REG_PHY_LOCK_APLL_ADLL_STATUS_MASK);
377
378         /* Configure - Reset the PHY Read FIFO and Write channels - Set Reset */
379         reg = (reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK);
380         /* [30:29] = 0 - Data Pup R/W path reset */
381         /* 0x1400 - SDRAM Configuration register */
382         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
383
384         /*
385          * Configure - DRAM Data PHY Read [30], Write [29] path
386          * reset - Release Reset
387          */
388         reg = (reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK);
389         /* [30:29] = '11' - Data Pup R/W path reset */
390         /* 0x1400 - SDRAM Configuration register */
391         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
392
393         /* Registered DIMM support */
394         if (dram_info->reg_dimm) {
395                 /*
396                  * Configure - Change register DRAM operating speed
397                  * (below 400MHz) - CWA_RC
398                  */
399                 reg = (0xA & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
400                         REG_SDRAM_OPERATION_CWA_RC_OFFS;
401
402                 /*
403                  * Configure - Change register DRAM operating speed
404                  * (below 400MHz) - CWA_DATA
405                  */
406                 reg |= ((0x0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
407                         REG_SDRAM_OPERATION_CWA_DATA_OFFS);
408
409                 /* Configure - Set Delay - tSTAB */
410                 reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
411
412                 /* Configure - Issue CWA command with the above parameters */
413                 reg |= (REG_SDRAM_OPERATION_CMD_CWA &
414                         ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
415
416                 /* 0x1418 - SDRAM Operation Register */
417                 dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
418
419                 /* Poll - Wait for CWA operation completion */
420                 do {
421                         reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
422                                 (REG_SDRAM_OPERATION_CMD_MASK);
423                 } while (reg);
424         }
425
426         /* Configure - Exit Self Refresh */
427         /* [2] - DfsSR  */
428         reg = (reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS));
429         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
430
431         /*
432          * Poll - DFS Register - 0x1528 [3] - DfsAtSR - All DRAM devices
433          * on all ranks are NOT in self refresh mode
434          */
435         do {
436                 reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
437         } while (reg);          /* Wait for '0' */
438
439         /* Configure - Issue Refresh command */
440         /* [3-0] = 0x2 - Refresh Command, [11-8] - enabled Cs */
441         reg = REG_SDRAM_OPERATION_CMD_RFRS;
442         for (cs = 0; cs < MAX_CS; cs++) {
443                 if (dram_info->cs_ena & (1 << cs))
444                         reg &= ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
445         }
446
447         /* 0x1418 - SDRAM Operation Register */
448         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
449
450         /* Poll - Wait for Refresh operation completion */
451         wait_refresh_op_complete();
452
453         /* Configure - Block new external transactions - Disable */
454         reg = reg_read(REG_DFS_ADDR);
455         reg &= ~(1 << REG_DFS_BLOCK_OFFS);      /* [1] - DfsBlock - Disable  */
456         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
457
458         /*
459          * Configure -  XBAR Retry response during Block to enable
460          * internal access - Disable
461          */
462         reg = reg_read(REG_METAL_MASK_ADDR);
463         /* [0] - RetryMask - Enable */
464         reg |= (1 << REG_METAL_MASK_RETRY_OFFS);
465         /* 0x14B0 - Dunit MMask Register */
466         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
467
468         for (cs = 0; cs < MAX_CS; cs++) {
469                 if (dram_info->cs_ena & (1 << cs)) {
470                         /* Configure - Set CL */
471                         reg = reg_read(REG_DDR3_MR0_CS_ADDR +
472                                        (cs << MR_CS_ADDR_OFFS)) &
473                                 ~REG_DDR3_MR0_CL_MASK;
474                         tmp = 0x4;      /* CL=6 - 0x4 */
475                         reg |= ((tmp & 0x1) << REG_DDR3_MR0_CL_OFFS);
476                         reg |= ((tmp & 0xE) << REG_DDR3_MR0_CL_HIGH_OFFS);
477                         dfs_reg_write(REG_DDR3_MR0_CS_ADDR +
478                                       (cs << MR_CS_ADDR_OFFS), reg);
479
480                         /* Configure - Set CWL */
481                         reg = reg_read(REG_DDR3_MR2_CS_ADDR +
482                                        (cs << MR_CS_ADDR_OFFS))
483                                 & ~(REG_DDR3_MR2_CWL_MASK << REG_DDR3_MR2_CWL_OFFS);
484                         /* CWL=6 - 0x1 */
485                         reg |= ((0x1) << REG_DDR3_MR2_CWL_OFFS);
486                         dfs_reg_write(REG_DDR3_MR2_CS_ADDR +
487                                       (cs << MR_CS_ADDR_OFFS), reg);
488                 }
489         }
490
491         DEBUG_DFS_C("DDR3 - DFS - High To Low - Ended successfuly - new Frequency - ",
492                     freq, 1);
493
494         return MV_OK;
495 #else
496         /* This Flow is relevant for Armada370 A0 and ArmadaXP Z1 */
497
498         u32 reg, freq_par;
499         u32 cs = 0;
500
501         DEBUG_DFS_C("DDR3 - DFS - High To Low - Starting DFS procedure to Frequency - ",
502                     freq, 1);
503
504         /* target frequency - 100MHz */
505         freq_par = ddr3_get_freq_parameter(freq, 0);
506
507         reg = 0x0000FF00;
508         /* 0x18700 - CPU Div CLK control 0 */
509         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
510
511         /* 0x1600 - ODPG_CNTRL_Control */
512         reg = reg_read(REG_ODPG_CNTRL_ADDR);
513         /* [21] = 1 - auto refresh disable */
514         reg |= (1 << REG_ODPG_CNTRL_OFFS);
515         dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
516
517         /* 0x1670 - PHY lock mask register */
518         reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
519         reg &= REG_PHY_LOCK_MASK_MASK;  /* [11:0] = 0 */
520         dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
521
522         reg = reg_read(REG_DFS_ADDR);   /* 0x1528 - DFS register */
523
524         /* Disable reconfig */
525         reg &= ~0x10;   /* [4] - Enable reconfig MR registers after DFS_ERG */
526         reg |= 0x1;     /* [0] - DRAM DLL disabled after DFS */
527
528         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
529
530         reg = reg_read(REG_METAL_MASK_ADDR) & ~(1 << 0); /* [0] - disable */
531         /* 0x14B0 - Dunit MMask Register */
532         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
533
534         /* [1] - DFS Block enable  */
535         reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_BLOCK_OFFS);
536         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
537
538         /* [2] - DFS Self refresh enable  */
539         reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_SR_OFFS);
540         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
541
542         /*
543          * Poll DFS Register - 0x1528 [3] - DfsAtSR -
544          * All DRAM devices on all ranks are in self refresh mode -
545          * DFS can be executed afterwards
546          */
547         do {
548                 reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
549         } while (reg == 0x0);   /* Wait for '1' */
550
551         /* Disable ODT on DLL-off mode */
552         dfs_reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR,
553                       REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK);
554
555         /* [11:0] = 0 */
556         reg = (reg_read(REG_PHY_LOCK_MASK_ADDR) & REG_PHY_LOCK_MASK_MASK);
557         /* 0x1670 - PHY lock mask register */
558         dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
559
560         /* Add delay between entering SR and start ratio modification */
561         udelay(1);
562
563         /*
564          * Initial Setup - assure that the "load new ratio" is clear (bit 24)
565          * and in the same chance, block reassertions of reset [15:8] and
566          * force reserved bits[7:0].
567          */
568         reg = 0x0000FDFF;
569         /* 0x18700 - CPU Div CLK control 0 */
570         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
571
572         /*
573          * RelaX whenever reset is asserted to that channel (good for any case)
574          */
575         reg = 0x0000FF00;
576         /* 0x18700 - CPU Div CLK control 0 */
577         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
578
579         reg = reg_read(REG_CPU_DIV_CLK_CTRL_3_ADDR) &
580                 REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
581         /* Full Integer ratio from PLL-out to ddr-clk */
582         reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
583         /* 0x1870C - CPU Div CLK control 3 register */
584         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_3_ADDR, reg);
585
586         /*
587          * Shut off clock enable to the DDRPHY clock channel (this is the "D").
588          * All the rest are kept as is (forced, but could be read-modify-write).
589          * This is done now by RMW above.
590          */
591
592         /* Clock is not shut off gracefully - keep it running */
593         reg = 0x000FFF02;
594         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
595
596         /* Wait before replacing the clock on the DDR Phy Channel. */
597         udelay(1);
598
599         /*
600          * This for triggering the frequency update. Bit[24] is the
601          * central control
602          * bits [23:16] == which channels to change ==2 ==> only DDR Phy
603          *                 (smooth transition)
604          * bits [15:8] == mask reset reassertion due to clock modification
605          *                to these channels.
606          * bits [7:0] == not in use
607          */
608         reg = 0x0102FDFF;
609         /* 0x18700 - CPU Div CLK control 0 register */
610         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
611
612         udelay(1);              /* Wait 1usec */
613
614         /*
615          * Poll Div CLK status 0 register - indication that the clocks
616          * are active - 0x18718 [8]
617          */
618         do {
619                 reg = (reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR)) &
620                         (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
621         } while (reg == 0);
622
623         /*
624          * Clean the CTRL0, to be ready for next resets and next requests of
625          * ratio modifications.
626          */
627         reg = 0x000000FF;
628         /* 0x18700 - CPU Div CLK control 0 register */
629         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
630
631         udelay(5);
632
633         /* Switch HCLK Mux to training clk (100Mhz), keep DFS request bit */
634         reg = 0x20050000;
635         /* 0x18488 - DRAM Init control status register */
636         dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
637
638         reg = reg_read(REG_DDR_IO_ADDR) & ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
639         /* [15] = 0 - Set 1:1 Ratio between Dunit and Phy */
640         dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Regist */
641
642         reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK;
643         /* [31:30]] - reset pup data ctrl ADLL */
644         /* 0x15EC - DRAM PHY Config register */
645         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
646
647         reg = (reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK);
648         /* [31:30] - normal pup data ctrl ADLL */
649         /* 0x15EC - DRAM PHY Config register */
650         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
651
652         udelay(1);              /* Wait 1usec */
653
654         /* 0x1404 */
655         reg = (reg_read(REG_DUNIT_CTRL_LOW_ADDR) & 0xFFFFFFE7);
656         dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
657
658         /* Poll Phy lock status register - APLL lock indication - 0x1674 */
659         do {
660                 reg = (reg_read(REG_PHY_LOCK_STATUS_ADDR)) &
661                         REG_PHY_LOCK_STATUS_LOCK_MASK;
662         } while (reg != REG_PHY_LOCK_STATUS_LOCK_MASK); /* Wait for '0xFFF' */
663
664         reg = (reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK);
665         /* [30:29] = 0 - Data Pup R/W path reset */
666         /* 0x1400 - SDRAM Configuration register */
667         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
668
669         reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
670         /* [30:29] = '11' - Data Pup R/W path reset */
671         /* 0x1400 - SDRAM Configuration register */
672         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
673
674         udelay(1000);           /* Wait 1msec */
675
676         for (cs = 0; cs < MAX_CS; cs++) {
677                 if (dram_info->cs_ena & (1 << cs)) {
678                         /* Poll - Wait for Refresh operation completion */
679                         wait_refresh_op_complete();
680
681                         /* Config CL and CWL with MR0 and MR2 registers */
682                         reg = reg_read(REG_DDR3_MR0_ADDR);
683                         reg &= ~0x74;   /* CL [3:0]; [6:4],[2] */
684                         reg |= (1 << 5);        /* CL = 4, CAS is 6 */
685                         dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
686                         reg = REG_SDRAM_OPERATION_CMD_MR0 &
687                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
688                         /* 0x1418 - SDRAM Operation Register */
689                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
690
691                         /* Poll - Wait for Refresh operation completion */
692                         wait_refresh_op_complete();
693
694                         reg = reg_read(REG_DDR3_MR2_ADDR);
695                         reg &= ~0x38;   /* CWL [5:3] */
696                         reg |= (1 << 3);        /* CWL = 1, CWL is 6 */
697                         dfs_reg_write(REG_DDR3_MR2_ADDR, reg);
698
699                         reg = REG_SDRAM_OPERATION_CMD_MR2 &
700                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
701                         /* 0x1418 - SDRAM Operation Register */
702                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
703
704                         /* Poll - Wait for Refresh operation completion */
705                         wait_refresh_op_complete();
706
707                         /* Set current rd_sample_delay  */
708                         reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
709                         reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
710                                  (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
711                         reg |= (5 << (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
712                         dfs_reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
713
714                         /* Set current rd_ready_delay  */
715                         reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
716                         reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
717                                  (REG_READ_DATA_READY_DELAYS_OFFS * cs));
718                         reg |= ((6) << (REG_READ_DATA_READY_DELAYS_OFFS * cs));
719                         dfs_reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
720                 }
721         }
722
723         /* [2] - DFS Self refresh disable  */
724         reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
725         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
726
727         /* [1] - DFS Block enable  */
728         reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_BLOCK_OFFS);
729         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
730
731         /*
732          * Poll DFS Register - 0x1528 [3] - DfsAtSR -
733          * All DRAM devices on all ranks are in self refresh mode - DFS can
734          * be executed afterwards
735          */
736         do {
737                 reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
738         } while (reg);          /* Wait for '1' */
739
740         reg = (reg_read(REG_METAL_MASK_ADDR) | (1 << 0));
741         /* [0] - Enable Dunit to crossbar retry */
742         /* 0x14B0 - Dunit MMask Register */
743         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
744
745         /* 0x1600 - PHY lock mask register */
746         reg = reg_read(REG_ODPG_CNTRL_ADDR);
747         reg &= ~(1 << REG_ODPG_CNTRL_OFFS);     /* [21] = 0 */
748         dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
749
750         /* 0x1670 - PHY lock mask register */
751         reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
752         reg |= ~REG_PHY_LOCK_MASK_MASK; /* [11:0] = FFF */
753         dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
754
755         DEBUG_DFS_C("DDR3 - DFS - High To Low - Ended successfuly - new Frequency - ",
756                     freq, 1);
757
758         return MV_OK;
759 #endif
760 }
761
762 /*
763  * Name:     ddr3_dfs_low_2_high
764  * Desc:
765  * Args:     freq - target frequency
766  * Notes:
767  * Returns:  MV_OK - success, MV_FAIL - fail
768  */
769 int ddr3_dfs_low_2_high(u32 freq, int ratio_2to1, MV_DRAM_INFO *dram_info)
770 {
771 #if defined(MV88F78X60) || defined(MV88F672X)
772         /* This Flow is relevant for ArmadaXP A0 */
773         u32 reg, freq_par, tmp;
774         u32 cs = 0;
775
776         DEBUG_DFS_C("DDR3 - DFS - Low To High - Starting DFS procedure to Frequency - ",
777                     freq, 1);
778
779         /* target frequency - freq */
780         freq_par = ddr3_get_freq_parameter(freq, ratio_2to1);
781
782 #if defined(MV88F672X)
783         u32 hclk;
784         u32 cpu_freq = ddr3_get_cpu_freq();
785         get_target_freq(cpu_freq, &tmp, &hclk);
786 #endif
787
788         /* Configure - DRAM DLL final state after DFS is complete - Enable */
789         reg = reg_read(REG_DFS_ADDR);
790         /* [0] - DfsDllNextState - Enable */
791         reg &= ~(1 << REG_DFS_DLLNEXTSTATE_OFFS);
792         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
793
794         /*
795          * Configure -  XBAR Retry response during Block to enable
796          * internal access - Disable
797          */
798         reg = reg_read(REG_METAL_MASK_ADDR);
799         /* [0] - RetryMask - Disable */
800         reg &= ~(1 << REG_METAL_MASK_RETRY_OFFS);
801         /* 0x14B0 - Dunit MMask Register */
802         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
803
804         /* Configure - Block new external transactions - Enable */
805         reg = reg_read(REG_DFS_ADDR);
806         reg |= (1 << REG_DFS_BLOCK_OFFS);       /* [1] - DfsBlock - Enable  */
807         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
808
809         /* Configure - Move DRAM into Self Refresh */
810         reg = reg_read(REG_DFS_ADDR);
811         reg |= (1 << REG_DFS_SR_OFFS);  /* [2] - DfsSR - Enable */
812         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
813
814         /* Poll - Wait for Self Refresh indication */
815         do {
816                 reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
817         } while (reg == 0x0);   /* 0x1528 [3] - DfsAtSR - Wait for '1' */
818
819         /* Start of clock change procedure (PLL) */
820 #if defined(MV88F672X)
821         /* avantaLP */
822         /* Configure    cpupll_clkdiv_reset_mask */
823         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
824         reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL0_MASK;
825         /* 0xE8264[7:0]   0xff CPU Clock Dividers Reset mask */
826         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, (reg + 0xFF));
827
828         /* Configure    cpu_clkdiv_reload_smooth    */
829         reg = reg_read(CPU_PLL_CNTRL0);
830         reg &= CPU_PLL_CNTRL0_RELOAD_SMOOTH_MASK;
831         /* 0xE8260   [15:8]  0x2 CPU Clock Dividers Reload Smooth enable */
832         dfs_reg_write(CPU_PLL_CNTRL0,
833                       reg + (2 << CPU_PLL_CNTRL0_RELOAD_SMOOTH_OFFS));
834
835         /* Configure    cpupll_clkdiv_relax_en */
836         reg = reg_read(CPU_PLL_CNTRL0);
837         reg &= CPU_PLL_CNTRL0_RELAX_EN_MASK;
838         /* 0xE8260 [31:24] 0x2 Relax Enable */
839         dfs_reg_write(CPU_PLL_CNTRL0,
840                       reg + (2 << CPU_PLL_CNTRL0_RELAX_EN_OFFS));
841
842         /* Configure    cpupll_clkdiv_ddr_clk_ratio */
843         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL1);
844         /*
845          * 0xE8268  [13:8]  N   Set Training clock:
846          * APLL Out Clock (VCO freq) / N = 100 MHz
847          */
848         reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL1_MASK;
849         reg |= (freq_par << 8); /* full Integer ratio from PLL-out to ddr-clk */
850         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL1, reg);
851         /* Configure    cpupll_clkdiv_reload_ratio  */
852         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
853         reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
854         /* 0xE8264 [8]=0x1 CPU Clock Dividers Reload Ratio trigger set */
855         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0,
856                       reg + (1 << CPU_PLL_CLOCK_RELOAD_RATIO_OFFS));
857
858         udelay(1);
859
860         /* Configure    cpupll_clkdiv_reload_ratio  */
861         reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
862         reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
863         /* 0xE8264 [8]=0x0 CPU Clock Dividers Reload Ratio trigger clear */
864         dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, reg);
865
866         udelay(5);
867
868 #else
869         /*
870          * Initial Setup - assure that the "load new ratio" is clear (bit 24)
871          * and in the same chance, block reassertions of reset [15:8]
872          * and force reserved bits[7:0].
873          */
874         reg = 0x0000FFFF;
875
876         /* 0x18700 - CPU Div CLK control 0 */
877         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
878
879         /*
880          * RelaX whenever reset is asserted to that channel (good for any case)
881          */
882         reg = 0x0000FF00;
883         /* 0x18704 - CPU Div CLK control 0 */
884         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
885
886         reg = reg_read(REG_CPU_DIV_CLK_CTRL_2_ADDR) &
887                 REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
888         reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
889         /* full Integer ratio from PLL-out to ddr-clk */
890         /* 0x1870C - CPU Div CLK control 3 register */
891         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_2_ADDR, reg);
892
893         /*
894          * Shut off clock enable to the DDRPHY clock channel (this is the "D").
895          * All the rest are kept as is (forced, but could be read-modify-write).
896          * This is done now by RMW above.
897          */
898         reg = 0x000FFF02;
899         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
900
901         /* Wait before replacing the clock on the DDR Phy Channel. */
902         udelay(1);
903
904         reg = 0x0102FDFF;
905         /*
906          * This for triggering the frequency update. Bit[24] is the
907          * central control
908          * bits [23:16] == which channels to change ==2 ==> only DDR Phy
909          *                 (smooth transition)
910          * bits [15:8] == mask reset reassertion due to clock modification
911          *                to these channels.
912          * bits [7:0] == not in use
913          */
914         /* 0x18700 - CPU Div CLK control 0 register */
915         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
916
917         udelay(1);
918
919         /*
920          * Poll Div CLK status 0 register - indication that the clocks
921          * are active - 0x18718 [8]
922          */
923         do {
924                 reg = reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR) &
925                         (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
926         } while (reg == 0);
927
928         reg = 0x000000FF;
929         /*
930          * Clean the CTRL0, to be ready for next resets and next requests
931          * of ratio modifications.
932          */
933         /* 0x18700 - CPU Div CLK control 0 register */
934         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
935 #endif
936         /* End of clock change procedure (PLL) */
937
938         if (ratio_2to1) {
939                 /* Configure - Select normal clock for the DDR PHY - Disable */
940                 reg = reg_read(REG_DRAM_INIT_CTRL_STATUS_ADDR);
941                 /* [16] - ddr_phy_trn_clk_sel - Disable  */
942                 reg &= ~(1 << REG_DRAM_INIT_CTRL_TRN_CLK_OFFS);
943                 /* 0x18488 - DRAM Init control status register */
944                 dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
945         }
946
947         /*
948          * Configure - Set Correct Ratio - according to target ratio
949          * parameter - 2:1/1:1
950          */
951         if (ratio_2to1) {
952                 /*
953                  * [15] - Phy2UnitClkRatio = 1 - Set 2:1 Ratio between
954                  * Dunit and Phy
955                  */
956                 reg = reg_read(REG_DDR_IO_ADDR) |
957                         (1 << REG_DDR_IO_CLK_RATIO_OFFS);
958         } else {
959                 /*
960                  * [15] - Phy2UnitClkRatio = 0 - Set 1:1 Ratio between
961                  * Dunit and Phy
962                  */
963                 reg = reg_read(REG_DDR_IO_ADDR) &
964                         ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
965         }
966         dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
967
968         /* Configure - 2T Mode - Restore original configuration */
969         reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
970         /* [3:4] 2T - Restore value */
971         reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
972         reg |= ((dram_info->mode_2t & REG_DUNIT_CTRL_LOW_2T_MASK) <<
973                 REG_DUNIT_CTRL_LOW_2T_OFFS);
974         /* 0x1404 - DDR Controller Control Low Register */
975         dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
976
977         /* Configure - Restore CL and CWL - MRS Commands */
978         reg = reg_read(REG_DFS_ADDR);
979         reg &= ~(REG_DFS_CL_NEXT_STATE_MASK << REG_DFS_CL_NEXT_STATE_OFFS);
980         reg &= ~(REG_DFS_CWL_NEXT_STATE_MASK << REG_DFS_CWL_NEXT_STATE_OFFS);
981
982         if (freq == DDR_400) {
983                 if (dram_info->target_frequency == 0x8)
984                         tmp = ddr3_cl_to_valid_cl(5);
985                 else
986                         tmp = ddr3_cl_to_valid_cl(6);
987         } else {
988                 tmp = ddr3_cl_to_valid_cl(dram_info->cl);
989         }
990
991         /* [8] - DfsCLNextState */
992         reg |= ((tmp & REG_DFS_CL_NEXT_STATE_MASK) << REG_DFS_CL_NEXT_STATE_OFFS);
993         if (freq == DDR_400) {
994                 /* [12] - DfsCWLNextState */
995                 reg |= (((0) & REG_DFS_CWL_NEXT_STATE_MASK) <<
996                         REG_DFS_CWL_NEXT_STATE_OFFS);
997         } else {
998                 /* [12] - DfsCWLNextState */
999                 reg |= (((dram_info->cwl) & REG_DFS_CWL_NEXT_STATE_MASK) <<
1000                         REG_DFS_CWL_NEXT_STATE_OFFS);
1001         }
1002         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1003
1004         /* Optional - Configure - DDR3_Rtt_nom_CS# */
1005         for (cs = 0; cs < MAX_CS; cs++) {
1006                 if (dram_info->cs_ena & (1 << cs)) {
1007                         reg = reg_read(REG_DDR3_MR1_CS_ADDR +
1008                                        (cs << MR_CS_ADDR_OFFS));
1009                         reg &= REG_DDR3_MR1_RTT_MASK;
1010                         reg |= odt_static[dram_info->cs_ena][cs];
1011                         dfs_reg_write(REG_DDR3_MR1_CS_ADDR +
1012                                       (cs << MR_CS_ADDR_OFFS), reg);
1013                 }
1014         }
1015
1016         /* Configure - Reset ADLLs - Set Reset */
1017         reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK;
1018         /* [31:30]] - reset pup data ctrl ADLL */
1019         /* 0x15EC - DRAM PHY Config Register */
1020         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1021
1022         /* Configure - Reset ADLLs - Release Reset */
1023         reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK;
1024         /* [31:30] - normal pup data ctrl ADLL */
1025         /* 0x15EC - DRAM PHY Config register */
1026         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1027
1028         /* Poll - Wait for APLL + ADLLs lock on new frequency */
1029         do {
1030                 reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1031                         REG_PHY_LOCK_APLL_ADLL_STATUS_MASK;
1032                 /* 0x1674 [10:0] - Phy lock status Register */
1033         } while (reg != REG_PHY_LOCK_APLL_ADLL_STATUS_MASK);
1034
1035         /* Configure - Reset the PHY SDR clock divider */
1036         if (ratio_2to1) {
1037                 /* Pup Reset Divider B - Set Reset */
1038                 /* [28] - DataPupRdRST = 0 */
1039                 reg = reg_read(REG_SDRAM_CONFIG_ADDR) &
1040                         ~(1 << REG_SDRAM_CONFIG_PUPRSTDIV_OFFS);
1041                 /* [28] - DataPupRdRST = 1 */
1042                 tmp = reg_read(REG_SDRAM_CONFIG_ADDR) |
1043                         (1 << REG_SDRAM_CONFIG_PUPRSTDIV_OFFS);
1044                 /* 0x1400 - SDRAM Configuration register */
1045                 dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1046
1047                 /* Pup Reset Divider B - Release Reset */
1048                 /* 0x1400 - SDRAM Configuration register */
1049                 dfs_reg_write(REG_SDRAM_CONFIG_ADDR, tmp);
1050         }
1051
1052         /* Configure - Reset the PHY Read FIFO and Write channels - Set Reset */
1053         reg = reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK;
1054         /* [30:29] = 0 - Data Pup R/W path reset */
1055         /* 0x1400 - SDRAM Configuration register */
1056         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1057
1058         /*
1059          * Configure - DRAM Data PHY Read [30], Write [29] path reset -
1060          * Release Reset
1061          */
1062         reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
1063         /* [30:29] = '11' - Data Pup R/W path reset */
1064         /* 0x1400 - SDRAM Configuration register */
1065         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1066
1067         /* Registered DIMM support */
1068         if (dram_info->reg_dimm) {
1069                 /*
1070                  * Configure - Change register DRAM operating speed
1071                  * (DDR3-1333 / DDR3-1600) - CWA_RC
1072                  */
1073                 reg = (0xA & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
1074                         REG_SDRAM_OPERATION_CWA_RC_OFFS;
1075                 if (freq <= DDR_400) {
1076                         /*
1077                          * Configure - Change register DRAM operating speed
1078                          * (DDR3-800) - CWA_DATA
1079                          */
1080                         reg |= ((0x0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1081                                 REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1082                 } else if ((freq > DDR_400) && (freq <= DDR_533)) {
1083                         /*
1084                          * Configure - Change register DRAM operating speed
1085                          * (DDR3-1066) - CWA_DATA
1086                          */
1087                         reg |= ((0x1 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1088                                 REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1089                 } else if ((freq > DDR_533) && (freq <= DDR_666)) {
1090                         /*
1091                          * Configure - Change register DRAM operating speed
1092                          * (DDR3-1333) - CWA_DATA
1093                          */
1094                         reg |= ((0x2 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1095                                 REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1096                 } else {
1097                         /*
1098                          * Configure - Change register DRAM operating speed
1099                          * (DDR3-1600) - CWA_DATA
1100                          */
1101                         reg |= ((0x3 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1102                                 REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1103                 }
1104
1105                 /* Configure - Set Delay - tSTAB */
1106                 reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
1107                 /* Configure - Issue CWA command with the above parameters */
1108                 reg |= (REG_SDRAM_OPERATION_CMD_CWA &
1109                         ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
1110
1111                 /* 0x1418 - SDRAM Operation Register */
1112                 dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1113
1114                 /* Poll - Wait for CWA operation completion */
1115                 do {
1116                         reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
1117                                 REG_SDRAM_OPERATION_CMD_MASK;
1118                 } while (reg);
1119         }
1120
1121         /* Configure - Exit Self Refresh */
1122         /* [2] - DfsSR  */
1123         reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
1124         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1125
1126         /*
1127          * Poll - DFS Register - 0x1528 [3] - DfsAtSR - All DRAM
1128          * devices on all ranks are NOT in self refresh mode
1129          */
1130         do {
1131                 reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1132         } while (reg);          /* Wait for '0' */
1133
1134         /* Configure - Issue Refresh command */
1135         /* [3-0] = 0x2 - Refresh Command, [11-8] - enabled Cs */
1136         reg = REG_SDRAM_OPERATION_CMD_RFRS;
1137         for (cs = 0; cs < MAX_CS; cs++) {
1138                 if (dram_info->cs_ena & (1 << cs))
1139                         reg &= ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1140         }
1141
1142         /* 0x1418 - SDRAM Operation Register */
1143         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1144
1145         /* Poll - Wait for Refresh operation completion */
1146         wait_refresh_op_complete();
1147
1148         /* Configure - Block new external transactions - Disable */
1149         reg = reg_read(REG_DFS_ADDR);
1150         reg &= ~(1 << REG_DFS_BLOCK_OFFS);      /* [1] - DfsBlock - Disable  */
1151         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1152
1153         /*
1154          * Configure -  XBAR Retry response during Block to enable
1155          * internal access - Disable
1156          */
1157         reg = reg_read(REG_METAL_MASK_ADDR);
1158         /* [0] - RetryMask - Enable */
1159         reg |= (1 << REG_METAL_MASK_RETRY_OFFS);
1160         /* 0x14B0 - Dunit MMask Register */
1161         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1162
1163         for (cs = 0; cs < MAX_CS; cs++) {
1164                 if (dram_info->cs_ena & (1 << cs)) {
1165                         /* Configure - Set CL */
1166                         reg = reg_read(REG_DDR3_MR0_CS_ADDR +
1167                                        (cs << MR_CS_ADDR_OFFS)) &
1168                                 ~REG_DDR3_MR0_CL_MASK;
1169                         if (freq == DDR_400)
1170                                 tmp = ddr3_cl_to_valid_cl(6);
1171                         else
1172                                 tmp = ddr3_cl_to_valid_cl(dram_info->cl);
1173                         reg |= ((tmp & 0x1) << REG_DDR3_MR0_CL_OFFS);
1174                         reg |= ((tmp & 0xE) << REG_DDR3_MR0_CL_HIGH_OFFS);
1175                         dfs_reg_write(REG_DDR3_MR0_CS_ADDR +
1176                                       (cs << MR_CS_ADDR_OFFS), reg);
1177
1178                         /* Configure - Set CWL */
1179                         reg = reg_read(REG_DDR3_MR2_CS_ADDR +
1180                                        (cs << MR_CS_ADDR_OFFS)) &
1181                                 ~(REG_DDR3_MR2_CWL_MASK << REG_DDR3_MR2_CWL_OFFS);
1182                         if (freq == DDR_400)
1183                                 reg |= ((0) << REG_DDR3_MR2_CWL_OFFS);
1184                         else
1185                                 reg |= ((dram_info->cwl) << REG_DDR3_MR2_CWL_OFFS);
1186                         dfs_reg_write(REG_DDR3_MR2_CS_ADDR +
1187                                       (cs << MR_CS_ADDR_OFFS), reg);
1188                 }
1189         }
1190
1191         DEBUG_DFS_C("DDR3 - DFS - Low To High - Ended successfuly - new Frequency - ",
1192                     freq, 1);
1193
1194         return MV_OK;
1195
1196 #else
1197
1198         /* This Flow is relevant for Armada370 A0 and ArmadaXP Z1 */
1199
1200         u32 reg, freq_par, tmp;
1201         u32 cs = 0;
1202
1203         DEBUG_DFS_C("DDR3 - DFS - Low To High - Starting DFS procedure to Frequency - ",
1204                     freq, 1);
1205
1206         /* target frequency - freq */
1207         freq_par = ddr3_get_freq_parameter(freq, ratio_2to1);
1208
1209         reg = 0x0000FF00;
1210         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
1211
1212         /* 0x1600 - PHY lock mask register */
1213         reg = reg_read(REG_ODPG_CNTRL_ADDR);
1214         reg |= (1 << REG_ODPG_CNTRL_OFFS);      /* [21] = 1 */
1215         dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
1216
1217         /* 0x1670 - PHY lock mask register */
1218         reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
1219         reg &= REG_PHY_LOCK_MASK_MASK;  /* [11:0] = 0 */
1220         dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
1221
1222         /* Enable reconfig MR Registers after DFS */
1223         reg = reg_read(REG_DFS_ADDR);   /* 0x1528 - DFS register */
1224         /* [4] - Disable - reconfig MR registers after DFS_ERG */
1225         reg &= ~0x11;
1226         /* [0] - Enable - DRAM DLL after DFS */
1227         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1228
1229         /* Disable DRAM Controller to crossbar retry */
1230         /* [0] - disable */
1231         reg = reg_read(REG_METAL_MASK_ADDR) & ~(1 << 0);
1232         /* 0x14B0 - Dunit MMask Register */
1233         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1234
1235         /* Enable DRAM Blocking */
1236         /* [1] - DFS Block enable  */
1237         reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_BLOCK_OFFS);
1238         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1239
1240         /* Enable Self refresh */
1241         /* [2] - DFS Self refresh enable  */
1242         reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_SR_OFFS);
1243         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1244
1245         /*
1246          * Poll DFS Register - All DRAM devices on all ranks are in
1247          * self refresh mode - DFS can be executed afterwards
1248          */
1249         /* 0x1528 [3] - DfsAtSR  */
1250         do {
1251                 reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1252         } while (reg == 0x0);   /* Wait for '1' */
1253
1254         /*
1255          * Set Correct Ratio - if freq>MARGIN_FREQ use 2:1 ratio
1256          * else use 1:1 ratio
1257          */
1258         if (ratio_2to1) {
1259                 /* [15] = 1 - Set 2:1 Ratio between Dunit and Phy */
1260                 reg = reg_read(REG_DDR_IO_ADDR) |
1261                         (1 << REG_DDR_IO_CLK_RATIO_OFFS);
1262         } else {
1263                 /* [15] = 0 - Set 1:1 Ratio between Dunit and Phy */
1264                 reg = reg_read(REG_DDR_IO_ADDR) &
1265                         ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
1266         }
1267         dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
1268
1269         /* Switch HCLK Mux from (100Mhz) [16]=0, keep DFS request bit */
1270         reg = 0x20040000;
1271         /*
1272          * [29] - training logic request DFS, [28:27] -
1273          * preload patterns frequency [18]
1274          */
1275
1276         /* 0x18488 - DRAM Init control status register */
1277         dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
1278
1279         /* Add delay between entering SR and start ratio modification */
1280         udelay(1);
1281
1282         /*
1283          * Initial Setup - assure that the "load new ratio" is clear (bit 24)
1284          * and in the same chance, block reassertions of reset [15:8] and
1285          * force reserved bits[7:0].
1286          */
1287         reg = 0x0000FFFF;
1288         /* 0x18700 - CPU Div CLK control 0 */
1289         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1290
1291         /*
1292          * RelaX whenever reset is asserted to that channel (good for any case)
1293          */
1294         reg = 0x0000FF00;
1295         /* 0x18704 - CPU Div CLK control 0 */
1296         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
1297
1298         reg = reg_read(REG_CPU_DIV_CLK_CTRL_3_ADDR) &
1299                 REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
1300         reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
1301         /* Full Integer ratio from PLL-out to ddr-clk */
1302         /* 0x1870C - CPU Div CLK control 3 register */
1303         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_3_ADDR, reg);
1304
1305         /*
1306          * Shut off clock enable to the DDRPHY clock channel (this is the "D").
1307          * All the rest are kept as is (forced, but could be read-modify-write).
1308          * This is done now by RMW above.
1309          */
1310
1311         reg = 0x000FFF02;
1312
1313         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
1314
1315         /* Wait before replacing the clock on the DDR Phy Channel. */
1316         udelay(1);
1317
1318         reg = 0x0102FDFF;
1319         /*
1320          * This for triggering the frequency update. Bit[24] is the
1321          * central control
1322          * bits [23:16] == which channels to change ==2 ==> only DDR Phy
1323          *                 (smooth transition)
1324          * bits [15:8] == mask reset reassertion due to clock modification
1325          *                to these channels.
1326          * bits [7:0] == not in use
1327          */
1328         /* 0x18700 - CPU Div CLK control 0 register */
1329         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1330
1331         udelay(1);
1332
1333         /*
1334          * Poll Div CLK status 0 register - indication that the clocks are
1335          * active - 0x18718 [8]
1336          */
1337         do {
1338                 reg = reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR) &
1339                         (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
1340         } while (reg == 0);
1341
1342         reg = 0x000000FF;
1343         /*
1344          * Clean the CTRL0, to be ready for next resets and next requests of
1345          * ratio modifications.
1346          */
1347         /* 0x18700 - CPU Div CLK control 0 register */
1348         dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1349
1350         udelay(5);
1351
1352         if (ratio_2to1) {
1353                 /* Pup Reset Divider B - Set Reset */
1354                 /* [28] = 0 - Pup Reset Divider B */
1355                 reg = reg_read(REG_SDRAM_CONFIG_ADDR) & ~(1 << 28);
1356                 /* [28] = 1 - Pup Reset Divider B */
1357                 tmp = reg_read(REG_SDRAM_CONFIG_ADDR) | (1 << 28);
1358                 /* 0x1400 - SDRAM Configuration register */
1359                 dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1360
1361                 /* Pup Reset Divider B - Release Reset */
1362                 /* 0x1400 - SDRAM Configuration register */
1363                 dfs_reg_write(REG_SDRAM_CONFIG_ADDR, tmp);
1364         }
1365
1366         /* DRAM Data PHYs ADLL Reset - Set Reset */
1367         reg = (reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK);
1368         /* [31:30]] - reset pup data ctrl ADLL */
1369         /* 0x15EC - DRAM PHY Config Register */
1370         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1371
1372         udelay(25);
1373
1374         /* APLL lock indication - Poll Phy lock status Register - 0x1674 [9] */
1375         do {
1376                 reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1377                         (1 << REG_PHY_LOCK_STATUS_LOCK_OFFS);
1378         } while (reg == 0);
1379
1380         /* DRAM Data PHYs ADLL Reset - Release Reset */
1381         reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK;
1382         /* [31:30] - normal pup data ctrl ADLL */
1383         /* 0x15EC - DRAM PHY Config register */
1384         dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1385
1386         udelay(10000);          /* Wait 10msec */
1387
1388         /*
1389          * APLL lock indication - Poll Phy lock status Register - 0x1674 [11:0]
1390          */
1391         do {
1392                 reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1393                         REG_PHY_LOCK_STATUS_LOCK_MASK;
1394         } while (reg != REG_PHY_LOCK_STATUS_LOCK_MASK);
1395
1396         /* DRAM Data PHY Read [30], Write [29] path reset - Set Reset */
1397         reg = reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK;
1398         /* [30:29] = 0 - Data Pup R/W path reset */
1399         /* 0x1400 - SDRAM Configuration register */
1400         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1401
1402         /* DRAM Data PHY Read [30], Write [29] path reset - Release Reset */
1403         reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
1404         /* [30:29] = '11' - Data Pup R/W path reset */
1405         /* 0x1400 - SDRAM Configuration register */
1406         dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1407
1408         /* Disable DFS Reconfig */
1409         reg = reg_read(REG_DFS_ADDR) & ~(1 << 4);
1410         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1411
1412         /* [2] - DFS Self refresh disable  */
1413         reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
1414         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1415
1416         /*
1417          * Poll DFS Register - 0x1528 [3] - DfsAtSR - All DRAM devices on
1418          * all ranks are NOT in self refresh mode
1419          */
1420         do {
1421                 reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1422         } while (reg);          /* Wait for '0' */
1423
1424         /* 0x1404 */
1425         reg = (reg_read(REG_DUNIT_CTRL_LOW_ADDR) & 0xFFFFFFE7) | 0x2;
1426
1427         /* Configure - 2T Mode - Restore original configuration */
1428         /* [3:4] 2T - Restore value */
1429         reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
1430         reg |= ((dram_info->mode_2t & REG_DUNIT_CTRL_LOW_2T_MASK) <<
1431                 REG_DUNIT_CTRL_LOW_2T_OFFS);
1432         dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
1433
1434         udelay(1);              /* Wait 1us */
1435
1436         for (cs = 0; cs < MAX_CS; cs++) {
1437                 if (dram_info->cs_ena & (1 << cs)) {
1438                         reg = (reg_read(REG_DDR3_MR1_ADDR));
1439                         /* DLL Enable */
1440                         reg &= ~(1 << REG_DDR3_MR1_DLL_ENA_OFFS);
1441                         dfs_reg_write(REG_DDR3_MR1_ADDR, reg);
1442
1443                         /* Issue MRS Command to current cs */
1444                         reg = REG_SDRAM_OPERATION_CMD_MR1 &
1445                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1446                         /*
1447                          * [3-0] = 0x4 - MR1 Command, [11-8] -
1448                          * enable current cs
1449                          */
1450                         /* 0x1418 - SDRAM Operation Register */
1451                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1452
1453                         /* Poll - Wait for Refresh operation completion */
1454                         wait_refresh_op_complete();
1455
1456                         /* DLL Reset - MR0 */
1457                         reg = reg_read(REG_DDR3_MR0_ADDR);
1458                         dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
1459
1460                         /* Issue MRS Command to current cs */
1461                         reg = REG_SDRAM_OPERATION_CMD_MR0 &
1462                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1463                         /*
1464                          * [3-0] = 0x4 - MR1 Command, [11-8] -
1465                          * enable current cs
1466                          */
1467                         /* 0x1418 - SDRAM Operation Register */
1468                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1469
1470                         /* Poll - Wait for Refresh operation completion */
1471                         wait_refresh_op_complete();
1472
1473                         reg = reg_read(REG_DDR3_MR0_ADDR);
1474                         reg &= ~0x74;   /* CL [3:0]; [6:4],[2] */
1475
1476                         if (freq == DDR_400)
1477                                 tmp = ddr3_cl_to_valid_cl(6) & 0xF;
1478                         else
1479                                 tmp = ddr3_cl_to_valid_cl(dram_info->cl) & 0xF;
1480
1481                         reg |= ((tmp & 0x1) << 2);
1482                         reg |= ((tmp >> 1) << 4);       /* to bit 4 */
1483                         dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
1484
1485                         reg = REG_SDRAM_OPERATION_CMD_MR0 &
1486                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1487                         /* 0x1418 - SDRAM Operation Register */
1488                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1489
1490                         /* Poll - Wait for Refresh operation completion */
1491                         wait_refresh_op_complete();
1492
1493                         reg = reg_read(REG_DDR3_MR2_ADDR);
1494                         reg &= ~0x38;   /* CWL [5:3] */
1495                         /* CWL = 0 ,for 400 MHg is 5 */
1496                         if (freq != DDR_400)
1497                                 reg |= dram_info->cwl << REG_DDR3_MR2_CWL_OFFS;
1498                         dfs_reg_write(REG_DDR3_MR2_ADDR, reg);
1499                         reg = REG_SDRAM_OPERATION_CMD_MR2 &
1500                                 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1501                         /* 0x1418 - SDRAM Operation Register */
1502                         dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1503
1504                         /* Poll - Wait for Refresh operation completion */
1505                         wait_refresh_op_complete();
1506
1507                         /* Set current rd_sample_delay  */
1508                         reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
1509                         reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
1510                                  (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1511                         reg |= (dram_info->cl <<
1512                                 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1513                         dfs_reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
1514
1515                         /* Set current rd_ready_delay  */
1516                         reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
1517                         reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
1518                                  (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1519                         reg |= ((dram_info->cl + 1) <<
1520                                 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1521                         dfs_reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1522                 }
1523         }
1524
1525         /* Enable ODT on DLL-on mode */
1526         dfs_reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, 0);
1527
1528         /* [1] - DFS Block disable  */
1529         reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_BLOCK_OFFS);
1530         dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1531
1532         /* Change DDR frequency to 100MHz procedure: */
1533         /* 0x1600 - PHY lock mask register */
1534         reg = reg_read(REG_ODPG_CNTRL_ADDR);
1535         reg &= ~(1 << REG_ODPG_CNTRL_OFFS);     /* [21] = 0 */
1536         dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
1537
1538         /* Change DDR frequency to 100MHz procedure: */
1539         /* 0x1670 - PHY lock mask register */
1540         reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
1541         reg |= ~REG_PHY_LOCK_MASK_MASK; /* [11:0] = FFF */
1542         dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
1543
1544         reg = reg_read(REG_METAL_MASK_ADDR) | (1 << 0); /* [0] - disable */
1545         /* 0x14B0 - Dunit MMask Register */
1546         dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1547
1548         DEBUG_DFS_C("DDR3 - DFS - Low To High - Ended successfuly - new Frequency - ",
1549                     freq, 1);
1550         return MV_OK;
1551 #endif
1552 }