[PATCH 1/2] clk: introduce optional disable_unused callback
Mike Turquette
mturquette at linaro.org
Wed Dec 5 13:00:03 EST 2012
On Wed, Dec 5, 2012 at 8:13 AM, Ulf Hansson <ulf.hansson at linaro.org> wrote:
> On 4 December 2012 22:00, Mike Turquette <mturquette at linaro.org> wrote:
>> Some gate clocks have special needs which must be handled during the
>> disable-unused clocks sequence. These needs might be driven by software
>> due to the fact that we're disabling a clock outside of the normal
>> clk_disable path and a clk's enable_count will not be accurate. On the
>> other hand a specific hardware programming sequence might need to be
>> followed for this corner case.
>>
>> This change is needed for the upcoming OMAP port to the common clock
>> framework. Specifically, it is undesirable to treat the disable-unused
>> path identically to the normal clk_disable path since other software
>> layers are involved. In this case OMAP's clockdomain code throws WARNs
>> and bails early due to the clock's enable_count being set to zero. A
>> custom callback mitigates this problem nicely.
>>
>> Cc: Paul Walmsley <paul at pwsan.com>
>> Signed-off-by: Mike Turquette <mturquette at linaro.org>
>> ---
>> drivers/clk/clk.c | 13 +++++++++++--
>> include/linux/clk-provider.h | 6 ++++++
>> 2 files changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
>> index 9955ad7..251e45d 100644
>> --- a/drivers/clk/clk.c
>> +++ b/drivers/clk/clk.c
>> @@ -219,8 +219,17 @@ static void clk_disable_unused_subtree(struct clk *clk)
>> if (clk->flags & CLK_IGNORE_UNUSED)
>> goto unlock_out;
>>
>> - if (__clk_is_enabled(clk) && clk->ops->disable)
>> - clk->ops->disable(clk->hw);
>> + /*
>> + * some gate clocks have special needs during the disable-unused
>> + * sequence. call .disable_unused if available, otherwise fall
>> + * back to .disable
>> + */
>> + if (__clk_is_enabled(clk)) {
>> + if (clk->ops->disable_unused)
>> + clk->ops->disable_unused(clk->hw);
>> + else if (clk->ops->disable)
>> + clk->ops->disable(clk->hw);
>> + }
>>
>> unlock_out:
>> spin_unlock_irqrestore(&enable_lock, flags);
>> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
>> index 3593a3c..1c94d18 100644
>> --- a/include/linux/clk-provider.h
>> +++ b/include/linux/clk-provider.h
>> @@ -57,6 +57,11 @@ struct clk_hw;
>> * This function must not sleep. Optional, if this op is not
>> * set then the enable count will be used.
>> *
>> + * @disable_unused: Disable the clock atomically. Only called from
>> + * clk_disable_unused for gate clocks with special needs.
>> + * Called with enable_lock held. This function must not
>> + * sleep.
>> + *
>> * @recalc_rate Recalculate the rate of this clock, by querying hardware. The
>> * parent rate is an input parameter. It is up to the caller to
>> * ensure that the prepare_mutex is held across this call.
>> @@ -106,6 +111,7 @@ struct clk_ops {
>> int (*enable)(struct clk_hw *hw);
>> void (*disable)(struct clk_hw *hw);
>> int (*is_enabled)(struct clk_hw *hw);
>> + void (*disable_unused)(struct clk_hw *hw);
>> unsigned long (*recalc_rate)(struct clk_hw *hw,
>> unsigned long parent_rate);
>> long (*round_rate)(struct clk_hw *hw, unsigned long,
>> --
>> 1.7.9.5
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
> Is there a need for updating the clk documentation around this?
>
I knew I was forgetting something. The documentation needs a general
cleanup effort and this callback should not go undocumented for long.
> Anyway, you have my:
>
> Acked-by: Ulf Hansson <ulf.hansson at linaro.org>
>
Thanks!
Regards,
Mike
>
> Kind regards
> Ulf Hansson
More information about the linux-arm-kernel
mailing list