Re: [PATCH 4/6] clk: rockchip: rk3506: Fix CLK_SARADC set rate issues

Jonas Karlman <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
Hi Simon,

On 8/8/2026 7:39 PM, Simon Glass wrote:
> Hi Jonas,
> 
> On 2026-08-03T19:09:38, Jonas Karlman <[email protected]> wrote:
>> clk: rockchip: rk3506: Fix CLK_SARADC set rate issues
>>
>> The set_rate ops for the CLK_SARADC clock in RK3506 clock driver
>> force use of 32 KHz or 400 KHz rates when any requested rate is
>> divisible with 32 KHz or 400 KHz.
>>
>> Adjust logic to better match the 32 KHz, 400 KHz or 1.5-24 GHz rate
>> limitation of the CLK_SARADC clock in RK3506.
> 
> Shouldn't that should be 1.5-24 MHz, not GHz?
> 
>>
>> Signed-off-by: Jonas Karlman <[email protected]>
>>
>> drivers/clk/rockchip/clk_rk3506.c | 13 +++++--------
>>  1 file changed, 5 insertions(+), 8 deletions(-)
> 
>> diff --git a/drivers/clk/rockchip/clk_rk3506.c b/drivers/clk/rockchip/clk_rk3506.c
>> @@ -440,22 +440,19 @@ static ulong rk3506_sdmmc_set_rate(struct rk3506_clk_priv *priv, ulong clk_id,
>>  static ulong rk3506_saradc_get_rate(struct rk3506_clk_priv *priv, ulong clk_id)
>>  {
>>       u32 con, div, sel;
>> -     ulong prate;
> 
>>
>>       con = readl(RK3506_CLKSEL_CON(54));
>>       sel = FIELD_GET(CLK_SARADC_SEL_MASK, con);
>>       div = FIELD_GET(CLK_SARADC_DIV_MASK, con);
>>
>>       if (sel == CLK_SARADC_SEL_24M)
>> -             prate = OSC_HZ;
>> +             return DIV_TO_RATE(OSC_HZ, div);
>>       else if (sel == CLK_SARADC_SEL_400K)
>> -             prate = 400000;
>> +             return 400000;
>>       else if (sel == CLK_SARADC_SEL_32K)
>> -             prate = 32000;
>> +             return 32000;
> 
> The commit message only mentions set_rate, but this changes get_rate
> to ignore the divider on the 32K/400K paths. Please mention this and
> explain why - I assume the hardware divider is only wired to the 24
> MHz mux input, but that isn't obvious from the code. Also div is now
> read but unused on those two paths.

The divider is configured to 1 in set_rate path, so this change is a
simplification to ensure the ops for CLK_SARADC works as expected had
set_rate been run.

The commit message already mentions that logic is adjusted to better
match the limitation of the CLK_SARADC clock.

> 
>> diff --git a/drivers/clk/rockchip/clk_rk3506.c b/drivers/clk/rockchip/clk_rk3506.c
>> @@ -463,10 +460,10 @@ static ulong rk3506_saradc_set_rate(struct rk3506_clk_priv *priv, ulong clk_id,
>>  {
>>       u32 div, sel;
> 
>>
>> -     if (32000 % rate == 0) {
>> +     if (rate <= 32768) {
>>               sel = CLK_SARADC_SEL_32K;
>>               div = 1;
> 
> The threshold 32768 is odd given that get_rate reports this source as
> 32000 - please pick one value and use it consistently, or add a
> comment. I suspect the real source is 32.768 kHz, in which case
> get_rate should return 32768.

I would also think it should be 32768, however TRM only state 32K and
vendor U-Boot use 32000.

Due to this uncertainty and how the fallback use a very narrow divider
field, 4-bits, it is more appropriate to check for <= 32768 or rate
may have fallback to 1.5-24 MHz depending on bits [3:0] of the
DIV_ROUND_UP(24000000, rate)-1 when close to 32 KHz is requested.

I still think this change fits under adjust logic to fit clock
limitations.

Regards,
Jonas

> 
> Regards,
> Simon
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.