All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Kepplinger <martin.kepplinger@puri.sm>
To: rafael@kernel.org, khilman@kernel.org, ulf.hansson@linaro.org,
	robh@kernel.org, krzysztof.kozlowski@linaro.org,
	shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com,
	pavel@ucw.cz
Cc: kernel@puri.sm, linux-imx@nxp.com, broonie@kernel.org,
	l.stach@pengutronix.de, aford173@gmail.com,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Martin Kepplinger <martin.kepplinger@puri.sm>
Subject: [PATCH v6 1/2] power: domain: handle genpd correctly when needing interrupts
Date: Tue, 26 Jul 2022 10:32:56 +0200	[thread overview]
Message-ID: <20220726083257.1730630-2-martin.kepplinger@puri.sm> (raw)
In-Reply-To: <20220726083257.1730630-1-martin.kepplinger@puri.sm>

If for example the power-domains' power-supply node (regulator) needs
interrupts to work, the current setup with noirq callbacks cannot
work; for example a pmic regulator on i2c, when suspending, usually already
times out during suspend_noirq:

[   41.024193] buck4: failed to disable: -ETIMEDOUT

So fix system suspend and resume for these power-domains by using the
"outer" suspend/resume callbacks instead. Tested on the imx8mq-librem5 board,
but by looking at the dts, this will fix imx8mq-evk and possibly many other
boards too.

This is designed so that genpd providers just say "this genpd needs
interrupts" (by setting the flag) - without implying an implementation.

Initially system suspend problems had been discussed at
https://lore.kernel.org/linux-arm-kernel/20211002005954.1367653-8-l.stach@pengutronix.de/
which led to discussing the pmic that contains the regulators which
serve as power-domain power-supplies:
https://lore.kernel.org/linux-pm/573166b75e524517782471c2b7f96e03fd93d175.camel@puri.sm/T/

Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 drivers/base/power/domain.c | 13 +++++++++++--
 include/linux/pm_domain.h   |  5 +++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 5a2e0232862e..58376752a4de 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -130,6 +130,7 @@ static const struct genpd_lock_ops genpd_spin_ops = {
 #define genpd_is_active_wakeup(genpd)	(genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
 #define genpd_is_cpu_domain(genpd)	(genpd->flags & GENPD_FLAG_CPU_DOMAIN)
 #define genpd_is_rpm_always_on(genpd)	(genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON)
+#define genpd_irq_on(genpd)		(genpd->flags & GENPD_FLAG_IRQ_ON)
 
 static inline bool irq_safe_dev_in_sleep_domain(struct device *dev,
 		const struct generic_pm_domain *genpd)
@@ -2065,8 +2066,15 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
 	genpd->domain.ops.runtime_suspend = genpd_runtime_suspend;
 	genpd->domain.ops.runtime_resume = genpd_runtime_resume;
 	genpd->domain.ops.prepare = genpd_prepare;
-	genpd->domain.ops.suspend_noirq = genpd_suspend_noirq;
-	genpd->domain.ops.resume_noirq = genpd_resume_noirq;
+
+	if (genpd_irq_on(genpd)) {
+		genpd->domain.ops.suspend = genpd_suspend_noirq;
+		genpd->domain.ops.resume = genpd_resume_noirq;
+	} else {
+		genpd->domain.ops.suspend_noirq = genpd_suspend_noirq;
+		genpd->domain.ops.resume_noirq = genpd_resume_noirq;
+	}
+
 	genpd->domain.ops.freeze_noirq = genpd_freeze_noirq;
 	genpd->domain.ops.thaw_noirq = genpd_thaw_noirq;
 	genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq;
@@ -2769,6 +2777,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
 			goto err;
 		dev_gpd_data(dev)->default_pstate = pstate;
 	}
+
 	return 1;
 
 err:
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index ebc351698090..9cdedbc21158 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -60,6 +60,10 @@
  * GENPD_FLAG_MIN_RESIDENCY:	Enable the genpd governor to consider its
  *				components' next wakeup when determining the
  *				optimal idle state.
+ *
+ * GENPD_FLAG_IRQ_ON:		genpd needs irqs to be able to manage power
+ *				on/off. Use the outer suspend/resume callbacks
+ *				instead of noirq for example.
  */
 #define GENPD_FLAG_PM_CLK	 (1U << 0)
 #define GENPD_FLAG_IRQ_SAFE	 (1U << 1)
@@ -68,6 +72,7 @@
 #define GENPD_FLAG_CPU_DOMAIN	 (1U << 4)
 #define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
 #define GENPD_FLAG_MIN_RESIDENCY (1U << 6)
+#define GENPD_FLAG_IRQ_ON	 (1U << 7)
 
 enum gpd_status {
 	GENPD_STATE_ON = 0,	/* PM domain is on */
-- 
2.30.2


WARNING: multiple messages have this Message-ID (diff)
From: Martin Kepplinger <martin.kepplinger@puri.sm>
To: rafael@kernel.org, khilman@kernel.org, ulf.hansson@linaro.org,
	robh@kernel.org, krzysztof.kozlowski@linaro.org,
	shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com,
	pavel@ucw.cz
Cc: kernel@puri.sm, linux-imx@nxp.com, broonie@kernel.org,
	l.stach@pengutronix.de, aford173@gmail.com,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Martin Kepplinger <martin.kepplinger@puri.sm>
Subject: [PATCH v6 1/2] power: domain: handle genpd correctly when needing interrupts
Date: Tue, 26 Jul 2022 10:32:56 +0200	[thread overview]
Message-ID: <20220726083257.1730630-2-martin.kepplinger@puri.sm> (raw)
In-Reply-To: <20220726083257.1730630-1-martin.kepplinger@puri.sm>

If for example the power-domains' power-supply node (regulator) needs
interrupts to work, the current setup with noirq callbacks cannot
work; for example a pmic regulator on i2c, when suspending, usually already
times out during suspend_noirq:

[   41.024193] buck4: failed to disable: -ETIMEDOUT

So fix system suspend and resume for these power-domains by using the
"outer" suspend/resume callbacks instead. Tested on the imx8mq-librem5 board,
but by looking at the dts, this will fix imx8mq-evk and possibly many other
boards too.

This is designed so that genpd providers just say "this genpd needs
interrupts" (by setting the flag) - without implying an implementation.

Initially system suspend problems had been discussed at
https://lore.kernel.org/linux-arm-kernel/20211002005954.1367653-8-l.stach@pengutronix.de/
which led to discussing the pmic that contains the regulators which
serve as power-domain power-supplies:
https://lore.kernel.org/linux-pm/573166b75e524517782471c2b7f96e03fd93d175.camel@puri.sm/T/

Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 drivers/base/power/domain.c | 13 +++++++++++--
 include/linux/pm_domain.h   |  5 +++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 5a2e0232862e..58376752a4de 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -130,6 +130,7 @@ static const struct genpd_lock_ops genpd_spin_ops = {
 #define genpd_is_active_wakeup(genpd)	(genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
 #define genpd_is_cpu_domain(genpd)	(genpd->flags & GENPD_FLAG_CPU_DOMAIN)
 #define genpd_is_rpm_always_on(genpd)	(genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON)
+#define genpd_irq_on(genpd)		(genpd->flags & GENPD_FLAG_IRQ_ON)
 
 static inline bool irq_safe_dev_in_sleep_domain(struct device *dev,
 		const struct generic_pm_domain *genpd)
@@ -2065,8 +2066,15 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
 	genpd->domain.ops.runtime_suspend = genpd_runtime_suspend;
 	genpd->domain.ops.runtime_resume = genpd_runtime_resume;
 	genpd->domain.ops.prepare = genpd_prepare;
-	genpd->domain.ops.suspend_noirq = genpd_suspend_noirq;
-	genpd->domain.ops.resume_noirq = genpd_resume_noirq;
+
+	if (genpd_irq_on(genpd)) {
+		genpd->domain.ops.suspend = genpd_suspend_noirq;
+		genpd->domain.ops.resume = genpd_resume_noirq;
+	} else {
+		genpd->domain.ops.suspend_noirq = genpd_suspend_noirq;
+		genpd->domain.ops.resume_noirq = genpd_resume_noirq;
+	}
+
 	genpd->domain.ops.freeze_noirq = genpd_freeze_noirq;
 	genpd->domain.ops.thaw_noirq = genpd_thaw_noirq;
 	genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq;
@@ -2769,6 +2777,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
 			goto err;
 		dev_gpd_data(dev)->default_pstate = pstate;
 	}
+
 	return 1;
 
 err:
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index ebc351698090..9cdedbc21158 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -60,6 +60,10 @@
  * GENPD_FLAG_MIN_RESIDENCY:	Enable the genpd governor to consider its
  *				components' next wakeup when determining the
  *				optimal idle state.
+ *
+ * GENPD_FLAG_IRQ_ON:		genpd needs irqs to be able to manage power
+ *				on/off. Use the outer suspend/resume callbacks
+ *				instead of noirq for example.
  */
 #define GENPD_FLAG_PM_CLK	 (1U << 0)
 #define GENPD_FLAG_IRQ_SAFE	 (1U << 1)
@@ -68,6 +72,7 @@
 #define GENPD_FLAG_CPU_DOMAIN	 (1U << 4)
 #define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
 #define GENPD_FLAG_MIN_RESIDENCY (1U << 6)
+#define GENPD_FLAG_IRQ_ON	 (1U << 7)
 
 enum gpd_status {
 	GENPD_STATE_ON = 0,	/* PM domain is on */
-- 
2.30.2


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

  reply	other threads:[~2022-07-26  8:33 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-26  8:32 [PATCH v6 0/2] power: domain: handle power supplies that need interrupts Martin Kepplinger
2022-07-26  8:32 ` Martin Kepplinger
2022-07-26  8:32 ` Martin Kepplinger [this message]
2022-07-26  8:32   ` [PATCH v6 1/2] power: domain: handle genpd correctly when needing interrupts Martin Kepplinger
2022-07-26 15:07   ` Ulf Hansson
2022-07-26 15:07     ` Ulf Hansson
2022-07-26 18:33     ` Rafael J. Wysocki
2022-07-26 18:33       ` Rafael J. Wysocki
2022-07-28  9:19       ` Ulf Hansson
2022-07-28  9:19         ` Ulf Hansson
2022-08-19  9:17     ` Martin Kepplinger
2022-08-19  9:17       ` Martin Kepplinger
2022-08-19 14:53       ` Ulf Hansson
2022-08-19 14:53         ` Ulf Hansson
2022-08-22  8:38         ` Martin Kepplinger
2022-08-22  8:38           ` Martin Kepplinger
2022-08-24 13:30           ` Ulf Hansson
2022-08-24 13:30             ` Ulf Hansson
2022-08-25  7:06             ` Martin Kepplinger
2022-08-25  7:06               ` Martin Kepplinger
2022-09-23 13:55               ` Ulf Hansson
2022-09-23 13:55                 ` Ulf Hansson
2022-09-26  9:52                 ` Martin Kepplinger
2022-09-26  9:52                   ` Martin Kepplinger
2023-06-21 18:20                 ` Martin Kepplinger
2023-06-21 18:20                   ` Martin Kepplinger
2023-06-26  9:50                   ` Ulf Hansson
2023-06-26  9:50                     ` Ulf Hansson
2022-07-26  8:32 ` [PATCH v6 2/2] soc: imx: gpcv2: fix suspend/resume by setting GENPD_FLAG_IRQ_ON Martin Kepplinger
2022-07-26  8:32   ` Martin Kepplinger
2022-07-26 15:08   ` Ulf Hansson
2022-07-26 15:08     ` Ulf Hansson

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=20220726083257.1730630-2-martin.kepplinger@puri.sm \
    --to=martin.kepplinger@puri.sm \
    --cc=aford173@gmail.com \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=festevam@gmail.com \
    --cc=kernel@puri.sm \
    --cc=khilman@kernel.org \
    --cc=krzysztof.kozlowski@linaro.org \
    --cc=l.stach@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=ulf.hansson@linaro.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.