diff mbox

clk: Add is_enabled sanity check

Message ID 1461292356-26043-1-git-send-email-jun.nie@linaro.org (mailing list archive)
State Rejected, archived
Delegated to: Stephen Boyd
Headers show

Commit Message

Jun Nie April 22, 2016, 2:32 a.m. UTC
If .enable and .disable is implemented, we must implement .is_enabled
per document. Otherwise, clk_disable_unused_subtree will not disable
the unused clock if the .is_enabled is not implemented, unecessary
power consumption happens on the clock as a result.

Signed-off-by: Jun Nie <jun.nie@linaro.org>
---
 drivers/clk/clk.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Stephen Boyd April 22, 2016, 10:36 p.m. UTC | #1
On 04/22, Jun Nie wrote:
> If .enable and .disable is implemented, we must implement .is_enabled
> per document. Otherwise, clk_disable_unused_subtree will not disable
> the unused clock if the .is_enabled is not implemented, unecessary
> power consumption happens on the clock as a result.
> 
> Signed-off-by: Jun Nie <jun.nie@linaro.org>
> ---
>  drivers/clk/clk.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index f13c3f4..5e63bee 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -2526,6 +2526,10 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw)
>  	int i, ret;
>  	struct clk_core *core;
>  
> +	if (hw->init->ops->enable && !hw->init->ops->is_enabled)
> +		pr_warn("Warning: %s %s must implement .is_enabled\n",
> +			__func__, hw->init->name);
> +
>  	core = kzalloc(sizeof(*core), GFP_KERNEL);
>  	if (!core) {
>  		ret = -ENOMEM;

Please move this to the place we check for other clk ops sanity.
Also, any idea how many drivers are not implementing is_enabled
but are implementing enable/disable?

Also, why isn't prepare/unprepare as important?
Jun Nie April 25, 2016, 6:48 a.m. UTC | #2
2016-04-23 6:36 GMT+08:00 Stephen Boyd <sboyd@codeaurora.org>:
> On 04/22, Jun Nie wrote:
>> If .enable and .disable is implemented, we must implement .is_enabled
>> per document. Otherwise, clk_disable_unused_subtree will not disable
>> the unused clock if the .is_enabled is not implemented, unecessary
>> power consumption happens on the clock as a result.
>>
>> Signed-off-by: Jun Nie <jun.nie@linaro.org>
>> ---
>>  drivers/clk/clk.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
>> index f13c3f4..5e63bee 100644
>> --- a/drivers/clk/clk.c
>> +++ b/drivers/clk/clk.c
>> @@ -2526,6 +2526,10 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw)
>>       int i, ret;
>>       struct clk_core *core;
>>
>> +     if (hw->init->ops->enable && !hw->init->ops->is_enabled)
>> +             pr_warn("Warning: %s %s must implement .is_enabled\n",
>> +                     __func__, hw->init->name);
>> +
>>       core = kzalloc(sizeof(*core), GFP_KERNEL);
>>       if (!core) {
>>               ret = -ENOMEM;
>
> Please move this to the place we check for other clk ops sanity.
Agree.

> Also, any idea how many drivers are not implementing is_enabled
> but are implementing enable/disable?
With grep and manual search the result, more than 30 clk ops in less
than 20 files miss the is_enabled callback.
grep -rw -e ".enable" -e ".is_enabled" drivers/clk/ | sed '/\*/d' | sed '/(/d'

>
> Also, why isn't prepare/unprepare as important?
The table of  clock hardware characteristics in the Document does not
say these two callback are mandatory in any case. Maybe some platform
does not need to prepare clock in a thread context.

>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
--
To unsubscribe from this list: send the line "unsubscribe linux-clk" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index f13c3f4..5e63bee 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -2526,6 +2526,10 @@  struct clk *clk_register(struct device *dev, struct clk_hw *hw)
 	int i, ret;
 	struct clk_core *core;
 
+	if (hw->init->ops->enable && !hw->init->ops->is_enabled)
+		pr_warn("Warning: %s %s must implement .is_enabled\n",
+			__func__, hw->init->name);
+
 	core = kzalloc(sizeof(*core), GFP_KERNEL);
 	if (!core) {
 		ret = -ENOMEM;