blanche.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. /*
  2. * board/renesas/blanche/blanche.c
  3. * This file is blanche board support.
  4. *
  5. * Copyright (C) 2016 Renesas Electronics Corporation
  6. *
  7. * SPDX-License-Identifier: GPL-2.0
  8. */
  9. #include <common.h>
  10. #include <malloc.h>
  11. #include <netdev.h>
  12. #include <dm.h>
  13. #include <dm/platform_data/serial_sh.h>
  14. #include <asm/processor.h>
  15. #include <asm/mach-types.h>
  16. #include <asm/io.h>
  17. #include <linux/errno.h>
  18. #include <asm/arch/sys_proto.h>
  19. #include <asm/gpio.h>
  20. #include <asm/arch/rmobile.h>
  21. #include <asm/arch/rcar-mstp.h>
  22. #include <asm/arch/mmc.h>
  23. #include <asm/arch/sh_sdhi.h>
  24. #include <miiphy.h>
  25. #include <i2c.h>
  26. #include <mmc.h>
  27. #include "qos.h"
  28. DECLARE_GLOBAL_DATA_PTR;
  29. struct pin_db {
  30. u32 addr; /* register address */
  31. u32 mask; /* mask value */
  32. u32 val; /* setting value */
  33. };
  34. #define PMMR 0xE6060000
  35. #define GPSR0 0xE6060004
  36. #define GPSR1 0xE6060008
  37. #define GPSR4 0xE6060014
  38. #define GPSR5 0xE6060018
  39. #define GPSR6 0xE606001C
  40. #define GPSR7 0xE6060020
  41. #define GPSR8 0xE6060024
  42. #define GPSR9 0xE6060028
  43. #define GPSR10 0xE606002C
  44. #define GPSR11 0xE6060030
  45. #define IPSR6 0xE6060058
  46. #define PUPR2 0xE6060108
  47. #define PUPR3 0xE606010C
  48. #define PUPR4 0xE6060110
  49. #define PUPR5 0xE6060114
  50. #define PUPR7 0xE606011C
  51. #define PUPR9 0xE6060124
  52. #define PUPR10 0xE6060128
  53. #define PUPR11 0xE606012C
  54. #define CPG_PLL1CR 0xE6150028
  55. #define CPG_PLL3CR 0xE61500DC
  56. #define SetREG(x) \
  57. writel((readl((x)->addr) & ~((x)->mask)) | ((x)->val), (x)->addr)
  58. #define SetGuardREG(x) \
  59. { \
  60. u32 val; \
  61. val = (readl((x)->addr) & ~((x)->mask)) | ((x)->val); \
  62. writel(~val, PMMR); \
  63. writel(val, (x)->addr); \
  64. }
  65. struct pin_db pin_guard[] = {
  66. { GPSR0, 0xFFFFFFFF, 0x0BFFFFFF },
  67. { GPSR1, 0xFFFFFFFF, 0x002FFFFF },
  68. { GPSR4, 0xFFFFFFFF, 0x00000FFF },
  69. { GPSR5, 0xFFFFFFFF, 0x00010FFF },
  70. { GPSR6, 0xFFFFFFFF, 0x00010FFF },
  71. { GPSR7, 0xFFFFFFFF, 0x00010FFF },
  72. { GPSR8, 0xFFFFFFFF, 0x00010FFF },
  73. { GPSR9, 0xFFFFFFFF, 0x00010FFF },
  74. { GPSR10, 0xFFFFFFFF, 0x04006000 },
  75. { GPSR11, 0xFFFFFFFF, 0x303FEFE0 },
  76. { IPSR6, 0xFFFFFFFF, 0x0002000E },
  77. };
  78. struct pin_db pin_tbl[] = {
  79. { PUPR2, 0xFFFFFFFF, 0x00000000 },
  80. { PUPR3, 0xFFFFFFFF, 0x0803FF40 },
  81. { PUPR4, 0xFFFFFFFF, 0x0000FFFF },
  82. { PUPR5, 0xFFFFFFFF, 0x00010FFF },
  83. { PUPR7, 0xFFFFFFFF, 0x0001AFFF },
  84. { PUPR9, 0xFFFFFFFF, 0x0001CFFF },
  85. { PUPR10, 0xFFFFFFFF, 0xC0438001 },
  86. { PUPR11, 0xFFFFFFFF, 0x0FC00007 },
  87. };
  88. void pin_init(void)
  89. {
  90. struct pin_db *db;
  91. for (db = pin_guard; db < &pin_guard[sizeof(pin_guard)/sizeof(struct pin_db)]; db++) {
  92. SetGuardREG(db);
  93. }
  94. for (db = pin_tbl; db < &pin_tbl[sizeof(pin_tbl) /sizeof(struct pin_db)]; db++) {
  95. SetREG(db);
  96. }
  97. }
  98. #define s_init_wait(cnt) \
  99. ({ \
  100. volatile u32 i = 0x10000 * cnt; \
  101. while (i > 0) \
  102. i--; \
  103. })
  104. void s_init(void)
  105. {
  106. struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
  107. struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
  108. u32 cpu_type;
  109. cpu_type = rmobile_get_cpu_type();
  110. if (cpu_type == 0x4A) {
  111. writel(0x4D000000, CPG_PLL1CR);
  112. writel(0x4F000000, CPG_PLL3CR);
  113. }
  114. /* Watchdog init */
  115. writel(0xA5A5A500, &rwdt->rwtcsra);
  116. writel(0xA5A5A500, &swdt->swtcsra);
  117. /* QoS(Quality-of-Service) Init */
  118. qos_init();
  119. /* SCIF Init */
  120. pin_init();
  121. #if !defined(CONFIG_SYS_NO_FLASH)
  122. struct rcar_lbsc *lbsc = (struct rcar_lbsc *)LBSC_BASE;
  123. struct rcar_dbsc3 *dbsc3_0 = (struct rcar_dbsc3 *)DBSC3_0_BASE;
  124. /* LBSC */
  125. writel(0x00000020, &lbsc->cs0ctrl);
  126. writel(0x00000020, &lbsc->cs1ctrl);
  127. writel(0x00002020, &lbsc->ecs0ctrl);
  128. writel(0x00002020, &lbsc->ecs1ctrl);
  129. writel(0x2A103320, &lbsc->cswcr0);
  130. writel(0x2A103320, &lbsc->cswcr1);
  131. writel(0x19102110, &lbsc->ecswcr0);
  132. writel(0x19102110, &lbsc->ecswcr1);
  133. /* DBSC3 */
  134. s_init_wait(10);
  135. writel(0x0000A55A, &dbsc3_0->dbpdlck);
  136. writel(0x21000000, &dbsc3_0->dbcmd); /* opc=RstH (RESET => H) */
  137. writel(0x11000000, &dbsc3_0->dbcmd); /* opc=PDXt(CKE=H) */
  138. writel(0x10000000, &dbsc3_0->dbcmd); /* opc=PDEn(CKE=L) */
  139. /* Stop Auto-Calibration */
  140. writel(0x00000001, &dbsc3_0->dbpdrga);
  141. writel(0x80000000, &dbsc3_0->dbpdrgd);
  142. writel(0x00000004, &dbsc3_0->dbpdrga);
  143. while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
  144. /* PLLCR: PLL Control Register */
  145. writel(0x00000006, &dbsc3_0->dbpdrga);
  146. writel(0x0001C000, &dbsc3_0->dbpdrgd); // > DDR1440
  147. /* DXCCR: DATX8 Common Configuration Register */
  148. writel(0x0000000F, &dbsc3_0->dbpdrga);
  149. writel(0x00181EE4, &dbsc3_0->dbpdrgd);
  150. /* DSGCR :DDR System General Configuration Register */
  151. writel(0x00000010, &dbsc3_0->dbpdrga);
  152. writel(0xF00464DB, &dbsc3_0->dbpdrgd);
  153. writel(0x00000061, &dbsc3_0->dbpdrga);
  154. writel(0x0000008D, &dbsc3_0->dbpdrgd);
  155. /* Re-Execute ZQ calibration */
  156. writel(0x00000001, &dbsc3_0->dbpdrga);
  157. writel(0x00000073, &dbsc3_0->dbpdrgd);
  158. writel(0x00000007, &dbsc3_0->dbkind);
  159. writel(0x0F030A02, &dbsc3_0->dbconf0);
  160. writel(0x00000001, &dbsc3_0->dbphytype);
  161. writel(0x00000000, &dbsc3_0->dbbl);
  162. writel(0x0000000B, &dbsc3_0->dbtr0); // tCL=11
  163. writel(0x00000008, &dbsc3_0->dbtr1); // tCWL=8
  164. writel(0x00000000, &dbsc3_0->dbtr2); // tAL=0
  165. writel(0x0000000B, &dbsc3_0->dbtr3); // tRCD=11
  166. writel(0x000C000B, &dbsc3_0->dbtr4); // tRPA=12,tRP=11
  167. writel(0x00000027, &dbsc3_0->dbtr5); // tRC = 39
  168. writel(0x0000001C, &dbsc3_0->dbtr6); // tRAS = 28
  169. writel(0x00000006, &dbsc3_0->dbtr7); // tRRD = 6
  170. writel(0x00000020, &dbsc3_0->dbtr8); // tRFAW = 32
  171. writel(0x00000008, &dbsc3_0->dbtr9); // tRDPR = 8
  172. writel(0x0000000C, &dbsc3_0->dbtr10); // tWR = 12
  173. writel(0x00000009, &dbsc3_0->dbtr11); // tRDWR = 9
  174. writel(0x00000012, &dbsc3_0->dbtr12); // tWRRD = 18
  175. writel(0x000000D0, &dbsc3_0->dbtr13); // tRFC = 208
  176. writel(0x00140005, &dbsc3_0->dbtr14);
  177. writel(0x00050004, &dbsc3_0->dbtr15);
  178. writel(0x70233005, &dbsc3_0->dbtr16); /* DQL = 35, WDQL = 5 */
  179. writel(0x000C0000, &dbsc3_0->dbtr17);
  180. writel(0x00000300, &dbsc3_0->dbtr18);
  181. writel(0x00000040, &dbsc3_0->dbtr19);
  182. writel(0x00000001, &dbsc3_0->dbrnk0);
  183. writel(0x00020001, &dbsc3_0->dbadj0);
  184. writel(0x20082004, &dbsc3_0->dbadj2); /* blanche QoS rev0.1 */
  185. writel(0x00020002, &dbsc3_0->dbwt0cnf0); /* 1600 */
  186. writel(0x0000001F, &dbsc3_0->dbwt0cnf4);
  187. while ((readl(&dbsc3_0->dbdfistat) & 0x00000001) != 0x00000001);
  188. writel(0x00000011, &dbsc3_0->dbdficnt);
  189. /* PGCR1 :PHY General Configuration Register 1 */
  190. writel(0x00000003, &dbsc3_0->dbpdrga);
  191. writel(0x0300C4E1, &dbsc3_0->dbpdrgd); /* DDR3 */
  192. /* PGCR2: PHY General Configuration Registers 2 */
  193. writel(0x00000023, &dbsc3_0->dbpdrga);
  194. writel(0x00FCDB60, &dbsc3_0->dbpdrgd);
  195. writel(0x00000011, &dbsc3_0->dbpdrga);
  196. writel(0x1000040B, &dbsc3_0->dbpdrgd);
  197. /* DTPR0 :DRAM Timing Parameters Register 0 */
  198. writel(0x00000012, &dbsc3_0->dbpdrga);
  199. writel(0x9D9CBB66, &dbsc3_0->dbpdrgd);
  200. /* DTPR1 :DRAM Timing Parameters Register 1 */
  201. writel(0x00000013, &dbsc3_0->dbpdrga);
  202. writel(0x1A868400, &dbsc3_0->dbpdrgd);
  203. /* DTPR2 ::DRAM Timing Parameters Register 2 */
  204. writel(0x00000014, &dbsc3_0->dbpdrga);
  205. writel(0x300214D8, &dbsc3_0->dbpdrgd);
  206. /* MR0 :Mode Register 0 */
  207. writel(0x00000015, &dbsc3_0->dbpdrga);
  208. writel(0x00000D70, &dbsc3_0->dbpdrgd);
  209. /* MR1 :Mode Register 1 */
  210. writel(0x00000016, &dbsc3_0->dbpdrga);
  211. writel(0x00000004, &dbsc3_0->dbpdrgd); /* DRAM Drv 40ohm */
  212. /* MR2 :Mode Register 2 */
  213. writel(0x00000017, &dbsc3_0->dbpdrga);
  214. writel(0x00000018, &dbsc3_0->dbpdrgd); /* CWL=8 */
  215. /* VREF(ZQCAL) */
  216. writel(0x0000001A, &dbsc3_0->dbpdrga);
  217. writel(0x910035C7, &dbsc3_0->dbpdrgd);
  218. /* PGSR0 :PHY General Status Registers 0 */
  219. writel(0x00000004, &dbsc3_0->dbpdrga);
  220. while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
  221. /* DRAM Init (set MRx etc) */
  222. writel(0x00000001, &dbsc3_0->dbpdrga);
  223. writel(0x00000181, &dbsc3_0->dbpdrgd);
  224. /* CKE = H */
  225. writel(0x11000000, &dbsc3_0->dbcmd); /* opc=PDXt(CKE=H) */
  226. /* PGSR0 :PHY General Status Registers 0 */
  227. writel(0x00000004, &dbsc3_0->dbpdrga);
  228. while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
  229. /* RAM ACC Training */
  230. writel(0x00000001, &dbsc3_0->dbpdrga);
  231. writel(0x0000FE01, &dbsc3_0->dbpdrgd);
  232. /* Bus control 0 */
  233. writel(0x00000000, &dbsc3_0->dbbs0cnt1);
  234. /* DDR3 Calibration set */
  235. writel(0x01004C20, &dbsc3_0->dbcalcnf);
  236. /* DDR3 Calibration timing */
  237. writel(0x014000AA, &dbsc3_0->dbcaltr);
  238. /* Refresh */
  239. writel(0x00000140, &dbsc3_0->dbrfcnf0);
  240. writel(0x00081860, &dbsc3_0->dbrfcnf1);
  241. writel(0x00010000, &dbsc3_0->dbrfcnf2);
  242. /* PGSR0 :PHY General Status Registers 0 */
  243. writel(0x00000004, &dbsc3_0->dbpdrga);
  244. while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
  245. /* Enable Auto-Refresh */
  246. writel(0x00000001, &dbsc3_0->dbrfen);
  247. /* Permit DDR-Access */
  248. writel(0x00000001, &dbsc3_0->dbacen);
  249. /* This locks the access to the PHY unit registers */
  250. writel(0x00000000, &dbsc3_0->dbpdlck);
  251. #endif /* CONFIG_SYS_NO_FLASH */
  252. }
  253. #define TMU0_MSTP125 (1 << 25)
  254. #define SCIF0_MSTP721 (1 << 21)
  255. #define SDHI0_MSTP314 (1 << 14)
  256. #define QSPI_MSTP917 (1 << 17)
  257. int board_early_init_f(void)
  258. {
  259. /* TMU0 */
  260. mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
  261. /* SCIF0 */
  262. mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF0_MSTP721);
  263. /* SDHI0 */
  264. mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SDHI0_MSTP314);
  265. /* QSPI */
  266. mstp_clrbits_le32(MSTPSR9, SMSTPCR9, QSPI_MSTP917);
  267. return 0;
  268. }
  269. DECLARE_GLOBAL_DATA_PTR;
  270. int board_init(void)
  271. {
  272. /* adress of boot parameters */
  273. gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
  274. /* Init PFC controller */
  275. r8a7792_pinmux_init();
  276. gpio_request(GPIO_FN_D0, NULL);
  277. gpio_request(GPIO_FN_D1, NULL);
  278. gpio_request(GPIO_FN_D2, NULL);
  279. gpio_request(GPIO_FN_D3, NULL);
  280. gpio_request(GPIO_FN_D4, NULL);
  281. gpio_request(GPIO_FN_D5, NULL);
  282. gpio_request(GPIO_FN_D6, NULL);
  283. gpio_request(GPIO_FN_D7, NULL);
  284. gpio_request(GPIO_FN_D8, NULL);
  285. gpio_request(GPIO_FN_D9, NULL);
  286. gpio_request(GPIO_FN_D10, NULL);
  287. gpio_request(GPIO_FN_D11, NULL);
  288. gpio_request(GPIO_FN_D12, NULL);
  289. gpio_request(GPIO_FN_D13, NULL);
  290. gpio_request(GPIO_FN_D14, NULL);
  291. gpio_request(GPIO_FN_D15, NULL);
  292. gpio_request(GPIO_FN_A0, NULL);
  293. gpio_request(GPIO_FN_A1, NULL);
  294. gpio_request(GPIO_FN_A2, NULL);
  295. gpio_request(GPIO_FN_A3, NULL);
  296. gpio_request(GPIO_FN_A4, NULL);
  297. gpio_request(GPIO_FN_A5, NULL);
  298. gpio_request(GPIO_FN_A6, NULL);
  299. gpio_request(GPIO_FN_A7, NULL);
  300. gpio_request(GPIO_FN_A8, NULL);
  301. gpio_request(GPIO_FN_A9, NULL);
  302. gpio_request(GPIO_FN_A10, NULL);
  303. gpio_request(GPIO_FN_A11, NULL);
  304. gpio_request(GPIO_FN_A12, NULL);
  305. gpio_request(GPIO_FN_A13, NULL);
  306. gpio_request(GPIO_FN_A14, NULL);
  307. gpio_request(GPIO_FN_A15, NULL);
  308. gpio_request(GPIO_FN_A16, NULL);
  309. gpio_request(GPIO_FN_A17, NULL);
  310. gpio_request(GPIO_FN_A18, NULL);
  311. gpio_request(GPIO_FN_A19, NULL);
  312. #if defined(CONFIG_SYS_NO_FLASH)
  313. gpio_request(GPIO_FN_MOSI_IO0, NULL);
  314. gpio_request(GPIO_FN_MISO_IO1, NULL);
  315. gpio_request(GPIO_FN_IO2, NULL);
  316. gpio_request(GPIO_FN_IO3, NULL);
  317. gpio_request(GPIO_FN_SPCLK, NULL);
  318. gpio_request(GPIO_FN_SSL, NULL);
  319. #else /* CONFIG_SYS_NO_FLASH */
  320. gpio_request(GPIO_FN_A20, NULL);
  321. gpio_request(GPIO_FN_A21, NULL);
  322. gpio_request(GPIO_FN_A22, NULL);
  323. gpio_request(GPIO_FN_A23, NULL);
  324. gpio_request(GPIO_FN_A24, NULL);
  325. gpio_request(GPIO_FN_A25, NULL);
  326. #endif /* CONFIG_SYS_NO_FLASH */
  327. gpio_request(GPIO_FN_CS1_A26, NULL);
  328. gpio_request(GPIO_FN_EX_CS0, NULL);
  329. gpio_request(GPIO_FN_EX_CS1, NULL);
  330. gpio_request(GPIO_FN_BS, NULL);
  331. gpio_request(GPIO_FN_RD, NULL);
  332. gpio_request(GPIO_FN_WE0, NULL);
  333. gpio_request(GPIO_FN_WE1, NULL);
  334. gpio_request(GPIO_FN_EX_WAIT0, NULL);
  335. gpio_request(GPIO_FN_IRQ0, NULL);
  336. gpio_request(GPIO_FN_IRQ2, NULL);
  337. gpio_request(GPIO_FN_IRQ3, NULL);
  338. gpio_request(GPIO_FN_CS0, NULL);
  339. /* Init timer */
  340. timer_init();
  341. return 0;
  342. }
  343. /*
  344. Added for BLANCHE(R-CarV2H board)
  345. */
  346. int board_eth_init(bd_t *bis)
  347. {
  348. int rc = 0;
  349. #ifdef CONFIG_SMC911X
  350. #define STR_ENV_ETHADDR "ethaddr"
  351. struct eth_device *dev;
  352. uchar eth_addr[6];
  353. rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
  354. if (!eth_getenv_enetaddr(STR_ENV_ETHADDR, eth_addr)) {
  355. dev = eth_get_dev_by_index(0);
  356. if (dev) {
  357. eth_setenv_enetaddr(STR_ENV_ETHADDR, dev->enetaddr);
  358. } else {
  359. printf("blanche: Couldn't get eth device\n");
  360. rc = -1;
  361. }
  362. }
  363. #endif
  364. return rc;
  365. }
  366. int board_mmc_init(bd_t *bis)
  367. {
  368. int ret = -ENODEV;
  369. #ifdef CONFIG_SH_SDHI
  370. gpio_request(GPIO_FN_SD0_DAT0, NULL);
  371. gpio_request(GPIO_FN_SD0_DAT1, NULL);
  372. gpio_request(GPIO_FN_SD0_DAT2, NULL);
  373. gpio_request(GPIO_FN_SD0_DAT3, NULL);
  374. gpio_request(GPIO_FN_SD0_CLK, NULL);
  375. gpio_request(GPIO_FN_SD0_CMD, NULL);
  376. gpio_request(GPIO_FN_SD0_CD, NULL);
  377. gpio_request(GPIO_GP_11_12, NULL);
  378. gpio_direction_output(GPIO_GP_11_12, 1); /* power on */
  379. ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI0_BASE, 0,
  380. SH_SDHI_QUIRK_16BIT_BUF);
  381. if (ret)
  382. return ret;
  383. #endif
  384. return ret;
  385. }
  386. int dram_init(void)
  387. {
  388. gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
  389. gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
  390. return 0;
  391. }
  392. const struct rmobile_sysinfo sysinfo = {
  393. CONFIG_RMOBILE_BOARD_STRING
  394. };
  395. void reset_cpu(ulong addr)
  396. {
  397. }
  398. static const struct sh_serial_platdata serial_platdata = {
  399. .base = SCIF0_BASE,
  400. .type = PORT_SCIF,
  401. .clk = 14745600,
  402. .clk_mode = EXT_CLK,
  403. };
  404. U_BOOT_DEVICE(blanche_serials) = {
  405. .name = "serial_sh",
  406. .platdata = &serial_platdata,
  407. };