[PATCH 06/22] clk: get clock pointer before proceeding

Simon Glass sjg at chromium.org
Tue Aug 4 04:00:40 CEST 2020


Hi Claudiu,

On Wed, 29 Jul 2020 at 08:52, Claudiu Beznea
<claudiu.beznea at microchip.com> wrote:
>
> clk_get_by_indexed_prop() retrieves a clock with dev member being set
> with the pointer to the udevice for the clock controller driver. But
> in case of CCF each struct clk object has set in dev member the reference
> to its parent (the root of the clock tree is a fixed clock, every
> node in clock tree is a clock registered with clk_register()). In this
> case the subsequent operations like dev_get_clk_ptr() on clocks
> retrieved by clk_get_by_indexed_prop() will fail. For this, get the
> pointer to the proper clock registered (with clk_register()) using
> clk_get_by_id() before proceeding.
>
> Fixes: 1d7993d1d0ef ("clk: Port Linux common clock framework [CCF] for imx6q to U-boot (tag: v5.1.12)")
> Signed-off-by: Claudiu Beznea <claudiu.beznea at microchip.com>
> ---
>  drivers/clk/clk-uclass.c | 41 +++++++++++++++++++++++++++++++++++++----
>  1 file changed, 37 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
> index 958a9490bee2..8f926aad12cf 100644
> --- a/drivers/clk/clk-uclass.c
> +++ b/drivers/clk/clk-uclass.c
> @@ -186,7 +186,7 @@ bulk_get_err:
>
>  static int clk_set_default_parents(struct udevice *dev, int stage)
>  {
> -       struct clk clk, parent_clk;
> +       struct clk clk, parent_clk, *c, *p;
>         int index;
>         int num_parents;
>         int ret;
> @@ -212,6 +212,17 @@ static int clk_set_default_parents(struct udevice *dev, int stage)
>                         return ret;
>                 }
>
> +               if (CONFIG_IS_ENABLED(CLK_CCF)) {
> +                       ret = clk_get_by_id(parent_clk.id, &p);
> +                       if (ret) {
> +                               debug("%s(): could not get parent clock pointer, id %lu, for %s\n",
> +                                     __func__, parent_clk.id, dev_read_name(dev));
> +                               return ret;
> +                       }
> +               } else {
> +                       p = &parent_clk;
> +               }
> +
>                 ret = clk_get_by_indexed_prop(dev, "assigned-clocks",
>                                               index, &clk);
>                 if (ret) {
> @@ -231,7 +242,18 @@ static int clk_set_default_parents(struct udevice *dev, int stage)
>                         /* do not setup twice the parent clocks */
>                         continue;
>
> -               ret = clk_set_parent(&clk, &parent_clk);
> +               if (CONFIG_IS_ENABLED(CLK_CCF)) {
> +                       ret = clk_get_by_id(clk.id, &c);
> +                       if (ret) {
> +                               debug("%s(): could not get clock pointer, id %lu, for %s\n",
> +                                     __func__, clk.id, dev_read_name(dev));
> +                               return ret;
> +                       }
> +               } else {
> +                       c = &clk;
> +               }

Could this code go in a function? It seems to be repeated three times.

> +
> +               ret = clk_set_parent(c, p);
>                 /*
>                  * Not all drivers may support clock-reparenting (as of now).
>                  * Ignore errors due to this.
> @@ -251,7 +273,7 @@ static int clk_set_default_parents(struct udevice *dev, int stage)
>
>  static int clk_set_default_rates(struct udevice *dev, int stage)
>  {
> -       struct clk clk;
> +       struct clk clk, *c;
>         int index;
>         int num_rates;
>         int size;
> @@ -295,7 +317,18 @@ static int clk_set_default_rates(struct udevice *dev, int stage)
>                         /* do not setup twice the parent clocks */
>                         continue;
>
> -               ret = clk_set_rate(&clk, rates[index]);
> +               if (CONFIG_IS_ENABLED(CLK_CCF)) {
> +                       ret = clk_get_by_id(clk.id, &c);
> +                       if (ret) {
> +                               debug("%s(): could not get clock pointer, id %lu, for %s\n",
> +                                     __func__, clk.id, dev_read_name(dev));
> +                               return ret;
> +                       }
> +               } else {
> +                       c = &clk;
> +               }
> +
> +               ret = clk_set_rate(c, rates[index]);
>
>                 if (ret < 0) {
>                         debug("%s: failed to set rate on clock index %d (%ld) for %s\n",
> --
> 2.7.4
>

Regards,
Simon


More information about the U-Boot mailing list