board.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 <asm/io.h>
  11. #include <asm/arch/clock.h>
  12. #include <asm/arch/periph.h>
  13. #include <asm/gpio.h>
  14. #include <dm/pinctrl.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. int board_init(void)
  17. {
  18. #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
  19. struct udevice *pinctrl;
  20. int ret;
  21. /*
  22. * We need to implement sdcard iomux here for the further
  23. * initlization, otherwise, it'll hit sdcard command sending
  24. * timeout exception.
  25. */
  26. ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
  27. if (ret) {
  28. debug("%s: Cannot find pinctrl device\n", __func__);
  29. goto err;
  30. }
  31. ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
  32. if (ret) {
  33. debug("%s: Failed to set up SD card\n", __func__);
  34. goto err;
  35. }
  36. return 0;
  37. err:
  38. printf("board_init: Error %d\n", ret);
  39. /* No way to report error here */
  40. hang();
  41. return -1;
  42. #else
  43. return 0;
  44. #endif
  45. }
  46. int dram_init(void)
  47. {
  48. struct ram_info ram;
  49. struct udevice *dev;
  50. int ret;
  51. ret = uclass_get_device(UCLASS_RAM, 0, &dev);
  52. if (ret) {
  53. debug("DRAM init failed: %d\n", ret);
  54. return ret;
  55. }
  56. ret = ram_get_info(dev, &ram);
  57. if (ret) {
  58. debug("Cannot get DRAM size: %d\n", ret);
  59. return ret;
  60. }
  61. debug("SDRAM base=%lx, size=%x\n", ram.base, ram.size);
  62. gd->ram_size = ram.size;
  63. return 0;
  64. }
  65. #ifndef CONFIG_SYS_DCACHE_OFF
  66. void enable_caches(void)
  67. {
  68. /* Enable D-cache. I-cache is already enabled in start.S */
  69. dcache_enable();
  70. }
  71. #endif
  72. #if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
  73. #include <usb.h>
  74. #include <usb/dwc2_udc.h>
  75. static struct dwc2_plat_otg_data rk3288_otg_data = {
  76. .rx_fifo_sz = 512,
  77. .np_tx_fifo_sz = 16,
  78. .tx_fifo_sz = 128,
  79. };
  80. int board_usb_init(int index, enum usb_init_type init)
  81. {
  82. int node, phy_node;
  83. const char *mode;
  84. bool matched = false;
  85. const void *blob = gd->fdt_blob;
  86. u32 grf_phy_offset;
  87. /* find the usb_otg node */
  88. node = fdt_node_offset_by_compatible(blob, -1,
  89. "rockchip,rk3288-usb");
  90. while (node > 0) {
  91. mode = fdt_getprop(blob, node, "dr_mode", NULL);
  92. if (mode && strcmp(mode, "otg") == 0) {
  93. matched = true;
  94. break;
  95. }
  96. node = fdt_node_offset_by_compatible(blob, node,
  97. "rockchip,rk3288-usb");
  98. }
  99. if (!matched) {
  100. debug("Not found usb_otg device\n");
  101. return -ENODEV;
  102. }
  103. rk3288_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
  104. node = fdtdec_lookup_phandle(blob, node, "phys");
  105. if (node <= 0) {
  106. debug("Not found usb phy device\n");
  107. return -ENODEV;
  108. }
  109. phy_node = fdt_parent_offset(blob, node);
  110. if (phy_node <= 0) {
  111. debug("Not found usb phy device\n");
  112. return -ENODEV;
  113. }
  114. rk3288_otg_data.phy_of_node = phy_node;
  115. grf_phy_offset = fdtdec_get_addr(blob, node, "reg");
  116. /* find the grf node */
  117. node = fdt_node_offset_by_compatible(blob, -1,
  118. "rockchip,rk3288-grf");
  119. if (node <= 0) {
  120. debug("Not found grf device\n");
  121. return -ENODEV;
  122. }
  123. rk3288_otg_data.regs_phy = grf_phy_offset +
  124. fdtdec_get_addr(blob, node, "reg");
  125. return dwc2_udc_probe(&rk3288_otg_data);
  126. }
  127. int board_usb_cleanup(int index, enum usb_init_type init)
  128. {
  129. return 0;
  130. }
  131. #endif
  132. static int do_clock(cmd_tbl_t *cmdtp, int flag, int argc,
  133. char * const argv[])
  134. {
  135. static const struct {
  136. char *name;
  137. int id;
  138. } clks[] = {
  139. { "osc", CLK_OSC },
  140. { "apll", CLK_ARM },
  141. { "dpll", CLK_DDR },
  142. { "cpll", CLK_CODEC },
  143. { "gpll", CLK_GENERAL },
  144. #ifdef CONFIG_ROCKCHIP_RK3036
  145. { "mpll", CLK_NEW },
  146. #else
  147. { "npll", CLK_NEW },
  148. #endif
  149. };
  150. int ret, i;
  151. struct udevice *dev;
  152. ret = rockchip_get_clk(&dev);
  153. if (ret) {
  154. printf("clk-uclass not found\n");
  155. return 0;
  156. }
  157. for (i = 0; i < ARRAY_SIZE(clks); i++) {
  158. struct clk clk;
  159. ulong rate;
  160. clk.id = clks[i].id;
  161. ret = clk_request(dev, &clk);
  162. if (ret < 0)
  163. continue;
  164. rate = clk_get_rate(&clk);
  165. printf("%s: %lu\n", clks[i].name, rate);
  166. clk_free(&clk);
  167. }
  168. return 0;
  169. }
  170. U_BOOT_CMD(
  171. clock, 2, 1, do_clock,
  172. "display information about clocks",
  173. ""
  174. );