Merge tag 'armsoc-defconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / clk / samsung / clk-cpu.c
index efc4fa6..00ef4d1 100644 (file)
@@ -401,26 +401,34 @@ static int exynos5433_cpuclk_notifier_cb(struct notifier_block *nb,
 
 /* helper function to register a CPU clock */
 int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
-               unsigned int lookup_id, const char *name, const char *parent,
-               const char *alt_parent, unsigned long offset,
-               const struct exynos_cpuclk_cfg_data *cfg,
+               unsigned int lookup_id, const char *name,
+               const struct clk_hw *parent, const struct clk_hw *alt_parent,
+               unsigned long offset, const struct exynos_cpuclk_cfg_data *cfg,
                unsigned long num_cfgs, unsigned long flags)
 {
        struct exynos_cpuclk *cpuclk;
        struct clk_init_data init;
-       struct clk *parent_clk;
+       const char *parent_name;
        int ret = 0;
 
+       if (IS_ERR(parent) || IS_ERR(alt_parent)) {
+               pr_err("%s: invalid parent clock(s)\n", __func__);
+               return -EINVAL;
+       }
+
        cpuclk = kzalloc(sizeof(*cpuclk), GFP_KERNEL);
        if (!cpuclk)
                return -ENOMEM;
 
+       parent_name = clk_hw_get_name(parent);
+
        init.name = name;
        init.flags = CLK_SET_RATE_PARENT;
-       init.parent_names = &parent;
+       init.parent_names = &parent_name;
        init.num_parents = 1;
        init.ops = &exynos_cpuclk_clk_ops;
 
+       cpuclk->alt_parent = alt_parent;
        cpuclk->hw.init = &init;
        cpuclk->ctrl_base = ctx->reg_base + offset;
        cpuclk->lock = &ctx->lock;
@@ -430,23 +438,8 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
        else
                cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb;
 
-       cpuclk->alt_parent = __clk_get_hw(__clk_lookup(alt_parent));
-       if (!cpuclk->alt_parent) {
-               pr_err("%s: could not lookup alternate parent %s\n",
-                               __func__, alt_parent);
-               ret = -EINVAL;
-               goto free_cpuclk;
-       }
-
-       parent_clk = __clk_lookup(parent);
-       if (!parent_clk) {
-               pr_err("%s: could not lookup parent clock %s\n",
-                               __func__, parent);
-               ret = -EINVAL;
-               goto free_cpuclk;
-       }
 
-       ret = clk_notifier_register(parent_clk, &cpuclk->clk_nb);
+       ret = clk_notifier_register(parent->clk, &cpuclk->clk_nb);
        if (ret) {
                pr_err("%s: failed to register clock notifier for %s\n",
                                __func__, name);
@@ -471,7 +464,7 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
 free_cpuclk_data:
        kfree(cpuclk->cfg);
 unregister_clk_nb:
-       clk_notifier_unregister(parent_clk, &cpuclk->clk_nb);
+       clk_notifier_unregister(parent->clk, &cpuclk->clk_nb);
 free_cpuclk:
        kfree(cpuclk);
        return ret;