Merge branch 'rmobile' of git://git.denx.de/u-boot-sh
[oweals/u-boot.git] / arch / arm / mach-rockchip / board.c
index f026abf0b1681923a79ca53331237ecbfa21e81f..bec756d7ac0bad6aed9324254909b2d675a85fc9 100644 (file)
@@ -5,15 +5,50 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include <ram.h>
 #include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/periph.h>
+#include <asm/gpio.h>
+#include <dm/pinctrl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 int board_init(void)
 {
+#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+       struct udevice *pinctrl;
+       int ret;
+
+    /*
+     * We need to implement sdcard iomux here for the further
+     * initlization, otherwise, it'll hit sdcard command sending
+     * timeout exception.
+     */
+       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
+       if (ret) {
+               debug("%s: Cannot find pinctrl device\n", __func__);
+               goto err;
+       }
+       ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
+       if (ret) {
+               debug("%s: Failed to set up SD card\n", __func__);
+               goto err;
+       }
+
        return 0;
+err:
+       printf("board_init: Error %d\n", ret);
+
+       /* No way to report error here */
+       hang();
+
+       return -1;
+#else
+       return 0;
+#endif
 }
 
 int dram_init(void)
@@ -45,3 +80,130 @@ void enable_caches(void)
        dcache_enable();
 }
 #endif
+
+void lowlevel_init(void)
+{
+}
+
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
+#include <usb.h>
+#include <usb/dwc2_udc.h>
+
+static struct dwc2_plat_otg_data rk3288_otg_data = {
+       .rx_fifo_sz     = 512,
+       .np_tx_fifo_sz  = 16,
+       .tx_fifo_sz     = 128,
+};
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+       int node, phy_node;
+       const char *mode;
+       bool matched = false;
+       const void *blob = gd->fdt_blob;
+       u32 grf_phy_offset;
+
+       /* find the usb_otg node */
+       node = fdt_node_offset_by_compatible(blob, -1,
+                                       "rockchip,rk3288-usb");
+
+       while (node > 0) {
+               mode = fdt_getprop(blob, node, "dr_mode", NULL);
+               if (mode && strcmp(mode, "otg") == 0) {
+                       matched = true;
+                       break;
+               }
+
+               node = fdt_node_offset_by_compatible(blob, node,
+                                       "rockchip,rk3288-usb");
+       }
+       if (!matched) {
+               debug("Not found usb_otg device\n");
+               return -ENODEV;
+       }
+       rk3288_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
+
+       node = fdtdec_lookup_phandle(blob, node, "phys");
+       if (node <= 0) {
+               debug("Not found usb phy device\n");
+               return -ENODEV;
+       }
+
+       phy_node = fdt_parent_offset(blob, node);
+       if (phy_node <= 0) {
+               debug("Not found usb phy device\n");
+               return -ENODEV;
+       }
+
+       rk3288_otg_data.phy_of_node = phy_node;
+       grf_phy_offset = fdtdec_get_addr(blob, node, "reg");
+
+       /* find the grf node */
+       node = fdt_node_offset_by_compatible(blob, -1,
+                                       "rockchip,rk3288-grf");
+       if (node <= 0) {
+               debug("Not found grf device\n");
+               return -ENODEV;
+       }
+       rk3288_otg_data.regs_phy = grf_phy_offset +
+                               fdtdec_get_addr(blob, node, "reg");
+
+       return dwc2_udc_probe(&rk3288_otg_data);
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+       return 0;
+}
+#endif
+
+static int do_clock(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char * const argv[])
+{
+       static const struct {
+               char *name;
+               int id;
+       } clks[] = {
+               { "osc", CLK_OSC },
+               { "apll", CLK_ARM },
+               { "dpll", CLK_DDR },
+               { "cpll", CLK_CODEC },
+               { "gpll", CLK_GENERAL },
+#ifdef CONFIG_ROCKCHIP_RK3036
+               { "mpll", CLK_NEW },
+#else
+               { "npll", CLK_NEW },
+#endif
+       };
+       int ret, i;
+       struct udevice *dev;
+
+       ret = rockchip_get_clk(&dev);
+       if (ret) {
+               printf("clk-uclass not found\n");
+               return 0;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(clks); i++) {
+               struct clk clk;
+               ulong rate;
+
+               clk.id = clks[i].id;
+               ret = clk_request(dev, &clk);
+               if (ret < 0)
+                       continue;
+
+               rate = clk_get_rate(&clk);
+               printf("%s: %lu\n", clks[i].name, rate);
+
+               clk_free(&clk);
+       }
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       clock, 2, 1, do_clock,
+       "display information about clocks",
+       ""
+);