* [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support
@ 2026-02-13 11:10 Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 1/4] power-domain: " Aswin Murugan
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Aswin Murugan @ 2026-02-13 11:10 UTC (permalink / raw)
To: casey.connolly, u-boot, u-boot-qcom
Cc: trini, sumit.garg, jh80.chung, peng.fan, neil.armstrong,
tien.fong.chee, miquel.raynal, msp, alif.zakuan.yuslaimi,
balaji.selvanathan, w.egorov, varadarajan.narayanan, rui.silva,
ilias.apalodimas, me, marek.vasut+renesas, 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.
When a suitable power domain driver is not found for the power-controller
node, it will be handled with a warning in dev_power_domain_ctrl() and
execution continues without breaking, ensuring compatibility across
different RPMH platforms.
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
Changes in v8:
- Renamed Kconfig option from QCOM_POWER_DOMAIN to QCOM_RPMH_POWER_DOMAIN
for better specificity as requested in review feedback
- Improved commit message for patch 3 as requested in review feedback
- Link to v7: https://lore.kernel.org/u-boot/20251222114823.2146775-1-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 (3):
power-domain: Add warning when power-domain driver is missing
mach-snapdragon: Remove RPMH power domain DT fixup code
qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config
Balaji Selvanathan (1):
power-domain: Add QCOM RPMH Power Domain Driver Support
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 +++++++++++++++++++++
6 files changed, 295 insertions(+), 31 deletions(-)
create mode 100644 drivers/power/domain/qcom-rpmhpd.c
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v8 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
2026-02-13 11:10 [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support Aswin Murugan
@ 2026-02-13 11:10 ` Aswin Murugan
2026-02-20 9:00 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Aswin Murugan @ 2026-02-13 11:10 UTC (permalink / raw)
To: casey.connolly, u-boot, u-boot-qcom
Cc: trini, sumit.garg, jh80.chung, peng.fan, neil.armstrong,
tien.fong.chee, miquel.raynal, msp, alif.zakuan.yuslaimi,
balaji.selvanathan, w.egorov, varadarajan.narayanan, rui.silva,
ilias.apalodimas, me, marek.vasut+renesas, Aswin Murugan
From: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
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>
---
v8:
- Renamed Kconfig option from QCOM_POWER_DOMAIN to QCOM_RPMH_POWER_DOMAIN
for better specificity as requested in review feedback
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 935f282d6c5..9fc2f5f020d 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_RPMH_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 b2c0bd8a61a..f373fc01395 100644
--- a/drivers/power/domain/Makefile
+++ b/drivers/power/domain/Makefile
@@ -23,3 +23,4 @@ obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
obj-$(CONFIG_TI_OMAP_PRM_POWER_DOMAIN) += ti-omap-prm.o
obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
+obj-$(CONFIG_QCOM_RPMH_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] 9+ messages in thread
* [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing
2026-02-13 11:10 [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 1/4] power-domain: " Aswin Murugan
@ 2026-02-13 11:10 ` Aswin Murugan
2026-02-20 9:01 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config Aswin Murugan
3 siblings, 1 reply; 9+ messages in thread
From: Aswin Murugan @ 2026-02-13 11:10 UTC (permalink / raw)
To: casey.connolly, u-boot, u-boot-qcom
Cc: trini, sumit.garg, jh80.chung, peng.fan, neil.armstrong,
tien.fong.chee, miquel.raynal, msp, alif.zakuan.yuslaimi,
balaji.selvanathan, w.egorov, varadarajan.narayanan, rui.silva,
ilias.apalodimas, me, marek.vasut+renesas, 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.
Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
Changes in v8:
- No changes in v8
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] 9+ messages in thread
* [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code
2026-02-13 11:10 [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 1/4] power-domain: " Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
@ 2026-02-13 11:10 ` Aswin Murugan
2026-02-20 9:02 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config Aswin Murugan
3 siblings, 1 reply; 9+ messages in thread
From: Aswin Murugan @ 2026-02-13 11:10 UTC (permalink / raw)
To: casey.connolly, u-boot, u-boot-qcom
Cc: trini, sumit.garg, jh80.chung, peng.fan, neil.armstrong,
tien.fong.chee, miquel.raynal, msp, alif.zakuan.yuslaimi,
balaji.selvanathan, w.egorov, varadarajan.narayanan, rui.silva,
ilias.apalodimas, me, marek.vasut+renesas, Aswin Murugan
Remove the device tree fixup code that was stripping power-domains
properties from device tree nodes. This fixup was a temporary
workaround needed when RPMH power domain driver support was not
available in U-Boot.
Now that RPMH power domain driver support has been added, the power
domain properties can be preserved in the device tree, allowing proper
power domain management. If a suitable power domain driver is not found
for the power-controller node, it will be handled with a warning in
dev_power_domain_ctrl().
Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
v8:
- Changed commit message
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 5b6076ea8e5..286541c8edc 100644
--- a/arch/arm/mach-snapdragon/of_fixup.c
+++ b/arch/arm/mach-snapdragon/of_fixup.c
@@ -134,36 +134,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(); \
@@ -176,7 +146,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] 9+ messages in thread
* [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config
2026-02-13 11:10 [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support Aswin Murugan
` (2 preceding siblings ...)
2026-02-13 11:10 ` [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code Aswin Murugan
@ 2026-02-13 11:10 ` Aswin Murugan
2026-02-20 9:03 ` Sumit Garg
3 siblings, 1 reply; 9+ messages in thread
From: Aswin Murugan @ 2026-02-13 11:10 UTC (permalink / raw)
To: casey.connolly, u-boot, u-boot-qcom
Cc: trini, sumit.garg, jh80.chung, peng.fan, neil.armstrong,
tien.fong.chee, miquel.raynal, msp, alif.zakuan.yuslaimi,
balaji.selvanathan, w.egorov, varadarajan.narayanan, rui.silva,
ilias.apalodimas, me, marek.vasut+renesas, Aswin Murugan
Enable QCOM_RPMH_POWER_DOMAIN config for qualcomm devices
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
v8:
- No changes to this patch in v8
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 fe5880de1fd..bced5d6eb0f 100644
--- a/configs/qcom_defconfig
+++ b/configs/qcom_defconfig
@@ -126,6 +126,7 @@ CONFIG_MSM_SERIAL=y
CONFIG_MSM_GENI_SERIAL=y
CONFIG_SOC_QCOM=y
CONFIG_QCOM_COMMAND_DB=y
+CONFIG_QCOM_RPMH_POWER_DOMAIN=y
CONFIG_QCOM_RPMH=y
CONFIG_SPMI_MSM=y
CONFIG_SYSINFO=y
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v8 1/4] power-domain: Add QCOM RPMH Power Domain Driver Support
2026-02-13 11:10 ` [PATCH v8 1/4] power-domain: " Aswin Murugan
@ 2026-02-20 9:00 ` Sumit Garg
0 siblings, 0 replies; 9+ messages in thread
From: Sumit Garg @ 2026-02-20 9:00 UTC (permalink / raw)
To: Aswin Murugan
Cc: casey.connolly, u-boot, u-boot-qcom, trini, jh80.chung, peng.fan,
neil.armstrong, tien.fong.chee, miquel.raynal, msp,
alif.zakuan.yuslaimi, balaji.selvanathan, w.egorov,
varadarajan.narayanan, rui.silva, ilias.apalodimas, me,
marek.vasut+renesas
On Fri, Feb 13, 2026 at 04:40:06PM +0530, Aswin Murugan wrote:
> From: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>
> 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>
> ---
> v8:
> - Renamed Kconfig option from QCOM_POWER_DOMAIN to QCOM_RPMH_POWER_DOMAIN
> for better specificity as requested in review feedback
>
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
> 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 935f282d6c5..9fc2f5f020d 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_RPMH_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 b2c0bd8a61a..f373fc01395 100644
> --- a/drivers/power/domain/Makefile
> +++ b/drivers/power/domain/Makefile
> @@ -23,3 +23,4 @@ obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
> obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
> obj-$(CONFIG_TI_OMAP_PRM_POWER_DOMAIN) += ti-omap-prm.o
> obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
> +obj-$(CONFIG_QCOM_RPMH_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] 9+ messages in thread
* Re: [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing
2026-02-13 11:10 ` [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
@ 2026-02-20 9:01 ` Sumit Garg
0 siblings, 0 replies; 9+ messages in thread
From: Sumit Garg @ 2026-02-20 9:01 UTC (permalink / raw)
To: Aswin Murugan
Cc: casey.connolly, u-boot, u-boot-qcom, trini, jh80.chung, peng.fan,
neil.armstrong, tien.fong.chee, miquel.raynal, msp,
alif.zakuan.yuslaimi, balaji.selvanathan, w.egorov,
varadarajan.narayanan, rui.silva, ilias.apalodimas, me,
marek.vasut+renesas
On Fri, Feb 13, 2026 at 04:40:07PM +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 v8:
> - No changes in v8
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
>
> 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] 9+ messages in thread
* Re: [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code
2026-02-13 11:10 ` [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code Aswin Murugan
@ 2026-02-20 9:02 ` Sumit Garg
0 siblings, 0 replies; 9+ messages in thread
From: Sumit Garg @ 2026-02-20 9:02 UTC (permalink / raw)
To: Aswin Murugan
Cc: casey.connolly, u-boot, u-boot-qcom, trini, jh80.chung, peng.fan,
neil.armstrong, tien.fong.chee, miquel.raynal, msp,
alif.zakuan.yuslaimi, balaji.selvanathan, w.egorov,
varadarajan.narayanan, rui.silva, ilias.apalodimas, me,
marek.vasut+renesas
On Fri, Feb 13, 2026 at 04:40:08PM +0530, Aswin Murugan wrote:
> Remove the device tree fixup code that was stripping power-domains
> properties from device tree nodes. This fixup was a temporary
> workaround needed when RPMH power domain driver support was not
> available in U-Boot.
>
> Now that RPMH power domain driver support has been added, the power
> domain properties can be preserved in the device tree, allowing proper
> power domain management. If a suitable power domain driver is not found
> for the power-controller node, it will be handled with a warning in
> dev_power_domain_ctrl().
>
> Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
> v8:
> - Changed commit message
>
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
> 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 5b6076ea8e5..286541c8edc 100644
> --- a/arch/arm/mach-snapdragon/of_fixup.c
> +++ b/arch/arm/mach-snapdragon/of_fixup.c
> @@ -134,36 +134,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(); \
> @@ -176,7 +146,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 [flat|nested] 9+ messages in thread
* Re: [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config
2026-02-13 11:10 ` [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config Aswin Murugan
@ 2026-02-20 9:03 ` Sumit Garg
0 siblings, 0 replies; 9+ messages in thread
From: Sumit Garg @ 2026-02-20 9:03 UTC (permalink / raw)
To: Aswin Murugan
Cc: casey.connolly, u-boot, u-boot-qcom, trini, jh80.chung, peng.fan,
neil.armstrong, tien.fong.chee, miquel.raynal, msp,
alif.zakuan.yuslaimi, balaji.selvanathan, w.egorov,
varadarajan.narayanan, rui.silva, ilias.apalodimas, me,
marek.vasut+renesas
On Fri, Feb 13, 2026 at 04:40:09PM +0530, Aswin Murugan wrote:
> Enable QCOM_RPMH_POWER_DOMAIN config for qualcomm devices
>
> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
> v8:
> - No changes to this patch in v8
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
>
> 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 fe5880de1fd..bced5d6eb0f 100644
> --- a/configs/qcom_defconfig
> +++ b/configs/qcom_defconfig
> @@ -126,6 +126,7 @@ CONFIG_MSM_SERIAL=y
> CONFIG_MSM_GENI_SERIAL=y
> CONFIG_SOC_QCOM=y
> CONFIG_QCOM_COMMAND_DB=y
> +CONFIG_QCOM_RPMH_POWER_DOMAIN=y
> CONFIG_QCOM_RPMH=y
> CONFIG_SPMI_MSM=y
> CONFIG_SYSINFO=y
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-02-20 9:03 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-13 11:10 [PATCH v8 0/4] Add QCOM RPMH Power Domain Driver Support Aswin Murugan
2026-02-13 11:10 ` [PATCH v8 1/4] power-domain: " Aswin Murugan
2026-02-20 9:00 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 2/4] power-domain: Add warning when power-domain driver is missing Aswin Murugan
2026-02-20 9:01 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 3/4] mach-snapdragon: Remove RPMH power domain DT fixup code Aswin Murugan
2026-02-20 9:02 ` Sumit Garg
2026-02-13 11:10 ` [PATCH v8 4/4] qcom_defconfig: Add QCOM_RPMH_POWER_DOMAIN config Aswin Murugan
2026-02-20 9:03 ` Sumit Garg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox