|
@@ -1984,9 +1984,28 @@ struct clk *__clk_register(struct device *dev, struct clk_hw *hw)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(__clk_register);
|
|
|
|
|
|
-static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk)
|
|
|
+/**
|
|
|
+ * clk_register - allocate a new clock, register it and return an opaque cookie
|
|
|
+ * @dev: device that is registering this clock
|
|
|
+ * @hw: link to hardware-specific clock data
|
|
|
+ *
|
|
|
+ * clk_register is the primary interface for populating the clock tree with new
|
|
|
+ * clock nodes. It returns a pointer to the newly allocated struct clk which
|
|
|
+ * cannot be dereferenced by driver code but may be used in conjuction with the
|
|
|
+ * rest of the clock API. In the event of an error clk_register will return an
|
|
|
+ * error code; drivers must test for an error code after calling clk_register.
|
|
|
+ */
|
|
|
+struct clk *clk_register(struct device *dev, struct clk_hw *hw)
|
|
|
{
|
|
|
int i, ret;
|
|
|
+ struct clk *clk;
|
|
|
+
|
|
|
+ clk = kzalloc(sizeof(*clk), GFP_KERNEL);
|
|
|
+ if (!clk) {
|
|
|
+ pr_err("%s: could not allocate clk\n", __func__);
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto fail_out;
|
|
|
+ }
|
|
|
|
|
|
clk->name = kstrdup(hw->init->name, GFP_KERNEL);
|
|
|
if (!clk->name) {
|
|
@@ -2026,7 +2045,7 @@ static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk)
|
|
|
|
|
|
ret = __clk_init(dev, clk);
|
|
|
if (!ret)
|
|
|
- return 0;
|
|
|
+ return clk;
|
|
|
|
|
|
fail_parent_names_copy:
|
|
|
while (--i >= 0)
|
|
@@ -2035,36 +2054,6 @@ fail_parent_names_copy:
|
|
|
fail_parent_names:
|
|
|
kfree(clk->name);
|
|
|
fail_name:
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * clk_register - allocate a new clock, register it and return an opaque cookie
|
|
|
- * @dev: device that is registering this clock
|
|
|
- * @hw: link to hardware-specific clock data
|
|
|
- *
|
|
|
- * clk_register is the primary interface for populating the clock tree with new
|
|
|
- * clock nodes. It returns a pointer to the newly allocated struct clk which
|
|
|
- * cannot be dereferenced by driver code but may be used in conjuction with the
|
|
|
- * rest of the clock API. In the event of an error clk_register will return an
|
|
|
- * error code; drivers must test for an error code after calling clk_register.
|
|
|
- */
|
|
|
-struct clk *clk_register(struct device *dev, struct clk_hw *hw)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct clk *clk;
|
|
|
-
|
|
|
- clk = kzalloc(sizeof(*clk), GFP_KERNEL);
|
|
|
- if (!clk) {
|
|
|
- pr_err("%s: could not allocate clk\n", __func__);
|
|
|
- ret = -ENOMEM;
|
|
|
- goto fail_out;
|
|
|
- }
|
|
|
-
|
|
|
- ret = _clk_register(dev, hw, clk);
|
|
|
- if (!ret)
|
|
|
- return clk;
|
|
|
-
|
|
|
kfree(clk);
|
|
|
fail_out:
|
|
|
return ERR_PTR(ret);
|
|
@@ -2173,7 +2162,7 @@ EXPORT_SYMBOL_GPL(clk_unregister);
|
|
|
|
|
|
static void devm_clk_release(struct device *dev, void *res)
|
|
|
{
|
|
|
- clk_unregister(res);
|
|
|
+ clk_unregister(*(struct clk **)res);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2188,18 +2177,18 @@ static void devm_clk_release(struct device *dev, void *res)
|
|
|
struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw)
|
|
|
{
|
|
|
struct clk *clk;
|
|
|
- int ret;
|
|
|
+ struct clk **clkp;
|
|
|
|
|
|
- clk = devres_alloc(devm_clk_release, sizeof(*clk), GFP_KERNEL);
|
|
|
- if (!clk)
|
|
|
+ clkp = devres_alloc(devm_clk_release, sizeof(*clkp), GFP_KERNEL);
|
|
|
+ if (!clkp)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- ret = _clk_register(dev, hw, clk);
|
|
|
- if (!ret) {
|
|
|
- devres_add(dev, clk);
|
|
|
+ clk = clk_register(dev, hw);
|
|
|
+ if (!IS_ERR(clk)) {
|
|
|
+ *clkp = clk;
|
|
|
+ devres_add(dev, clkp);
|
|
|
} else {
|
|
|
- devres_free(clk);
|
|
|
- clk = ERR_PTR(ret);
|
|
|
+ devres_free(clkp);
|
|
|
}
|
|
|
|
|
|
return clk;
|