* [RFC PATCH 0/2] Allow platform drivers to skip PM domain power-on at probe
@ 2026-10-27 14:07 Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 1/2] PM: domains: Honour PD_FLAG_ATTACH_POWER_ON for genpd Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 2/2] driver core: platform: Allow drivers to skip PM domain power-on at probe Beleswar Padhi
0 siblings, 2 replies; 3+ messages in thread
From: Beleswar Padhi @ 2026-10-27 14:07 UTC (permalink / raw)
To: gregkh, rafael, dakr, johan, pavel, lenb, ulfh
Cc: sid9.karanam, afd, nm, vigneshr, u-kumar1, b-padhi, driver-core,
linux-kernel, linux-pm
Some devices must be configured before their PM domain is powered on,
but on DT based platforms platform_probe() always powers it on first.
This series lets a platform driver opt out.
The user will be the TI K3 DSP/M4 remoteproc drivers which need to put
those remote cores in reset before powering on the pmdomain. A patch has
been posted to add "power-domains" DT property to these devices[0] which
is the motivation of this series as well.
[0]: https://lore.kernel.org/all/8cb23b44-027d-4d81-b342-7eaca0248f63@ti.com/
Please provide your comments.
Thanks,
Beleswar
Beleswar Padhi (2):
PM: domains: Honour PD_FLAG_ATTACH_POWER_ON for genpd
driver core: platform: Allow drivers to skip PM domain power-on at
probe
drivers/base/platform.c | 7 +++++--
drivers/base/power/common.c | 5 +++--
drivers/pmdomain/core.c | 5 +++--
include/linux/platform_device.h | 8 ++++++++
include/linux/pm_domain.h | 4 ++--
5 files changed, 21 insertions(+), 8 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [RFC PATCH 1/2] PM: domains: Honour PD_FLAG_ATTACH_POWER_ON for genpd
2026-10-27 14:07 [RFC PATCH 0/2] Allow platform drivers to skip PM domain power-on at probe Beleswar Padhi
@ 2026-10-27 14:07 ` Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 2/2] driver core: platform: Allow drivers to skip PM domain power-on at probe Beleswar Padhi
1 sibling, 0 replies; 3+ messages in thread
From: Beleswar Padhi @ 2026-10-27 14:07 UTC (permalink / raw)
To: gregkh, rafael, dakr, johan, pavel, lenb, ulfh
Cc: sid9.karanam, afd, nm, vigneshr, u-kumar1, b-padhi, driver-core,
linux-kernel, linux-pm
dev_pm_domain_attach() takes PD_FLAG_ATTACH_POWER_ON to let the caller
decide whether the PM domain is powered on during attach. But, only the
ACPI path honours it today. genpd_dev_pm_attach() takes no flags and
always powers on the domain, so a DT based device cannot be attached to
its PM domain without powering it on.
Add a power_on argument to genpd_dev_pm_attach() and pass it on to
__genpd_dev_pm_attach(), which already supports it for the multiple PM
domains case.
Signed-off-by: Beleswar Padhi <b-padhi@ti.com>
---
drivers/base/power/common.c | 5 +++--
drivers/pmdomain/core.c | 5 +++--
include/linux/pm_domain.h | 4 ++--
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/base/power/common.c b/drivers/base/power/common.c
index 9bef9248a7052..3263659c58dc8 100644
--- a/drivers/base/power/common.c
+++ b/drivers/base/power/common.c
@@ -102,14 +102,15 @@ EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data);
*/
int dev_pm_domain_attach(struct device *dev, u32 flags)
{
+ bool power_on = !!(flags & PD_FLAG_ATTACH_POWER_ON);
int ret;
if (dev->pm_domain)
return 0;
- ret = acpi_dev_pm_attach(dev, !!(flags & PD_FLAG_ATTACH_POWER_ON));
+ ret = acpi_dev_pm_attach(dev, power_on);
if (!ret)
- ret = genpd_dev_pm_attach(dev);
+ ret = genpd_dev_pm_attach(dev, power_on);
if (dev->pm_domain)
dev->power.detach_power_off = !!(flags & PD_FLAG_DETACH_POWER_OFF);
diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
index 964e44c2f78f1..785c27491aad5 100644
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
@@ -3553,6 +3553,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
/**
* genpd_dev_pm_attach - Attach a device to its PM domain using DT.
* @dev: Device to attach.
+ * @power_on: Whether to power on the PM domain during attach.
*
* Parse device's OF node to find a PM domain specifier. If such is found,
* attaches the device to retrieved pm_domain ops.
@@ -3563,7 +3564,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
* found or turned on, then return -EPROBE_DEFER to ensure that the device is
* not probed and to re-try again later.
*/
-int genpd_dev_pm_attach(struct device *dev)
+int genpd_dev_pm_attach(struct device *dev, bool power_on)
{
if (!dev->of_node)
return 0;
@@ -3576,7 +3577,7 @@ int genpd_dev_pm_attach(struct device *dev)
"#power-domain-cells") != 1)
return 0;
- return __genpd_dev_pm_attach(dev, dev, 0, 1, true);
+ return __genpd_dev_pm_attach(dev, dev, 0, 1, power_on);
}
EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 14e0e346c610a..010fbfffee39d 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -481,7 +481,7 @@ int of_genpd_add_child_ids(struct device_node *np,
int of_genpd_remove_child_ids(struct device_node *np,
struct genpd_onecell_data *data);
-int genpd_dev_pm_attach(struct device *dev);
+int genpd_dev_pm_attach(struct device *dev, bool power_on);
struct device *genpd_dev_pm_attach_by_id(struct device *dev,
unsigned int index);
struct device *genpd_dev_pm_attach_by_name(struct device *dev,
@@ -527,7 +527,7 @@ static inline int of_genpd_parse_idle_states(struct device_node *dn,
static inline void of_genpd_sync_state(struct device_node *np) {}
-static inline int genpd_dev_pm_attach(struct device *dev)
+static inline int genpd_dev_pm_attach(struct device *dev, bool power_on)
{
return 0;
}
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [RFC PATCH 2/2] driver core: platform: Allow drivers to skip PM domain power-on at probe
2026-10-27 14:07 [RFC PATCH 0/2] Allow platform drivers to skip PM domain power-on at probe Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 1/2] PM: domains: Honour PD_FLAG_ATTACH_POWER_ON for genpd Beleswar Padhi
@ 2026-10-27 14:07 ` Beleswar Padhi
1 sibling, 0 replies; 3+ messages in thread
From: Beleswar Padhi @ 2026-10-27 14:07 UTC (permalink / raw)
To: gregkh, rafael, dakr, johan, pavel, lenb, ulfh
Cc: sid9.karanam, afd, nm, vigneshr, u-kumar1, b-padhi, driver-core,
linux-kernel, linux-pm
Currently, platform_probe() attaches the PM domain to the device and
powers the domain on before calling the driver's probe. This works for
most cases, but would be erroneous for devices that must be configured
before they can be powered on.
One example is the C66x/C7x remote processors on TI K3 SoCs like AM62A.
Such a remote core's local reset must be asserted before the device is
powered on, otherwise the core can start running bogus instructions
whatever happens to be in its memories at that point.
dev_pm_domain_attach() lets its caller skip the power-on by not passing
PD_FLAG_ATTACH_POWER_ON. So, add a pm_domain_no_power_on flag to struct
platform_driver by which platform drivers can opt out of the power-on
at attach. Drivers that set it must power on the PM domain themselves.
Signed-off-by: Beleswar Padhi <b-padhi@ti.com>
---
drivers/base/platform.c | 7 +++++--
include/linux/platform_device.h | 8 ++++++++
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 3593d45f4a7ae..774f7214877d9 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -1483,6 +1483,7 @@ static int platform_probe(struct device *_dev)
{
struct platform_driver *drv = to_platform_driver(_dev->driver);
struct platform_device *dev = to_platform_device(_dev);
+ u32 pd_flags = PD_FLAG_DETACH_POWER_OFF;
int ret;
/*
@@ -1499,8 +1500,10 @@ static int platform_probe(struct device *_dev)
if (ret < 0)
return ret;
- ret = dev_pm_domain_attach(_dev, PD_FLAG_ATTACH_POWER_ON |
- PD_FLAG_DETACH_POWER_OFF);
+ if (!drv->pm_domain_no_power_on)
+ pd_flags |= PD_FLAG_ATTACH_POWER_ON;
+
+ ret = dev_pm_domain_attach(_dev, pd_flags);
if (ret)
goto out;
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
index 3bd0f1f0d8704..4d1679c4ea78e 100644
--- a/include/linux/platform_device.h
+++ b/include/linux/platform_device.h
@@ -292,6 +292,14 @@ struct platform_driver {
* to setup and manage their own I/O address space.
*/
bool driver_managed_dma;
+ /*
+ * By default the PM domain of a platform device is powered on before
+ * the driver's probe is invoked. Drivers that need to configure the
+ * device (e.g. hold it in reset) before its PM domain can be powered
+ * on must set this flag, and are then responsible for powering on the
+ * PM domain themselves.
+ */
+ bool pm_domain_no_power_on;
};
#define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-27 14:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-27 14:07 [RFC PATCH 0/2] Allow platform drivers to skip PM domain power-on at probe Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 1/2] PM: domains: Honour PD_FLAG_ATTACH_POWER_ON for genpd Beleswar Padhi
2026-10-27 14:07 ` [RFC PATCH 2/2] driver core: platform: Allow drivers to skip PM domain power-on at probe Beleswar Padhi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®