On 5 June 2018 at 17:05, Geert Uytterhoeven <geert+rene...@glider.be> wrote:
> The quirk for R-Car E3 ES1.0 added in commit 086b399965a7ee7e ("soc:
> renesas: r8a77990-sysc: Add workaround for 3DG-{A,B}") makes the 3DG-A
> PM domain a subdomain of the 3DG-B PM domain.  However, registering
> 3DG-A with its parent fails silently, as the 3DG-B PM domain hasn't been
> registered yet, and such failures are never reported.
>
> Fix this by:
>   1. Splitting PM Domain initialization in two steps, so all PM domains
>      are registered before any child-parent links are established,
>   2. Reporting any failures in establishing child-parent relations.
>
> Check for and report pm_genpd_init() failures, too, as that function
> gained a return value in commit 7eb231c337e00735 ("PM / Domains: Convert
> pm_genpd_init() to return an error code").
>
> Fixes: 086b399965a7ee7e ("soc: renesas: r8a77990-sysc: Add workaround for 
> 3DG-{A,B}")
> Signed-off-by: Geert Uytterhoeven <geert+rene...@glider.be>

Reviewed-by: Ulf Hansson <ulf.hans...@linaro.org>

Kind regards
Uffe

> ---
>  drivers/soc/renesas/rcar-sysc.c | 35 +++++++++++++++++++++++++++++------
>  1 file changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/soc/renesas/rcar-sysc.c b/drivers/soc/renesas/rcar-sysc.c
> index 4db53fa38abc5cf3..99e926f68299878d 100644
> --- a/drivers/soc/renesas/rcar-sysc.c
> +++ b/drivers/soc/renesas/rcar-sysc.c
> @@ -379,11 +379,12 @@ static int rcar_sysc_pd_power_on(struct 
> generic_pm_domain *genpd)
>
>  static bool has_cpg_mstp;
>
> -static void __init rcar_sysc_pd_setup(struct rcar_sysc_pd *pd)
> +static int __init rcar_sysc_pd_setup(struct rcar_sysc_pd *pd)
>  {
>         struct generic_pm_domain *genpd = &pd->genpd;
>         const char *name = pd->genpd.name;
>         struct dev_power_governor *gov = &simple_qos_governor;
> +       int error;
>
>         if (pd->flags & PD_CPU) {
>                 /*
> @@ -436,7 +437,11 @@ static void __init rcar_sysc_pd_setup(struct 
> rcar_sysc_pd *pd)
>         rcar_sysc_power_up(&pd->ch);
>
>  finalize:
> -       pm_genpd_init(genpd, gov, false);
> +       error = pm_genpd_init(genpd, gov, false);
> +       if (error)
> +               pr_err("Failed to init PM domain %s: %d\n", name, error);
> +
> +       return error;
>  }
>
>  static const struct of_device_id rcar_sysc_matches[] __initconst = {
> @@ -560,6 +565,9 @@ static int __init rcar_sysc_pd_init(void)
>         pr_debug("%pOF: syscier = 0x%08x\n", np, syscier);
>         iowrite32(syscier, base + SYSCIER);
>
> +       /*
> +        * First, create all PM domains
> +        */
>         for (i = 0; i < info->num_areas; i++) {
>                 const struct rcar_sysc_area *area = &info->areas[i];
>                 struct rcar_sysc_pd *pd;
> @@ -582,14 +590,29 @@ static int __init rcar_sysc_pd_init(void)
>                 pd->ch.isr_bit = area->isr_bit;
>                 pd->flags = area->flags;
>
> -               rcar_sysc_pd_setup(pd);
> -               if (area->parent >= 0)
> -                       pm_genpd_add_subdomain(domains->domains[area->parent],
> -                                              &pd->genpd);
> +               error = rcar_sysc_pd_setup(pd);
> +               if (error)
> +                       goto out_put;
>
>                 domains->domains[area->isr_bit] = &pd->genpd;
>         }
>
> +       /*
> +        * Second, link all PM domains to their parents
> +        */
> +       for (i = 0; i < info->num_areas; i++) {
> +               const struct rcar_sysc_area *area = &info->areas[i];
> +
> +               if (!area->name || area->parent < 0)
> +                       continue;
> +
> +               error = pm_genpd_add_subdomain(domains->domains[area->parent],
> +                                              
> domains->domains[area->isr_bit]);
> +               if (error)
> +                       pr_warn("Failed to add PM subdomain %s to parent 
> %u\n",
> +                               area->name, area->parent);
> +       }
> +
>         error = of_genpd_add_provider_onecell(np, &domains->onecell_data);
>
>  out_put:
> --
> 2.7.4
>

Reply via email to