]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
clk: convert API to match reset/mailbox style
[karo-tx-uboot.git] / arch / arm / mach-rockchip / rk3288 / sdram_rk3288.c
index 2a43574a79aa3a8769ea1a09892afab3c61d123a..55ac73e9d25111eb96345e07d66cd7af9f80e9ed 100644 (file)
@@ -22,6 +22,8 @@
 #include <asm/arch/pmu_rk3288.h>
 #include <asm/arch/sdram.h>
 #include <linux/err.h>
+#include <power/regulator.h>
+#include <power/rk808_pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -34,7 +36,7 @@ struct chan_info {
 struct dram_info {
        struct chan_info chan[2];
        struct ram_info info;
-       struct udevice *ddr_clk;
+       struct clk ddr_clk;
        struct rk3288_cru *cru;
        struct rk3288_grf *grf;
        struct rk3288_sgrf *sgrf;
@@ -574,7 +576,7 @@ static void dram_all_config(const struct dram_info *dram,
        rk_clrsetreg(&dram->sgrf->soc_con2, 0x1f, sdram_params->base.stride);
 }
 
-static int sdram_init(const struct dram_info *dram,
+static int sdram_init(struct dram_info *dram,
                      const struct rk3288_sdram_params *sdram_params)
 {
        int channel;
@@ -590,8 +592,8 @@ static int sdram_init(const struct dram_info *dram,
                return -E2BIG;
        }
 
-       debug("ddr clk %s\n", dram->ddr_clk->name);
-       ret = clk_set_rate(dram->ddr_clk, sdram_params->base.ddr_freq);
+       debug("ddr clk dpll\n");
+       ret = clk_set_rate(&dram->ddr_clk, sdram_params->base.ddr_freq);
        debug("ret=%d\n", ret);
        if (ret) {
                debug("Could not set DDR clock\n");
@@ -748,6 +750,32 @@ size_t sdram_size_mb(struct rk3288_pmu *pmu)
 }
 
 #ifdef CONFIG_SPL_BUILD
+# ifdef CONFIG_ROCKCHIP_FAST_SPL
+static int veyron_init(struct dram_info *priv)
+{
+       struct udevice *pmic;
+       int ret;
+
+       ret = uclass_first_device_err(UCLASS_PMIC, &pmic);
+       if (ret)
+               return ret;
+
+       /* Slowly raise to max CPU voltage to prevent overshoot */
+       ret = rk808_spl_configure_buck(pmic, 1, 1200000);
+       if (ret)
+               return ret;
+       udelay(175);/* Must wait for voltage to stabilize, 2mV/us */
+       ret = rk808_spl_configure_buck(pmic, 1, 1400000);
+       if (ret)
+               return ret;
+       udelay(100);/* Must wait for voltage to stabilize, 2mV/us */
+
+       rkclk_configure_cpu(priv->cru, priv->grf);
+
+       return 0;
+}
+# endif
+
 static int setup_sdram(struct udevice *dev)
 {
        struct dram_info *priv = dev_get_priv(dev);
@@ -791,6 +819,14 @@ static int setup_sdram(struct udevice *dev)
                return -EINVAL;
        }
 
+# ifdef CONFIG_ROCKCHIP_FAST_SPL
+       if (!fdt_node_check_compatible(blob, 0, "google,veyron")) {
+               ret = veyron_init(priv);
+               if (ret)
+                       return ret;
+       }
+# endif
+
        return sdram_init(priv, &params);
 }
 #endif
@@ -800,6 +836,7 @@ static int rk3288_dmc_probe(struct udevice *dev)
        struct dram_info *priv = dev_get_priv(dev);
        struct regmap *map;
        int ret;
+       struct udevice *dev_clk;
 
        map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_NOC);
        if (IS_ERR(map))
@@ -808,20 +845,9 @@ static int rk3288_dmc_probe(struct udevice *dev)
        priv->chan[1].msch = (struct rk3288_msch *)
                        (regmap_get_range(map, 0) + 0x80);
 
-       map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_GRF);
-       if (IS_ERR(map))
-               return PTR_ERR(map);
-       priv->grf = regmap_get_range(map, 0);
-
-       map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_SGRF);
-       if (IS_ERR(map))
-               return PTR_ERR(map);
-       priv->sgrf = regmap_get_range(map, 0);
-
-       map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_PMU);
-       if (IS_ERR(map))
-               return PTR_ERR(map);
-       priv->pmu = regmap_get_range(map, 0);
+       priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+       priv->sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_SGRF);
+       priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
 
        ret = regmap_init_mem(dev, &map);
        if (ret)
@@ -831,7 +857,11 @@ static int rk3288_dmc_probe(struct udevice *dev)
        priv->chan[1].pctl = regmap_get_range(map, 2);
        priv->chan[1].publ = regmap_get_range(map, 3);
 
-       ret = uclass_get_device(UCLASS_CLK, CLK_DDR, &priv->ddr_clk);
+       ret = uclass_get_device(UCLASS_CLK, 0, &dev_clk);
+       if (ret)
+               return ret;
+       priv->ddr_clk.id = CLK_DDR;
+       ret = clk_request(dev_clk, &priv->ddr_clk);
        if (ret)
                return ret;