Merge branches 'clk-ti', 'clk-analog', 'clk-trace', 'clk-at91' and 'clk-silabs' into...
[linux-2.6-microblaze.git] / drivers / clk / rockchip / clk.c
index 546e810..336481b 100644 (file)
@@ -43,7 +43,7 @@ static struct clk *rockchip_clk_register_branch(const char *name,
                u8 gate_shift, u8 gate_flags, unsigned long flags,
                spinlock_t *lock)
 {
-       struct clk *clk;
+       struct clk_hw *hw;
        struct clk_mux *mux = NULL;
        struct clk_gate *gate = NULL;
        struct clk_divider *div = NULL;
@@ -100,20 +100,18 @@ static struct clk *rockchip_clk_register_branch(const char *name,
                                                : &clk_divider_ops;
        }
 
-       clk = clk_register_composite(NULL, name, parent_names, num_parents,
-                                    mux ? &mux->hw : NULL, mux_ops,
-                                    div ? &div->hw : NULL, div_ops,
-                                    gate ? &gate->hw : NULL, gate_ops,
-                                    flags);
-
-       if (IS_ERR(clk)) {
-               ret = PTR_ERR(clk);
-               goto err_composite;
+       hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
+                                      mux ? &mux->hw : NULL, mux_ops,
+                                      div ? &div->hw : NULL, div_ops,
+                                      gate ? &gate->hw : NULL, gate_ops,
+                                      flags);
+       if (IS_ERR(hw)) {
+               kfree(div);
+               kfree(gate);
+               return ERR_CAST(hw);
        }
 
-       return clk;
-err_composite:
-       kfree(div);
+       return hw->clk;
 err_div:
        kfree(gate);
 err_gate:
@@ -214,8 +212,8 @@ static struct clk *rockchip_clk_register_frac_branch(
                unsigned long flags, struct rockchip_clk_branch *child,
                spinlock_t *lock)
 {
+       struct clk_hw *hw;
        struct rockchip_clk_frac *frac;
-       struct clk *clk;
        struct clk_gate *gate = NULL;
        struct clk_fractional_divider *div = NULL;
        const struct clk_ops *div_ops = NULL, *gate_ops = NULL;
@@ -255,14 +253,14 @@ static struct clk *rockchip_clk_register_frac_branch(
        div->approximation = rockchip_fractional_approximation;
        div_ops = &clk_fractional_divider_ops;
 
-       clk = clk_register_composite(NULL, name, parent_names, num_parents,
-                                    NULL, NULL,
-                                    &div->hw, div_ops,
-                                    gate ? &gate->hw : NULL, gate_ops,
-                                    flags | CLK_SET_RATE_UNGATE);
-       if (IS_ERR(clk)) {
+       hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
+                                      NULL, NULL,
+                                      &div->hw, div_ops,
+                                      gate ? &gate->hw : NULL, gate_ops,
+                                      flags | CLK_SET_RATE_UNGATE);
+       if (IS_ERR(hw)) {
                kfree(frac);
-               return clk;
+               return ERR_CAST(hw);
        }
 
        if (child) {
@@ -292,7 +290,7 @@ static struct clk *rockchip_clk_register_frac_branch(
                mux_clk = clk_register(NULL, &frac_mux->hw);
                if (IS_ERR(mux_clk)) {
                        kfree(frac);
-                       return clk;
+                       return mux_clk;
                }
 
                rockchip_clk_add_lookup(ctx, mux_clk, child->id);
@@ -301,7 +299,7 @@ static struct clk *rockchip_clk_register_frac_branch(
                if (frac->mux_frac_idx >= 0) {
                        pr_debug("%s: found fractional parent in mux at pos %d\n",
                                 __func__, frac->mux_frac_idx);
-                       ret = clk_notifier_register(clk, &frac->clk_nb);
+                       ret = clk_notifier_register(hw->clk, &frac->clk_nb);
                        if (ret)
                                pr_err("%s: failed to register clock notifier for %s\n",
                                                __func__, name);
@@ -311,7 +309,7 @@ static struct clk *rockchip_clk_register_frac_branch(
                }
        }
 
-       return clk;
+       return hw->clk;
 }
 
 static struct clk *rockchip_clk_register_factor_branch(const char *name,
@@ -320,7 +318,7 @@ static struct clk *rockchip_clk_register_factor_branch(const char *name,
                int gate_offset, u8 gate_shift, u8 gate_flags,
                unsigned long flags, spinlock_t *lock)
 {
-       struct clk *clk;
+       struct clk_hw *hw;
        struct clk_gate *gate = NULL;
        struct clk_fixed_factor *fix = NULL;
 
@@ -349,20 +347,22 @@ static struct clk *rockchip_clk_register_factor_branch(const char *name,
        fix->mult = mult;
        fix->div = div;
 
-       clk = clk_register_composite(NULL, name, parent_names, num_parents,
-                                    NULL, NULL,
-                                    &fix->hw, &clk_fixed_factor_ops,
-                                    &gate->hw, &clk_gate_ops, flags);
-       if (IS_ERR(clk)) {
+       hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
+                                      NULL, NULL,
+                                      &fix->hw, &clk_fixed_factor_ops,
+                                      &gate->hw, &clk_gate_ops, flags);
+       if (IS_ERR(hw)) {
                kfree(fix);
                kfree(gate);
+               return ERR_CAST(hw);
        }
 
-       return clk;
+       return hw->clk;
 }
 
-struct rockchip_clk_provider * __init rockchip_clk_init(struct device_node *np,
-                       void __iomem *base, unsigned long nr_clks)
+struct rockchip_clk_provider *rockchip_clk_init(struct device_node *np,
+                                               void __iomem *base,
+                                               unsigned long nr_clks)
 {
        struct rockchip_clk_provider *ctx;
        struct clk **clk_table;
@@ -394,14 +394,16 @@ err_free:
        kfree(ctx);
        return ERR_PTR(-ENOMEM);
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_init);
 
-void __init rockchip_clk_of_add_provider(struct device_node *np,
-                               struct rockchip_clk_provider *ctx)
+void rockchip_clk_of_add_provider(struct device_node *np,
+                                 struct rockchip_clk_provider *ctx)
 {
        if (of_clk_add_provider(np, of_clk_src_onecell_get,
                                &ctx->clk_data))
                pr_err("%s: could not register clk provider\n", __func__);
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_of_add_provider);
 
 void rockchip_clk_add_lookup(struct rockchip_clk_provider *ctx,
                             struct clk *clk, unsigned int id)
@@ -409,8 +411,9 @@ void rockchip_clk_add_lookup(struct rockchip_clk_provider *ctx,
        if (ctx->clk_data.clks && id)
                ctx->clk_data.clks[id] = clk;
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_add_lookup);
 
-void __init rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
+void rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
                                struct rockchip_pll_clock *list,
                                unsigned int nr_pll, int grf_lock_offset)
 {
@@ -433,11 +436,11 @@ void __init rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
                rockchip_clk_add_lookup(ctx, clk, list->id);
        }
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_register_plls);
 
-void __init rockchip_clk_register_branches(
-                                     struct rockchip_clk_provider *ctx,
-                                     struct rockchip_clk_branch *list,
-                                     unsigned int nr_clk)
+void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
+                                   struct rockchip_clk_branch *list,
+                                   unsigned int nr_clk)
 {
        struct clk *clk = NULL;
        unsigned int idx;
@@ -566,14 +569,15 @@ void __init rockchip_clk_register_branches(
                rockchip_clk_add_lookup(ctx, clk, list->id);
        }
 }
-
-void __init rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx,
-                       unsigned int lookup_id,
-                       const char *name, const char *const *parent_names,
-                       u8 num_parents,
-                       const struct rockchip_cpuclk_reg_data *reg_data,
-                       const struct rockchip_cpuclk_rate_table *rates,
-                       int nrates)
+EXPORT_SYMBOL_GPL(rockchip_clk_register_branches);
+
+void rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx,
+                                 unsigned int lookup_id,
+                                 const char *name, const char *const *parent_names,
+                                 u8 num_parents,
+                                 const struct rockchip_cpuclk_reg_data *reg_data,
+                                 const struct rockchip_cpuclk_rate_table *rates,
+                                 int nrates)
 {
        struct clk *clk;
 
@@ -588,9 +592,10 @@ void __init rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx,
 
        rockchip_clk_add_lookup(ctx, clk, lookup_id);
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_register_armclk);
 
-void __init rockchip_clk_protect_critical(const char *const clocks[],
-                                         int nclocks)
+void rockchip_clk_protect_critical(const char *const clocks[],
+                                  int nclocks)
 {
        int i;
 
@@ -598,10 +603,10 @@ void __init rockchip_clk_protect_critical(const char *const clocks[],
        for (i = 0; i < nclocks; i++) {
                struct clk *clk = __clk_lookup(clocks[i]);
 
-               if (clk)
-                       clk_prepare_enable(clk);
+               clk_prepare_enable(clk);
        }
 }
+EXPORT_SYMBOL_GPL(rockchip_clk_protect_critical);
 
 static void __iomem *rst_base;
 static unsigned int reg_restart;
@@ -621,10 +626,10 @@ static struct notifier_block rockchip_restart_handler = {
        .priority = 128,
 };
 
-void __init
+void
 rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx,
-                                              unsigned int reg,
-                                              void (*cb)(void))
+                                  unsigned int reg,
+                                  void (*cb)(void))
 {
        int ret;
 
@@ -636,3 +641,4 @@ rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx,
                pr_err("%s: cannot register restart handler, %d\n",
                       __func__, ret);
 }
+EXPORT_SYMBOL_GPL(rockchip_register_restart_notifier);