Message ID | 20211011112719.3951784-3-claudiu.beznea@microchip.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | clk: at91: updates for power management and dvfs | expand |
On 11/10/2021 at 13:27, Claudiu Beznea wrote: > Before going to backup mode architecture specific PM code sets the first > word in securam (file arch/arm/mach-at91/pm.c, function at91_pm_begin()). > Thus take this into account when suspending/resuming clocks. This will > avoid executing unnecessary instructions when suspending to non backup > modes. > > Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> Ok to do it like this: Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com> > --- > drivers/clk/at91/pmc.c | 39 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c > index b2806946a77a..517973062719 100644 > --- a/drivers/clk/at91/pmc.c > +++ b/drivers/clk/at91/pmc.c > @@ -8,6 +8,7 @@ > #include <linux/clkdev.h> > #include <linux/clk/at91_pmc.h> > #include <linux/of.h> > +#include <linux/of_address.h> > #include <linux/mfd/syscon.h> > #include <linux/platform_device.h> > #include <linux/regmap.h> > @@ -110,13 +111,35 @@ struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, > } > > #ifdef CONFIG_PM > + > +/* Address in SECURAM that say if we suspend to backup mode. */ > +static void __iomem *at91_pmc_backup_suspend; > + > static int at91_pmc_suspend(void) > { > + unsigned int backup; > + > + if (!at91_pmc_backup_suspend) > + return 0; > + > + backup = readl_relaxed(at91_pmc_backup_suspend); > + if (!backup) > + return 0; > + > return clk_save_context(); > } > > static void at91_pmc_resume(void) > { > + unsigned int backup; > + > + if (!at91_pmc_backup_suspend) > + return; > + > + backup = readl_relaxed(at91_pmc_backup_suspend); > + if (!backup) > + return; > + > clk_restore_context(); > } > > @@ -144,6 +167,22 @@ static int __init pmc_register_ops(void) > } > of_node_put(np); > > + np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam"); > + if (!np) > + return -ENODEV; > + > + if (!of_device_is_available(np)) { > + of_node_put(np); > + return -ENODEV; > + } > + of_node_put(np); > + > + at91_pmc_backup_suspend = of_iomap(np, 0); > + if (!at91_pmc_backup_suspend) { > + pr_warn("%s(): unable to map securam\n", __func__); > + return -ENOMEM; > + } > + > register_syscore_ops(&pmc_syscore_ops); > > return 0; >
diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c index b2806946a77a..517973062719 100644 --- a/drivers/clk/at91/pmc.c +++ b/drivers/clk/at91/pmc.c @@ -8,6 +8,7 @@ #include <linux/clkdev.h> #include <linux/clk/at91_pmc.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/mfd/syscon.h> #include <linux/platform_device.h> #include <linux/regmap.h> @@ -110,13 +111,35 @@ struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, } #ifdef CONFIG_PM + +/* Address in SECURAM that say if we suspend to backup mode. */ +static void __iomem *at91_pmc_backup_suspend; + static int at91_pmc_suspend(void) { + unsigned int backup; + + if (!at91_pmc_backup_suspend) + return 0; + + backup = readl_relaxed(at91_pmc_backup_suspend); + if (!backup) + return 0; + return clk_save_context(); } static void at91_pmc_resume(void) { + unsigned int backup; + + if (!at91_pmc_backup_suspend) + return; + + backup = readl_relaxed(at91_pmc_backup_suspend); + if (!backup) + return; + clk_restore_context(); } @@ -144,6 +167,22 @@ static int __init pmc_register_ops(void) } of_node_put(np); + np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam"); + if (!np) + return -ENODEV; + + if (!of_device_is_available(np)) { + of_node_put(np); + return -ENODEV; + } + of_node_put(np); + + at91_pmc_backup_suspend = of_iomap(np, 0); + if (!at91_pmc_backup_suspend) { + pr_warn("%s(): unable to map securam\n", __func__); + return -ENOMEM; + } + register_syscore_ops(&pmc_syscore_ops); return 0;
Before going to backup mode architecture specific PM code sets the first word in securam (file arch/arm/mach-at91/pm.c, function at91_pm_begin()). Thus take this into account when suspending/resuming clocks. This will avoid executing unnecessary instructions when suspending to non backup modes. Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> --- drivers/clk/at91/pmc.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)