rk3288-board.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*
  2. * (C) Copyright 2015 Google, Inc
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <clk.h>
  8. #include <dm.h>
  9. #include <ram.h>
  10. #include <syscon.h>
  11. #include <asm/io.h>
  12. #include <asm/arch/clock.h>
  13. #include <asm/arch/periph.h>
  14. #include <asm/arch/pmu_rk3288.h>
  15. #include <asm/arch/boot_mode.h>
  16. #include <asm/gpio.h>
  17. #include <dm/pinctrl.h>
  18. #include <dt-bindings/clock/rk3288-cru.h>
  19. #include <power/regulator.h>
  20. DECLARE_GLOBAL_DATA_PTR;
  21. #define PMU_BASE 0xff730000
  22. static void setup_boot_mode(void)
  23. {
  24. struct rk3288_pmu *const pmu = (void *)PMU_BASE;
  25. int boot_mode = readl(&pmu->sys_reg[0]);
  26. debug("boot mode %x.\n", boot_mode);
  27. /* Clear boot mode */
  28. writel(BOOT_NORMAL, &pmu->sys_reg[0]);
  29. switch (boot_mode) {
  30. case BOOT_FASTBOOT:
  31. printf("enter fastboot!\n");
  32. setenv("preboot", "setenv preboot; fastboot usb0");
  33. break;
  34. case BOOT_UMS:
  35. printf("enter UMS!\n");
  36. setenv("preboot", "setenv preboot; if mmc dev 0;"
  37. "then ums mmc 0; else ums mmc 1;fi");
  38. break;
  39. }
  40. }
  41. __weak int rk_board_late_init(void)
  42. {
  43. return 0;
  44. }
  45. int board_late_init(void)
  46. {
  47. setup_boot_mode();
  48. return rk_board_late_init();
  49. }
  50. #ifndef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
  51. static int veyron_init(void)
  52. {
  53. struct udevice *dev;
  54. struct clk clk;
  55. int ret;
  56. ret = regulator_get_by_platname("vdd_arm", &dev);
  57. if (ret)
  58. return ret;
  59. /* Slowly raise to max CPU voltage to prevent overshoot */
  60. ret = regulator_set_value(dev, 1200000);
  61. if (ret)
  62. return ret;
  63. udelay(175); /* Must wait for voltage to stabilize, 2mV/us */
  64. ret = regulator_set_value(dev, 1400000);
  65. if (ret)
  66. return ret;
  67. udelay(100); /* Must wait for voltage to stabilize, 2mV/us */
  68. ret = rockchip_get_clk(&clk.dev);
  69. if (ret)
  70. return ret;
  71. clk.id = PLL_APLL;
  72. ret = clk_set_rate(&clk, 1800000000);
  73. if (IS_ERR_VALUE(ret))
  74. return ret;
  75. return 0;
  76. }
  77. #endif
  78. int board_init(void)
  79. {
  80. #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
  81. struct udevice *pinctrl;
  82. int ret;
  83. /*
  84. * We need to implement sdcard iomux here for the further
  85. * initlization, otherwise, it'll hit sdcard command sending
  86. * timeout exception.
  87. */
  88. ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
  89. if (ret) {
  90. debug("%s: Cannot find pinctrl device\n", __func__);
  91. goto err;
  92. }
  93. ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
  94. if (ret) {
  95. debug("%s: Failed to set up SD card\n", __func__);
  96. goto err;
  97. }
  98. return 0;
  99. err:
  100. printf("board_init: Error %d\n", ret);
  101. /* No way to report error here */
  102. hang();
  103. return -1;
  104. #else
  105. int ret;
  106. /* We do some SoC one time setting here */
  107. if (!fdt_node_check_compatible(gd->fdt_blob, 0, "google,veyron")) {
  108. ret = veyron_init();
  109. if (ret)
  110. return ret;
  111. }
  112. return 0;
  113. #endif
  114. }
  115. int dram_init(void)
  116. {
  117. struct ram_info ram;
  118. struct udevice *dev;
  119. int ret;
  120. ret = uclass_get_device(UCLASS_RAM, 0, &dev);
  121. if (ret) {
  122. debug("DRAM init failed: %d\n", ret);
  123. return ret;
  124. }
  125. ret = ram_get_info(dev, &ram);
  126. if (ret) {
  127. debug("Cannot get DRAM size: %d\n", ret);
  128. return ret;
  129. }
  130. debug("SDRAM base=%lx, size=%x\n", ram.base, ram.size);
  131. gd->ram_size = ram.size;
  132. return 0;
  133. }
  134. #ifndef CONFIG_SYS_DCACHE_OFF
  135. void enable_caches(void)
  136. {
  137. /* Enable D-cache. I-cache is already enabled in start.S */
  138. dcache_enable();
  139. }
  140. #endif
  141. #if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
  142. #include <usb.h>
  143. #include <usb/dwc2_udc.h>
  144. static struct dwc2_plat_otg_data rk3288_otg_data = {
  145. .rx_fifo_sz = 512,
  146. .np_tx_fifo_sz = 16,
  147. .tx_fifo_sz = 128,
  148. };
  149. int board_usb_init(int index, enum usb_init_type init)
  150. {
  151. int node, phy_node;
  152. const char *mode;
  153. bool matched = false;
  154. const void *blob = gd->fdt_blob;
  155. u32 grf_phy_offset;
  156. /* find the usb_otg node */
  157. node = fdt_node_offset_by_compatible(blob, -1,
  158. "rockchip,rk3288-usb");
  159. while (node > 0) {
  160. mode = fdt_getprop(blob, node, "dr_mode", NULL);
  161. if (mode && strcmp(mode, "otg") == 0) {
  162. matched = true;
  163. break;
  164. }
  165. node = fdt_node_offset_by_compatible(blob, node,
  166. "rockchip,rk3288-usb");
  167. }
  168. if (!matched) {
  169. debug("Not found usb_otg device\n");
  170. return -ENODEV;
  171. }
  172. rk3288_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
  173. node = fdtdec_lookup_phandle(blob, node, "phys");
  174. if (node <= 0) {
  175. debug("Not found usb phy device\n");
  176. return -ENODEV;
  177. }
  178. phy_node = fdt_parent_offset(blob, node);
  179. if (phy_node <= 0) {
  180. debug("Not found usb phy device\n");
  181. return -ENODEV;
  182. }
  183. rk3288_otg_data.phy_of_node = phy_node;
  184. grf_phy_offset = fdtdec_get_addr(blob, node, "reg");
  185. /* find the grf node */
  186. node = fdt_node_offset_by_compatible(blob, -1,
  187. "rockchip,rk3288-grf");
  188. if (node <= 0) {
  189. debug("Not found grf device\n");
  190. return -ENODEV;
  191. }
  192. rk3288_otg_data.regs_phy = grf_phy_offset +
  193. fdtdec_get_addr(blob, node, "reg");
  194. return dwc2_udc_probe(&rk3288_otg_data);
  195. }
  196. int board_usb_cleanup(int index, enum usb_init_type init)
  197. {
  198. return 0;
  199. }
  200. #endif
  201. static int do_clock(cmd_tbl_t *cmdtp, int flag, int argc,
  202. char * const argv[])
  203. {
  204. static const struct {
  205. char *name;
  206. int id;
  207. } clks[] = {
  208. { "osc", CLK_OSC },
  209. { "apll", CLK_ARM },
  210. { "dpll", CLK_DDR },
  211. { "cpll", CLK_CODEC },
  212. { "gpll", CLK_GENERAL },
  213. #ifdef CONFIG_ROCKCHIP_RK3036
  214. { "mpll", CLK_NEW },
  215. #else
  216. { "npll", CLK_NEW },
  217. #endif
  218. };
  219. int ret, i;
  220. struct udevice *dev;
  221. ret = rockchip_get_clk(&dev);
  222. if (ret) {
  223. printf("clk-uclass not found\n");
  224. return 0;
  225. }
  226. for (i = 0; i < ARRAY_SIZE(clks); i++) {
  227. struct clk clk;
  228. ulong rate;
  229. clk.id = clks[i].id;
  230. ret = clk_request(dev, &clk);
  231. if (ret < 0)
  232. continue;
  233. rate = clk_get_rate(&clk);
  234. printf("%s: %lu\n", clks[i].name, rate);
  235. clk_free(&clk);
  236. }
  237. return 0;
  238. }
  239. U_BOOT_CMD(
  240. clock, 2, 1, do_clock,
  241. "display information about clocks",
  242. ""
  243. );