All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Krummenacher <max.oss.09@gmail.com>
To: max.krummenacher@toradex.com
Cc: Ulf Hansson <ulf.hansson@linaro.org>,
	linux-pm@vger.kernel.org,
	Francesco Dolcini <francesco.dolcini@toradex.com>,
	Mark Brown <broonie@kernel.org>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	Kevin Hilman <khilman@kernel.org>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v1 2/5] pm: add regulator power domain controller
Date: Thu,  9 Jun 2022 17:08:48 +0200	[thread overview]
Message-ID: <20220609150851.23084-3-max.oss.09@gmail.com> (raw)
In-Reply-To: <20220609150851.23084-1-max.oss.09@gmail.com>

From: Max Krummenacher <max.krummenacher@toradex.com>

Acts as a power domain controller which switches its domain power by
enabling/disabling a regulator.

Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
---

 drivers/power/Kconfig                |   1 +
 drivers/power/Makefile               |   5 +-
 drivers/power/domain/Kconfig         |   7 ++
 drivers/power/domain/Makefile        |   2 +
 drivers/power/domain/regulator-pdc.c | 112 +++++++++++++++++++++++++++
 5 files changed, 125 insertions(+), 2 deletions(-)
 create mode 100644 drivers/power/domain/Kconfig
 create mode 100644 drivers/power/domain/Makefile
 create mode 100644 drivers/power/domain/regulator-pdc.c

diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 696bf77a7042..e8eebee629d5 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -1,3 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
+source "drivers/power/domain/Kconfig"
 source "drivers/power/reset/Kconfig"
 source "drivers/power/supply/Kconfig"
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index effbf0377f32..4323a8c8c328 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -1,3 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
-obj-$(CONFIG_POWER_RESET)	+= reset/
-obj-$(CONFIG_POWER_SUPPLY)	+= supply/
+obj-$(CONFIG_PM_GENERIC_DOMAINS)	+= domain/
+obj-$(CONFIG_POWER_RESET)		+= reset/
+obj-$(CONFIG_POWER_SUPPLY)		+= supply/
diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
new file mode 100644
index 000000000000..74c50baf2df0
--- /dev/null
+++ b/drivers/power/domain/Kconfig
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+config POWER_DOMAIN_REGULATOR
+	bool "A power domain controller using a regulator for power control"
+	help
+	  Say Y here to enable a power domain controller which uses a regulator
+	  to control its power domain.
diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
new file mode 100644
index 000000000000..13b3378fb11f
--- /dev/null
+++ b/drivers/power/domain/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_POWER_DOMAIN_REGULATOR)	+= regulator-pdc.o
diff --git a/drivers/power/domain/regulator-pdc.c b/drivers/power/domain/regulator-pdc.c
new file mode 100644
index 000000000000..e03cfe901d70
--- /dev/null
+++ b/drivers/power/domain/regulator-pdc.c
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * A power domain controller which uses a regulator to control its power domain.
+ *
+ * Copyright 2022 Toradex
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/pm_domain.h>
+#include <linux/regulator/consumer.h>
+
+struct reg_pd {
+	struct device *dev;
+	struct generic_pm_domain pd;
+	struct regulator *supply;
+};
+
+static int reg_pd_power_off(struct generic_pm_domain *domain)
+{
+	struct reg_pd *pd = container_of(domain, struct reg_pd, pd);
+
+	return regulator_disable(pd->supply);
+}
+
+static int reg_pd_power_on(struct generic_pm_domain *domain)
+{
+	struct reg_pd *pd = container_of(domain, struct reg_pd, pd);
+
+	return regulator_enable(pd->supply);
+}
+
+static const struct of_device_id reg_pd_of_match[] = {
+	{
+		.compatible = "regulator-pm-pd",
+	},
+	{ },
+};
+
+static int reg_pd_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *np = dev->of_node;
+	struct of_phandle_args child, parent;
+	struct reg_pd *pd;
+	const char *name;
+	int ret;
+
+	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd) {
+		of_node_put(np);
+		return -ENOMEM;
+	}
+	pd->dev = dev;
+
+	if (of_property_read_string(np, "label", &name) < 0)
+		name = kbasename(np->full_name);
+	pd->pd.name = kstrdup_const(name, GFP_KERNEL);
+	if (!pd->pd.name)
+		return -ENOMEM;
+
+	pd->supply = devm_regulator_get(dev, "power");
+	if (IS_ERR(pd->supply))
+		return dev_err_probe(dev, PTR_ERR(pd->supply),
+				     "failed to get regulator\n");
+
+	pd->pd.power_off = reg_pd_power_off;
+	pd->pd.power_on = reg_pd_power_on;
+
+	ret = pm_genpd_init(&pd->pd, NULL, true);
+	if (ret)
+		goto err_out;
+	ret = of_genpd_add_provider_simple(np, &pd->pd);
+	if (ret)
+		goto err_out;
+
+	if (of_parse_phandle_with_args(np, "power-domains",
+				      "#power-domain-cells", 0, &parent) == 0) {
+		child.np = np;
+		child.args_count = 0;
+
+		if (of_genpd_add_subdomain(&parent, &child))
+			pr_warn("%pOF failed to add subdomain: %pOF\n",
+				parent.np, child.np);
+		else
+			pr_info("%pOF has as child subdomain: %pOF.\n",
+				parent.np, child.np);
+	}
+
+	return 0;
+
+err_out:
+	dev_warn(dev, "failed to probe pd %s", pd->pd.name);
+	return ret;
+}
+
+static struct platform_driver reg_pd_driver = {
+	.driver = {
+		.name	= "regulator_power_domain",
+		.of_match_table = reg_pd_of_match,
+		.owner	= THIS_MODULE,
+	},
+	.probe = reg_pd_probe,
+};
+
+static __init int reg_pd_init(void)
+{
+	return platform_driver_register(&reg_pd_driver);
+}
+core_initcall(reg_pd_init);
-- 
2.20.1


  parent reply	other threads:[~2022-06-09 15:09 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-09 15:08 [PATCH v1 0/5] power: domain: Add driver for a PM domain provider which controls Max Krummenacher
2022-06-09 15:08 ` Max Krummenacher
2022-06-09 15:08 ` [PATCH v1 1/5] dt-bindings: power: Add bindings for a power domain controlled by a regulator Max Krummenacher
2022-06-10  2:57   ` Rob Herring
2022-06-15 15:19     ` Max Krummenacher
2022-06-15 17:16       ` Krzysztof Kozlowski
2022-06-14  7:23   ` Geert Uytterhoeven
2022-06-15 15:18     ` Max Krummenacher
2022-06-09 15:08 ` Max Krummenacher [this message]
2022-06-09 15:08 ` [PATCH v1 3/5] MAINTAINERS: add REGULATOR POWER DOMAIN Max Krummenacher
2022-06-09 15:08 ` [RFC PATCH v1 4/5] arm64: defconfig: Enable generic power domain controller controlling a regulator Max Krummenacher
2022-06-09 15:08   ` Max Krummenacher
2022-06-09 15:08 ` [RFC PATCH v1 5/5] ARM64: verdin-imx8mm: use regulator power domain to model sleep-moci Max Krummenacher
2022-06-09 15:08   ` Max Krummenacher
2022-06-14  7:29   ` Geert Uytterhoeven
2022-06-14  7:29     ` Geert Uytterhoeven
2022-06-15 15:32     ` Max Krummenacher
2022-06-15 15:32       ` Max Krummenacher
2022-06-13 19:15 ` [PATCH v1 0/5] power: domain: Add driver for a PM domain provider which controls Rob Herring
2022-06-13 19:15   ` Rob Herring
2022-06-14  7:22   ` Geert Uytterhoeven
2022-06-14  7:22     ` Geert Uytterhoeven
2022-06-15 16:10     ` Max Krummenacher
2022-06-15 16:10       ` Max Krummenacher
2022-06-15 17:15       ` Krzysztof Kozlowski
2022-06-15 17:15         ` Krzysztof Kozlowski
2022-06-15 17:31         ` Marcel Ziswiler
2022-06-15 17:31           ` Marcel Ziswiler
2022-06-15 17:37           ` Krzysztof Kozlowski
2022-06-15 17:37             ` Krzysztof Kozlowski
2022-06-15 18:13             ` Marcel Ziswiler
2022-06-15 18:13               ` Marcel Ziswiler
2022-06-15 18:48               ` Dmitry Baryshkov
2022-06-15 18:48                 ` Dmitry Baryshkov
2022-06-15 20:48               ` Krzysztof Kozlowski
2022-06-15 20:48                 ` Krzysztof Kozlowski
2022-06-15 18:24           ` Robin Murphy
2022-06-15 18:24             ` Robin Murphy
2022-06-15 19:12             ` Mark Brown
2022-06-15 19:12               ` Mark Brown
2022-06-15 21:14 ` Ulf Hansson
2022-06-15 21:14   ` Ulf Hansson
2022-06-16 12:50 ` Linus Walleij
2022-06-16 12:50   ` Linus Walleij
2022-06-23 16:14   ` Max Krummenacher
2022-06-23 16:14     ` Max Krummenacher
2022-07-13 11:43     ` Ulf Hansson
2022-07-13 11:43       ` Ulf Hansson
2022-07-18  9:49       ` Linus Walleij
2022-07-18  9:49         ` Linus Walleij
2022-07-26 16:03       ` Francesco Dolcini
2022-07-26 16:03         ` Francesco Dolcini
2022-07-28  9:37         ` Ulf Hansson
2022-07-28  9:37           ` Ulf Hansson
2022-07-28 11:21           ` Francesco Dolcini
2022-07-28 11:21             ` Francesco Dolcini
2022-08-26 13:50             ` Ulf Hansson
2022-08-26 13:50               ` Ulf Hansson
2022-09-09 14:22               ` Francesco Dolcini
2022-09-09 14:22                 ` Francesco Dolcini
2022-09-22 13:49                 ` Ulf Hansson
2022-09-22 13:49                   ` Ulf Hansson
2022-09-23 18:00                   ` Krzysztof Kozlowski
2022-09-23 18:00                     ` Krzysztof Kozlowski
2022-09-26 10:12                     ` Ulf Hansson
2022-09-26 10:12                       ` Ulf Hansson
2022-09-26 15:11                       ` Krzysztof Kozlowski
2022-09-26 15:11                         ` Krzysztof Kozlowski
2022-09-27  9:48                         ` Ulf Hansson
2022-09-27  9:48                           ` Ulf Hansson
2022-09-27 12:49                           ` Geert Uytterhoeven
2022-09-27 12:49                             ` Geert Uytterhoeven
2022-09-27 14:26                             ` Krzysztof Kozlowski
2022-09-27 14:26                               ` Krzysztof Kozlowski
2022-09-28  7:59                               ` Ulf Hansson
2022-09-28  7:59                                 ` 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=20220609150851.23084-3-max.oss.09@gmail.com \
    --to=max.oss.09@gmail.com \
    --cc=broonie@kernel.org \
    --cc=francesco.dolcini@toradex.com \
    --cc=khilman@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=max.krummenacher@toradex.com \
    --cc=rafael@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.