diff mbox series

[RFC] clk: fix clk_get_rate() always return ulong

Message ID 87a67rwav0.fsf@baylibre.com
State RFC
Delegated to: Sean Anderson
Headers show
Series [RFC] clk: fix clk_get_rate() always return ulong | expand

Commit Message

Julien Masson Aug. 26, 2022, 10:31 a.m. UTC
According to clk_ops struct definition, the callback `get_rate()`
return current clock rate value as ulong.
`clk_get_rate()` should handle the clock rate returned as ulong also.

Otherwise we may have invalid/truncated clock rate value returned by
`clk_get_rate()`.

`log_ret` has also been removed since it use an `int` in the macro
definition.

Signed-off-by: Julien Masson <jmasson@baylibre.com>
---
 drivers/clk/clk-uclass.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Sean Anderson Aug. 26, 2022, 2 p.m. UTC | #1
On 8/26/22 6:31 AM, Julien Masson wrote:
> According to clk_ops struct definition, the callback `get_rate()`
> return current clock rate value as ulong.
> `clk_get_rate()` should handle the clock rate returned as ulong also.
> 
> Otherwise we may have invalid/truncated clock rate value returned by
> `clk_get_rate()`.
> 
> `log_ret` has also been removed since it use an `int` in the macro
> definition.
> 
> Signed-off-by: Julien Masson <jmasson@baylibre.com>
> ---
>   drivers/clk/clk-uclass.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
> index b89c77bf79..446f7c49b8 100644
> --- a/drivers/clk/clk-uclass.c
> +++ b/drivers/clk/clk-uclass.c
> @@ -469,7 +469,7 @@ void clk_free(struct clk *clk)
>   ulong clk_get_rate(struct clk *clk)
>   {
>   	const struct clk_ops *ops;
> -	int ret;
> +	ulong ret;
>   
>   	debug("%s(clk=%p)\n", __func__, clk);
>   	if (!clk_valid(clk))
> @@ -481,7 +481,7 @@ ulong clk_get_rate(struct clk *clk)
>   
>   	ret = ops->get_rate(clk);
>   	if (ret)
> -		return log_ret(ret);
> +		return ret;
>   
>   	return 0;

This can just be return ret no if required.

>   }
>
Simon Glass Aug. 27, 2022, 12:20 a.m. UTC | #2
Hi,

On Fri, 26 Aug 2022 at 08:00, Sean Anderson <seanga2@gmail.com> wrote:
>
> On 8/26/22 6:31 AM, Julien Masson wrote:
> > According to clk_ops struct definition, the callback `get_rate()`
> > return current clock rate value as ulong.
> > `clk_get_rate()` should handle the clock rate returned as ulong also.
> >
> > Otherwise we may have invalid/truncated clock rate value returned by
> > `clk_get_rate()`.
> >
> > `log_ret` has also been removed since it use an `int` in the macro
> > definition.
> >
> > Signed-off-by: Julien Masson <jmasson@baylibre.com>
> > ---
> >   drivers/clk/clk-uclass.c | 4 ++--
> >   1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
> > index b89c77bf79..446f7c49b8 100644
> > --- a/drivers/clk/clk-uclass.c
> > +++ b/drivers/clk/clk-uclass.c
> > @@ -469,7 +469,7 @@ void clk_free(struct clk *clk)
> >   ulong clk_get_rate(struct clk *clk)
> >   {
> >       const struct clk_ops *ops;
> > -     int ret;
> > +     ulong ret;
> >
> >       debug("%s(clk=%p)\n", __func__, clk);
> >       if (!clk_valid(clk))
> > @@ -481,7 +481,7 @@ ulong clk_get_rate(struct clk *clk)
> >
> >       ret = ops->get_rate(clk);
> >       if (ret)
> > -             return log_ret(ret);

How about:

if (IS_ERR(ret))
   return log_ret(ret)

> > +             return ret;
> >
> >       return 0;
>
> This can just be return ret no if required.

Yes, but it is nice to have the 'success' path clear and at the end.

>
> >   }
> >

Regards,
Simon
Julien Masson Aug. 29, 2022, 8:55 a.m. UTC | #3
On Mon 29 Aug 2022 at 10:38, Simon Glass <sjg@chromium.org> wrote:

> Hi,
> 
> On Fri, 26 Aug 2022 at 08:00, Sean Anderson <seanga2@gmail.com> wrote:
>>
>> On 8/26/22 6:31 AM, Julien Masson wrote:
>>> According to clk_ops struct definition, the callback `get_rate()`
>>> return current clock rate value as ulong.
>>> `clk_get_rate()` should handle the clock rate returned as ulong also.
>>>
>>> Otherwise we may have invalid/truncated clock rate value returned by
>>> `clk_get_rate()`.
>>>
>>> `log_ret` has also been removed since it use an `int` in the macro
>>> definition.
>>>
>>> Signed-off-by: Julien Masson <jmasson@baylibre.com>
>>> ---
>>>   drivers/clk/clk-uclass.c | 4 ++--
>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
>>> index b89c77bf79..446f7c49b8 100644
>>> --- a/drivers/clk/clk-uclass.c
>>> +++ b/drivers/clk/clk-uclass.c
>>> @@ -469,7 +469,7 @@ void clk_free(struct clk *clk)
>>>   ulong clk_get_rate(struct clk *clk)
>>>   {
>>>       const struct clk_ops *ops;
>>> -     int ret;
>>> +     ulong ret;
>>>
>>>       debug("%s(clk=%p)\n", __func__, clk);
>>>       if (!clk_valid(clk))
>>> @@ -481,7 +481,7 @@ ulong clk_get_rate(struct clk *clk)
>>>
>>>       ret = ops->get_rate(clk);
>>>       if (ret)
>>> -             return log_ret(ret);
> 
> How about:
> 
> if (IS_ERR(ret))
>    return log_ret(ret)
Maybe we can let the caller do this check ?

This is how we do for these functions: clk_round_rate and clk_set_rate

> 
>>> +             return ret;
>>>
>>>       return 0;
>>
>> This can just be return ret no if required.
Yes correct I can directly return the callback, I will change that in v2.

> 
> Yes, but it is nice to have the 'success' path clear and at the end.
hummm it's not clear to me if return 0 is considered as 'success' path.
I guess some drivers doesn't expect to get 0 from a clock ...

As I suggested previously maybe we can let the caller handle the value
returned by the callback ? (like clk_round_rate and clk_set_rate)

> 
>>
>>>   }
>>>
> 
> Regards,
> Simon
diff mbox series

Patch

diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index b89c77bf79..446f7c49b8 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -469,7 +469,7 @@  void clk_free(struct clk *clk)
 ulong clk_get_rate(struct clk *clk)
 {
 	const struct clk_ops *ops;
-	int ret;
+	ulong ret;
 
 	debug("%s(clk=%p)\n", __func__, clk);
 	if (!clk_valid(clk))
@@ -481,7 +481,7 @@  ulong clk_get_rate(struct clk *clk)
 
 	ret = ops->get_rate(clk);
 	if (ret)
-		return log_ret(ret);
+		return ret;
 
 	return 0;
 }