}
 EXPORT_SYMBOL_GPL(hisi_clk_init);
 
-void hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *clks,
+int hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *clks,
                                         int nums, struct hisi_clock_data *data)
 {
        struct clk *clk;
                if (IS_ERR(clk)) {
                        pr_err("%s: failed to register clock %s\n",
                               __func__, clks[i].name);
-                       continue;
+                       goto err;
                }
                data->clk_data.clks[clks[i].id] = clk;
        }
+
+       return 0;
+
+err:
+       while (i--)
+               clk_unregister_fixed_rate(data->clk_data.clks[clks[i].id]);
+
+       return PTR_ERR(clk);
 }
 EXPORT_SYMBOL_GPL(hisi_clk_register_fixed_rate);
 
-void hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *clks,
+int hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *clks,
                                           int nums,
                                           struct hisi_clock_data *data)
 {
                if (IS_ERR(clk)) {
                        pr_err("%s: failed to register clock %s\n",
                               __func__, clks[i].name);
-                       continue;
+                       goto err;
                }
                data->clk_data.clks[clks[i].id] = clk;
        }
+
+       return 0;
+
+err:
+       while (i--)
+               clk_unregister_fixed_factor(data->clk_data.clks[clks[i].id]);
+
+       return PTR_ERR(clk);
 }
 EXPORT_SYMBOL_GPL(hisi_clk_register_fixed_factor);
 
-void hisi_clk_register_mux(const struct hisi_mux_clock *clks,
+int hisi_clk_register_mux(const struct hisi_mux_clock *clks,
                                  int nums, struct hisi_clock_data *data)
 {
        struct clk *clk;
                if (IS_ERR(clk)) {
                        pr_err("%s: failed to register clock %s\n",
                               __func__, clks[i].name);
-                       continue;
+                       goto err;
                }
 
                if (clks[i].alias)
 
                data->clk_data.clks[clks[i].id] = clk;
        }
+
+       return 0;
+
+err:
+       while (i--)
+               clk_unregister_mux(data->clk_data.clks[clks[i].id]);
+
+       return PTR_ERR(clk);
 }
 EXPORT_SYMBOL_GPL(hisi_clk_register_mux);
 
-void hisi_clk_register_divider(const struct hisi_divider_clock *clks,
+int hisi_clk_register_divider(const struct hisi_divider_clock *clks,
                                      int nums, struct hisi_clock_data *data)
 {
        struct clk *clk;
                if (IS_ERR(clk)) {
                        pr_err("%s: failed to register clock %s\n",
                               __func__, clks[i].name);
-                       continue;
+                       goto err;
                }
 
                if (clks[i].alias)
 
                data->clk_data.clks[clks[i].id] = clk;
        }
+
+       return 0;
+
+err:
+       while (i--)
+               clk_unregister_divider(data->clk_data.clks[clks[i].id]);
+
+       return PTR_ERR(clk);
 }
 EXPORT_SYMBOL_GPL(hisi_clk_register_divider);
 
-void hisi_clk_register_gate(const struct hisi_gate_clock *clks,
+int hisi_clk_register_gate(const struct hisi_gate_clock *clks,
                                       int nums, struct hisi_clock_data *data)
 {
        struct clk *clk;
                if (IS_ERR(clk)) {
                        pr_err("%s: failed to register clock %s\n",
                               __func__, clks[i].name);
-                       continue;
+                       goto err;
                }
 
                if (clks[i].alias)
 
                data->clk_data.clks[clks[i].id] = clk;
        }
+
+       return 0;
+
+err:
+       while (i--)
+               clk_unregister_gate(data->clk_data.clks[clks[i].id]);
+
+       return PTR_ERR(clk);
 }
 EXPORT_SYMBOL_GPL(hisi_clk_register_gate);
 
 
 
 struct hisi_clock_data *hisi_clk_alloc(struct platform_device *, int);
 struct hisi_clock_data *hisi_clk_init(struct device_node *, int);
-void hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *,
+int hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *,
                                int, struct hisi_clock_data *);
-void hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *,
+int hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *,
                                int, struct hisi_clock_data *);
-void hisi_clk_register_mux(const struct hisi_mux_clock *, int,
+int hisi_clk_register_mux(const struct hisi_mux_clock *, int,
                                struct hisi_clock_data *);
-void hisi_clk_register_divider(const struct hisi_divider_clock *,
+int hisi_clk_register_divider(const struct hisi_divider_clock *,
                                int, struct hisi_clock_data *);
-void hisi_clk_register_gate(const struct hisi_gate_clock *,
+int hisi_clk_register_gate(const struct hisi_gate_clock *,
                                int, struct hisi_clock_data *);
 void hisi_clk_register_gate_sep(const struct hisi_gate_clock *,
                                int, struct hisi_clock_data *);