From: Stefan Agner <stefan@agner.ch> To: shawnguo@kernel.org, mturquette@baylibre.com, sboyd@codeaurora.org Cc: kernel@pengutronix.de, sergeimir@emcraft.com, tglx@linutronix.de, jason@lakedaemon.net, marc.zyngier@arm.com, robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, ijc+devicetree@hellion.org.uk, galak@codeaurora.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Stefan Agner <stefan@agner.ch> Subject: [PATCH 09/18] ARM: vf610: clk: add suspend/resume support Date: Wed, 9 Mar 2016 18:16:50 -0800 [thread overview] Message-ID: <1457576219-7971-10-git-send-email-stefan@agner.ch> (raw) In-Reply-To: <1457576219-7971-1-git-send-email-stefan@agner.ch> The clock register are lost when enterying LPSTOPx, hence provide suspend/resume functions restoring them. The clock gates get restored by the individual driver, hence we do not need to restore them here. Signed-off-by: Stefan Agner <stefan@agner.ch> --- drivers/clk/imx/clk-vf610.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c index 610a724..e2e2c43 100644 --- a/drivers/clk/imx/clk-vf610.c +++ b/drivers/clk/imx/clk-vf610.c @@ -10,6 +10,7 @@ #include <linux/of_address.h> #include <linux/clk.h> +#include <linux/syscore_ops.h> #include <dt-bindings/clock/vf610-clock.h> #include "clk.h" @@ -40,6 +41,7 @@ #define CCM_CCGR9 (ccm_base + 0x64) #define CCM_CCGR10 (ccm_base + 0x68) #define CCM_CCGR11 (ccm_base + 0x6c) +#define CCM_CCGRx(x) (CCM_CCGR0 + (x) * 4) #define CCM_CMEOR0 (ccm_base + 0x70) #define CCM_CMEOR1 (ccm_base + 0x74) #define CCM_CMEOR2 (ccm_base + 0x78) @@ -115,6 +117,13 @@ static struct clk_div_table pll4_audio_div_table[] = { static struct clk *clk[VF610_CLK_END]; static struct clk_onecell_data clk_data; +static u32 cscmr1; +static u32 cscmr2; +static u32 cscdr1; +static u32 cscdr2; +static u32 cscdr3; +static u32 ccgr[12]; + static unsigned int const clks_init_on[] __initconst = { VF610_CLK_SYS_BUS, VF610_CLK_DDR_SEL, @@ -134,6 +143,43 @@ static struct clk * __init vf610_get_fixed_clock( return clk; }; +static int vf610_clk_suspend(void) +{ + int i; + + cscmr1 = readl_relaxed(CCM_CSCMR1); + cscmr2 = readl_relaxed(CCM_CSCMR2); + + cscdr1 = readl_relaxed(CCM_CSCDR1); + cscdr2 = readl_relaxed(CCM_CSCDR2); + cscdr3 = readl_relaxed(CCM_CSCDR3); + + for (i = 0; i < 12; i++) + ccgr[i] = readl_relaxed(CCM_CCGRx(i)); + + return 0; +} + +static void vf610_clk_resume(void) +{ + int i; + + writel_relaxed(cscmr1, CCM_CSCMR1); + writel_relaxed(cscmr2, CCM_CSCMR2); + + writel_relaxed(cscdr1, CCM_CSCDR1); + writel_relaxed(cscdr2, CCM_CSCDR2); + writel_relaxed(cscdr3, CCM_CSCDR3); + + for (i = 0; i < 12; i++) + writel_relaxed(ccgr[i], CCM_CCGRx(i)); +} + +static struct syscore_ops vf610_clk_syscore_ops = { + .suspend = vf610_clk_suspend, + .resume = vf610_clk_resume, +}; + static void __init vf610_clocks_init(struct device_node *ccm_node) { struct device_node *np; @@ -414,9 +460,12 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) clk_prepare_enable(clk[clks_init_on[i]]); + register_syscore_ops(&vf610_clk_syscore_ops); + /* Add the clocks to provider list */ clk_data.clks = clk; clk_data.clk_num = ARRAY_SIZE(clk); of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); } CLK_OF_DECLARE(vf610, "fsl,vf610-ccm", vf610_clocks_init); + -- 2.7.2
WARNING: multiple messages have this Message-ID (diff)
From: stefan@agner.ch (Stefan Agner) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 09/18] ARM: vf610: clk: add suspend/resume support Date: Wed, 9 Mar 2016 18:16:50 -0800 [thread overview] Message-ID: <1457576219-7971-10-git-send-email-stefan@agner.ch> (raw) In-Reply-To: <1457576219-7971-1-git-send-email-stefan@agner.ch> The clock register are lost when enterying LPSTOPx, hence provide suspend/resume functions restoring them. The clock gates get restored by the individual driver, hence we do not need to restore them here. Signed-off-by: Stefan Agner <stefan@agner.ch> --- drivers/clk/imx/clk-vf610.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c index 610a724..e2e2c43 100644 --- a/drivers/clk/imx/clk-vf610.c +++ b/drivers/clk/imx/clk-vf610.c @@ -10,6 +10,7 @@ #include <linux/of_address.h> #include <linux/clk.h> +#include <linux/syscore_ops.h> #include <dt-bindings/clock/vf610-clock.h> #include "clk.h" @@ -40,6 +41,7 @@ #define CCM_CCGR9 (ccm_base + 0x64) #define CCM_CCGR10 (ccm_base + 0x68) #define CCM_CCGR11 (ccm_base + 0x6c) +#define CCM_CCGRx(x) (CCM_CCGR0 + (x) * 4) #define CCM_CMEOR0 (ccm_base + 0x70) #define CCM_CMEOR1 (ccm_base + 0x74) #define CCM_CMEOR2 (ccm_base + 0x78) @@ -115,6 +117,13 @@ static struct clk_div_table pll4_audio_div_table[] = { static struct clk *clk[VF610_CLK_END]; static struct clk_onecell_data clk_data; +static u32 cscmr1; +static u32 cscmr2; +static u32 cscdr1; +static u32 cscdr2; +static u32 cscdr3; +static u32 ccgr[12]; + static unsigned int const clks_init_on[] __initconst = { VF610_CLK_SYS_BUS, VF610_CLK_DDR_SEL, @@ -134,6 +143,43 @@ static struct clk * __init vf610_get_fixed_clock( return clk; }; +static int vf610_clk_suspend(void) +{ + int i; + + cscmr1 = readl_relaxed(CCM_CSCMR1); + cscmr2 = readl_relaxed(CCM_CSCMR2); + + cscdr1 = readl_relaxed(CCM_CSCDR1); + cscdr2 = readl_relaxed(CCM_CSCDR2); + cscdr3 = readl_relaxed(CCM_CSCDR3); + + for (i = 0; i < 12; i++) + ccgr[i] = readl_relaxed(CCM_CCGRx(i)); + + return 0; +} + +static void vf610_clk_resume(void) +{ + int i; + + writel_relaxed(cscmr1, CCM_CSCMR1); + writel_relaxed(cscmr2, CCM_CSCMR2); + + writel_relaxed(cscdr1, CCM_CSCDR1); + writel_relaxed(cscdr2, CCM_CSCDR2); + writel_relaxed(cscdr3, CCM_CSCDR3); + + for (i = 0; i < 12; i++) + writel_relaxed(ccgr[i], CCM_CCGRx(i)); +} + +static struct syscore_ops vf610_clk_syscore_ops = { + .suspend = vf610_clk_suspend, + .resume = vf610_clk_resume, +}; + static void __init vf610_clocks_init(struct device_node *ccm_node) { struct device_node *np; @@ -414,9 +460,12 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) clk_prepare_enable(clk[clks_init_on[i]]); + register_syscore_ops(&vf610_clk_syscore_ops); + /* Add the clocks to provider list */ clk_data.clks = clk; clk_data.clk_num = ARRAY_SIZE(clk); of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); } CLK_OF_DECLARE(vf610, "fsl,vf610-ccm", vf610_clocks_init); + -- 2.7.2
next prev parent reply other threads:[~2016-03-10 2:17 UTC|newest] Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-03-10 2:16 [PATCH 00/18] ARM: vf610: Suspend/resume with self-refresh mode Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 01/18] irqchip: vf610-gpc: add Vybrid GPC IRQ controller Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-11 3:41 ` Marc Zyngier 2016-03-11 3:41 ` Marc Zyngier 2016-03-11 3:41 ` Marc Zyngier 2016-03-11 18:11 ` Stefan Agner 2016-03-11 18:11 ` Stefan Agner 2016-03-11 18:11 ` Stefan Agner 2016-03-12 0:21 ` Marc Zyngier 2016-03-12 0:21 ` Marc Zyngier 2016-03-31 8:07 ` Shawn Guo 2016-03-31 8:07 ` Shawn Guo 2016-03-10 2:16 ` [PATCH 02/18] ARM: dts: vf610: add GPC as new interrupt parent Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 8:21 ` Shawn Guo 2016-03-31 8:21 ` Shawn Guo 2016-03-31 17:53 ` Stefan Agner 2016-03-31 17:53 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 03/18] ARM: dts: vf610-colibri: GPIO wakeup key Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 8:19 ` Shawn Guo 2016-03-31 8:19 ` Shawn Guo 2016-03-31 17:55 ` Stefan Agner 2016-03-31 17:55 ` Stefan Agner 2016-03-31 17:55 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 04/18] ARM: dts: vf610: add on-chip SRAM Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 8:33 ` Shawn Guo 2016-03-31 8:33 ` Shawn Guo 2016-03-31 17:57 ` Stefan Agner 2016-03-31 17:57 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 05/18] ARM: dts: vf610: add modules required for PM Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 8:34 ` Shawn Guo 2016-03-31 8:34 ` Shawn Guo 2016-03-31 8:34 ` Shawn Guo 2016-03-10 2:16 ` [PATCH 06/18] ARM: imx: clk-gate2: allow custom gate configuration Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 11:37 ` Shawn Guo 2016-03-31 11:37 ` Shawn Guo 2016-03-31 17:59 ` Stefan Agner 2016-03-31 17:59 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 07/18] ARM: imx: clk-vf610: leave DDR clock on Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 08/18] ARM: clk: add WKPU unit Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-16 1:13 ` Stephen Boyd 2016-03-16 1:13 ` Stephen Boyd 2016-03-10 2:16 ` Stefan Agner [this message] 2016-03-10 2:16 ` [PATCH 09/18] ARM: vf610: clk: add suspend/resume support Stefan Agner 2016-03-31 11:39 ` Shawn Guo 2016-03-31 11:39 ` Shawn Guo 2016-03-10 2:16 ` [PATCH 10/18] tty: serial: fsl_lpuart: support suspend/resume Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-31 11:41 ` Shawn Guo 2016-03-31 11:41 ` Shawn Guo 2016-03-10 2:16 ` [PATCH 11/18] pinctrl: pinctrl-imx: implement suspend/resume Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 12/18] gpio: vf610: add system PM suspend/resume Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 13/18] ARM: dts: vf610: add WKPU connection to GPIO Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 14/18] gpio: vf610: add support for WKPU unit Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-17 20:00 ` Rob Herring 2016-03-17 20:00 ` Rob Herring 2016-03-17 22:12 ` Stefan Agner 2016-03-17 22:12 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 15/18] ARM: vf610: PM: initial suspend/resume support Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 21:19 ` kbuild test robot 2016-03-10 21:19 ` kbuild test robot 2016-03-10 21:19 ` kbuild test robot 2016-04-01 2:25 ` Shawn Guo 2016-04-01 2:25 ` Shawn Guo 2016-04-01 6:40 ` Stefan Agner 2016-04-01 6:40 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 16/18] ARM: vf610: PM: enable Suspend-to-RAM only if hardware fixes are in place Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` [PATCH 17/18] Documentation: dt: add Vybrid DDR memory controller bindings Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-10 2:16 ` Stefan Agner 2016-03-18 16:10 ` Rob Herring 2016-03-18 16:10 ` Rob Herring 2016-03-10 2:16 ` [PATCH 18/18] ARM: vf610: PM: enable SNVS access Stefan Agner 2016-03-10 2:16 ` Stefan Agner
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1457576219-7971-10-git-send-email-stefan@agner.ch \ --to=stefan@agner.ch \ --cc=devicetree@vger.kernel.org \ --cc=galak@codeaurora.org \ --cc=ijc+devicetree@hellion.org.uk \ --cc=jason@lakedaemon.net \ --cc=kernel@pengutronix.de \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-clk@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=marc.zyngier@arm.com \ --cc=mark.rutland@arm.com \ --cc=mturquette@baylibre.com \ --cc=pawel.moll@arm.com \ --cc=robh+dt@kernel.org \ --cc=sboyd@codeaurora.org \ --cc=sergeimir@emcraft.com \ --cc=shawnguo@kernel.org \ --cc=tglx@linutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.