Re: [PATCH] clk: renesas: rcar-gen3: set state when registering SD clocks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Niklas,

On Thu, Nov 29, 2018 at 1:16 AM Niklas Söderlund
<niklas.soderlund+renesas@xxxxxxxxxxxx> wrote:
> The driver tries to figure out which state a SD clock is in when the
> clock is register instead of setting a known state. This can be
> problematic for two reasons.
>
> 1. If the clock driver can't figure out the state of the clock
>    registration of the clock fails and setting of a known state by a
>    clock user is not possible.
>
> 2. The state of the clock depends on if and how the bootloader
>    configured it. The driver only checks that the rate is known not if
>    the clock is stopped or not for example.
>
> Fix this by setting a known state and make sure the clock is stopped.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>

Thanks for your patch!

Reviewed-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>

One minor nit below.

> --- a/drivers/clk/renesas/rcar-gen3-cpg.c
> +++ b/drivers/clk/renesas/rcar-gen3-cpg.c
> @@ -360,7 +360,7 @@ static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
>         struct sd_clock *clock;
>         struct clk *clk;
>         unsigned int i;
> -       u32 sd_fc;
> +       u32 val;
>
>         clock = kzalloc(sizeof(*clock), GFP_KERNEL);
>         if (!clock)
> @@ -377,17 +377,11 @@ static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
>         clock->div_table = cpg_sd_div_table;
>         clock->div_num = ARRAY_SIZE(cpg_sd_div_table);
>
> -       sd_fc = readl(clock->csn.reg) & CPG_SD_FC_MASK;
> -       for (i = 0; i < clock->div_num; i++)
> -               if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
> -                       break;
> -
> -       if (WARN_ON(i >= clock->div_num)) {
> -               kfree(clock);
> -               return ERR_PTR(-EINVAL);
> -       }
> +       val = readl(clock->csn.reg) & ~CPG_SD_FC_MASK;
> +       val |= CPG_SD_STP_MASK | (clock->div_table[0].val & CPG_SD_FC_MASK);
> +       writel(val, clock->csn.reg);
>
> -       clock->cur_div_idx = i;
> +       clock->cur_div_idx = 0;

I think this line can just be dropped, as the object was allocated using
kzalloc().

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds



[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux