clk: Introduce optional is_prepared callback
To reflect whether a clk_hw is prepared the clk_hw may implement the optional is_prepared callback. If not implemented we fall back to use the software prepare counter. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mike Turquette <mturquette@linaro.org>
This commit is contained in:
Родитель
30ee400614
Коммит
3d6ee287a3
|
@ -451,6 +451,27 @@ unsigned long __clk_get_flags(struct clk *clk)
|
||||||
return !clk ? 0 : clk->flags;
|
return !clk ? 0 : clk->flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool __clk_is_prepared(struct clk *clk)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!clk)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* .is_prepared is optional for clocks that can prepare
|
||||||
|
* fall back to software usage counter if it is missing
|
||||||
|
*/
|
||||||
|
if (!clk->ops->is_prepared) {
|
||||||
|
ret = clk->prepare_count ? 1 : 0;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk->ops->is_prepared(clk->hw);
|
||||||
|
out:
|
||||||
|
return !!ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool __clk_is_enabled(struct clk *clk)
|
bool __clk_is_enabled(struct clk *clk)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -45,6 +45,10 @@ struct clk_hw;
|
||||||
* undo any work done in the @prepare callback. Called with
|
* undo any work done in the @prepare callback. Called with
|
||||||
* prepare_lock held.
|
* prepare_lock held.
|
||||||
*
|
*
|
||||||
|
* @is_prepared: Queries the hardware to determine if the clock is prepared.
|
||||||
|
* This function is allowed to sleep. Optional, if this op is not
|
||||||
|
* set then the prepare count will be used.
|
||||||
|
*
|
||||||
* @enable: Enable the clock atomically. This must not return until the
|
* @enable: Enable the clock atomically. This must not return until the
|
||||||
* clock is generating a valid clock signal, usable by consumer
|
* clock is generating a valid clock signal, usable by consumer
|
||||||
* devices. Called with enable_lock held. This function must not
|
* devices. Called with enable_lock held. This function must not
|
||||||
|
@ -108,6 +112,7 @@ struct clk_hw;
|
||||||
struct clk_ops {
|
struct clk_ops {
|
||||||
int (*prepare)(struct clk_hw *hw);
|
int (*prepare)(struct clk_hw *hw);
|
||||||
void (*unprepare)(struct clk_hw *hw);
|
void (*unprepare)(struct clk_hw *hw);
|
||||||
|
int (*is_prepared)(struct clk_hw *hw);
|
||||||
int (*enable)(struct clk_hw *hw);
|
int (*enable)(struct clk_hw *hw);
|
||||||
void (*disable)(struct clk_hw *hw);
|
void (*disable)(struct clk_hw *hw);
|
||||||
int (*is_enabled)(struct clk_hw *hw);
|
int (*is_enabled)(struct clk_hw *hw);
|
||||||
|
@ -351,6 +356,7 @@ unsigned int __clk_get_enable_count(struct clk *clk);
|
||||||
unsigned int __clk_get_prepare_count(struct clk *clk);
|
unsigned int __clk_get_prepare_count(struct clk *clk);
|
||||||
unsigned long __clk_get_rate(struct clk *clk);
|
unsigned long __clk_get_rate(struct clk *clk);
|
||||||
unsigned long __clk_get_flags(struct clk *clk);
|
unsigned long __clk_get_flags(struct clk *clk);
|
||||||
|
bool __clk_is_prepared(struct clk *clk);
|
||||||
bool __clk_is_enabled(struct clk *clk);
|
bool __clk_is_enabled(struct clk *clk);
|
||||||
struct clk *__clk_lookup(const char *name);
|
struct clk *__clk_lookup(const char *name);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче