public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver
@ 2025-12-22 11:48 Aswin Murugan
  2025-12-22 11:48 ` [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support Aswin Murugan
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Aswin Murugan @ 2025-12-22 11:48 UTC (permalink / raw)
  To: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot
  Cc: Aswin Murugan

This patch series adds support for the Qualcomm RPMH power domain
driver, responsible for managing power domains on Qualcomm SoCs.
The driver is ported from the Linux kernel and adapted for
U-Boot to enable proper power domain control on SA8775P platform.

Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
Changes in v7:
- Droped soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data() functions
  patch from previous version, since it was already picked
  Link: https://lore.kernel.org/u-boot/176363183220.2293399.7296647117885059868.b4-ty@linaro.org/
- Cleaned up the warning logic in drivers/power/domain/power-domain-uclass.c
  when power-domain driver is missing
- Link to v6: https://lore.kernel.org/u-boot/20251113113427.2218045-1-aswin.murugan@oss.qualcomm.com/

Changes in v6:
- Added the change in drivers/power/domain/power-domain-uclass.c to give warning
  when power-domain driver is missing
- Added the change log 'In qcom-rpmhpd driver, the un-supported power domains are handled with warning
  in rpmhpd_power_on() & rpmhpd_power_on()' 
- In drivers/power/domain/qcom-rpmhpd.c, the 'ret' variable in rpmhpd_probe() is initialized with 0
- Link to v5: https://lore.kernel.org/u-boot/20251027113312.3815169-1-aswinm@qti.qualcomm.com/

Changes in v5:
- As part of "qcom_rpmhpd" driver removal change did in v4, the rpmh_write() in drivers/power/domain/qcom-rpmhpd.c
  should be passed with pd->dev as first argument to align with it.
- Added (ulong) casting in rpmhpd_match_table to address the warning.

Changes in v4:
- Added all soc entries in power domain linux driver to drivers/power/domain/qcom-rpmhpd.c and
  stubbed it
- Removed "qcom_rpmhpd" driver & unused members of struct rpmhpd in drivers/power/domain/qcom-rpmhpd.c
- Moved the "soc: qcom: cmd-db" change before the "power-domain" change
- Link to v3: https://lore.kernel.org/u-boot/20250702180133.1889709-1-aswin.murugan@oss.qualcomm.com/

Changes in v3:
- Removed OF_LIVE_SA8775P config in arch/arm/mach-snapdragon/Kconfig & configs/qcs9100_defconfig,
  since there is no SA8775p specific fixups are done
- Link to v2: https://lore.kernel.org/u-boot/20250702171335.1811080-1-aswin.murugan@oss.qualcomm.com/

Changes in v2:
- Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN in drivers/power/domain/Kconfig
- In drivers/power/domain/qcom-rpmhpd.c, the un-supported power domains are handled with warning
- Power domain fixups have been removed since they are now managed by drivers/power/domain/qcom-rpmhpd.c
- Link to v1: https://lore.kernel.org/u-boot/20250626112441.143064-1-aswin.murugan@oss.qualcomm.com/
---

Aswin Murugan (5):
  soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data()
    functions
  power-domain: Add QCOM RPMH Power Domain Driver Support
  power-domain: Add warning when power-domain driver is missing
  mach-snapdragon: fixup power-domains
  configs: qcom: Add QCOM_POWER_DOMAIN config

 arch/arm/mach-snapdragon/of_fixup.c        |  31 ---
 configs/qcom_defconfig                     |   1 +
 drivers/power/domain/Kconfig               |   8 +
 drivers/power/domain/Makefile              |   1 +
 drivers/power/domain/power-domain-uclass.c |   7 +
 drivers/power/domain/qcom-rpmhpd.c         | 278 +++++++++++++++++++++
 drivers/soc/qcom/cmd-db.c                  |  45 ++++
 include/soc/qcom/cmd-db.h                  |   2 +
 8 files changed, 342 insertions(+), 31 deletions(-)
 create mode 100644 drivers/power/domain/qcom-rpmhpd.c

-- 
2.34.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
  2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
@ 2025-12-22 11:48 ` Aswin Murugan
  2025-12-26  9:46   ` Sumit Garg
  2025-12-22 11:48 ` [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Aswin Murugan @ 2025-12-22 11:48 UTC (permalink / raw)
  To: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot
  Cc: Aswin Murugan, Balaji Selvanathan

Added support for Qualcomm RPMH power domain driver, responsible
for managing power domains on Qualcomm SoCs. This is a port of
the Linux RPMHPD driver [1] and sa8775p related changes. The
power domain driver currently has support to power on and off
MMCX power domain of sa8775p; support for other soc entries power
domains are stubbed, in future, the required soc support can be
added.

[1]:
https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/pmdomain/qcom/rpmhpd.c?id=3d25d46a255a83f94d7d4d4216f38aafc8e116b

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
v7:
- No changes to this patch in v7

v6:
- Initialized ret with 0 in rpmhpd_probe()

v5:
- Changed the first argument passed to rpmh_write as pd->dev
- Added (ulong) casting in rpmhpd_match_table to address the warning.

v4:
- Added all SoC entries from the Linux driver and stubbed it
- Removed "qcom_rpmhpd" driver
- Removed unused members in struct rpmhpd

v3:
- No changes to this patch in v3

v2:
- Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN Kconfig
- In qcom-rpmhpd driver, the un-supported power domains are handled with warning
  in rpmhpd_power_on() & rpmhpd_power_off()
---
 drivers/power/domain/Kconfig       |   8 +
 drivers/power/domain/Makefile      |   1 +
 drivers/power/domain/qcom-rpmhpd.c | 278 +++++++++++++++++++++++++++++
 3 files changed, 287 insertions(+)
 create mode 100644 drivers/power/domain/qcom-rpmhpd.c

diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
index 0ad885c9e8b..48e841c638e 100644
--- a/drivers/power/domain/Kconfig
+++ b/drivers/power/domain/Kconfig
@@ -90,6 +90,14 @@ config MESON_SECURE_POWER_DOMAIN
 	  Enable support for manipulating Amlogic Meson Secure power domains.
 	  Support for Amlogic A1 series.
 
+config QCOM_POWER_DOMAIN
+	bool "Enable the QCOM RPMH Power domain driver"
+	depends on POWER_DOMAIN && ARCH_SNAPDRAGON
+	help
+	  Generic RPMH power domain implementation for QCOM devices.
+	  The RPMH power domain driver is responsible for managing power
+	  domains on Qualcomm SoCs.
+
 config SANDBOX_POWER_DOMAIN
 	bool "Enable the sandbox power domain test driver"
 	depends on POWER_DOMAIN && SANDBOX
diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
index 8e03f620437..1c2c64b0964 100644
--- a/drivers/power/domain/Makefile
+++ b/drivers/power/domain/Makefile
@@ -22,3 +22,4 @@ obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o
 obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
 obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
 obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
+obj-$(CONFIG_QCOM_POWER_DOMAIN) += qcom-rpmhpd.o
diff --git a/drivers/power/domain/qcom-rpmhpd.c b/drivers/power/domain/qcom-rpmhpd.c
new file mode 100644
index 00000000000..f51bc9a4bbb
--- /dev/null
+++ b/drivers/power/domain/qcom-rpmhpd.c
@@ -0,0 +1,278 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+// Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
+
+#include <dm.h>
+#include <dm/lists.h>
+#include <power-domain.h>
+#include <asm/io.h>
+#include <linux/errno.h>
+
+#include <power-domain-uclass.h>
+#include <soc/qcom/cmd-db.h>
+#include <soc/qcom/rpmh.h>
+#include <dt-bindings/power/qcom-rpmpd.h>
+#include <dm/device_compat.h>
+
+#define RPMH_ARC_MAX_LEVELS	16
+
+/**
+ * struct rpmhpd - top level RPMh power domain resource data structure
+ * @dev:                rpmh power domain controller device
+ * @pd:                 generic_pm_domain corresponding to the power domain
+ * @parent:             generic_pm_domain corresponding to the parent's power domain
+ * @enable_corner:      lowest non-zero corner
+ * @level:              An array of level (vlvl) to corner (hlvl) mappings
+ *                      derived from cmd-db
+ * @level_count:        Number of levels supported by the power domain. max
+ *                      being 16 (0 - 15)
+ * @enabled:            true if the power domain is enabled
+ * @res_name:           Resource name used for cmd-db lookup
+ * @addr:               Resource address as looped up using resource name from
+ * @skip_retention_level: Indicate that retention level should not be used for the power domain
+ */
+struct rpmhpd {
+	struct udevice	*dev;
+	struct power_domain pd;
+	struct power_domain *parent;
+	unsigned int	enable_corner;
+	u32		level[RPMH_ARC_MAX_LEVELS];
+	size_t		level_count;
+	bool		enabled;
+	const char	*res_name;
+	u32		addr;
+	bool		skip_retention_level;
+};
+
+struct rpmhpd_desc {
+	struct rpmhpd **rpmhpds;
+	size_t num_pds;
+};
+
+/* RPMH powerdomains */
+static struct rpmhpd mmcx_ao;
+static struct rpmhpd mmcx = {
+	.res_name = "mmcx.lvl",
+};
+
+static struct rpmhpd mmcx_ao = {
+	.res_name = "mmcx.lvl",
+};
+
+/* SA8775P RPMH power domains */
+static struct rpmhpd *sa8775p_rpmhpds[] = {
+	[SA8775P_MMCX] = &mmcx,
+	[SA8775P_MMCX_AO] = &mmcx_ao,
+};
+
+static const struct rpmhpd_desc sa8775p_desc = {
+	.rpmhpds = sa8775p_rpmhpds,
+	.num_pds = ARRAY_SIZE(sa8775p_rpmhpds),
+};
+
+/* stub RPMH power domains mapped for unsupported platforms */
+static struct rpmhpd *stub_rpmhpds[] = {};
+
+static const struct rpmhpd_desc stub_desc = {
+	.rpmhpds = stub_rpmhpds,
+	.num_pds = ARRAY_SIZE(stub_rpmhpds),
+};
+
+static const struct udevice_id rpmhpd_match_table[] = {
+	{ .compatible = "qcom,sa8775p-rpmhpd", .data = (ulong)&sa8775p_desc },
+	{ .compatible = "qcom,qcs615-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,qcs8300-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,qdu1000-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sa8155p-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sa8540p-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sar2130p-rpmhpd", .data = (ulong)&stub_desc},
+	{ .compatible = "qcom,sc7180-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sc7280-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sc8180x-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sc8280xp-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sdm670-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sdm845-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sdx55-rpmhpd", .data = (ulong)&stub_desc},
+	{ .compatible = "qcom,sdx65-rpmhpd", .data = (ulong)&stub_desc},
+	{ .compatible = "qcom,sdx75-rpmhpd", .data = (ulong)&stub_desc},
+	{ .compatible = "qcom,sm4450-rpmhpd", .data = (ulong)&stub_desc},
+	{ .compatible = "qcom,sm6350-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm7150-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8150-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8250-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8350-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8450-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8550-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8650-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,sm8750-rpmhpd", .data = (ulong)&stub_desc },
+	{ .compatible = "qcom,x1e80100-rpmhpd", .data = (ulong)&stub_desc },
+	{ }
+};
+
+static int rpmhpd_send_corner(struct rpmhpd *pd, int state,
+			      unsigned int corner, bool sync)
+{
+	struct tcs_cmd cmd = {
+		.addr = pd->addr,
+		.data = corner,
+	};
+
+	return rpmh_write(pd->dev, state, &cmd, 1);
+}
+
+static int rpmhpd_power_on(struct power_domain *pd)
+{
+	int ret;
+	unsigned int corner;
+	struct rpmhpd **rpmhpds;
+	const struct rpmhpd_desc *desc;
+	struct rpmhpd *curr_rpmhpd;
+
+	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
+	if (!desc)
+		return -EINVAL;
+
+	rpmhpds = desc->rpmhpds;
+	curr_rpmhpd = rpmhpds[pd->id];
+
+	/* Do nothing for undefined power domains */
+	if (!curr_rpmhpd) {
+		log_warning("Power domain id (%ld) not supported\n",
+			    pd->id);
+		return 0;
+	}
+
+	corner = curr_rpmhpd->enable_corner;
+
+	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
+				 false);
+	if (!ret)
+		curr_rpmhpd->enabled = true;
+
+	return ret;
+}
+
+static int rpmhpd_power_off(struct power_domain *pd)
+{
+	int ret;
+	unsigned int corner;
+	struct rpmhpd **rpmhpds;
+	const struct rpmhpd_desc *desc;
+	struct rpmhpd *curr_rpmhpd;
+
+	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
+	if (!desc)
+		return -EINVAL;
+
+	rpmhpds = desc->rpmhpds;
+	curr_rpmhpd = rpmhpds[pd->id];
+
+	/* Do nothing for undefined power domains */
+	if (!curr_rpmhpd) {
+		log_warning("Power domain id (%ld) not supported\n",
+			    pd->id);
+		return 0;
+	}
+
+	corner = 0;
+
+	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
+				 false);
+	if (!ret)
+		curr_rpmhpd->enabled = false;
+
+	return ret;
+}
+
+static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd)
+{
+	int i;
+	const u16 *buf;
+
+	buf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count);
+	if (IS_ERR(buf))
+		return PTR_ERR(buf);
+
+	/* 2 bytes used for each command DB aux data entry */
+	rpmhpd->level_count >>= 1;
+
+	if (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS)
+		return -EINVAL;
+
+	for (i = 0; i < rpmhpd->level_count; i++) {
+		if (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION)
+			continue;
+
+		rpmhpd->level[i] = buf[i];
+
+		/* Remember the first corner with non-zero level */
+		if (!rpmhpd->level[rpmhpd->enable_corner] && rpmhpd->level[i])
+			rpmhpd->enable_corner = i;
+
+		/*
+		 * The AUX data may be zero padded. These 0 valued entries at
+		 * the end of the map must be ignored.
+		 */
+		if (i > 0 && rpmhpd->level[i] == 0) {
+			rpmhpd->level_count = i;
+			break;
+		}
+		debug("%s: ARC hlvl=%2d --> vlvl=%4u\n", rpmhpd->res_name, i,
+		      rpmhpd->level[i]);
+	}
+
+	return 0;
+}
+
+static int rpmhpd_probe(struct udevice *dev)
+{
+	int i, ret = 0;
+	struct rpmhpd **rpmhpds;
+	struct rpmhpd *priv;
+	const struct rpmhpd_desc *desc;
+
+	desc = (const struct rpmhpd_desc *)dev_get_driver_data(dev);
+	if (!desc)
+		return -EINVAL;
+
+	rpmhpds = desc->rpmhpds;
+
+	for (i = 0; i < desc->num_pds; i++) {
+		if (!rpmhpds[i])
+			continue;
+
+		priv = rpmhpds[i];
+		priv->dev = dev;
+		priv->addr = cmd_db_read_addr(priv->res_name);
+		if (!priv->addr) {
+			dev_err(dev, "Could not find RPMh address for resource %s\n",
+				priv->res_name);
+			return -ENODEV;
+		}
+
+		ret = cmd_db_read_slave_id(priv->res_name);
+		if (ret != CMD_DB_HW_ARC) {
+			dev_err(dev, "RPMh slave ID mismatch\n");
+			return -EINVAL;
+		}
+
+		ret = rpmhpd_update_level_mapping(priv);
+		if (ret)
+			return ret;
+	}
+
+	return ret;
+}
+
+static const struct power_domain_ops qcom_rpmhpd_power_ops = {
+	.on = rpmhpd_power_on,
+	.off = rpmhpd_power_off,
+};
+
+U_BOOT_DRIVER(qcom_rpmhpd_drv) = {
+	.name = "qcom_rpmhpd_drv",
+	.id = UCLASS_POWER_DOMAIN,
+	.of_match = rpmhpd_match_table,
+	.probe = rpmhpd_probe,
+	.ops = &qcom_rpmhpd_power_ops,
+};
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing
  2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
  2025-12-22 11:48 ` [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support Aswin Murugan
@ 2025-12-22 11:48 ` Aswin Murugan
  2025-12-23  3:15   ` Varadarajan Narayanan
  2025-12-22 11:48 ` [PATCH v7 3/4] mach-snapdragon: fixup power-domains Aswin Murugan
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Aswin Murugan @ 2025-12-22 11:48 UTC (permalink / raw)
  To: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot
  Cc: Aswin Murugan

Update dev_power_domain_ctrl() to log a warning if the power-domain
driver is not found (-ENODEV). Return 0 in this case to allow continued
execution, while preserving error handling for other failures.

Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
Changes in v7:
- Cleaned up the warning logic in drivers/power/domain/power-domain-uclass.c
  when power-domain driver is missing

Changes in v6:
- Newly added the change in drivers/power/domain/power-domain-uclass.c to give warning
  when power-domain driver is missing
---
 drivers/power/domain/power-domain-uclass.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/power/domain/power-domain-uclass.c b/drivers/power/domain/power-domain-uclass.c
index d9fa8ad4bd2..52f56f57658 100644
--- a/drivers/power/domain/power-domain-uclass.c
+++ b/drivers/power/domain/power-domain-uclass.c
@@ -10,6 +10,7 @@
 #include <malloc.h>
 #include <power-domain.h>
 #include <power-domain-uclass.h>
+#include <dm/device_compat.h>
 #include <dm/device-internal.h>
 
 struct power_domain_priv {
@@ -184,6 +185,12 @@ static int dev_power_domain_ctrl(struct udevice *dev, bool on)
 					    "#power-domain-cells", 0);
 	for (i = 0; i < count; i++) {
 		ret = power_domain_get_by_index(dev, &pd, i);
+
+		if (ret == -ENODEV) {
+			dev_warn(dev, "power-domain driver not found\n");
+			return 0;
+		}
+
 		if (ret)
 			return ret;
 		if (on)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v7 3/4] mach-snapdragon: fixup power-domains
  2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
  2025-12-22 11:48 ` [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support Aswin Murugan
  2025-12-22 11:48 ` [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
@ 2025-12-22 11:48 ` Aswin Murugan
  2025-12-22 11:48 ` [PATCH v7 4/4] configs: qcom: Add QCOM_POWER_DOMAIN config Aswin Murugan
  2026-01-14 14:38 ` [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Casey Connolly
  4 siblings, 0 replies; 11+ messages in thread
From: Aswin Murugan @ 2025-12-22 11:48 UTC (permalink / raw)
  To: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot
  Cc: Aswin Murugan, Varadarajan Narayanan

RPMH power domain properties were initially removed from the
device tree due to the absence of driver support. Since RPMH
power domain driver is added now, the fixups are removed.

Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
v7:
- No changes to this patch in v7

v6:
- No changes to this patch in v6

v5:
- No changes to this patch in v5

v4:
- Reverted the inclusion of qcom-rpmpd.h header in pervious versions.

v3:
- Removed OF_LIVE_SA8775P config, since there is no SA8775P specific fixups are done

v2:
- Removed the power domain fixups, since the power domains are handled in qcom-rpmhpd driver
---
 arch/arm/mach-snapdragon/of_fixup.c | 31 -----------------------------
 1 file changed, 31 deletions(-)

diff --git a/arch/arm/mach-snapdragon/of_fixup.c b/arch/arm/mach-snapdragon/of_fixup.c
index eec2c0c757e..93c16821e54 100644
--- a/arch/arm/mach-snapdragon/of_fixup.c
+++ b/arch/arm/mach-snapdragon/of_fixup.c
@@ -116,36 +116,6 @@ static void fixup_usb_nodes(struct device_node *root)
 	}
 }
 
-/* Remove all references to the rpmhpd device */
-static void fixup_power_domains(struct device_node *root)
-{
-	struct device_node *pd = NULL, *np = NULL;
-	struct property *prop;
-	const __be32 *val;
-
-	/* All Qualcomm platforms name the rpm(h)pd "power-controller" */
-	for_each_of_allnodes_from(root, pd) {
-		if (pd->name && !strcmp("power-controller", pd->name))
-			break;
-	}
-
-	/* Sanity check that this is indeed a power domain controller */
-	if (!of_find_property(pd, "#power-domain-cells", NULL)) {
-		log_err("Found power-controller but it doesn't have #power-domain-cells\n");
-		return;
-	}
-
-	/* Remove all references to the power domain controller */
-	for_each_of_allnodes_from(root, np) {
-		if (!(prop = of_find_property(np, "power-domains", NULL)))
-			continue;
-
-		val = prop->value;
-		if (val[0] == cpu_to_fdt32(pd->phandle))
-			of_remove_property(np, prop);
-	}
-}
-
 #define time_call(func, ...) \
 	do { \
 		u64 start = timer_get_us(); \
@@ -158,7 +128,6 @@ static int qcom_of_fixup_nodes(void * __maybe_unused ctx, struct event *event)
 	struct device_node *root = event->data.of_live_built.root;
 
 	time_call(fixup_usb_nodes, root);
-	time_call(fixup_power_domains, root);
 
 	return 0;
 }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v7 4/4] configs: qcom: Add QCOM_POWER_DOMAIN config
  2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
                   ` (2 preceding siblings ...)
  2025-12-22 11:48 ` [PATCH v7 3/4] mach-snapdragon: fixup power-domains Aswin Murugan
@ 2025-12-22 11:48 ` Aswin Murugan
  2026-01-14 14:38 ` [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Casey Connolly
  4 siblings, 0 replies; 11+ messages in thread
From: Aswin Murugan @ 2025-12-22 11:48 UTC (permalink / raw)
  To: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot
  Cc: Aswin Murugan

Enable QCOM_POWER_DOMAIN config for qualcomm devices

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
v7:
- No changes to this patch in v7

v6:
- No changes to this patch in v6

v5:
- No changes to this patch in v5

v4:
- No changes to this patch in v4

v3:
- Removed OF_LIVE_SA8775P config, since there is no SA8775p specific fixups are done

v2:
- No changes to this patch in v2
---
 configs/qcom_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
index e1ae0d946ee..19b63d6f1ca 100644
--- a/configs/qcom_defconfig
+++ b/configs/qcom_defconfig
@@ -122,6 +122,7 @@ CONFIG_MSM_SERIAL=y
 CONFIG_MSM_GENI_SERIAL=y
 CONFIG_SOC_QCOM=y
 CONFIG_QCOM_COMMAND_DB=y
+CONFIG_QCOM_POWER_DOMAIN=y
 CONFIG_QCOM_RPMH=y
 CONFIG_SPMI_MSM=y
 CONFIG_SYSINFO=y
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing
  2025-12-22 11:48 ` [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
@ 2025-12-23  3:15   ` Varadarajan Narayanan
  0 siblings, 0 replies; 11+ messages in thread
From: Varadarajan Narayanan @ 2025-12-23  3:15 UTC (permalink / raw)
  To: Aswin Murugan
  Cc: trini, casey.connolly, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot

On Mon, Dec 22, 2025 at 05:18:21PM +0530, Aswin Murugan wrote:
> Update dev_power_domain_ctrl() to log a warning if the power-domain
> driver is not found (-ENODEV). Return 0 in this case to allow continued
> execution, while preserving error handling for other failures.

Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>

>
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
> Changes in v7:
> - Cleaned up the warning logic in drivers/power/domain/power-domain-uclass.c
>   when power-domain driver is missing
>
> Changes in v6:
> - Newly added the change in drivers/power/domain/power-domain-uclass.c to give warning
>   when power-domain driver is missing
> ---
>  drivers/power/domain/power-domain-uclass.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/power/domain/power-domain-uclass.c b/drivers/power/domain/power-domain-uclass.c
> index d9fa8ad4bd2..52f56f57658 100644
> --- a/drivers/power/domain/power-domain-uclass.c
> +++ b/drivers/power/domain/power-domain-uclass.c
> @@ -10,6 +10,7 @@
>  #include <malloc.h>
>  #include <power-domain.h>
>  #include <power-domain-uclass.h>
> +#include <dm/device_compat.h>
>  #include <dm/device-internal.h>
>
>  struct power_domain_priv {
> @@ -184,6 +185,12 @@ static int dev_power_domain_ctrl(struct udevice *dev, bool on)
>  					    "#power-domain-cells", 0);
>  	for (i = 0; i < count; i++) {
>  		ret = power_domain_get_by_index(dev, &pd, i);
> +
> +		if (ret == -ENODEV) {
> +			dev_warn(dev, "power-domain driver not found\n");
> +			return 0;
> +		}
> +
>  		if (ret)
>  			return ret;
>  		if (on)
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
  2025-12-22 11:48 ` [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support Aswin Murugan
@ 2025-12-26  9:46   ` Sumit Garg
  2026-01-13 10:43     ` Aswin Murugan
  0 siblings, 1 reply; 11+ messages in thread
From: Sumit Garg @ 2025-12-26  9:46 UTC (permalink / raw)
  To: Aswin Murugan
  Cc: trini, casey.connolly, neil.armstrong, jh80.chung, rui.silva,
	ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot, Balaji Selvanathan

Hi Aswin,

Thanks for the driver port.

On Mon, Dec 22, 2025 at 05:18:20PM +0530, Aswin Murugan wrote:
> Added support for Qualcomm RPMH power domain driver, responsible
> for managing power domains on Qualcomm SoCs. This is a port of
> the Linux RPMHPD driver [1] and sa8775p related changes.

> The
> power domain driver currently has support to power on and off
> MMCX power domain of sa8775p;

IIUC, the MMCX power domain relates to multimedia use-cases. Do you have
any such use-case for that in U-Boot? IOW, I don't see a user of the
RPMh functionality you are trying to add in this patch-set.

If it's just meant for now to not have live DT fixups then having just
the stubbed power domains will be sufficient.

-Sumit

> support for other soc entries power
> domains are stubbed, in future, the required soc support can be
> added.
> 
> [1]:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/pmdomain/qcom/rpmhpd.c?id=3d25d46a255a83f94d7d4d4216f38aafc8e116b
> 
> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
> v7:
> - No changes to this patch in v7
> 
> v6:
> - Initialized ret with 0 in rpmhpd_probe()
> 
> v5:
> - Changed the first argument passed to rpmh_write as pd->dev
> - Added (ulong) casting in rpmhpd_match_table to address the warning.
> 
> v4:
> - Added all SoC entries from the Linux driver and stubbed it
> - Removed "qcom_rpmhpd" driver
> - Removed unused members in struct rpmhpd
> 
> v3:
> - No changes to this patch in v3
> 
> v2:
> - Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN Kconfig
> - In qcom-rpmhpd driver, the un-supported power domains are handled with warning
>   in rpmhpd_power_on() & rpmhpd_power_off()
> ---
>  drivers/power/domain/Kconfig       |   8 +
>  drivers/power/domain/Makefile      |   1 +
>  drivers/power/domain/qcom-rpmhpd.c | 278 +++++++++++++++++++++++++++++
>  3 files changed, 287 insertions(+)
>  create mode 100644 drivers/power/domain/qcom-rpmhpd.c
> 
> diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
> index 0ad885c9e8b..48e841c638e 100644
> --- a/drivers/power/domain/Kconfig
> +++ b/drivers/power/domain/Kconfig
> @@ -90,6 +90,14 @@ config MESON_SECURE_POWER_DOMAIN
>  	  Enable support for manipulating Amlogic Meson Secure power domains.
>  	  Support for Amlogic A1 series.
>  
> +config QCOM_POWER_DOMAIN
> +	bool "Enable the QCOM RPMH Power domain driver"
> +	depends on POWER_DOMAIN && ARCH_SNAPDRAGON
> +	help
> +	  Generic RPMH power domain implementation for QCOM devices.
> +	  The RPMH power domain driver is responsible for managing power
> +	  domains on Qualcomm SoCs.
> +
>  config SANDBOX_POWER_DOMAIN
>  	bool "Enable the sandbox power domain test driver"
>  	depends on POWER_DOMAIN && SANDBOX
> diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
> index 8e03f620437..1c2c64b0964 100644
> --- a/drivers/power/domain/Makefile
> +++ b/drivers/power/domain/Makefile
> @@ -22,3 +22,4 @@ obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o
>  obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
>  obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
>  obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
> +obj-$(CONFIG_QCOM_POWER_DOMAIN) += qcom-rpmhpd.o
> diff --git a/drivers/power/domain/qcom-rpmhpd.c b/drivers/power/domain/qcom-rpmhpd.c
> new file mode 100644
> index 00000000000..f51bc9a4bbb
> --- /dev/null
> +++ b/drivers/power/domain/qcom-rpmhpd.c
> @@ -0,0 +1,278 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// Copyright (c) 2018, The Linux Foundation. All rights reserved.
> +// Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
> +
> +#include <dm.h>
> +#include <dm/lists.h>
> +#include <power-domain.h>
> +#include <asm/io.h>
> +#include <linux/errno.h>
> +
> +#include <power-domain-uclass.h>
> +#include <soc/qcom/cmd-db.h>
> +#include <soc/qcom/rpmh.h>
> +#include <dt-bindings/power/qcom-rpmpd.h>
> +#include <dm/device_compat.h>
> +
> +#define RPMH_ARC_MAX_LEVELS	16
> +
> +/**
> + * struct rpmhpd - top level RPMh power domain resource data structure
> + * @dev:                rpmh power domain controller device
> + * @pd:                 generic_pm_domain corresponding to the power domain
> + * @parent:             generic_pm_domain corresponding to the parent's power domain
> + * @enable_corner:      lowest non-zero corner
> + * @level:              An array of level (vlvl) to corner (hlvl) mappings
> + *                      derived from cmd-db
> + * @level_count:        Number of levels supported by the power domain. max
> + *                      being 16 (0 - 15)
> + * @enabled:            true if the power domain is enabled
> + * @res_name:           Resource name used for cmd-db lookup
> + * @addr:               Resource address as looped up using resource name from
> + * @skip_retention_level: Indicate that retention level should not be used for the power domain
> + */
> +struct rpmhpd {
> +	struct udevice	*dev;
> +	struct power_domain pd;
> +	struct power_domain *parent;
> +	unsigned int	enable_corner;
> +	u32		level[RPMH_ARC_MAX_LEVELS];
> +	size_t		level_count;
> +	bool		enabled;
> +	const char	*res_name;
> +	u32		addr;
> +	bool		skip_retention_level;
> +};
> +
> +struct rpmhpd_desc {
> +	struct rpmhpd **rpmhpds;
> +	size_t num_pds;
> +};
> +
> +/* RPMH powerdomains */
> +static struct rpmhpd mmcx_ao;
> +static struct rpmhpd mmcx = {
> +	.res_name = "mmcx.lvl",
> +};
> +
> +static struct rpmhpd mmcx_ao = {
> +	.res_name = "mmcx.lvl",
> +};
> +
> +/* SA8775P RPMH power domains */
> +static struct rpmhpd *sa8775p_rpmhpds[] = {
> +	[SA8775P_MMCX] = &mmcx,
> +	[SA8775P_MMCX_AO] = &mmcx_ao,
> +};
> +
> +static const struct rpmhpd_desc sa8775p_desc = {
> +	.rpmhpds = sa8775p_rpmhpds,
> +	.num_pds = ARRAY_SIZE(sa8775p_rpmhpds),
> +};
> +
> +/* stub RPMH power domains mapped for unsupported platforms */
> +static struct rpmhpd *stub_rpmhpds[] = {};
> +
> +static const struct rpmhpd_desc stub_desc = {
> +	.rpmhpds = stub_rpmhpds,
> +	.num_pds = ARRAY_SIZE(stub_rpmhpds),
> +};
> +
> +static const struct udevice_id rpmhpd_match_table[] = {
> +	{ .compatible = "qcom,sa8775p-rpmhpd", .data = (ulong)&sa8775p_desc },
> +	{ .compatible = "qcom,qcs615-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,qcs8300-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,qdu1000-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sa8155p-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sa8540p-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sar2130p-rpmhpd", .data = (ulong)&stub_desc},
> +	{ .compatible = "qcom,sc7180-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sc7280-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sc8180x-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sc8280xp-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sdm670-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sdm845-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sdx55-rpmhpd", .data = (ulong)&stub_desc},
> +	{ .compatible = "qcom,sdx65-rpmhpd", .data = (ulong)&stub_desc},
> +	{ .compatible = "qcom,sdx75-rpmhpd", .data = (ulong)&stub_desc},
> +	{ .compatible = "qcom,sm4450-rpmhpd", .data = (ulong)&stub_desc},
> +	{ .compatible = "qcom,sm6350-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm7150-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8150-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8250-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8350-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8450-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8550-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8650-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,sm8750-rpmhpd", .data = (ulong)&stub_desc },
> +	{ .compatible = "qcom,x1e80100-rpmhpd", .data = (ulong)&stub_desc },
> +	{ }
> +};
> +
> +static int rpmhpd_send_corner(struct rpmhpd *pd, int state,
> +			      unsigned int corner, bool sync)
> +{
> +	struct tcs_cmd cmd = {
> +		.addr = pd->addr,
> +		.data = corner,
> +	};
> +
> +	return rpmh_write(pd->dev, state, &cmd, 1);
> +}
> +
> +static int rpmhpd_power_on(struct power_domain *pd)
> +{
> +	int ret;
> +	unsigned int corner;
> +	struct rpmhpd **rpmhpds;
> +	const struct rpmhpd_desc *desc;
> +	struct rpmhpd *curr_rpmhpd;
> +
> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
> +	if (!desc)
> +		return -EINVAL;
> +
> +	rpmhpds = desc->rpmhpds;
> +	curr_rpmhpd = rpmhpds[pd->id];
> +
> +	/* Do nothing for undefined power domains */
> +	if (!curr_rpmhpd) {
> +		log_warning("Power domain id (%ld) not supported\n",
> +			    pd->id);
> +		return 0;
> +	}
> +
> +	corner = curr_rpmhpd->enable_corner;
> +
> +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
> +				 false);
> +	if (!ret)
> +		curr_rpmhpd->enabled = true;
> +
> +	return ret;
> +}
> +
> +static int rpmhpd_power_off(struct power_domain *pd)
> +{
> +	int ret;
> +	unsigned int corner;
> +	struct rpmhpd **rpmhpds;
> +	const struct rpmhpd_desc *desc;
> +	struct rpmhpd *curr_rpmhpd;
> +
> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
> +	if (!desc)
> +		return -EINVAL;
> +
> +	rpmhpds = desc->rpmhpds;
> +	curr_rpmhpd = rpmhpds[pd->id];
> +
> +	/* Do nothing for undefined power domains */
> +	if (!curr_rpmhpd) {
> +		log_warning("Power domain id (%ld) not supported\n",
> +			    pd->id);
> +		return 0;
> +	}
> +
> +	corner = 0;
> +
> +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
> +				 false);
> +	if (!ret)
> +		curr_rpmhpd->enabled = false;
> +
> +	return ret;
> +}
> +
> +static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd)
> +{
> +	int i;
> +	const u16 *buf;
> +
> +	buf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count);
> +	if (IS_ERR(buf))
> +		return PTR_ERR(buf);
> +
> +	/* 2 bytes used for each command DB aux data entry */
> +	rpmhpd->level_count >>= 1;
> +
> +	if (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS)
> +		return -EINVAL;
> +
> +	for (i = 0; i < rpmhpd->level_count; i++) {
> +		if (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION)
> +			continue;
> +
> +		rpmhpd->level[i] = buf[i];
> +
> +		/* Remember the first corner with non-zero level */
> +		if (!rpmhpd->level[rpmhpd->enable_corner] && rpmhpd->level[i])
> +			rpmhpd->enable_corner = i;
> +
> +		/*
> +		 * The AUX data may be zero padded. These 0 valued entries at
> +		 * the end of the map must be ignored.
> +		 */
> +		if (i > 0 && rpmhpd->level[i] == 0) {
> +			rpmhpd->level_count = i;
> +			break;
> +		}
> +		debug("%s: ARC hlvl=%2d --> vlvl=%4u\n", rpmhpd->res_name, i,
> +		      rpmhpd->level[i]);
> +	}
> +
> +	return 0;
> +}
> +
> +static int rpmhpd_probe(struct udevice *dev)
> +{
> +	int i, ret = 0;
> +	struct rpmhpd **rpmhpds;
> +	struct rpmhpd *priv;
> +	const struct rpmhpd_desc *desc;
> +
> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(dev);
> +	if (!desc)
> +		return -EINVAL;
> +
> +	rpmhpds = desc->rpmhpds;
> +
> +	for (i = 0; i < desc->num_pds; i++) {
> +		if (!rpmhpds[i])
> +			continue;
> +
> +		priv = rpmhpds[i];
> +		priv->dev = dev;
> +		priv->addr = cmd_db_read_addr(priv->res_name);
> +		if (!priv->addr) {
> +			dev_err(dev, "Could not find RPMh address for resource %s\n",
> +				priv->res_name);
> +			return -ENODEV;
> +		}
> +
> +		ret = cmd_db_read_slave_id(priv->res_name);
> +		if (ret != CMD_DB_HW_ARC) {
> +			dev_err(dev, "RPMh slave ID mismatch\n");
> +			return -EINVAL;
> +		}
> +
> +		ret = rpmhpd_update_level_mapping(priv);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return ret;
> +}
> +
> +static const struct power_domain_ops qcom_rpmhpd_power_ops = {
> +	.on = rpmhpd_power_on,
> +	.off = rpmhpd_power_off,
> +};
> +
> +U_BOOT_DRIVER(qcom_rpmhpd_drv) = {
> +	.name = "qcom_rpmhpd_drv",
> +	.id = UCLASS_POWER_DOMAIN,
> +	.of_match = rpmhpd_match_table,
> +	.probe = rpmhpd_probe,
> +	.ops = &qcom_rpmhpd_power_ops,
> +};
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
  2025-12-26  9:46   ` Sumit Garg
@ 2026-01-13 10:43     ` Aswin Murugan
  2026-01-16  9:24       ` Sumit Garg
  0 siblings, 1 reply; 11+ messages in thread
From: Aswin Murugan @ 2026-01-13 10:43 UTC (permalink / raw)
  To: Sumit Garg
  Cc: trini, casey.connolly, neil.armstrong, jh80.chung, rui.silva,
	ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot, Balaji Selvanathan


On 12/26/2025 3:16 PM, Sumit Garg wrote:
> Hi Aswin,
>
> Thanks for the driver port.
>
> On Mon, Dec 22, 2025 at 05:18:20PM +0530, Aswin Murugan wrote:
>> Added support for Qualcomm RPMH power domain driver, responsible
>> for managing power domains on Qualcomm SoCs. This is a port of
>> the Linux RPMHPD driver [1] and sa8775p related changes.
>> The
>> power domain driver currently has support to power on and off
>> MMCX power domain of sa8775p;
> IIUC, the MMCX power domain relates to multimedia use-cases. Do you have
> any such use-case for that in U-Boot? IOW, I don't see a user of the
> RPMh functionality you are trying to add in this patch-set.
>
> Yes, MMCX is tied to multimedia, and in our case, it is required for 
> display initialization in U-Boot.
>
>
> If it's just meant for now to not have live DT fixups then having just
> the stubbed power domains will be sufficient.
>
> -Sumit
>
> Yes, the purpose of introducing stubbed power domains is to eliminate the need for live Device Tree fixups related to power domains
>
> -Aswin
>
>
>> support for other soc entries power
>> domains are stubbed, in future, the required soc support can be
>> added.
>>
>> [1]:
>> https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/pmdomain/qcom/rpmhpd.c?id=3d25d46a255a83f94d7d4d4216f38aafc8e116b
>>
>> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
>> Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
>> ---
>> v7:
>> - No changes to this patch in v7
>>
>> v6:
>> - Initialized ret with 0 in rpmhpd_probe()
>>
>> v5:
>> - Changed the first argument passed to rpmh_write as pd->dev
>> - Added (ulong) casting in rpmhpd_match_table to address the warning.
>>
>> v4:
>> - Added all SoC entries from the Linux driver and stubbed it
>> - Removed "qcom_rpmhpd" driver
>> - Removed unused members in struct rpmhpd
>>
>> v3:
>> - No changes to this patch in v3
>>
>> v2:
>> - Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN Kconfig
>> - In qcom-rpmhpd driver, the un-supported power domains are handled with warning
>>    in rpmhpd_power_on() & rpmhpd_power_off()
>> ---
>>   drivers/power/domain/Kconfig       |   8 +
>>   drivers/power/domain/Makefile      |   1 +
>>   drivers/power/domain/qcom-rpmhpd.c | 278 +++++++++++++++++++++++++++++
>>   3 files changed, 287 insertions(+)
>>   create mode 100644 drivers/power/domain/qcom-rpmhpd.c
>>
>> diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
>> index 0ad885c9e8b..48e841c638e 100644
>> --- a/drivers/power/domain/Kconfig
>> +++ b/drivers/power/domain/Kconfig
>> @@ -90,6 +90,14 @@ config MESON_SECURE_POWER_DOMAIN
>>   	  Enable support for manipulating Amlogic Meson Secure power domains.
>>   	  Support for Amlogic A1 series.
>>   
>> +config QCOM_POWER_DOMAIN
>> +	bool "Enable the QCOM RPMH Power domain driver"
>> +	depends on POWER_DOMAIN && ARCH_SNAPDRAGON
>> +	help
>> +	  Generic RPMH power domain implementation for QCOM devices.
>> +	  The RPMH power domain driver is responsible for managing power
>> +	  domains on Qualcomm SoCs.
>> +
>>   config SANDBOX_POWER_DOMAIN
>>   	bool "Enable the sandbox power domain test driver"
>>   	depends on POWER_DOMAIN && SANDBOX
>> diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
>> index 8e03f620437..1c2c64b0964 100644
>> --- a/drivers/power/domain/Makefile
>> +++ b/drivers/power/domain/Makefile
>> @@ -22,3 +22,4 @@ obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o
>>   obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
>>   obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
>>   obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
>> +obj-$(CONFIG_QCOM_POWER_DOMAIN) += qcom-rpmhpd.o
>> diff --git a/drivers/power/domain/qcom-rpmhpd.c b/drivers/power/domain/qcom-rpmhpd.c
>> new file mode 100644
>> index 00000000000..f51bc9a4bbb
>> --- /dev/null
>> +++ b/drivers/power/domain/qcom-rpmhpd.c
>> @@ -0,0 +1,278 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +// Copyright (c) 2018, The Linux Foundation. All rights reserved.
>> +// Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
>> +
>> +#include <dm.h>
>> +#include <dm/lists.h>
>> +#include <power-domain.h>
>> +#include <asm/io.h>
>> +#include <linux/errno.h>
>> +
>> +#include <power-domain-uclass.h>
>> +#include <soc/qcom/cmd-db.h>
>> +#include <soc/qcom/rpmh.h>
>> +#include <dt-bindings/power/qcom-rpmpd.h>
>> +#include <dm/device_compat.h>
>> +
>> +#define RPMH_ARC_MAX_LEVELS	16
>> +
>> +/**
>> + * struct rpmhpd - top level RPMh power domain resource data structure
>> + * @dev:                rpmh power domain controller device
>> + * @pd:                 generic_pm_domain corresponding to the power domain
>> + * @parent:             generic_pm_domain corresponding to the parent's power domain
>> + * @enable_corner:      lowest non-zero corner
>> + * @level:              An array of level (vlvl) to corner (hlvl) mappings
>> + *                      derived from cmd-db
>> + * @level_count:        Number of levels supported by the power domain. max
>> + *                      being 16 (0 - 15)
>> + * @enabled:            true if the power domain is enabled
>> + * @res_name:           Resource name used for cmd-db lookup
>> + * @addr:               Resource address as looped up using resource name from
>> + * @skip_retention_level: Indicate that retention level should not be used for the power domain
>> + */
>> +struct rpmhpd {
>> +	struct udevice	*dev;
>> +	struct power_domain pd;
>> +	struct power_domain *parent;
>> +	unsigned int	enable_corner;
>> +	u32		level[RPMH_ARC_MAX_LEVELS];
>> +	size_t		level_count;
>> +	bool		enabled;
>> +	const char	*res_name;
>> +	u32		addr;
>> +	bool		skip_retention_level;
>> +};
>> +
>> +struct rpmhpd_desc {
>> +	struct rpmhpd **rpmhpds;
>> +	size_t num_pds;
>> +};
>> +
>> +/* RPMH powerdomains */
>> +static struct rpmhpd mmcx_ao;
>> +static struct rpmhpd mmcx = {
>> +	.res_name = "mmcx.lvl",
>> +};
>> +
>> +static struct rpmhpd mmcx_ao = {
>> +	.res_name = "mmcx.lvl",
>> +};
>> +
>> +/* SA8775P RPMH power domains */
>> +static struct rpmhpd *sa8775p_rpmhpds[] = {
>> +	[SA8775P_MMCX] = &mmcx,
>> +	[SA8775P_MMCX_AO] = &mmcx_ao,
>> +};
>> +
>> +static const struct rpmhpd_desc sa8775p_desc = {
>> +	.rpmhpds = sa8775p_rpmhpds,
>> +	.num_pds = ARRAY_SIZE(sa8775p_rpmhpds),
>> +};
>> +
>> +/* stub RPMH power domains mapped for unsupported platforms */
>> +static struct rpmhpd *stub_rpmhpds[] = {};
>> +
>> +static const struct rpmhpd_desc stub_desc = {
>> +	.rpmhpds = stub_rpmhpds,
>> +	.num_pds = ARRAY_SIZE(stub_rpmhpds),
>> +};
>> +
>> +static const struct udevice_id rpmhpd_match_table[] = {
>> +	{ .compatible = "qcom,sa8775p-rpmhpd", .data = (ulong)&sa8775p_desc },
>> +	{ .compatible = "qcom,qcs615-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,qcs8300-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,qdu1000-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sa8155p-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sa8540p-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sar2130p-rpmhpd", .data = (ulong)&stub_desc},
>> +	{ .compatible = "qcom,sc7180-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sc7280-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sc8180x-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sc8280xp-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sdm670-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sdm845-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sdx55-rpmhpd", .data = (ulong)&stub_desc},
>> +	{ .compatible = "qcom,sdx65-rpmhpd", .data = (ulong)&stub_desc},
>> +	{ .compatible = "qcom,sdx75-rpmhpd", .data = (ulong)&stub_desc},
>> +	{ .compatible = "qcom,sm4450-rpmhpd", .data = (ulong)&stub_desc},
>> +	{ .compatible = "qcom,sm6350-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm7150-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8150-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8250-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8350-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8450-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8550-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8650-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,sm8750-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ .compatible = "qcom,x1e80100-rpmhpd", .data = (ulong)&stub_desc },
>> +	{ }
>> +};
>> +
>> +static int rpmhpd_send_corner(struct rpmhpd *pd, int state,
>> +			      unsigned int corner, bool sync)
>> +{
>> +	struct tcs_cmd cmd = {
>> +		.addr = pd->addr,
>> +		.data = corner,
>> +	};
>> +
>> +	return rpmh_write(pd->dev, state, &cmd, 1);
>> +}
>> +
>> +static int rpmhpd_power_on(struct power_domain *pd)
>> +{
>> +	int ret;
>> +	unsigned int corner;
>> +	struct rpmhpd **rpmhpds;
>> +	const struct rpmhpd_desc *desc;
>> +	struct rpmhpd *curr_rpmhpd;
>> +
>> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
>> +	if (!desc)
>> +		return -EINVAL;
>> +
>> +	rpmhpds = desc->rpmhpds;
>> +	curr_rpmhpd = rpmhpds[pd->id];
>> +
>> +	/* Do nothing for undefined power domains */
>> +	if (!curr_rpmhpd) {
>> +		log_warning("Power domain id (%ld) not supported\n",
>> +			    pd->id);
>> +		return 0;
>> +	}
>> +
>> +	corner = curr_rpmhpd->enable_corner;
>> +
>> +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
>> +				 false);
>> +	if (!ret)
>> +		curr_rpmhpd->enabled = true;
>> +
>> +	return ret;
>> +}
>> +
>> +static int rpmhpd_power_off(struct power_domain *pd)
>> +{
>> +	int ret;
>> +	unsigned int corner;
>> +	struct rpmhpd **rpmhpds;
>> +	const struct rpmhpd_desc *desc;
>> +	struct rpmhpd *curr_rpmhpd;
>> +
>> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
>> +	if (!desc)
>> +		return -EINVAL;
>> +
>> +	rpmhpds = desc->rpmhpds;
>> +	curr_rpmhpd = rpmhpds[pd->id];
>> +
>> +	/* Do nothing for undefined power domains */
>> +	if (!curr_rpmhpd) {
>> +		log_warning("Power domain id (%ld) not supported\n",
>> +			    pd->id);
>> +		return 0;
>> +	}
>> +
>> +	corner = 0;
>> +
>> +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
>> +				 false);
>> +	if (!ret)
>> +		curr_rpmhpd->enabled = false;
>> +
>> +	return ret;
>> +}
>> +
>> +static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd)
>> +{
>> +	int i;
>> +	const u16 *buf;
>> +
>> +	buf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count);
>> +	if (IS_ERR(buf))
>> +		return PTR_ERR(buf);
>> +
>> +	/* 2 bytes used for each command DB aux data entry */
>> +	rpmhpd->level_count >>= 1;
>> +
>> +	if (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS)
>> +		return -EINVAL;
>> +
>> +	for (i = 0; i < rpmhpd->level_count; i++) {
>> +		if (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION)
>> +			continue;
>> +
>> +		rpmhpd->level[i] = buf[i];
>> +
>> +		/* Remember the first corner with non-zero level */
>> +		if (!rpmhpd->level[rpmhpd->enable_corner] && rpmhpd->level[i])
>> +			rpmhpd->enable_corner = i;
>> +
>> +		/*
>> +		 * The AUX data may be zero padded. These 0 valued entries at
>> +		 * the end of the map must be ignored.
>> +		 */
>> +		if (i > 0 && rpmhpd->level[i] == 0) {
>> +			rpmhpd->level_count = i;
>> +			break;
>> +		}
>> +		debug("%s: ARC hlvl=%2d --> vlvl=%4u\n", rpmhpd->res_name, i,
>> +		      rpmhpd->level[i]);
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +static int rpmhpd_probe(struct udevice *dev)
>> +{
>> +	int i, ret = 0;
>> +	struct rpmhpd **rpmhpds;
>> +	struct rpmhpd *priv;
>> +	const struct rpmhpd_desc *desc;
>> +
>> +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(dev);
>> +	if (!desc)
>> +		return -EINVAL;
>> +
>> +	rpmhpds = desc->rpmhpds;
>> +
>> +	for (i = 0; i < desc->num_pds; i++) {
>> +		if (!rpmhpds[i])
>> +			continue;
>> +
>> +		priv = rpmhpds[i];
>> +		priv->dev = dev;
>> +		priv->addr = cmd_db_read_addr(priv->res_name);
>> +		if (!priv->addr) {
>> +			dev_err(dev, "Could not find RPMh address for resource %s\n",
>> +				priv->res_name);
>> +			return -ENODEV;
>> +		}
>> +
>> +		ret = cmd_db_read_slave_id(priv->res_name);
>> +		if (ret != CMD_DB_HW_ARC) {
>> +			dev_err(dev, "RPMh slave ID mismatch\n");
>> +			return -EINVAL;
>> +		}
>> +
>> +		ret = rpmhpd_update_level_mapping(priv);
>> +		if (ret)
>> +			return ret;
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +static const struct power_domain_ops qcom_rpmhpd_power_ops = {
>> +	.on = rpmhpd_power_on,
>> +	.off = rpmhpd_power_off,
>> +};
>> +
>> +U_BOOT_DRIVER(qcom_rpmhpd_drv) = {
>> +	.name = "qcom_rpmhpd_drv",
>> +	.id = UCLASS_POWER_DOMAIN,
>> +	.of_match = rpmhpd_match_table,
>> +	.probe = rpmhpd_probe,
>> +	.ops = &qcom_rpmhpd_power_ops,
>> +};
>> -- 
>> 2.34.1
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver
  2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
                   ` (3 preceding siblings ...)
  2025-12-22 11:48 ` [PATCH v7 4/4] configs: qcom: Add QCOM_POWER_DOMAIN config Aswin Murugan
@ 2026-01-14 14:38 ` Casey Connolly
  2026-01-30 17:13   ` Aswin Murugan
  4 siblings, 1 reply; 11+ messages in thread
From: Casey Connolly @ 2026-01-14 14:38 UTC (permalink / raw)
  To: Aswin Murugan, trini, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot

Hi Aswin,

Sorry for the late response here.

Still a few minor issues with this series but it's more or less there.
I'll just list everything here rather than replying to individual patches.

1. Please rename the kconfig option to something more specific like
QCOM_RPMH_POWER_DOMAIN
2. Removing the fixup code will break msm8916 and other platforms that
use rpmpd (non-hardened), it should be pretty trivial to check if the
compatible string for the power-controller node ends with "rpmpd" or
"rpmhpd" and skip the logic in the latter case.
3. The commit "mach-snapdragon: fixup power-domains" should have a more
specific title.

I'll pick this up as soon as I get the next revision.

Kind regards,

On 22/12/2025 12:48, Aswin Murugan wrote:
> This patch series adds support for the Qualcomm RPMH power domain
> driver, responsible for managing power domains on Qualcomm SoCs.
> The driver is ported from the Linux kernel and adapted for
> U-Boot to enable proper power domain control on SA8775P platform.
> 
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
> Changes in v7:
> - Droped soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data() functions
>   patch from previous version, since it was already picked
>   Link: https://lore.kernel.org/u-boot/176363183220.2293399.7296647117885059868.b4-ty@linaro.org/
> - Cleaned up the warning logic in drivers/power/domain/power-domain-uclass.c
>   when power-domain driver is missing
> - Link to v6: https://lore.kernel.org/u-boot/20251113113427.2218045-1-aswin.murugan@oss.qualcomm.com/
> 
> Changes in v6:
> - Added the change in drivers/power/domain/power-domain-uclass.c to give warning
>   when power-domain driver is missing
> - Added the change log 'In qcom-rpmhpd driver, the un-supported power domains are handled with warning
>   in rpmhpd_power_on() & rpmhpd_power_on()' 
> - In drivers/power/domain/qcom-rpmhpd.c, the 'ret' variable in rpmhpd_probe() is initialized with 0
> - Link to v5: https://lore.kernel.org/u-boot/20251027113312.3815169-1-aswinm@qti.qualcomm.com/
> 
> Changes in v5:
> - As part of "qcom_rpmhpd" driver removal change did in v4, the rpmh_write() in drivers/power/domain/qcom-rpmhpd.c
>   should be passed with pd->dev as first argument to align with it.
> - Added (ulong) casting in rpmhpd_match_table to address the warning.
> 
> Changes in v4:
> - Added all soc entries in power domain linux driver to drivers/power/domain/qcom-rpmhpd.c and
>   stubbed it
> - Removed "qcom_rpmhpd" driver & unused members of struct rpmhpd in drivers/power/domain/qcom-rpmhpd.c
> - Moved the "soc: qcom: cmd-db" change before the "power-domain" change
> - Link to v3: https://lore.kernel.org/u-boot/20250702180133.1889709-1-aswin.murugan@oss.qualcomm.com/
> 
> Changes in v3:
> - Removed OF_LIVE_SA8775P config in arch/arm/mach-snapdragon/Kconfig & configs/qcs9100_defconfig,
>   since there is no SA8775p specific fixups are done
> - Link to v2: https://lore.kernel.org/u-boot/20250702171335.1811080-1-aswin.murugan@oss.qualcomm.com/
> 
> Changes in v2:
> - Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN in drivers/power/domain/Kconfig
> - In drivers/power/domain/qcom-rpmhpd.c, the un-supported power domains are handled with warning
> - Power domain fixups have been removed since they are now managed by drivers/power/domain/qcom-rpmhpd.c
> - Link to v1: https://lore.kernel.org/u-boot/20250626112441.143064-1-aswin.murugan@oss.qualcomm.com/
> ---
> 
> Aswin Murugan (5):
>   soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data()
>     functions
>   power-domain: Add QCOM RPMH Power Domain Driver Support
>   power-domain: Add warning when power-domain driver is missing
>   mach-snapdragon: fixup power-domains
>   configs: qcom: Add QCOM_POWER_DOMAIN config
> 
>  arch/arm/mach-snapdragon/of_fixup.c        |  31 ---
>  configs/qcom_defconfig                     |   1 +
>  drivers/power/domain/Kconfig               |   8 +
>  drivers/power/domain/Makefile              |   1 +
>  drivers/power/domain/power-domain-uclass.c |   7 +
>  drivers/power/domain/qcom-rpmhpd.c         | 278 +++++++++++++++++++++
>  drivers/soc/qcom/cmd-db.c                  |  45 ++++
>  include/soc/qcom/cmd-db.h                  |   2 +
>  8 files changed, 342 insertions(+), 31 deletions(-)
>  create mode 100644 drivers/power/domain/qcom-rpmhpd.c
> 

-- 
// Casey (she/her)


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
  2026-01-13 10:43     ` Aswin Murugan
@ 2026-01-16  9:24       ` Sumit Garg
  0 siblings, 0 replies; 11+ messages in thread
From: Sumit Garg @ 2026-01-16  9:24 UTC (permalink / raw)
  To: Aswin Murugan
  Cc: trini, casey.connolly, neil.armstrong, jh80.chung, rui.silva,
	ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot, Balaji Selvanathan

On Tue, Jan 13, 2026 at 04:13:30PM +0530, Aswin Murugan wrote:
> 
> On 12/26/2025 3:16 PM, Sumit Garg wrote:
> > Hi Aswin,
> > 
> > Thanks for the driver port.
> > 
> > On Mon, Dec 22, 2025 at 05:18:20PM +0530, Aswin Murugan wrote:
> > > Added support for Qualcomm RPMH power domain driver, responsible
> > > for managing power domains on Qualcomm SoCs. This is a port of
> > > the Linux RPMHPD driver [1] and sa8775p related changes.
> > > The
> > > power domain driver currently has support to power on and off
> > > MMCX power domain of sa8775p;
> > IIUC, the MMCX power domain relates to multimedia use-cases. Do you have
> > any such use-case for that in U-Boot? IOW, I don't see a user of the
> > RPMh functionality you are trying to add in this patch-set.
> > 
> > Yes, MMCX is tied to multimedia, and in our case, it is required for
> > display initialization in U-Boot.
> >

Okay, it would be interesting to see display support in U-Boot for Qcom
platforms.

-Sumit

> > 
> > If it's just meant for now to not have live DT fixups then having just
> > the stubbed power domains will be sufficient.
> > 
> > -Sumit
> > 
> > Yes, the purpose of introducing stubbed power domains is to eliminate the need for live Device Tree fixups related to power domains
> > 
> > -Aswin
> > 
> > 
> > > support for other soc entries power
> > > domains are stubbed, in future, the required soc support can be
> > > added.
> > > 
> > > [1]:
> > > https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/pmdomain/qcom/rpmhpd.c?id=3d25d46a255a83f94d7d4d4216f38aafc8e116b
> > > 
> > > Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> > > Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
> > > Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> > > ---
> > > v7:
> > > - No changes to this patch in v7
> > > 
> > > v6:
> > > - Initialized ret with 0 in rpmhpd_probe()
> > > 
> > > v5:
> > > - Changed the first argument passed to rpmh_write as pd->dev
> > > - Added (ulong) casting in rpmhpd_match_table to address the warning.
> > > 
> > > v4:
> > > - Added all SoC entries from the Linux driver and stubbed it
> > > - Removed "qcom_rpmhpd" driver
> > > - Removed unused members in struct rpmhpd
> > > 
> > > v3:
> > > - No changes to this patch in v3
> > > 
> > > v2:
> > > - Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN Kconfig
> > > - In qcom-rpmhpd driver, the un-supported power domains are handled with warning
> > >    in rpmhpd_power_on() & rpmhpd_power_off()
> > > ---
> > >   drivers/power/domain/Kconfig       |   8 +
> > >   drivers/power/domain/Makefile      |   1 +
> > >   drivers/power/domain/qcom-rpmhpd.c | 278 +++++++++++++++++++++++++++++
> > >   3 files changed, 287 insertions(+)
> > >   create mode 100644 drivers/power/domain/qcom-rpmhpd.c
> > > 
> > > diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
> > > index 0ad885c9e8b..48e841c638e 100644
> > > --- a/drivers/power/domain/Kconfig
> > > +++ b/drivers/power/domain/Kconfig
> > > @@ -90,6 +90,14 @@ config MESON_SECURE_POWER_DOMAIN
> > >   	  Enable support for manipulating Amlogic Meson Secure power domains.
> > >   	  Support for Amlogic A1 series.
> > > +config QCOM_POWER_DOMAIN
> > > +	bool "Enable the QCOM RPMH Power domain driver"
> > > +	depends on POWER_DOMAIN && ARCH_SNAPDRAGON
> > > +	help
> > > +	  Generic RPMH power domain implementation for QCOM devices.
> > > +	  The RPMH power domain driver is responsible for managing power
> > > +	  domains on Qualcomm SoCs.
> > > +
> > >   config SANDBOX_POWER_DOMAIN
> > >   	bool "Enable the sandbox power domain test driver"
> > >   	depends on POWER_DOMAIN && SANDBOX
> > > diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
> > > index 8e03f620437..1c2c64b0964 100644
> > > --- a/drivers/power/domain/Makefile
> > > +++ b/drivers/power/domain/Makefile
> > > @@ -22,3 +22,4 @@ obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o
> > >   obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
> > >   obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
> > >   obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
> > > +obj-$(CONFIG_QCOM_POWER_DOMAIN) += qcom-rpmhpd.o
> > > diff --git a/drivers/power/domain/qcom-rpmhpd.c b/drivers/power/domain/qcom-rpmhpd.c
> > > new file mode 100644
> > > index 00000000000..f51bc9a4bbb
> > > --- /dev/null
> > > +++ b/drivers/power/domain/qcom-rpmhpd.c
> > > @@ -0,0 +1,278 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +// Copyright (c) 2018, The Linux Foundation. All rights reserved.
> > > +// Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
> > > +
> > > +#include <dm.h>
> > > +#include <dm/lists.h>
> > > +#include <power-domain.h>
> > > +#include <asm/io.h>
> > > +#include <linux/errno.h>
> > > +
> > > +#include <power-domain-uclass.h>
> > > +#include <soc/qcom/cmd-db.h>
> > > +#include <soc/qcom/rpmh.h>
> > > +#include <dt-bindings/power/qcom-rpmpd.h>
> > > +#include <dm/device_compat.h>
> > > +
> > > +#define RPMH_ARC_MAX_LEVELS	16
> > > +
> > > +/**
> > > + * struct rpmhpd - top level RPMh power domain resource data structure
> > > + * @dev:                rpmh power domain controller device
> > > + * @pd:                 generic_pm_domain corresponding to the power domain
> > > + * @parent:             generic_pm_domain corresponding to the parent's power domain
> > > + * @enable_corner:      lowest non-zero corner
> > > + * @level:              An array of level (vlvl) to corner (hlvl) mappings
> > > + *                      derived from cmd-db
> > > + * @level_count:        Number of levels supported by the power domain. max
> > > + *                      being 16 (0 - 15)
> > > + * @enabled:            true if the power domain is enabled
> > > + * @res_name:           Resource name used for cmd-db lookup
> > > + * @addr:               Resource address as looped up using resource name from
> > > + * @skip_retention_level: Indicate that retention level should not be used for the power domain
> > > + */
> > > +struct rpmhpd {
> > > +	struct udevice	*dev;
> > > +	struct power_domain pd;
> > > +	struct power_domain *parent;
> > > +	unsigned int	enable_corner;
> > > +	u32		level[RPMH_ARC_MAX_LEVELS];
> > > +	size_t		level_count;
> > > +	bool		enabled;
> > > +	const char	*res_name;
> > > +	u32		addr;
> > > +	bool		skip_retention_level;
> > > +};
> > > +
> > > +struct rpmhpd_desc {
> > > +	struct rpmhpd **rpmhpds;
> > > +	size_t num_pds;
> > > +};
> > > +
> > > +/* RPMH powerdomains */
> > > +static struct rpmhpd mmcx_ao;
> > > +static struct rpmhpd mmcx = {
> > > +	.res_name = "mmcx.lvl",
> > > +};
> > > +
> > > +static struct rpmhpd mmcx_ao = {
> > > +	.res_name = "mmcx.lvl",
> > > +};
> > > +
> > > +/* SA8775P RPMH power domains */
> > > +static struct rpmhpd *sa8775p_rpmhpds[] = {
> > > +	[SA8775P_MMCX] = &mmcx,
> > > +	[SA8775P_MMCX_AO] = &mmcx_ao,
> > > +};
> > > +
> > > +static const struct rpmhpd_desc sa8775p_desc = {
> > > +	.rpmhpds = sa8775p_rpmhpds,
> > > +	.num_pds = ARRAY_SIZE(sa8775p_rpmhpds),
> > > +};
> > > +
> > > +/* stub RPMH power domains mapped for unsupported platforms */
> > > +static struct rpmhpd *stub_rpmhpds[] = {};
> > > +
> > > +static const struct rpmhpd_desc stub_desc = {
> > > +	.rpmhpds = stub_rpmhpds,
> > > +	.num_pds = ARRAY_SIZE(stub_rpmhpds),
> > > +};
> > > +
> > > +static const struct udevice_id rpmhpd_match_table[] = {
> > > +	{ .compatible = "qcom,sa8775p-rpmhpd", .data = (ulong)&sa8775p_desc },
> > > +	{ .compatible = "qcom,qcs615-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,qcs8300-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,qdu1000-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sa8155p-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sa8540p-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sar2130p-rpmhpd", .data = (ulong)&stub_desc},
> > > +	{ .compatible = "qcom,sc7180-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sc7280-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sc8180x-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sc8280xp-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sdm670-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sdm845-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sdx55-rpmhpd", .data = (ulong)&stub_desc},
> > > +	{ .compatible = "qcom,sdx65-rpmhpd", .data = (ulong)&stub_desc},
> > > +	{ .compatible = "qcom,sdx75-rpmhpd", .data = (ulong)&stub_desc},
> > > +	{ .compatible = "qcom,sm4450-rpmhpd", .data = (ulong)&stub_desc},
> > > +	{ .compatible = "qcom,sm6350-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm7150-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8150-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8250-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8350-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8450-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8550-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8650-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,sm8750-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ .compatible = "qcom,x1e80100-rpmhpd", .data = (ulong)&stub_desc },
> > > +	{ }
> > > +};
> > > +
> > > +static int rpmhpd_send_corner(struct rpmhpd *pd, int state,
> > > +			      unsigned int corner, bool sync)
> > > +{
> > > +	struct tcs_cmd cmd = {
> > > +		.addr = pd->addr,
> > > +		.data = corner,
> > > +	};
> > > +
> > > +	return rpmh_write(pd->dev, state, &cmd, 1);
> > > +}
> > > +
> > > +static int rpmhpd_power_on(struct power_domain *pd)
> > > +{
> > > +	int ret;
> > > +	unsigned int corner;
> > > +	struct rpmhpd **rpmhpds;
> > > +	const struct rpmhpd_desc *desc;
> > > +	struct rpmhpd *curr_rpmhpd;
> > > +
> > > +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
> > > +	if (!desc)
> > > +		return -EINVAL;
> > > +
> > > +	rpmhpds = desc->rpmhpds;
> > > +	curr_rpmhpd = rpmhpds[pd->id];
> > > +
> > > +	/* Do nothing for undefined power domains */
> > > +	if (!curr_rpmhpd) {
> > > +		log_warning("Power domain id (%ld) not supported\n",
> > > +			    pd->id);
> > > +		return 0;
> > > +	}
> > > +
> > > +	corner = curr_rpmhpd->enable_corner;
> > > +
> > > +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
> > > +				 false);
> > > +	if (!ret)
> > > +		curr_rpmhpd->enabled = true;
> > > +
> > > +	return ret;
> > > +}
> > > +
> > > +static int rpmhpd_power_off(struct power_domain *pd)
> > > +{
> > > +	int ret;
> > > +	unsigned int corner;
> > > +	struct rpmhpd **rpmhpds;
> > > +	const struct rpmhpd_desc *desc;
> > > +	struct rpmhpd *curr_rpmhpd;
> > > +
> > > +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);
> > > +	if (!desc)
> > > +		return -EINVAL;
> > > +
> > > +	rpmhpds = desc->rpmhpds;
> > > +	curr_rpmhpd = rpmhpds[pd->id];
> > > +
> > > +	/* Do nothing for undefined power domains */
> > > +	if (!curr_rpmhpd) {
> > > +		log_warning("Power domain id (%ld) not supported\n",
> > > +			    pd->id);
> > > +		return 0;
> > > +	}
> > > +
> > > +	corner = 0;
> > > +
> > > +	ret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,
> > > +				 false);
> > > +	if (!ret)
> > > +		curr_rpmhpd->enabled = false;
> > > +
> > > +	return ret;
> > > +}
> > > +
> > > +static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd)
> > > +{
> > > +	int i;
> > > +	const u16 *buf;
> > > +
> > > +	buf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count);
> > > +	if (IS_ERR(buf))
> > > +		return PTR_ERR(buf);
> > > +
> > > +	/* 2 bytes used for each command DB aux data entry */
> > > +	rpmhpd->level_count >>= 1;
> > > +
> > > +	if (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS)
> > > +		return -EINVAL;
> > > +
> > > +	for (i = 0; i < rpmhpd->level_count; i++) {
> > > +		if (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION)
> > > +			continue;
> > > +
> > > +		rpmhpd->level[i] = buf[i];
> > > +
> > > +		/* Remember the first corner with non-zero level */
> > > +		if (!rpmhpd->level[rpmhpd->enable_corner] && rpmhpd->level[i])
> > > +			rpmhpd->enable_corner = i;
> > > +
> > > +		/*
> > > +		 * The AUX data may be zero padded. These 0 valued entries at
> > > +		 * the end of the map must be ignored.
> > > +		 */
> > > +		if (i > 0 && rpmhpd->level[i] == 0) {
> > > +			rpmhpd->level_count = i;
> > > +			break;
> > > +		}
> > > +		debug("%s: ARC hlvl=%2d --> vlvl=%4u\n", rpmhpd->res_name, i,
> > > +		      rpmhpd->level[i]);
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int rpmhpd_probe(struct udevice *dev)
> > > +{
> > > +	int i, ret = 0;
> > > +	struct rpmhpd **rpmhpds;
> > > +	struct rpmhpd *priv;
> > > +	const struct rpmhpd_desc *desc;
> > > +
> > > +	desc = (const struct rpmhpd_desc *)dev_get_driver_data(dev);
> > > +	if (!desc)
> > > +		return -EINVAL;
> > > +
> > > +	rpmhpds = desc->rpmhpds;
> > > +
> > > +	for (i = 0; i < desc->num_pds; i++) {
> > > +		if (!rpmhpds[i])
> > > +			continue;
> > > +
> > > +		priv = rpmhpds[i];
> > > +		priv->dev = dev;
> > > +		priv->addr = cmd_db_read_addr(priv->res_name);
> > > +		if (!priv->addr) {
> > > +			dev_err(dev, "Could not find RPMh address for resource %s\n",
> > > +				priv->res_name);
> > > +			return -ENODEV;
> > > +		}
> > > +
> > > +		ret = cmd_db_read_slave_id(priv->res_name);
> > > +		if (ret != CMD_DB_HW_ARC) {
> > > +			dev_err(dev, "RPMh slave ID mismatch\n");
> > > +			return -EINVAL;
> > > +		}
> > > +
> > > +		ret = rpmhpd_update_level_mapping(priv);
> > > +		if (ret)
> > > +			return ret;
> > > +	}
> > > +
> > > +	return ret;
> > > +}
> > > +
> > > +static const struct power_domain_ops qcom_rpmhpd_power_ops = {
> > > +	.on = rpmhpd_power_on,
> > > +	.off = rpmhpd_power_off,
> > > +};
> > > +
> > > +U_BOOT_DRIVER(qcom_rpmhpd_drv) = {
> > > +	.name = "qcom_rpmhpd_drv",
> > > +	.id = UCLASS_POWER_DOMAIN,
> > > +	.of_match = rpmhpd_match_table,
> > > +	.probe = rpmhpd_probe,
> > > +	.ops = &qcom_rpmhpd_power_ops,
> > > +};
> > > -- 
> > > 2.34.1
> > > 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver
  2026-01-14 14:38 ` [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Casey Connolly
@ 2026-01-30 17:13   ` Aswin Murugan
  0 siblings, 0 replies; 11+ messages in thread
From: Aswin Murugan @ 2026-01-30 17:13 UTC (permalink / raw)
  To: Casey Connolly, trini, neil.armstrong, sumit.garg, jh80.chung,
	rui.silva, ilias.apalodimas, quic_varada, me, marek.vasut+renesas,
	miquel.raynal, alif.zakuan.yuslaimi, tien.fong.chee, w.egorov,
	u-boot-qcom, u-boot

Hi Casey,

Thanks for the review & feedback

Regarding comment *#2*, this was already discussed in v5 [1] and got 
addressed from v6.
In Patch No 2 "power-domain: Add warning when power-domain driver is 
missing", |dev_power_domain_ctrl()| was updated to log a warning when 
the power‑domain driver isn’t found (|-ENODEV|) and return 0 so that 
execution continues without breaking the rpmpd platforms.

For the remaining comments (#1 and #3), I’ll incorporate the suggestions 
and respin the series.

[1] 
https://lore.kernel.org/u-boot/2e387aeb-2ba2-4b72-aa91-0815cd06f831@linaro.org/

Regards,
Aswin

On 1/14/2026 8:08 PM, Casey Connolly wrote:
> Hi Aswin,
>
> Sorry for the late response here.
>
> Still a few minor issues with this series but it's more or less there.
> I'll just list everything here rather than replying to individual patches.
>
> 1. Please rename the kconfig option to something more specific like
> QCOM_RPMH_POWER_DOMAIN
> 2. Removing the fixup code will break msm8916 and other platforms that
> use rpmpd (non-hardened), it should be pretty trivial to check if the
> compatible string for the power-controller node ends with "rpmpd" or
> "rpmhpd" and skip the logic in the latter case.
> 3. The commit "mach-snapdragon: fixup power-domains" should have a more
> specific title.
>
> I'll pick this up as soon as I get the next revision.
>
> Kind regards,
>
> On 22/12/2025 12:48, Aswin Murugan wrote:
>> This patch series adds support for the Qualcomm RPMH power domain
>> driver, responsible for managing power domains on Qualcomm SoCs.
>> The driver is ported from the Linux kernel and adapted for
>> U-Boot to enable proper power domain control on SA8775P platform.
>>
>> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
>> ---
>> Changes in v7:
>> - Droped soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data() functions
>>    patch from previous version, since it was already picked
>>    Link: https://lore.kernel.org/u-boot/176363183220.2293399.7296647117885059868.b4-ty@linaro.org/
>> - Cleaned up the warning logic in drivers/power/domain/power-domain-uclass.c
>>    when power-domain driver is missing
>> - Link to v6: https://lore.kernel.org/u-boot/20251113113427.2218045-1-aswin.murugan@oss.qualcomm.com/
>>
>> Changes in v6:
>> - Added the change in drivers/power/domain/power-domain-uclass.c to give warning
>>    when power-domain driver is missing
>> - Added the change log 'In qcom-rpmhpd driver, the un-supported power domains are handled with warning
>>    in rpmhpd_power_on() & rpmhpd_power_on()'
>> - In drivers/power/domain/qcom-rpmhpd.c, the 'ret' variable in rpmhpd_probe() is initialized with 0
>> - Link to v5: https://lore.kernel.org/u-boot/20251027113312.3815169-1-aswinm@qti.qualcomm.com/
>>
>> Changes in v5:
>> - As part of "qcom_rpmhpd" driver removal change did in v4, the rpmh_write() in drivers/power/domain/qcom-rpmhpd.c
>>    should be passed with pd->dev as first argument to align with it.
>> - Added (ulong) casting in rpmhpd_match_table to address the warning.
>>
>> Changes in v4:
>> - Added all soc entries in power domain linux driver to drivers/power/domain/qcom-rpmhpd.c and
>>    stubbed it
>> - Removed "qcom_rpmhpd" driver & unused members of struct rpmhpd in drivers/power/domain/qcom-rpmhpd.c
>> - Moved the "soc: qcom: cmd-db" change before the "power-domain" change
>> - Link to v3: https://lore.kernel.org/u-boot/20250702180133.1889709-1-aswin.murugan@oss.qualcomm.com/
>>
>> Changes in v3:
>> - Removed OF_LIVE_SA8775P config in arch/arm/mach-snapdragon/Kconfig & configs/qcs9100_defconfig,
>>    since there is no SA8775p specific fixups are done
>> - Link to v2: https://lore.kernel.org/u-boot/20250702171335.1811080-1-aswin.murugan@oss.qualcomm.com/
>>
>> Changes in v2:
>> - Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN in drivers/power/domain/Kconfig
>> - In drivers/power/domain/qcom-rpmhpd.c, the un-supported power domains are handled with warning
>> - Power domain fixups have been removed since they are now managed by drivers/power/domain/qcom-rpmhpd.c
>> - Link to v1: https://lore.kernel.org/u-boot/20250626112441.143064-1-aswin.murugan@oss.qualcomm.com/
>> ---
>>
>> Aswin Murugan (5):
>>    soc: qcom: cmd-db: Add cmd_db_read_slave_id() & cmd_db_read_aux_data()
>>      functions
>>    power-domain: Add QCOM RPMH Power Domain Driver Support
>>    power-domain: Add warning when power-domain driver is missing
>>    mach-snapdragon: fixup power-domains
>>    configs: qcom: Add QCOM_POWER_DOMAIN config
>>
>>   arch/arm/mach-snapdragon/of_fixup.c        |  31 ---
>>   configs/qcom_defconfig                     |   1 +
>>   drivers/power/domain/Kconfig               |   8 +
>>   drivers/power/domain/Makefile              |   1 +
>>   drivers/power/domain/power-domain-uclass.c |   7 +
>>   drivers/power/domain/qcom-rpmhpd.c         | 278 +++++++++++++++++++++
>>   drivers/soc/qcom/cmd-db.c                  |  45 ++++
>>   include/soc/qcom/cmd-db.h                  |   2 +
>>   8 files changed, 342 insertions(+), 31 deletions(-)
>>   create mode 100644 drivers/power/domain/qcom-rpmhpd.c
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-01-30 17:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-22 11:48 [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Aswin Murugan
2025-12-22 11:48 ` [PATCH v7 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support Aswin Murugan
2025-12-26  9:46   ` Sumit Garg
2026-01-13 10:43     ` Aswin Murugan
2026-01-16  9:24       ` Sumit Garg
2025-12-22 11:48 ` [PATCH v7 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
2025-12-23  3:15   ` Varadarajan Narayanan
2025-12-22 11:48 ` [PATCH v7 3/4] mach-snapdragon: fixup power-domains Aswin Murugan
2025-12-22 11:48 ` [PATCH v7 4/4] configs: qcom: Add QCOM_POWER_DOMAIN config Aswin Murugan
2026-01-14 14:38 ` [PATCH v7 0/5] Added QCOM RPMH Power Domain Driver Casey Connolly
2026-01-30 17:13   ` Aswin Murugan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox