hi Ulf, Lucas and all interested,
This (after a cleanup patch) makes available a new genpd flag
GENPD_FLAG_IRQ_ON in a relatively generic way: genpd providers can set
it when irqs are needed to manage power on/off. Since the main goal
here has been to fix systemd suspend/resume, adjusting these callbacks
is all that's being done when this flag gets set.
And since I'm working on imx8mq, the 3rd patch makes gpcv2 set this new
flag when a power domain has a power-supply descirbed in DT.
For i.MX8M* platforms, this should be ok. For other platforms this might
be useful too but needs to be tested.
revision history
----------------
v5: (thank you Lucas)
* simplify gpcv2 code: just set GENPD_FLAG_IRQ_ON when a power-supply is present
v4: (thank you Ulf and Lucas)
* split up genpd core and gpcv2 changes
* set callbacks inside of pm_genpd_init()
* make flag name and description a bit more generic
* print an error in __genpd_dev_pm_attach() if there a "mismatch"
https://lore.kernel.org/linux-arm-kernel/[email protected]/T/#t
v3: (thank you Ulf)
* move DT parsing to gpcv2 and create a genpd flag that gets set
https://lore.kernel.org/linux-arm-kernel/[email protected]/
v2: (thank you Krzysztof)
* rewrite: find possible regulators' interrupts property in parents
instead of inventing a new property.
https://lore.kernel.org/linux-arm-kernel/[email protected]/
v1: (initial idea)
https://lore.kernel.org/linux-arm-kernel/[email protected]/T/#t
Martin Kepplinger (3):
PM: domain: fix indentation and use BIT macro for flags
power: domain: handle genpd correctly when needing interrupts
soc: imx: gpcv2: fix suspend/resume by setting GENPD_FLAG_IRQ_ON
drivers/base/power/domain.c | 13 +++++++++++++
drivers/soc/imx/gpcv2.c | 3 +++
include/linux/pm_domain.h | 20 +++++++++++++-------
3 files changed, 29 insertions(+), 7 deletions(-)
--
2.30.2
For boards that use power-domains' power-supplies that need interrupts
to work (like regulator over i2c), set GENPD_FLAG_IRQ_ON.
This will tell genpd to adjust accordingly. Currently it "only" sets the
correct suspend/resume callbacks.
This fixes suspend/resume on imx8mq-librem5 boards (tested) and
imx8mq-evk (by looking at dts) and possibly more.
Signed-off-by: Martin Kepplinger <[email protected]>
---
drivers/soc/imx/gpcv2.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c
index 6383a4edc360..e058aed76602 100644
--- a/drivers/soc/imx/gpcv2.c
+++ b/drivers/soc/imx/gpcv2.c
@@ -1337,6 +1337,9 @@ static int imx_pgc_domain_probe(struct platform_device *pdev)
regmap_update_bits(domain->regmap, domain->regs->map,
domain->bits.map, domain->bits.map);
+ if (of_parse_phandle(domain->dev->of_node, "power-supply", 0))
+ domain->genpd.flags |= GENPD_FLAG_IRQ_ON;
+
ret = pm_genpd_init(&domain->genpd, NULL, true);
if (ret) {
dev_err(domain->dev, "Failed to init power domain\n");
--
2.30.2
Am Donnerstag, dem 21.07.2022 um 06:36 +0200 schrieb Martin Kepplinger:
> For boards that use power-domains' power-supplies that need interrupts
> to work (like regulator over i2c), set GENPD_FLAG_IRQ_ON.
> This will tell genpd to adjust accordingly. Currently it "only" sets the
> correct suspend/resume callbacks.
>
> This fixes suspend/resume on imx8mq-librem5 boards (tested) and
> imx8mq-evk (by looking at dts) and possibly more.
>
> Signed-off-by: Martin Kepplinger <[email protected]>
> ---
> drivers/soc/imx/gpcv2.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c
> index 6383a4edc360..e058aed76602 100644
> --- a/drivers/soc/imx/gpcv2.c
> +++ b/drivers/soc/imx/gpcv2.c
> @@ -1337,6 +1337,9 @@ static int imx_pgc_domain_probe(struct platform_device *pdev)
> regmap_update_bits(domain->regmap, domain->regs->map,
> domain->bits.map, domain->bits.map);
>
> + if (of_parse_phandle(domain->dev->of_node, "power-supply", 0))
We don't actually need to parse the phandle. For a simple presence
check of_property_read_bool() is enough.
Regards,
Lucas
> + domain->genpd.flags |= GENPD_FLAG_IRQ_ON;
> +
> ret = pm_genpd_init(&domain->genpd, NULL, true);
> if (ret) {
> dev_err(domain->dev, "Failed to init power domain\n");