Commit 3cc8247f authored by Ulf Hansson's avatar Ulf Hansson Committed by Mike Turquette

clk: Introduce optional unprepare_unused callback

An unprepare_unused callback is introduced due to the same reasons to
why the disable_unused callback was added.

During the clk_disable_unused sequence, those clk_hw that needs specific
treatment with regards to being unprepared, shall implement the
unprepare_unused callback.
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarMike Turquette <mturquette@linaro.org>
parent 1c155b3d
...@@ -352,9 +352,12 @@ static void clk_unprepare_unused_subtree(struct clk *clk) ...@@ -352,9 +352,12 @@ static void clk_unprepare_unused_subtree(struct clk *clk)
if (clk->flags & CLK_IGNORE_UNUSED) if (clk->flags & CLK_IGNORE_UNUSED)
return; return;
if (__clk_is_prepared(clk)) if (__clk_is_prepared(clk)) {
if (clk->ops->unprepare) if (clk->ops->unprepare_unused)
clk->ops->unprepare_unused(clk->hw);
else if (clk->ops->unprepare)
clk->ops->unprepare(clk->hw); clk->ops->unprepare(clk->hw);
}
} }
/* caller must hold prepare_lock */ /* caller must hold prepare_lock */
......
...@@ -49,6 +49,10 @@ struct clk_hw; ...@@ -49,6 +49,10 @@ struct clk_hw;
* This function is allowed to sleep. Optional, if this op is not * This function is allowed to sleep. Optional, if this op is not
* set then the prepare count will be used. * set then the prepare count will be used.
* *
* @unprepare_unused: Unprepare the clock atomically. Only called from
* clk_disable_unused for prepare clocks with special needs.
* Called with prepare mutex held. This function may sleep.
*
* @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
...@@ -113,6 +117,7 @@ struct clk_ops { ...@@ -113,6 +117,7 @@ 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 (*is_prepared)(struct clk_hw *hw);
void (*unprepare_unused)(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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment