ddr3-mt7629.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek DDR3 driver for MT7629 SoC
  4. *
  5. * Copyright (C) 2018 MediaTek Inc.
  6. * Author: Wu Zou <wu.zou@mediatek.com>
  7. * Ryder Lee <ryder.lee@mediatek.com>
  8. */
  9. #include <clk.h>
  10. #include <common.h>
  11. #include <dm.h>
  12. #include <ram.h>
  13. #include <asm/io.h>
  14. #include <linux/bitops.h>
  15. #include <linux/delay.h>
  16. #include <linux/sizes.h>
  17. /* EMI */
  18. #define EMI_CONA 0x000
  19. #define EMI_CONF 0x028
  20. #define EMI_CONM 0x060
  21. /* DDR PHY */
  22. #define DDRPHY_PLL1 0x0000
  23. #define DDRPHY_PLL2 0x0004
  24. #define DDRPHY_PLL3 0x0008
  25. #define DDRPHY_PLL4 0x000c
  26. #define DDRPHY_PLL5 0x0010
  27. #define DDRPHY_PLL7 0x0018
  28. #define DDRPHY_B0_DLL_ARPI0 0x0080
  29. #define DDRPHY_B0_DLL_ARPI1 0x0084
  30. #define DDRPHY_B0_DLL_ARPI2 0x0088
  31. #define DDRPHY_B0_DLL_ARPI3 0x008c
  32. #define DDRPHY_B0_DLL_ARPI4 0x0090
  33. #define DDRPHY_B0_DLL_ARPI5 0x0094
  34. #define DDRPHY_B0_DQ2 0x00a0
  35. #define DDRPHY_B0_DQ3 0x00a4
  36. #define DDRPHY_B0_DQ4 0x00a8
  37. #define DDRPHY_B0_DQ5 0x00ac
  38. #define DDRPHY_B0_DQ6 0x00b0
  39. #define DDRPHY_B0_DQ7 0x00b4
  40. #define DDRPHY_B0_DQ8 0x00b8
  41. #define DDRPHY_B1_DLL_ARPI0 0x0100
  42. #define DDRPHY_B1_DLL_ARPI1 0x0104
  43. #define DDRPHY_B1_DLL_ARPI2 0x0108
  44. #define DDRPHY_B1_DLL_ARPI3 0x010c
  45. #define DDRPHY_B1_DLL_ARPI4 0x0110
  46. #define DDRPHY_B1_DLL_ARPI5 0x0114
  47. #define DDRPHY_B1_DQ2 0x0120
  48. #define DDRPHY_B1_DQ3 0x0124
  49. #define DDRPHY_B1_DQ4 0x0128
  50. #define DDRPHY_B1_DQ5 0x012c
  51. #define DDRPHY_B1_DQ6 0x0130
  52. #define DDRPHY_B1_DQ7 0x0134
  53. #define DDRPHY_B1_DQ8 0x0138
  54. #define DDRPHY_CA_DLL_ARPI0 0x0180
  55. #define DDRPHY_CA_DLL_ARPI1 0x0184
  56. #define DDRPHY_CA_DLL_ARPI2 0x0188
  57. #define DDRPHY_CA_DLL_ARPI3 0x018c
  58. #define DDRPHY_CA_DLL_ARPI4 0x0190
  59. #define DDRPHY_CA_DLL_ARPI5 0x0194
  60. #define DDRPHY_CA_CMD2 0x01a0
  61. #define DDRPHY_CA_CMD3 0x01a4
  62. #define DDRPHY_CA_CMD5 0x01ac
  63. #define DDRPHY_CA_CMD6 0x01b0
  64. #define DDRPHY_CA_CMD7 0x01b4
  65. #define DDRPHY_CA_CMD8 0x01b8
  66. #define DDRPHY_MISC_VREF_CTRL 0x0264
  67. #define DDRPHY_MISC_IMP_CTRL0 0x0268
  68. #define DDRPHY_MISC_IMP_CTRL1 0x026c
  69. #define DDRPHY_MISC_SHU_OPT 0x0270
  70. #define DDRPHY_MISC_SPM_CTRL0 0x0274
  71. #define DDRPHY_MISC_SPM_CTRL1 0x0278
  72. #define DDRPHY_MISC_SPM_CTRL2 0x027c
  73. #define DDRPHY_MISC_CG_CTRL0 0x0284
  74. #define DDRPHY_MISC_CG_CTRL1 0x0288
  75. #define DDRPHY_MISC_CG_CTRL2 0x028c
  76. #define DDRPHY_MISC_CG_CTRL4 0x0294
  77. #define DDRPHY_MISC_CTRL0 0x029c
  78. #define DDRPHY_MISC_CTRL1 0x02a0
  79. #define DDRPHY_MISC_CTRL3 0x02a8
  80. #define DDRPHY_MISC_RXDVS1 0x05e4
  81. #define DDRPHY_SHU1_B0_DQ4 0x0c10
  82. #define DDRPHY_SHU1_B0_DQ5 0x0c14
  83. #define DDRPHY_SHU1_B0_DQ6 0x0c18
  84. #define DDRPHY_SHU1_B0_DQ7 0x0c1c
  85. #define DDRPHY_SHU1_B1_DQ4 0x0c90
  86. #define DDRPHY_SHU1_B1_DQ5 0x0c94
  87. #define DDRPHY_SHU1_B1_DQ6 0x0c98
  88. #define DDRPHY_SHU1_B1_DQ7 0x0c9c
  89. #define DDRPHY_SHU1_CA_CMD2 0x0d08
  90. #define DDRPHY_SHU1_CA_CMD4 0x0d10
  91. #define DDRPHY_SHU1_CA_CMD5 0x0d14
  92. #define DDRPHY_SHU1_CA_CMD6 0x0d18
  93. #define DDRPHY_SHU1_CA_CMD7 0x0d1c
  94. #define DDRPHY_SHU1_PLL0 0x0d80
  95. #define DDRPHY_SHU1_PLL1 0x0d84
  96. #define DDRPHY_SHU1_PLL4 0x0d90
  97. #define DDRPHY_SHU1_PLL5 0x0d94
  98. #define DDRPHY_SHU1_PLL6 0x0d98
  99. #define DDRPHY_SHU1_PLL7 0x0d9C
  100. #define DDRPHY_SHU1_PLL8 0x0da0
  101. #define DDRPHY_SHU1_PLL9 0x0da4
  102. #define DDRPHY_SHU1_PLL10 0x0da8
  103. #define DDRPHY_SHU1_PLL11 0x0dac
  104. #define DDRPHY_SHU1_R0_B0_DQ2 0x0e08
  105. #define DDRPHY_SHU1_R0_B0_DQ3 0x0e0c
  106. #define DDRPHY_SHU1_R0_B0_DQ4 0x0e10
  107. #define DDRPHY_SHU1_R0_B0_DQ5 0x0e14
  108. #define DDRPHY_SHU1_R0_B0_DQ6 0x0e18
  109. #define DDRPHY_SHU1_R0_B0_DQ7 0x0e1c
  110. #define DDRPHY_SHU1_R0_B1_DQ2 0x0e58
  111. #define DDRPHY_SHU1_R0_B1_DQ3 0x0e5c
  112. #define DDRPHY_SHU1_R0_B1_DQ4 0x0e60
  113. #define DDRPHY_SHU1_R0_B1_DQ5 0x0e64
  114. #define DDRPHY_SHU1_R0_B1_DQ6 0x0e68
  115. #define DDRPHY_SHU1_R0_B1_DQ7 0x0e6c
  116. #define DDRPHY_SHU1_R0_CA_CMD9 0x0ec4
  117. #define DDRPHY_SHU1_R1_B0_DQ2 0x0f08
  118. #define DDRPHY_SHU1_R1_B0_DQ3 0x0f0c
  119. #define DDRPHY_SHU1_R1_B0_DQ4 0x0f10
  120. #define DDRPHY_SHU1_R1_B0_DQ5 0x0f14
  121. #define DDRPHY_SHU1_R1_B0_DQ6 0x0f18
  122. #define DDRPHY_SHU1_R1_B0_DQ7 0x0f1c
  123. #define DDRPHY_SHU1_R1_B1_DQ2 0x0f58
  124. #define DDRPHY_SHU1_R1_B1_DQ3 0x0f5c
  125. #define DDRPHY_SHU1_R1_B1_DQ4 0x0f60
  126. #define DDRPHY_SHU1_R1_B1_DQ5 0x0f64
  127. #define DDRPHY_SHU1_R1_B1_DQ6 0x0f68
  128. #define DDRPHY_SHU1_R1_B1_DQ7 0x0f6c
  129. #define DDRPHY_SHU1_R1_CA_CMD9 0x0fc4
  130. /* DRAMC */
  131. #define DRAMC_DDRCONF0 0x0000
  132. #define DRAMC_DRAMCTRL 0x0004
  133. #define DRAMC_MISCTL0 0x0008
  134. #define DRAMC_PERFCTL0 0x000c
  135. #define DRAMC_ARBCTL 0x0010
  136. #define DRAMC_RSTMASK 0x001c
  137. #define DRAMC_PADCTRL 0x0020
  138. #define DRAMC_CKECTRL 0x0024
  139. #define DRAMC_RKCFG 0x0034
  140. #define DRAMC_DRAMC_PD_CTRL 0x0038
  141. #define DRAMC_CLKAR 0x003c
  142. #define DRAMC_CLKCTRL 0x0040
  143. #define DRAMC_SREFCTRL 0x0048
  144. #define DRAMC_REFCTRL0 0x004c
  145. #define DRAMC_REFCTRL1 0x0050
  146. #define DRAMC_REFRATRE_FILTER 0x0054
  147. #define DRAMC_ZQCS 0x0058
  148. #define DRAMC_MRS 0x005c
  149. #define DRAMC_SPCMD 0x0060
  150. #define DRAMC_SPCMDCTRL 0x0064
  151. #define DRAMC_HW_MRR_FUN 0x0074
  152. #define DRAMC_TEST2_1 0x0094
  153. #define DRAMC_TEST2_2 0x0098
  154. #define DRAMC_TEST2_3 0x009c
  155. #define DRAMC_TEST2_4 0x00a0
  156. #define DRAMC_CATRAINING1 0x00b0
  157. #define DRAMC_DUMMY_RD 0x00d0
  158. #define DRAMC_SHUCTRL 0x00d4
  159. #define DRAMC_SHUCTRL2 0x00dc
  160. #define DRAMC_STBCAL 0x0200
  161. #define DRAMC_STBCAL1 0x0204
  162. #define DRAMC_EYESCAN 0x020c
  163. #define DRAMC_DVFSDLL 0x0210
  164. #define DRAMC_SHU_ACTIM0 0x0800
  165. #define DRAMC_SHU_ACTIM1 0x0804
  166. #define DRAMC_SHU_ACTIM2 0x0808
  167. #define DRAMC_SHU_ACTIM3 0x080c
  168. #define DRAMC_SHU_ACTIM4 0x0810
  169. #define DRAMC_SHU_ACTIM5 0x0814
  170. #define DRAMC_SHU_ACTIM_XRT 0x081c
  171. #define DRAMC_SHU_AC_TIME_05T 0x0820
  172. #define DRAMC_SHU_CONF0 0x0840
  173. #define DRAMC_SHU_CONF1 0x0844
  174. #define DRAMC_SHU_CONF2 0x0848
  175. #define DRAMC_SHU_CONF3 0x084c
  176. #define DRAMC_SHU_RANKCTL 0x0858
  177. #define DRAMC_SHU_CKECTRL 0x085c
  178. #define DRAMC_SHU_ODTCTRL 0x0860
  179. #define DRAMC_SHU_PIPE 0x0878
  180. #define DRAMC_SHU_SELPH_CA1 0x0880
  181. #define DRAMC_SHU_SELPH_CA2 0x0884
  182. #define DRAMC_SHU_SELPH_CA3 0x0888
  183. #define DRAMC_SHU_SELPH_CA4 0x088c
  184. #define DRAMC_SHU_SELPH_CA5 0x0890
  185. #define DRAMC_SHU_SELPH_CA6 0x0894
  186. #define DRAMC_SHU_SELPH_CA7 0x0898
  187. #define DRAMC_SHU_SELPH_CA8 0x089c
  188. #define DRAMC_SHU_SELPH_DQS0 0x08a0
  189. #define DRAMC_SHU_SELPH_DQS1 0x08a4
  190. #define DRAMC_SHU1_DRVING1 0x08a8
  191. #define DRAMC_SHU1_DRVING2 0x08ac
  192. #define DRAMC_SHU1_WODT 0x08c0
  193. #define DRAMC_SHU_SCINTV 0x08c8
  194. #define DRAMC_SHURK0_DQSCTL 0x0a00
  195. #define DRAMC_SHURK0_DQSIEN 0x0a04
  196. #define DRAMC_SHURK0_SELPH_ODTEN0 0x0a1c
  197. #define DRAMC_SHURK0_SELPH_ODTEN1 0x0a20
  198. #define DRAMC_SHURK0_SELPH_DQSG0 0x0a24
  199. #define DRAMC_SHURK0_SELPH_DQSG1 0x0a28
  200. #define DRAMC_SHURK0_SELPH_DQ0 0x0a2c
  201. #define DRAMC_SHURK0_SELPH_DQ1 0x0a30
  202. #define DRAMC_SHURK0_SELPH_DQ2 0x0a34
  203. #define DRAMC_SHURK0_SELPH_DQ3 0x0a38
  204. #define DRAMC_SHURK1_DQSCTL 0x0b00
  205. #define DRAMC_SHURK1_SELPH_ODTEN0 0x0b1c
  206. #define DRAMC_SHURK1_SELPH_ODTEN1 0x0b20
  207. #define DRAMC_SHURK1_SELPH_DQSG0 0x0b24
  208. #define DRAMC_SHURK1_SELPH_DQSG1 0x0b28
  209. #define DRAMC_SHURK1_SELPH_DQ0 0x0b2c
  210. #define DRAMC_SHURK1_SELPH_DQ1 0x0b30
  211. #define DRAMC_SHURK1_SELPH_DQ2 0x0b34
  212. #define DRAMC_SHURK1_SELPH_DQ3 0x0b38
  213. #define DRAMC_SHURK2_SELPH_ODTEN0 0x0c1c
  214. #define DRAMC_SHURK2_SELPH_ODTEN1 0x0c20
  215. #define DRAMC_SHU_DQSG_RETRY 0x0c54
  216. #define EMI_COL_ADDR_MASK GENMASK(13, 12)
  217. #define EMI_COL_ADDR_SHIFT 12
  218. #define WALKING_PATTERN 0x12345678
  219. #define WALKING_STEP 0x4000000
  220. struct mtk_ddr3_priv {
  221. fdt_addr_t emi;
  222. fdt_addr_t ddrphy;
  223. fdt_addr_t dramc_ao;
  224. struct clk phy;
  225. struct clk phy_mux;
  226. struct clk mem;
  227. struct clk mem_mux;
  228. };
  229. #ifdef CONFIG_SPL_BUILD
  230. static int mtk_ddr3_rank_size_detect(struct udevice *dev)
  231. {
  232. struct mtk_ddr3_priv *priv = dev_get_priv(dev);
  233. int step;
  234. u32 start, test;
  235. /* To detect size, we have to make sure it's single rank
  236. * and it has maximum addressing region
  237. */
  238. writel(WALKING_PATTERN, CFG_SYS_SDRAM_BASE);
  239. if (readl(CFG_SYS_SDRAM_BASE) != WALKING_PATTERN)
  240. return -EINVAL;
  241. for (step = 0; step < 5; step++) {
  242. writel(~WALKING_PATTERN, CFG_SYS_SDRAM_BASE +
  243. (WALKING_STEP << step));
  244. start = readl(CFG_SYS_SDRAM_BASE);
  245. test = readl(CFG_SYS_SDRAM_BASE + (WALKING_STEP << step));
  246. if ((test != ~WALKING_PATTERN) || test == start)
  247. break;
  248. }
  249. step = step ? step - 1 : 3;
  250. clrsetbits_le32(priv->emi + EMI_CONA, EMI_COL_ADDR_MASK,
  251. step << EMI_COL_ADDR_SHIFT);
  252. return 0;
  253. }
  254. static int mtk_ddr3_init(struct udevice *dev)
  255. {
  256. struct mtk_ddr3_priv *priv = dev_get_priv(dev);
  257. int ret;
  258. ret = clk_set_parent(&priv->phy, &priv->phy_mux);
  259. if (ret)
  260. return ret;
  261. /* EMI Setting */
  262. writel(0x00003010, priv->emi + EMI_CONA);
  263. writel(0x00000000, priv->emi + EMI_CONF);
  264. writel(0x000006b8, priv->emi + EMI_CONM);
  265. /* DQS */
  266. writel(0x20c00, priv->dramc_ao + DRAMC_SHU1_DRVING1);
  267. /* Clock */
  268. writel(0x8320c83, priv->dramc_ao + DRAMC_SHU1_DRVING2);
  269. /* DDRPHY setting */
  270. writel(0x2201, priv->dramc_ao + DRAMC_DRAMCTRL);
  271. writel(0x3000000c, priv->dramc_ao + DRAMC_CLKCTRL);
  272. writel(0xe08, priv->ddrphy + DDRPHY_CA_CMD5);
  273. writel(0x60e, priv->ddrphy + DDRPHY_SHU1_CA_CMD5);
  274. writel(0x0, priv->ddrphy + DDRPHY_MISC_SPM_CTRL1);
  275. writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_SPM_CTRL0);
  276. writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_SPM_CTRL2);
  277. writel(0x6003bf, priv->ddrphy + DDRPHY_MISC_CG_CTRL2);
  278. writel(0x13300000, priv->ddrphy + DDRPHY_MISC_CG_CTRL4);
  279. writel(0x1, priv->ddrphy + DDRPHY_SHU1_CA_CMD7);
  280. writel(0x21, priv->ddrphy + DDRPHY_SHU1_B0_DQ7);
  281. writel(0x1, priv->ddrphy + DDRPHY_SHU1_B1_DQ7);
  282. writel(0xfff0, priv->ddrphy + DDRPHY_CA_CMD2);
  283. writel(0x0, priv->ddrphy + DDRPHY_B0_DQ2);
  284. writel(0x0, priv->ddrphy + DDRPHY_B1_DQ2);
  285. writel(0x7, priv->ddrphy + DDRPHY_MISC_RXDVS1);
  286. writel(0x10, priv->ddrphy + DDRPHY_PLL3);
  287. writel(0x8e8e0000, priv->ddrphy + DDRPHY_MISC_VREF_CTRL);
  288. writel(0x2e0040, priv->ddrphy + DDRPHY_MISC_IMP_CTRL0);
  289. writel(0x50060e, priv->ddrphy + DDRPHY_SHU1_B0_DQ5);
  290. writel(0x50060e, priv->ddrphy + DDRPHY_SHU1_B1_DQ5);
  291. udelay(1);
  292. writel(0x10, priv->ddrphy + DDRPHY_B0_DQ3);
  293. writel(0x10, priv->ddrphy + DDRPHY_B1_DQ3);
  294. writel(0x3f600, priv->ddrphy + DDRPHY_MISC_CG_CTRL1);
  295. writel(0x1010, priv->ddrphy + DDRPHY_B0_DQ4);
  296. writel(0x1110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
  297. writel(0x10c10d0, priv->ddrphy + DDRPHY_B0_DQ6);
  298. writel(0x3110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
  299. writel(0x1010, priv->ddrphy + DDRPHY_B1_DQ4);
  300. writel(0x1110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
  301. writel(0x10c10d0, priv->ddrphy + DDRPHY_B1_DQ6);
  302. writel(0x3110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
  303. writel(0x7fffffc, priv->ddrphy + DDRPHY_CA_CMD3);
  304. writel(0xc0010, priv->ddrphy + DDRPHY_CA_CMD6);
  305. writel(0x101, priv->ddrphy + DDRPHY_SHU1_CA_CMD2);
  306. writel(0x41e, priv->ddrphy + DDRPHY_B0_DQ3);
  307. writel(0x41e, priv->ddrphy + DDRPHY_B1_DQ3);
  308. writel(0x180101, priv->ddrphy + DDRPHY_CA_CMD8);
  309. writel(0x0, priv->ddrphy + DDRPHY_MISC_IMP_CTRL1);
  310. writel(0x11400000, priv->ddrphy + DDRPHY_MISC_CG_CTRL4);
  311. writel(0xfff0f0f0, priv->ddrphy + DDRPHY_MISC_SHU_OPT);
  312. writel(0x1f, priv->ddrphy + DDRPHY_MISC_CG_CTRL0);
  313. writel(0x0, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
  314. writel(0x0, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
  315. writel(0x0, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
  316. writel(0x40000, priv->ddrphy + DDRPHY_PLL4);
  317. writel(0x0, priv->ddrphy + DDRPHY_PLL1);
  318. writel(0x0, priv->ddrphy + DDRPHY_PLL2);
  319. writel(0x666008, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
  320. writel(0x80666008, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
  321. writel(0x80666008, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
  322. writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
  323. writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
  324. writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
  325. writel(0x400, priv->ddrphy + DDRPHY_CA_DLL_ARPI2);
  326. writel(0x20400, priv->ddrphy + DDRPHY_B0_DLL_ARPI2);
  327. writel(0x20400, priv->ddrphy + DDRPHY_B1_DLL_ARPI2);
  328. writel(0x0, priv->ddrphy + DDRPHY_SHU1_PLL9);
  329. writel(0x0, priv->ddrphy + DDRPHY_SHU1_PLL11);
  330. writel(0xf7f, priv->ddrphy + DDRPHY_SHU1_PLL0);
  331. writel(0x40000, priv->ddrphy + DDRPHY_SHU1_PLL8);
  332. writel(0x40000, priv->ddrphy + DDRPHY_SHU1_PLL10);
  333. writel(0xe57800fe, priv->ddrphy + DDRPHY_SHU1_PLL4);
  334. writel(0xe57800fe, priv->ddrphy + DDRPHY_SHU1_PLL6);
  335. writel(0xB5000000, priv->ddrphy + DDRPHY_SHU1_PLL5);
  336. writel(0xB5000000, priv->ddrphy + DDRPHY_SHU1_PLL7);
  337. writel(0x14d0002, priv->ddrphy + DDRPHY_PLL5);
  338. writel(0x14d0002, priv->ddrphy + DDRPHY_PLL7);
  339. writel(0x80040000, priv->ddrphy + DDRPHY_SHU1_PLL8);
  340. writel(0x80040000, priv->ddrphy + DDRPHY_SHU1_PLL10);
  341. writel(0xf, priv->ddrphy + DDRPHY_SHU1_PLL1);
  342. writel(0x4, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
  343. writel(0x1, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
  344. writel(0x1, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
  345. writel(0x698600, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
  346. writel(0xc0778600, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
  347. writel(0xc0778600, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
  348. writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI4);
  349. writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI4);
  350. writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI4);
  351. writel(0x2ba800, priv->ddrphy + DDRPHY_CA_DLL_ARPI1);
  352. writel(0x2ae806, priv->ddrphy + DDRPHY_B0_DLL_ARPI1);
  353. writel(0xae806, priv->ddrphy + DDRPHY_B1_DLL_ARPI1);
  354. writel(0xba000, priv->ddrphy + DDRPHY_CA_DLL_ARPI3);
  355. writel(0x2e800, priv->ddrphy + DDRPHY_B0_DLL_ARPI3);
  356. writel(0x2e800, priv->ddrphy + DDRPHY_B1_DLL_ARPI3);
  357. writel(0x0, priv->ddrphy + DDRPHY_SHU1_CA_CMD4);
  358. writel(0x0, priv->ddrphy + DDRPHY_SHU1_B0_DQ4);
  359. writel(0x0, priv->ddrphy + DDRPHY_SHU1_B1_DQ4);
  360. writel(0x4, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
  361. writel(0x1, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
  362. writel(0x1, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
  363. writel(0x32cf0000, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
  364. writel(0x32cd0000, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
  365. writel(0x32cd0000, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
  366. writel(0x80010000, priv->ddrphy + DDRPHY_PLL1);
  367. writel(0x80000000, priv->ddrphy + DDRPHY_PLL2);
  368. udelay(100);
  369. writel(0xc, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
  370. writel(0x9, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
  371. writel(0x9, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
  372. writel(0xd0000, priv->ddrphy + DDRPHY_PLL4);
  373. udelay(1);
  374. writel(0x82, priv->ddrphy + DDRPHY_MISC_CTRL1);
  375. writel(0x2, priv->dramc_ao + DRAMC_DDRCONF0);
  376. writel(0x3acf0000, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
  377. writel(0x3acd0000, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
  378. writel(0x3acd0000, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
  379. udelay(1);
  380. writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI2);
  381. writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI2);
  382. writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI2);
  383. writel(0x80, priv->ddrphy + DDRPHY_MISC_CTRL1);
  384. writel(0x0, priv->dramc_ao + DRAMC_DDRCONF0);
  385. writel(0x80000000, priv->ddrphy + DDRPHY_PLL1);
  386. udelay(1);
  387. writel(0x698e00, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
  388. udelay(1);
  389. writel(0xc0778e00, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
  390. udelay(1);
  391. writel(0xc0778e00, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
  392. udelay(1);
  393. ret = clk_set_parent(&priv->mem, &priv->mem_mux);
  394. if (ret)
  395. return ret;
  396. /* DDR PHY PLL setting */
  397. writel(0x51e, priv->ddrphy + DDRPHY_B0_DQ3);
  398. writel(0x51e, priv->ddrphy + DDRPHY_B1_DQ3);
  399. writel(0x8100008c, priv->ddrphy + DDRPHY_MISC_CTRL1);
  400. writel(0x80101, priv->ddrphy + DDRPHY_CA_CMD8);
  401. writel(0x100, priv->ddrphy + DDRPHY_CA_CMD7);
  402. writel(0x0, priv->ddrphy + DDRPHY_CA_CMD7);
  403. writel(0x0, priv->ddrphy + DDRPHY_B0_DQ7);
  404. writel(0x0, priv->ddrphy + DDRPHY_B1_DQ7);
  405. writel(0x51e, priv->ddrphy + DDRPHY_B0_DQ3);
  406. writel(0xff051e, priv->ddrphy + DDRPHY_B1_DQ3);
  407. writel(0x0, priv->ddrphy + DDRPHY_B0_DQ2);
  408. writel(0x1ff, priv->ddrphy + DDRPHY_B1_DQ2);
  409. /* Update initial setting */
  410. writel(0x5fc, priv->ddrphy + DDRPHY_B0_DQ3);
  411. writel(0xff05fc, priv->ddrphy + DDRPHY_B1_DQ3);
  412. writel(0x10c12d9, priv->ddrphy + DDRPHY_B0_DQ6);
  413. writel(0x10c12d9, priv->ddrphy + DDRPHY_B1_DQ6);
  414. writel(0xc0259, priv->ddrphy + DDRPHY_CA_CMD6);
  415. writel(0x4000, priv->ddrphy + DDRPHY_B0_DQ2);
  416. writel(0x41ff, priv->ddrphy + DDRPHY_B1_DQ2);
  417. writel(0x0, priv->ddrphy + DDRPHY_B0_DQ8);
  418. writel(0x100, priv->ddrphy + DDRPHY_B1_DQ8);
  419. writel(0x3110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
  420. writel(0x3110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
  421. writel(0x51060e, priv->ddrphy + DDRPHY_SHU1_B0_DQ5);
  422. writel(0x51060e, priv->ddrphy + DDRPHY_SHU1_B1_DQ5);
  423. writel(0x39eff6, priv->dramc_ao + DRAMC_SHU_SCINTV);
  424. writel(0x204ffff, priv->dramc_ao + DRAMC_CLKAR);
  425. writel(0x31b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  426. writel(0x0, priv->dramc_ao + DRAMC_PERFCTL0);
  427. writel(0x80000, priv->dramc_ao + DRAMC_PERFCTL0);
  428. /* Dramc setting PC3 */
  429. writel(0x65714001, priv->dramc_ao + DRAMC_REFCTRL0);
  430. writel(0x11351131, priv->ddrphy + DDRPHY_MISC_CTRL3);
  431. writel(0x200600, priv->dramc_ao + DRAMC_SHU_DQSG_RETRY);
  432. writel(0x101d007, priv->dramc_ao + DRAMC_SHUCTRL2);
  433. writel(0xe090601, priv->dramc_ao + DRAMC_DVFSDLL);
  434. writel(0x20003000, priv->dramc_ao + DRAMC_DDRCONF0);
  435. writel(0x3900020f, priv->ddrphy + DDRPHY_MISC_CTRL0);
  436. writel(0xa20810bf, priv->dramc_ao + DRAMC_SHU_CONF0);
  437. writel(0x30050, priv->dramc_ao + DRAMC_SHU_ODTCTRL);
  438. writel(0x25712000, priv->dramc_ao + DRAMC_REFCTRL0);
  439. writel(0xb0100000, priv->dramc_ao + DRAMC_STBCAL);
  440. writel(0x8000000, priv->dramc_ao + DRAMC_SREFCTRL);
  441. writel(0xc0000000, priv->dramc_ao + DRAMC_SHU_PIPE);
  442. writel(0x731004, priv->dramc_ao + DRAMC_RKCFG);
  443. writel(0x8007320f, priv->dramc_ao + DRAMC_SHU_CONF2);
  444. writel(0x2a7c0, priv->dramc_ao + DRAMC_SHU_SCINTV);
  445. writel(0xc110, priv->dramc_ao + DRAMC_SHUCTRL);
  446. writel(0x30000700, priv->dramc_ao + DRAMC_REFCTRL1);
  447. writel(0x6543b321, priv->dramc_ao + DRAMC_REFRATRE_FILTER);
  448. /* Update PCDDR3 default setting */
  449. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA1);
  450. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA2);
  451. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA3);
  452. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA4);
  453. writel(0x10000111, priv->dramc_ao + DRAMC_SHU_SELPH_CA5);
  454. writel(0x1000000, priv->dramc_ao + DRAMC_SHU_SELPH_CA6);
  455. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA7);
  456. writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA8);
  457. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_CA_CMD9);
  458. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_CA_CMD9);
  459. writel(0x11112222, priv->dramc_ao + DRAMC_SHU_SELPH_DQS0);
  460. writel(0x33331111, priv->dramc_ao + DRAMC_SHU_SELPH_DQS1);
  461. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ0);
  462. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ1);
  463. writel(0x33331111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ2);
  464. writel(0x33331111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ3);
  465. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ0);
  466. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ1);
  467. writel(0x33331111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ2);
  468. writel(0x33331111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ3);
  469. writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
  470. writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ7);
  471. writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
  472. writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ7);
  473. writel(0x0, priv->dramc_ao + DRAMC_SHURK0_SELPH_ODTEN0);
  474. writel(0x0, priv->dramc_ao + DRAMC_SHURK0_SELPH_ODTEN1);
  475. writel(0x0, priv->dramc_ao + DRAMC_SHURK1_SELPH_ODTEN0);
  476. writel(0x0, priv->dramc_ao + DRAMC_SHURK1_SELPH_ODTEN1);
  477. writel(0x0, priv->dramc_ao + DRAMC_SHURK2_SELPH_ODTEN0);
  478. writel(0x66666666, priv->dramc_ao + DRAMC_SHURK2_SELPH_ODTEN1);
  479. writel(0x2c000b0f, priv->dramc_ao + DRAMC_SHU_CONF1);
  480. writel(0x11111111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG0);
  481. writel(0x64646464, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG1);
  482. writel(0x11111111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQSG0);
  483. writel(0x64646464, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQSG1);
  484. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ2);
  485. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ3);
  486. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ4);
  487. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ5);
  488. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ6);
  489. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ2);
  490. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ3);
  491. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ4);
  492. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ5);
  493. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ6);
  494. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ2);
  495. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ3);
  496. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ4);
  497. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ5);
  498. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ6);
  499. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ2);
  500. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ3);
  501. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ4);
  502. writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ5);
  503. writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ6);
  504. writel(0x20000001, priv->dramc_ao + DRAMC_SHU_RANKCTL);
  505. writel(0x2, priv->dramc_ao + DRAMC_SHURK0_DQSCTL);
  506. writel(0x2, priv->dramc_ao + DRAMC_SHURK1_DQSCTL);
  507. writel(0x4020b07, priv->dramc_ao + DRAMC_SHU_ACTIM0);
  508. writel(0xb060400, priv->dramc_ao + DRAMC_SHU_ACTIM1);
  509. writel(0x8090200, priv->dramc_ao + DRAMC_SHU_ACTIM2);
  510. writel(0x810018, priv->dramc_ao + DRAMC_SHU_ACTIM3);
  511. writel(0x1e9700ff, priv->dramc_ao + DRAMC_SHU_ACTIM4);
  512. writel(0x1000908, priv->dramc_ao + DRAMC_SHU_ACTIM5);
  513. writel(0x801040b, priv->dramc_ao + DRAMC_SHU_ACTIM_XRT);
  514. writel(0x20000D1, priv->dramc_ao + DRAMC_SHU_AC_TIME_05T);
  515. writel(0x80010000, priv->ddrphy + DDRPHY_PLL2);
  516. udelay(500);
  517. writel(0x81080000, priv->dramc_ao + DRAMC_MISCTL0);
  518. writel(0xacf13, priv->dramc_ao + DRAMC_PERFCTL0);
  519. writel(0xacf12, priv->dramc_ao + DRAMC_PERFCTL0);
  520. writel(0x80, priv->dramc_ao + DRAMC_ARBCTL);
  521. writel(0x9, priv->dramc_ao + DRAMC_PADCTRL);
  522. writel(0x80000107, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
  523. writel(0x3000000c, priv->dramc_ao + DRAMC_CLKCTRL);
  524. writel(0x25714001, priv->dramc_ao + DRAMC_REFCTRL0);
  525. writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  526. writel(0x4300000, priv->dramc_ao + DRAMC_CATRAINING1);
  527. writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
  528. writel(0x731414, priv->dramc_ao + DRAMC_RKCFG);
  529. writel(0x733414, priv->dramc_ao + DRAMC_RKCFG);
  530. udelay(20);
  531. writel(0x80002050, priv->dramc_ao + DRAMC_CKECTRL);
  532. udelay(100);
  533. writel(0x400000, priv->dramc_ao + DRAMC_MRS);
  534. writel(0x401800, priv->dramc_ao + DRAMC_MRS);
  535. writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
  536. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  537. udelay(100);
  538. writel(0x601800, priv->dramc_ao + DRAMC_MRS);
  539. writel(0x600000, priv->dramc_ao + DRAMC_MRS);
  540. writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
  541. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  542. udelay(100);
  543. writel(0x200000, priv->dramc_ao + DRAMC_MRS);
  544. writel(0x200400, priv->dramc_ao + DRAMC_MRS);
  545. writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
  546. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  547. udelay(100);
  548. writel(0x400, priv->dramc_ao + DRAMC_MRS);
  549. writel(0x1d7000, priv->dramc_ao + DRAMC_MRS);
  550. writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
  551. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  552. udelay(100);
  553. writel(0x702201, priv->dramc_ao + DRAMC_DRAMCTRL);
  554. writel(0x10, priv->dramc_ao + DRAMC_SPCMD);
  555. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  556. writel(0x20, priv->dramc_ao + DRAMC_SPCMD);
  557. writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
  558. writel(0x1, priv->dramc_ao + DRAMC_HW_MRR_FUN);
  559. writel(0x702301, priv->dramc_ao + DRAMC_DRAMCTRL);
  560. writel(0x702301, priv->dramc_ao + DRAMC_DRAMCTRL);
  561. writel(0xa56, priv->dramc_ao + DRAMC_ZQCS);
  562. writel(0xff0000, priv->dramc_ao + DRAMC_SHU_CONF3);
  563. writel(0x15b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  564. writel(0x2cb00b0f, priv->dramc_ao + DRAMC_SHU_CONF1);
  565. writel(0x65714001, priv->dramc_ao + DRAMC_REFCTRL0);
  566. writel(0x48000000, priv->dramc_ao + DRAMC_SREFCTRL);
  567. writel(0xc0000107, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
  568. writel(0x10002, priv->dramc_ao + DRAMC_EYESCAN);
  569. writel(0x15e00, priv->dramc_ao + DRAMC_STBCAL1);
  570. writel(0x100000, priv->dramc_ao + DRAMC_TEST2_1);
  571. writel(0x4000, priv->dramc_ao + DRAMC_TEST2_2);
  572. writel(0x12000480, priv->dramc_ao + DRAMC_TEST2_3);
  573. writel(0x301d007, priv->dramc_ao + DRAMC_SHUCTRL2);
  574. writel(0x4782321, priv->dramc_ao + DRAMC_DRAMCTRL);
  575. writel(0x30210000, priv->dramc_ao + DRAMC_SHU_CKECTRL);
  576. writel(0x20000, priv->dramc_ao + DRAMC_DUMMY_RD);
  577. writel(0x4080110d, priv->dramc_ao + DRAMC_TEST2_4);
  578. writel(0x30000721, priv->dramc_ao + DRAMC_REFCTRL1);
  579. writel(0x0, priv->dramc_ao + DRAMC_RSTMASK);
  580. writel(0x4782320, priv->dramc_ao + DRAMC_DRAMCTRL);
  581. writel(0x80002000, priv->dramc_ao + DRAMC_CKECTRL);
  582. writel(0x45714001, priv->dramc_ao + DRAMC_REFCTRL0);
  583. /* Apply config before calibration */
  584. writel(0x120, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
  585. writel(0x11351131, priv->ddrphy + DDRPHY_MISC_CTRL3);
  586. writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_CG_CTRL0);
  587. writel(0x2a7fe, priv->dramc_ao + DRAMC_SHU_SCINTV);
  588. writel(0xff01ff, priv->dramc_ao + DRAMC_SHU_CONF3);
  589. writel(0x4782320, priv->dramc_ao + DRAMC_DRAMCTRL);
  590. writel(0xa56, priv->dramc_ao + DRAMC_ZQCS);
  591. writel(0x80000000, priv->dramc_ao + DRAMC_SHU1_WODT);
  592. writel(0x21, priv->ddrphy + DDRPHY_SHU1_B0_DQ7);
  593. writel(0x1, priv->ddrphy + DDRPHY_SHU1_B1_DQ7);
  594. writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  595. writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  596. writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
  597. writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
  598. writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
  599. writel(0x10002, priv->dramc_ao + DRAMC_EYESCAN);
  600. writel(0x8100008c, priv->ddrphy + DDRPHY_MISC_CTRL1);
  601. writel(0x45714001, priv->dramc_ao + DRAMC_REFCTRL0);
  602. writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
  603. writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
  604. /* Write leveling */
  605. writel(0x1f2e2e00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
  606. writel(0x202f2f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
  607. writel(0x33221100, priv->dramc_ao + DRAMC_SHU_SELPH_DQS1);
  608. writel(0x11112222, priv->dramc_ao + DRAMC_SHU_SELPH_DQS0);
  609. /* RX dqs gating cal */
  610. writel(0x11111010, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG0);
  611. writel(0x20201717, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG1);
  612. writel(0x1d1f, priv->dramc_ao + DRAMC_SHURK0_DQSIEN);
  613. /* RX window per-bit cal */
  614. writel(0x03030404, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ2);
  615. writel(0x01010303, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ3);
  616. writel(0x01010303, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ4);
  617. writel(0x01010000, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ5);
  618. writel(0x03030606, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ2);
  619. writel(0x02020202, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ3);
  620. writel(0x04040303, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ4);
  621. writel(0x06060101, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ5);
  622. /* RX datlat cal */
  623. writel(0x28b00a0e, priv->dramc_ao + DRAMC_SHU_CONF1);
  624. /* TX window per-byte with 2UI cal */
  625. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ0);
  626. writel(0x22220000, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ2);
  627. writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ1);
  628. writel(0x22220000, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ3);
  629. writel(0x1f2e2e00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
  630. writel(0x202f2f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
  631. return mtk_ddr3_rank_size_detect(dev);
  632. }
  633. #endif
  634. static int mtk_ddr3_probe(struct udevice *dev)
  635. {
  636. struct mtk_ddr3_priv *priv = dev_get_priv(dev);
  637. priv->emi = dev_read_addr_index(dev, 0);
  638. if (priv->emi == FDT_ADDR_T_NONE)
  639. return -EINVAL;
  640. priv->ddrphy = dev_read_addr_index(dev, 1);
  641. if (priv->ddrphy == FDT_ADDR_T_NONE)
  642. return -EINVAL;
  643. priv->dramc_ao = dev_read_addr_index(dev, 2);
  644. if (priv->dramc_ao == FDT_ADDR_T_NONE)
  645. return -EINVAL;
  646. #ifdef CONFIG_SPL_BUILD
  647. int ret;
  648. ret = clk_get_by_index(dev, 0, &priv->phy);
  649. if (ret)
  650. return ret;
  651. ret = clk_get_by_index(dev, 1, &priv->phy_mux);
  652. if (ret)
  653. return ret;
  654. ret = clk_get_by_index(dev, 2, &priv->mem);
  655. if (ret)
  656. return ret;
  657. ret = clk_get_by_index(dev, 3, &priv->mem_mux);
  658. if (ret)
  659. return ret;
  660. ret = mtk_ddr3_init(dev);
  661. if (ret)
  662. return ret;
  663. #endif
  664. return 0;
  665. }
  666. static int mtk_ddr3_get_info(struct udevice *dev, struct ram_info *info)
  667. {
  668. struct mtk_ddr3_priv *priv = dev_get_priv(dev);
  669. u32 val = readl(priv->emi + EMI_CONA);
  670. info->base = CFG_SYS_SDRAM_BASE;
  671. switch ((val & EMI_COL_ADDR_MASK) >> EMI_COL_ADDR_SHIFT) {
  672. case 0:
  673. info->size = SZ_128M;
  674. break;
  675. case 1:
  676. info->size = SZ_256M;
  677. break;
  678. case 2:
  679. info->size = SZ_512M;
  680. break;
  681. case 3:
  682. info->size = SZ_1G;
  683. break;
  684. default:
  685. return -EINVAL;
  686. }
  687. return 0;
  688. }
  689. static struct ram_ops mtk_ddr3_ops = {
  690. .get_info = mtk_ddr3_get_info,
  691. };
  692. static const struct udevice_id mtk_ddr3_ids[] = {
  693. { .compatible = "mediatek,mt7629-dramc" },
  694. { }
  695. };
  696. U_BOOT_DRIVER(mediatek_ddr3) = {
  697. .name = "mediatek_ddr3",
  698. .id = UCLASS_RAM,
  699. .of_match = mtk_ddr3_ids,
  700. .ops = &mtk_ddr3_ops,
  701. .probe = mtk_ddr3_probe,
  702. .priv_auto = sizeof(struct mtk_ddr3_priv),
  703. };