All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dong Aisheng <aisheng.dong@nxp.com>
To: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org, sboyd@kernel.org,
	mturquette@baylibre.com, shawnguo@kernel.org,
	fabio.estevam@nxp.com, linux-imx@nxp.com, kernel@pengutronix.de,
	Dong Aisheng <aisheng.dong@nxp.com>
Subject: [PATCH v7 11/11] clk: imx: lpcg: add suspend/resume support
Date: Wed, 29 Jul 2020 16:00:18 +0800	[thread overview]
Message-ID: <1596009618-25516-12-git-send-email-aisheng.dong@nxp.com> (raw)
In-Reply-To: <1596009618-25516-1-git-send-email-aisheng.dong@nxp.com>

LPCG clock state may be lost when it's power domain is completely
off during system suspend/resume and we need save and restore the
state properly.

Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
ChangeLog:
v5->v7:
 * no changes
v5:
 * make suspend/resume function static
 * improve code comments
v4: no changes
v3: new patch
---
 drivers/clk/imx/clk-imx8qxp-lpcg.c |  1 +
 drivers/clk/imx/clk-lpcg-scu.c     | 37 ++++++++++++++++++++++++++++++
 drivers/clk/imx/clk-scu.h          |  1 +
 3 files changed, 39 insertions(+)

diff --git a/drivers/clk/imx/clk-imx8qxp-lpcg.c b/drivers/clk/imx/clk-imx8qxp-lpcg.c
index 3385de76f6c7..4d4a3a65bcec 100644
--- a/drivers/clk/imx/clk-imx8qxp-lpcg.c
+++ b/drivers/clk/imx/clk-imx8qxp-lpcg.c
@@ -364,6 +364,7 @@ static struct platform_driver imx8qxp_lpcg_clk_driver = {
 	.driver = {
 		.name = "imx8qxp-lpcg-clk",
 		.of_match_table = imx8qxp_lpcg_match,
+		.pm = &imx_clk_lpcg_scu_pm_ops,
 		.suppress_bind_attrs = true,
 	},
 	.probe = imx8qxp_lpcg_clk_probe,
diff --git a/drivers/clk/imx/clk-lpcg-scu.c b/drivers/clk/imx/clk-lpcg-scu.c
index 2242e5047a0e..5bd8af371059 100644
--- a/drivers/clk/imx/clk-lpcg-scu.c
+++ b/drivers/clk/imx/clk-lpcg-scu.c
@@ -33,6 +33,9 @@ struct clk_lpcg_scu {
 	void __iomem *reg;
 	u8 bit_idx;
 	bool hw_gate;
+
+	/* for state save&restore */
+	u32 state;
 };
 
 #define to_clk_lpcg_scu(_hw) container_of(_hw, struct clk_lpcg_scu, hw)
@@ -112,6 +115,9 @@ struct clk_hw *__imx_clk_lpcg_scu(struct device *dev, const char *name,
 		hw = ERR_PTR(ret);
 	}
 
+	if (dev)
+		dev_set_drvdata(dev, clk);
+
 	return hw;
 }
 
@@ -122,3 +128,34 @@ void imx_clk_lpcg_scu_unregister(struct clk_hw *hw)
 	clk_hw_unregister(&clk->hw);
 	kfree(clk);
 }
+
+static int __maybe_unused imx_clk_lpcg_scu_suspend(struct device *dev)
+{
+	struct clk_lpcg_scu *clk = dev_get_drvdata(dev);
+
+	clk->state = readl_relaxed(clk->reg);
+	dev_dbg(dev, "save lpcg state 0x%x\n", clk->state);
+
+	return 0;
+}
+
+static int __maybe_unused imx_clk_lpcg_scu_resume(struct device *dev)
+{
+	struct clk_lpcg_scu *clk = dev_get_drvdata(dev);
+
+	/*
+	 * FIXME: Sometimes writes don't work unless the CPU issues
+	 * them twice
+	 */
+
+	writel(clk->state, clk->reg);
+	writel(clk->state, clk->reg);
+	dev_dbg(dev, "restore lpcg state 0x%x\n", clk->state);
+
+	return 0;
+}
+
+const struct dev_pm_ops imx_clk_lpcg_scu_pm_ops = {
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_clk_lpcg_scu_suspend,
+				      imx_clk_lpcg_scu_resume)
+};
diff --git a/drivers/clk/imx/clk-scu.h b/drivers/clk/imx/clk-scu.h
index faee1ba5c4ee..e8352164923e 100644
--- a/drivers/clk/imx/clk-scu.h
+++ b/drivers/clk/imx/clk-scu.h
@@ -11,6 +11,7 @@
 #include <linux/of.h>
 
 extern struct list_head imx_scu_clks[];
+extern const struct dev_pm_ops imx_clk_lpcg_scu_pm_ops;
 
 int imx_clk_scu_init(struct device_node *np);
 struct clk_hw *imx_scu_of_clk_src_get(struct of_phandle_args *clkspec,
-- 
2.23.0


WARNING: multiple messages have this Message-ID (diff)
From: Dong Aisheng <aisheng.dong@nxp.com>
To: linux-clk@vger.kernel.org
Cc: Dong Aisheng <aisheng.dong@nxp.com>,
	sboyd@kernel.org, mturquette@baylibre.com, linux-imx@nxp.com,
	kernel@pengutronix.de, fabio.estevam@nxp.com,
	shawnguo@kernel.org, linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 11/11] clk: imx: lpcg: add suspend/resume support
Date: Wed, 29 Jul 2020 16:00:18 +0800	[thread overview]
Message-ID: <1596009618-25516-12-git-send-email-aisheng.dong@nxp.com> (raw)
In-Reply-To: <1596009618-25516-1-git-send-email-aisheng.dong@nxp.com>

LPCG clock state may be lost when it's power domain is completely
off during system suspend/resume and we need save and restore the
state properly.

Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
ChangeLog:
v5->v7:
 * no changes
v5:
 * make suspend/resume function static
 * improve code comments
v4: no changes
v3: new patch
---
 drivers/clk/imx/clk-imx8qxp-lpcg.c |  1 +
 drivers/clk/imx/clk-lpcg-scu.c     | 37 ++++++++++++++++++++++++++++++
 drivers/clk/imx/clk-scu.h          |  1 +
 3 files changed, 39 insertions(+)

diff --git a/drivers/clk/imx/clk-imx8qxp-lpcg.c b/drivers/clk/imx/clk-imx8qxp-lpcg.c
index 3385de76f6c7..4d4a3a65bcec 100644
--- a/drivers/clk/imx/clk-imx8qxp-lpcg.c
+++ b/drivers/clk/imx/clk-imx8qxp-lpcg.c
@@ -364,6 +364,7 @@ static struct platform_driver imx8qxp_lpcg_clk_driver = {
 	.driver = {
 		.name = "imx8qxp-lpcg-clk",
 		.of_match_table = imx8qxp_lpcg_match,
+		.pm = &imx_clk_lpcg_scu_pm_ops,
 		.suppress_bind_attrs = true,
 	},
 	.probe = imx8qxp_lpcg_clk_probe,
diff --git a/drivers/clk/imx/clk-lpcg-scu.c b/drivers/clk/imx/clk-lpcg-scu.c
index 2242e5047a0e..5bd8af371059 100644
--- a/drivers/clk/imx/clk-lpcg-scu.c
+++ b/drivers/clk/imx/clk-lpcg-scu.c
@@ -33,6 +33,9 @@ struct clk_lpcg_scu {
 	void __iomem *reg;
 	u8 bit_idx;
 	bool hw_gate;
+
+	/* for state save&restore */
+	u32 state;
 };
 
 #define to_clk_lpcg_scu(_hw) container_of(_hw, struct clk_lpcg_scu, hw)
@@ -112,6 +115,9 @@ struct clk_hw *__imx_clk_lpcg_scu(struct device *dev, const char *name,
 		hw = ERR_PTR(ret);
 	}
 
+	if (dev)
+		dev_set_drvdata(dev, clk);
+
 	return hw;
 }
 
@@ -122,3 +128,34 @@ void imx_clk_lpcg_scu_unregister(struct clk_hw *hw)
 	clk_hw_unregister(&clk->hw);
 	kfree(clk);
 }
+
+static int __maybe_unused imx_clk_lpcg_scu_suspend(struct device *dev)
+{
+	struct clk_lpcg_scu *clk = dev_get_drvdata(dev);
+
+	clk->state = readl_relaxed(clk->reg);
+	dev_dbg(dev, "save lpcg state 0x%x\n", clk->state);
+
+	return 0;
+}
+
+static int __maybe_unused imx_clk_lpcg_scu_resume(struct device *dev)
+{
+	struct clk_lpcg_scu *clk = dev_get_drvdata(dev);
+
+	/*
+	 * FIXME: Sometimes writes don't work unless the CPU issues
+	 * them twice
+	 */
+
+	writel(clk->state, clk->reg);
+	writel(clk->state, clk->reg);
+	dev_dbg(dev, "restore lpcg state 0x%x\n", clk->state);
+
+	return 0;
+}
+
+const struct dev_pm_ops imx_clk_lpcg_scu_pm_ops = {
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_clk_lpcg_scu_suspend,
+				      imx_clk_lpcg_scu_resume)
+};
diff --git a/drivers/clk/imx/clk-scu.h b/drivers/clk/imx/clk-scu.h
index faee1ba5c4ee..e8352164923e 100644
--- a/drivers/clk/imx/clk-scu.h
+++ b/drivers/clk/imx/clk-scu.h
@@ -11,6 +11,7 @@
 #include <linux/of.h>
 
 extern struct list_head imx_scu_clks[];
+extern const struct dev_pm_ops imx_clk_lpcg_scu_pm_ops;
 
 int imx_clk_scu_init(struct device_node *np);
 struct clk_hw *imx_scu_of_clk_src_get(struct of_phandle_args *clkspec,
-- 
2.23.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2020-07-29  8:04 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-29  8:00 [PATCH v7 00/11] clk: imx8: add new clock binding for better pm support Dong Aisheng
2020-07-29  8:00 ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 01/11] dt-bindings: firmware: imx-scu: new binding to parse clocks from device tree Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 02/11] dt-bindings: clock: imx-lpcg: add support " Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:06   ` Dong Aisheng
2020-07-29  8:06     ` Dong Aisheng
2020-07-31 21:28   ` Rob Herring
2020-07-31 21:28     ` Rob Herring
2020-10-14  0:41   ` Stephen Boyd
2020-10-14  0:41     ` Stephen Boyd
2020-07-29  8:00 ` [PATCH v7 03/11] clk: imx: scu: add two cells binding support Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-10-14  0:40   ` Stephen Boyd
2020-10-14  0:40     ` Stephen Boyd
2020-10-30  1:06   ` Nathan Chancellor
2020-10-30  1:06     ` Nathan Chancellor
2020-10-30  3:22     ` Aisheng Dong
2020-10-30  3:22       ` Aisheng Dong
2020-10-30 15:58       ` Aisheng Dong
2020-10-30 15:58         ` Aisheng Dong
2020-07-29  8:00 ` [PATCH v7 04/11] clk: imx: scu: bypass cpu power domains Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 05/11] clk: imx: scu: allow scu clk to take device pointer Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 06/11] clk: imx: scu: add runtime pm support Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 07/11] clk: imx: scu: add suspend/resume support Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 08/11] clk: imx: imx8qxp-lpcg: add parsing clocks from device tree Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 09/11] clk: imx: lpcg: allow lpcg clk to take device pointer Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` [PATCH v7 10/11] clk: imx: clk-imx8qxp-lpcg: add runtime pm support Dong Aisheng
2020-07-29  8:00   ` Dong Aisheng
2020-07-29  8:00 ` Dong Aisheng [this message]
2020-07-29  8:00   ` [PATCH v7 11/11] clk: imx: lpcg: add suspend/resume support Dong Aisheng
2020-07-29  8:04 ` [PATCH v7 00/11] clk: imx8: add new clock binding for better pm support Dong Aisheng
2020-07-29  8:04   ` Dong Aisheng
2020-08-17  7:42   ` Dong Aisheng
2020-08-17  7:42     ` Dong Aisheng
2020-09-02  6:35     ` Dong Aisheng
2020-09-02  6:35       ` Dong Aisheng
2020-09-27  4:13       ` Aisheng Dong
2020-09-27  4:13         ` Aisheng Dong
2020-10-12 19:28         ` Stephen Boyd
2020-10-12 19:28           ` Stephen Boyd
2020-10-13  9:27           ` Dong Aisheng
2020-10-13  9:27             ` Dong Aisheng
2020-10-14  0:41             ` Stephen Boyd
2020-10-14  0:41               ` Stephen Boyd
2020-10-15  6:51               ` Dong Aisheng
2020-10-15  6:51                 ` Dong Aisheng
2020-10-26  2:55 ` Shawn Guo
2020-10-26  2:55   ` Shawn Guo

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=1596009618-25516-12-git-send-email-aisheng.dong@nxp.com \
    --to=aisheng.dong@nxp.com \
    --cc=fabio.estevam@nxp.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=mturquette@baylibre.com \
    --cc=sboyd@kernel.org \
    --cc=shawnguo@kernel.org \
    /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 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.