linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sowjanya Komatineni <skomatineni@nvidia.com>
To: <thierry.reding@gmail.com>, <jonathanh@nvidia.com>,
	<tglx@linutronix.de>, <jason@lakedaemon.net>,
	<marc.zyngier@arm.com>, <linus.walleij@linaro.org>,
	<stefan@agner.ch>, <mark.rutland@arm.com>
Cc: <pdeschrijver@nvidia.com>, <pgaikwad@nvidia.com>,
	<sboyd@kernel.org>, <linux-clk@vger.kernel.org>,
	<linux-gpio@vger.kernel.org>, <jckuo@nvidia.com>,
	<josephl@nvidia.com>, <talho@nvidia.com>,
	<skomatineni@nvidia.com>, <linux-tegra@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <mperttunen@nvidia.com>,
	<spatra@nvidia.com>, <robh+dt@kernel.org>, <digetx@gmail.com>,
	<devicetree@vger.kernel.org>
Subject: [PATCH V5 06/18] clk: tegra: Save and restore CPU and System clocks context
Date: Thu, 27 Jun 2019 19:12:40 -0700	[thread overview]
Message-ID: <1561687972-19319-7-git-send-email-skomatineni@nvidia.com> (raw)
In-Reply-To: <1561687972-19319-1-git-send-email-skomatineni@nvidia.com>

During system suspend state, core power goes off and looses all the
CAR controller register settings.

This patch creates APIs for saving and restoring the context of Tegra
CPUG, CPULP and SCLK.

CPU and System clock context includes
- CPUG, CPULP, and SCLK burst policy settings for clock sourcea of all
  their normal states.
- SCLK divisor and System clock rate for restoring SCLK, AHB and APB
  rates on resume.
- OSC_DIV settings which are used as reference clock input to some PLLs.
- SPARE_REG and CLK_MASK settings.

These APIs are used in Tegra210 clock driver during suspend and resume
operation.

Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Sowjanya Komatineni <skomatineni@nvidia.com>
---
 drivers/clk/tegra/clk-tegra-super-gen4.c |  4 --
 drivers/clk/tegra/clk.c                  | 80 ++++++++++++++++++++++++++++++++
 drivers/clk/tegra/clk.h                  | 14 ++++++
 3 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/tegra/clk-tegra-super-gen4.c b/drivers/clk/tegra/clk-tegra-super-gen4.c
index cdfe7c9697e1..ed69ec4d883e 100644
--- a/drivers/clk/tegra/clk-tegra-super-gen4.c
+++ b/drivers/clk/tegra/clk-tegra-super-gen4.c
@@ -19,10 +19,6 @@
 #define PLLX_MISC2 0x514
 #define PLLX_MISC3 0x518
 
-#define CCLKG_BURST_POLICY 0x368
-#define CCLKLP_BURST_POLICY 0x370
-#define SCLK_BURST_POLICY 0x028
-#define SYSTEM_CLK_RATE 0x030
 #define SCLK_DIVIDER 0x2c
 
 static DEFINE_SPINLOCK(sysrate_lock);
diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c
index 573e3c967ae1..9e863362d2bf 100644
--- a/drivers/clk/tegra/clk.c
+++ b/drivers/clk/tegra/clk.c
@@ -70,6 +70,12 @@ static struct clk **clks;
 static int clk_num;
 static struct clk_onecell_data clk_data;
 
+static u32 cclkg_burst_policy_ctx[2];
+static u32 cclklp_burst_policy_ctx[2];
+static u32 sclk_burst_policy_ctx[2];
+static u32 sys_clk_divisor_ctx, system_rate_ctx;
+static u32 spare_ctx, misc_clk_enb_ctx, clk_arm_ctx;
+
 /* Handlers for SoC-specific reset lines */
 static int (*special_reset_assert)(unsigned long);
 static int (*special_reset_deassert)(unsigned long);
@@ -199,6 +205,80 @@ const struct tegra_clk_periph_regs *get_reg_bank(int clkid)
 	}
 }
 
+void tegra_cclkg_burst_policy_save_context(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < BURST_POLICY_REG_SIZE; i++)
+		cclkg_burst_policy_ctx[i] = readl_relaxed(clk_base +
+							  CCLKG_BURST_POLICY +
+							  (i * 4));
+}
+
+void tegra_cclkg_burst_policy_restore_context(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < BURST_POLICY_REG_SIZE; i++)
+		writel_relaxed(cclkg_burst_policy_ctx[i],
+			       clk_base + CCLKG_BURST_POLICY + (i * 4));
+
+	fence_udelay(2, clk_base);
+}
+
+void tegra_sclk_cclklp_burst_policy_save_context(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < BURST_POLICY_REG_SIZE; i++) {
+		cclklp_burst_policy_ctx[i] = readl_relaxed(clk_base +
+							  CCLKLP_BURST_POLICY +
+							  (i * 4));
+
+		sclk_burst_policy_ctx[i] = readl_relaxed(clk_base +
+							  SCLK_BURST_POLICY +
+							  (i * 4));
+	}
+
+	sys_clk_divisor_ctx = readl_relaxed(clk_base + SYS_CLK_DIV);
+	system_rate_ctx = readl_relaxed(clk_base + SYSTEM_CLK_RATE);
+	spare_ctx = readl_relaxed(clk_base + SPARE_REG0);
+	misc_clk_enb_ctx = readl_relaxed(clk_base + MISC_CLK_ENB);
+	clk_arm_ctx = readl_relaxed(clk_base + CLK_MASK_ARM);
+}
+
+void tegra_sclk_cpulp_burst_policy_restore_context(void)
+{
+	unsigned int i;
+	u32 val;
+
+	/*
+	 * resume SCLK and CPULP clocks
+	 * for SCLk, set safe dividers values first and then restore source
+	 * and dividers
+	 */
+
+	writel_relaxed(0x1, clk_base + SYSTEM_CLK_RATE);
+	val = readl_relaxed(clk_base + SYS_CLK_DIV);
+	if (val < sys_clk_divisor_ctx)
+		writel_relaxed(sys_clk_divisor_ctx, clk_base + SYS_CLK_DIV);
+
+	fence_udelay(2, clk_base);
+
+	for (i = 0; i < BURST_POLICY_REG_SIZE; i++) {
+		writel_relaxed(cclklp_burst_policy_ctx[i],
+			       clk_base + CCLKLP_BURST_POLICY + (i * 4));
+		writel_relaxed(sclk_burst_policy_ctx[i],
+			       clk_base + SCLK_BURST_POLICY + (i * 4));
+	}
+
+	writel_relaxed(sys_clk_divisor_ctx, clk_base + SYS_CLK_DIV);
+	writel_relaxed(system_rate_ctx, clk_base + SYSTEM_CLK_RATE);
+	writel_relaxed(spare_ctx, clk_base + SPARE_REG0);
+	writel_relaxed(misc_clk_enb_ctx, clk_base + MISC_CLK_ENB);
+	writel_relaxed(clk_arm_ctx, clk_base + CLK_MASK_ARM);
+}
+
 struct clk ** __init tegra_clk_init(void __iomem *regs, int num, int banks)
 {
 	clk_base = regs;
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index 8532f5150091..c66b0a73bb01 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -10,6 +10,16 @@
 #include <linux/clkdev.h>
 #include <linux/delay.h>
 
+#define SCLK_BURST_POLICY	0x28
+#define SYSTEM_CLK_RATE		0x30
+#define CLK_MASK_ARM		0x44
+#define MISC_CLK_ENB		0x48
+#define CCLKG_BURST_POLICY	0x368
+#define CCLKLP_BURST_POLICY	0x370
+#define SYS_CLK_DIV		0x400
+#define SPARE_REG0		0x55c
+#define BURST_POLICY_REG_SIZE	2
+
 /**
  * struct tegra_clk_sync_source - external clock source from codec
  *
@@ -849,6 +859,10 @@ int tegra_pll_p_div_to_hw(struct tegra_clk_pll *pll, u8 p_div);
 int div_frac_get(unsigned long rate, unsigned parent_rate, u8 width,
 		 u8 frac_width, u8 flags);
 void tegra_clk_sync_state_pll(struct clk_hw *hw);
+void tegra_cclkg_burst_policy_save_context(void);
+void tegra_cclkg_burst_policy_restore_context(void);
+void tegra_sclk_cclklp_burst_policy_save_context(void);
+void tegra_sclk_cpulp_burst_policy_restore_context(void);
 
 /* Combined read fence with delay */
 #define fence_udelay(delay, reg)	\
-- 
2.7.4


  parent reply	other threads:[~2019-06-28  2:14 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-28  2:12 [PATCH V5 00/18] SC7 entry and exit support for Tegra210 Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 01/18] irqchip: tegra: Do not disable COP IRQ during suspend Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 02/18] pinctrl: tegra: Add suspend and resume support Sowjanya Komatineni
2019-06-28 11:56   ` Dmitry Osipenko
2019-06-28 12:05     ` Dmitry Osipenko
2019-06-28 23:00       ` Sowjanya Komatineni
2019-06-29 12:38         ` Dmitry Osipenko
2019-06-29 15:40           ` Dmitry Osipenko
2019-06-29 15:46   ` Dmitry Osipenko
2019-06-29 15:58     ` Dmitry Osipenko
2019-06-29 16:28       ` Dmitry Osipenko
2019-07-04  7:31       ` Linus Walleij
2019-07-04 10:40         ` Dmitry Osipenko
2019-07-13  5:31           ` Sowjanya Komatineni
2019-07-14 21:41             ` Dmitry Osipenko
2019-07-13  5:48     ` Sowjanya Komatineni
2019-07-04  7:26   ` Linus Walleij
2019-06-28  2:12 ` [PATCH V5 03/18] clk: tegra: Save and restore divider rate Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 04/18] clk: tegra: pllout: Save and restore pllout context Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 05/18] clk: tegra: pll: Save and restore pll context Sowjanya Komatineni
2019-06-28  2:12 ` Sowjanya Komatineni [this message]
2019-06-29 13:33   ` [PATCH V5 06/18] clk: tegra: Save and restore CPU and System clocks context Dmitry Osipenko
2019-06-29 15:26   ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 07/18] clk: tegra: Support for saving and restoring OSC context Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 08/18] clk: tegra: Add suspend resume support for DFLL Sowjanya Komatineni
2019-06-29 13:28   ` Dmitry Osipenko
2019-06-29 21:45     ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 09/18] clk: tegra: Add save and restore context support for peripheral clocks Sowjanya Komatineni
2019-06-29 13:17   ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 10/18] clk: tegra210: Use fence_udelay during PLLU init Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 11/18] clk: tegra210: Add support for Tegra210 clocks Sowjanya Komatineni
2019-06-29 13:14   ` Dmitry Osipenko
2019-06-29 15:10   ` Dmitry Osipenko
2019-07-13  5:54     ` Sowjanya Komatineni
2019-07-14 21:41       ` Dmitry Osipenko
2019-07-16  0:35         ` Sowjanya Komatineni
2019-07-16  3:00           ` Sowjanya Komatineni
2019-07-16  3:41             ` Sowjanya Komatineni
2019-07-16  3:50             ` Dmitry Osipenko
2019-07-16  4:37               ` Sowjanya Komatineni
2019-07-16  5:37                 ` Dmitry Osipenko
2019-07-16  6:20                   ` Dmitry Osipenko
2019-07-16  6:35                   ` Sowjanya Komatineni
2019-07-16  7:24                     ` Joseph Lo
2019-07-16  8:06                       ` Peter De Schrijver
2019-07-16 15:00                         ` Dmitry Osipenko
2019-07-16 16:50                           ` Sowjanya Komatineni
2019-07-16 18:19                             ` Sowjanya Komatineni
2019-07-16 18:25                               ` Dmitry Osipenko
2019-07-16 18:30                                 ` Sowjanya Komatineni
2019-07-16 18:43                                   ` Dmitry Osipenko
2019-07-16 19:26                                     ` Sowjanya Komatineni
2019-07-16 20:47                                       ` Dmitry Osipenko
2019-07-16 21:12                                         ` Sowjanya Komatineni
2019-07-16 21:21                                           ` Dmitry Osipenko
2019-07-16 21:35                                             ` Sowjanya Komatineni
2019-07-16 22:00                                               ` Dmitry Osipenko
2019-07-16 22:06                                                 ` Sowjanya Komatineni
2019-07-17  2:18                                                   ` Sowjanya Komatineni
2019-07-17  2:35                                                     ` Sowjanya Komatineni
2019-07-17  4:11                                                       ` Dmitry Osipenko
     [not found]                                                         ` <77df234f-aa40-0319-a593-f1f19f0f1c2a@nvidia.com>
2019-07-17  5:42                                                           ` Dmitry Osipenko
2019-07-17  5:55                                                             ` Sowjanya Komatineni
2019-07-17  6:33                                                               ` Dmitry Osipenko
2019-07-17  6:36                                                                 ` Sowjanya Komatineni
2019-07-17 15:17                                                                   ` Dmitry Osipenko
2019-07-17 17:29                                                                     ` Sowjanya Komatineni
2019-07-17 18:32                                                                       ` Dmitry Osipenko
2019-07-17 18:51                                                                         ` Sowjanya Komatineni
2019-07-17 18:54                                                                           ` Sowjanya Komatineni
2019-07-17 19:43                                                                             ` Dmitry Osipenko
2019-07-17 20:01                                                                               ` Sowjanya Komatineni
2019-07-17 20:11                                                                                 ` Sowjanya Komatineni
2019-07-17 21:29                                                                                   ` Sowjanya Komatineni
2019-07-17 21:30                                                                                   ` Dmitry Osipenko
2019-07-17 21:51                                                                                     ` Sowjanya Komatineni
2019-07-17 21:57                                                                                       ` Sowjanya Komatineni
2019-07-17 22:48                                                                                         ` Dmitry Osipenko
2019-07-17 23:36                                                                                           ` Sowjanya Komatineni
2019-07-17 23:44                                                                                             ` Dmitry Osipenko
2019-07-18  0:25                                                                                               ` Sowjanya Komatineni
2019-07-18  1:15                                                                                                 ` Sowjanya Komatineni
2019-07-18 16:34                                                                                                   ` Dmitry Osipenko
2019-07-18 17:22                                                                                                     ` Sowjanya Komatineni
2019-07-18 17:41                                                                                                       ` Sowjanya Komatineni
2019-07-18 18:29                                                                                                         ` Sowjanya Komatineni
2019-07-18 19:11                                                                                                           ` Sowjanya Komatineni
2019-07-18 19:42                                                                                               ` Peter De Schrijver
2019-07-18 20:26                                                                                                 ` Dmitry Osipenko
2019-07-18 20:36                                                                                                   ` Sowjanya Komatineni
2019-07-18 22:52                                                                                                     ` Dmitry Osipenko
2019-07-18 23:08                                                                                                     ` Sowjanya Komatineni
2019-07-18 23:52                                                                                                       ` Dmitry Osipenko
2019-07-17  3:54                                                     ` Dmitry Osipenko
2019-07-17  4:01                                                       ` Sowjanya Komatineni
2019-07-18 19:18                                     ` Peter De Schrijver
2019-07-18 19:24                                       ` Sowjanya Komatineni
2019-07-18 20:11                                         ` Dmitry Osipenko
2019-07-18 20:32                                           ` Dmitry Osipenko
2019-07-18 19:15                                 ` Peter De Schrijver
2019-06-29 15:13   ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 12/18] soc/tegra: pmc: Allow support for more tegra wake Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 13/18] soc/tegra: pmc: Add pmc wake support for tegra210 Sowjanya Komatineni
2019-06-29 13:11   ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 14/18] arm64: tegra: Enable wake from deep sleep on RTC alarm Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 15/18] soc/tegra: pmc: Configure core power request polarity Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 16/18] soc/tegra: pmc: Configure deep sleep control settings Sowjanya Komatineni
2019-06-29 13:00   ` Dmitry Osipenko
2019-06-29 13:02   ` Dmitry Osipenko
2019-06-28  2:12 ` [PATCH V5 17/18] arm64: dts: tegra210-p2180: Jetson TX1 SC7 timings Sowjanya Komatineni
2019-06-28  2:12 ` [PATCH V5 18/18] arm64: dts: tegra210-p3450: Jetson nano " Sowjanya Komatineni

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=1561687972-19319-7-git-send-email-skomatineni@nvidia.com \
    --to=skomatineni@nvidia.com \
    --cc=devicetree@vger.kernel.org \
    --cc=digetx@gmail.com \
    --cc=jason@lakedaemon.net \
    --cc=jckuo@nvidia.com \
    --cc=jonathanh@nvidia.com \
    --cc=josephl@nvidia.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=mperttunen@nvidia.com \
    --cc=pdeschrijver@nvidia.com \
    --cc=pgaikwad@nvidia.com \
    --cc=robh+dt@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=spatra@nvidia.com \
    --cc=stefan@agner.ch \
    --cc=talho@nvidia.com \
    --cc=tglx@linutronix.de \
    --cc=thierry.reding@gmail.com \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).