diff mbox

[v3,05/11] soc: renesas: rcar-sysc: Enable Clock Domain for r8a7795 I/O devices

Message ID 1457551127-21934-6-git-send-email-geert+renesas@glider.be (mailing list archive)
State Deferred
Delegated to: Simon Horman
Headers show

Commit Message

Geert Uytterhoeven March 9, 2016, 7:18 p.m. UTC
On R-Car H3, some power areas (e.g. A3VP) contain I/O devices, which are
also part of the CPG/MSSR Clock Domain.  Hook up the CPG/MSSR Clock
Domain attach/detach callbacks to enable power management using module
clocks.

This also allows to support the Clock Domain for devices in the
"always-on" power area.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
---
v3:
  - Hook up the CPG/MSSR Clock Domain attach/detach callbacks instead of
    using our own copies,

v2:
  - New.
---
 drivers/soc/renesas/rcar-sysc.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Laurent Pinchart March 10, 2016, 9:40 a.m. UTC | #1
Hi Geert,

Thank you for the patch.

On Wednesday 09 March 2016 20:18:41 Geert Uytterhoeven wrote:
> On R-Car H3, some power areas (e.g. A3VP) contain I/O devices, which are
> also part of the CPG/MSSR Clock Domain.  Hook up the CPG/MSSR Clock
> Domain attach/detach callbacks to enable power management using module
> clocks.
> 
> This also allows to support the Clock Domain for devices in the
> "always-on" power area.
> 
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@codeaurora.org>
> ---
> v3:
>   - Hook up the CPG/MSSR Clock Domain attach/detach callbacks instead of
>     using our own copies,
> 
> v2:
>   - New.
> ---
>  drivers/soc/renesas/rcar-sysc.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/soc/renesas/rcar-sysc.c
> b/drivers/soc/renesas/rcar-sysc.c index 28af0b704fc008d2..2d6fbeb481883be7
> 100644
> --- a/drivers/soc/renesas/rcar-sysc.c
> +++ b/drivers/soc/renesas/rcar-sysc.c
> @@ -9,6 +9,7 @@
>   * for more details.
>   */
> 
> +#include <linux/clk/renesas.h>
>  #include <linux/delay.h>
>  #include <linux/err.h>
>  #include <linux/mm.h>
> @@ -251,6 +252,15 @@ static void __init rcar_sysc_pd_setup(struct
> device_node *np, gov = &pm_domain_always_on_gov;
>  	}
> 
> +#ifdef CONFIG_ARCH_R8A7795

This is fine for now as the R8A7795 is the only ARM64 model in the R-Car 
family, but how do you plan to move forward on this ? Will it be enabled for 
ARM64 SoCs straight away, and for ARM32 SoCs when switching from the cpg to 
the always-on power domain ?

> +	if (!(pd->flags & (PD_CPU | PD_SCU))) {
> +		/* Enable Clock Domain for I/O devices */
> +		genpd->flags = GENPD_FLAG_PM_CLK;
> +		genpd->attach_dev = cpg_mssr_attach_dev;
> +		genpd->detach_dev = cpg_mssr_detach_dev;
> +	}
> +#endif
> +
>  	pm_genpd_init(genpd, gov, false);
>  	genpd->dev_ops.active_wakeup = rcar_sysc_active_wakeup;
>  	genpd->power_off = rcar_sysc_pd_power_off;
Geert Uytterhoeven March 10, 2016, 9:51 a.m. UTC | #2
Hi Laurent,

On Thu, Mar 10, 2016 at 10:40 AM, Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
> On Wednesday 09 March 2016 20:18:41 Geert Uytterhoeven wrote:
>> On R-Car H3, some power areas (e.g. A3VP) contain I/O devices, which are
>> also part of the CPG/MSSR Clock Domain.  Hook up the CPG/MSSR Clock
>> Domain attach/detach callbacks to enable power management using module
>> clocks.
>>
>> This also allows to support the Clock Domain for devices in the
>> "always-on" power area.
>>
>> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

>> --- a/drivers/soc/renesas/rcar-sysc.c
>> +++ b/drivers/soc/renesas/rcar-sysc.c

>> @@ -251,6 +252,15 @@ static void __init rcar_sysc_pd_setup(struct
>> device_node *np, gov = &pm_domain_always_on_gov;
>>       }
>>
>> +#ifdef CONFIG_ARCH_R8A7795
>
> This is fine for now as the R8A7795 is the only ARM64 model in the R-Car
> family, but how do you plan to move forward on this ? Will it be enabled for
> ARM64 SoCs straight away, and for ARM32 SoCs when switching from the cpg to
> the always-on power domain ?
>
>> +     if (!(pd->flags & (PD_CPU | PD_SCU))) {
>> +             /* Enable Clock Domain for I/O devices */
>> +             genpd->flags = GENPD_FLAG_PM_CLK;
>> +             genpd->attach_dev = cpg_mssr_attach_dev;
>> +             genpd->detach_dev = cpg_mssr_detach_dev;
>> +     }
>> +#endif

When enabling the always-on power domain for R-Car H1 and Gen2, this
should become:

        if (!(pd->flags & (PD_CPU | PD_SCU))) {
                /* Enable Clock Domain for I/O devices */
                genpd->flags = GENPD_FLAG_PM_CLK;
#ifdef CONFIG_ARCH_R8A7795 /* or CONFIG_ARM64 */
                genpd->attach_dev = cpg_mssr_attach_dev;
                genpd->detach_dev = cpg_mssr_detach_dev;
#else
                genpd->attach_dev = cpg_mstp_attach_dev;
                genpd->detach_dev = cpg_mstp_detach_dev;
#endif

It becomes more gory when migrating R-Car H1 and Gen2 to CPG/MSSR, and
maintaining backwards compatibility, as which callbacks to choose will depend
on the presence of "renesas,cpg-mstp-clocks" device nodes in DT, and a new
CONFIG_CLK_RENESAS_LEGACY option.
Needless to say, it'll be more complex if not all SoCs migrate at once...

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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
diff mbox

Patch

diff --git a/drivers/soc/renesas/rcar-sysc.c b/drivers/soc/renesas/rcar-sysc.c
index 28af0b704fc008d2..2d6fbeb481883be7 100644
--- a/drivers/soc/renesas/rcar-sysc.c
+++ b/drivers/soc/renesas/rcar-sysc.c
@@ -9,6 +9,7 @@ 
  * for more details.
  */
 
+#include <linux/clk/renesas.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/mm.h>
@@ -251,6 +252,15 @@  static void __init rcar_sysc_pd_setup(struct device_node *np,
 		gov = &pm_domain_always_on_gov;
 	}
 
+#ifdef CONFIG_ARCH_R8A7795
+	if (!(pd->flags & (PD_CPU | PD_SCU))) {
+		/* Enable Clock Domain for I/O devices */
+		genpd->flags = GENPD_FLAG_PM_CLK;
+		genpd->attach_dev = cpg_mssr_attach_dev;
+		genpd->detach_dev = cpg_mssr_detach_dev;
+	}
+#endif
+
 	pm_genpd_init(genpd, gov, false);
 	genpd->dev_ops.active_wakeup = rcar_sysc_active_wakeup;
 	genpd->power_off = rcar_sysc_pd_power_off;