|
@@ -1813,6 +1813,10 @@ struct clk *__clk_register(struct device *dev, struct clk_hw *hw)
|
|
clk->flags = hw->init->flags;
|
|
clk->flags = hw->init->flags;
|
|
clk->parent_names = hw->init->parent_names;
|
|
clk->parent_names = hw->init->parent_names;
|
|
clk->num_parents = hw->init->num_parents;
|
|
clk->num_parents = hw->init->num_parents;
|
|
|
|
+ if (dev && dev->driver)
|
|
|
|
+ clk->owner = dev->driver->owner;
|
|
|
|
+ else
|
|
|
|
+ clk->owner = NULL;
|
|
|
|
|
|
ret = __clk_init(dev, clk);
|
|
ret = __clk_init(dev, clk);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -1833,6 +1837,8 @@ static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk)
|
|
goto fail_name;
|
|
goto fail_name;
|
|
}
|
|
}
|
|
clk->ops = hw->init->ops;
|
|
clk->ops = hw->init->ops;
|
|
|
|
+ if (dev && dev->driver)
|
|
|
|
+ clk->owner = dev->driver->owner;
|
|
clk->hw = hw;
|
|
clk->hw = hw;
|
|
clk->flags = hw->init->flags;
|
|
clk->flags = hw->init->flags;
|
|
clk->num_parents = hw->init->num_parents;
|
|
clk->num_parents = hw->init->num_parents;
|
|
@@ -1973,6 +1979,26 @@ void devm_clk_unregister(struct device *dev, struct clk *clk)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(devm_clk_unregister);
|
|
EXPORT_SYMBOL_GPL(devm_clk_unregister);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * clkdev helpers
|
|
|
|
+ */
|
|
|
|
+int __clk_get(struct clk *clk)
|
|
|
|
+{
|
|
|
|
+ if (clk && !try_module_get(clk->owner))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void __clk_put(struct clk *clk)
|
|
|
|
+{
|
|
|
|
+ if (WARN_ON_ONCE(IS_ERR(clk)))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (clk)
|
|
|
|
+ module_put(clk->owner);
|
|
|
|
+}
|
|
|
|
+
|
|
/*** clk rate change notifiers ***/
|
|
/*** clk rate change notifiers ***/
|
|
|
|
|
|
/**
|
|
/**
|