|
@@ -153,6 +153,18 @@ const struct clk_ops clk_divider_ops = {
|
|
|
};
|
|
|
EXPORT_SYMBOL_GPL(clk_divider_ops);
|
|
|
|
|
|
+/**
|
|
|
+ * clk_register_divider - register a divider clock with the clock framework
|
|
|
+ * @dev: device registering this clock
|
|
|
+ * @name: name of this clock
|
|
|
+ * @parent_name: name of clock's parent
|
|
|
+ * @flags: framework-specific flags
|
|
|
+ * @reg: register address to adjust divider
|
|
|
+ * @shift: number of bits to shift the bitfield
|
|
|
+ * @width: width of the bitfield
|
|
|
+ * @clk_divider_flags: divider-specific flags for this clock
|
|
|
+ * @lock: shared register lock for this clock
|
|
|
+ */
|
|
|
struct clk *clk_register_divider(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
void __iomem *reg, u8 shift, u8 width,
|
|
@@ -161,11 +173,11 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
|
|
|
struct clk_divider *div;
|
|
|
struct clk *clk;
|
|
|
|
|
|
+ /* allocate the divider */
|
|
|
div = kzalloc(sizeof(struct clk_divider), GFP_KERNEL);
|
|
|
-
|
|
|
if (!div) {
|
|
|
pr_err("%s: could not allocate divider clk\n", __func__);
|
|
|
- return NULL;
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
}
|
|
|
|
|
|
/* struct clk_divider assignments */
|
|
@@ -175,23 +187,15 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
|
|
|
div->flags = clk_divider_flags;
|
|
|
div->lock = lock;
|
|
|
|
|
|
- if (parent_name) {
|
|
|
- div->parent[0] = kstrdup(parent_name, GFP_KERNEL);
|
|
|
- if (!div->parent[0])
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
+ /* register the clock */
|
|
|
clk = clk_register(dev, name,
|
|
|
&clk_divider_ops, &div->hw,
|
|
|
- div->parent,
|
|
|
+ (parent_name ? &parent_name: NULL),
|
|
|
(parent_name ? 1 : 0),
|
|
|
flags);
|
|
|
- if (clk)
|
|
|
- return clk;
|
|
|
|
|
|
-out:
|
|
|
- kfree(div->parent[0]);
|
|
|
- kfree(div);
|
|
|
+ if (IS_ERR(clk))
|
|
|
+ kfree(div);
|
|
|
|
|
|
- return NULL;
|
|
|
+ return clk;
|
|
|
}
|