Re: [PATCH v24 04/12] mfd: psci-mfd: Add PSCI MFD driver for cpuidle-psci-domain cell
Ulf Hansson <[email protected]>
| Newsgroups | dev.linux.lists.mfd,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <CAPx+jO9QE_KG8BbfnMLTebDpGDj7OSpPDtgc9uTBGZCDJeLu_w@mail.gmail.com> |
On Mon, Aug 3, 2026 at 11:45 AM Shivendra Pratap <[email protected]> wrote: > > PSCI has multiple kernel consumers, such as cpuidle-psci-domain. > Currently, both the PSCI core driver and cpuidle-psci-domain bind > directly to the same PSCI node "arm,psci-1.0". Additional consumers, if > introduced, would also need to bind in the same way, leading to several > drivers attached to a single device node. > > Introduce a PSCI MFD driver that binds to "arm,psci-1.0" and registers > PSCI child cells. As the first user, register cpuidle-psci-domain as a > child cell. I don't think PSCI should be modeled as an MFD device with childrens. Instead, this looks rather like a better fit for the auxiliary bus/driver. Please consider using that instead. Kind regards Uffe > > Update cpuidle-psci-domain to probe as an MFD child and use the parent > PSCI node for power-domain traversal. > > Suggested-by: Bartosz Golaszewski <[email protected]> > Reviewed-by: Bartosz Golaszewski <[email protected]> > Signed-off-by: Shivendra Pratap <[email protected]> > --- > MAINTAINERS | 1 + > drivers/cpuidle/Kconfig.arm | 1 + > drivers/cpuidle/cpuidle-psci-domain.c | 9 +------- > drivers/mfd/Kconfig | 12 ++++++++++ > drivers/mfd/Makefile | 2 ++ > drivers/mfd/psci-mfd.c | 43 +++++++++++++++++++++++++++++++++++ > 6 files changed, 60 insertions(+), 8 deletions(-) > > diff --git a/MAINTAINERS b/MAINTAINERS > index fe67f7bfa44c..0b6e4f89f319 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -21671,6 +21671,7 @@ L: [email protected] (moderated for non-subscribers) > S: Maintained > F: Documentation/devicetree/bindings/arm/psci.yaml > F: drivers/firmware/psci/ > +F: drivers/mfd/psci-mfd.c > F: include/linux/psci.h > F: include/uapi/linux/psci.h > > diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm > index b88b01aa5829..c5ecca0d7397 100644 > --- a/drivers/cpuidle/Kconfig.arm > +++ b/drivers/cpuidle/Kconfig.arm > @@ -36,6 +36,7 @@ config ARM_PSCI_CPUIDLE_DOMAIN > bool "PSCI CPU idle Domain" > depends on ARM_PSCI_CPUIDLE > depends on PM_GENERIC_DOMAINS_OF > + depends on MFD_PSCI > select DT_IDLE_GENPD > default y > help > diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c > index b9e4ad7d43a3..a2d01810f295 100644 > --- a/drivers/cpuidle/cpuidle-psci-domain.c > +++ b/drivers/cpuidle/cpuidle-psci-domain.c > @@ -17,7 +17,6 @@ > #include <linux/pm_runtime.h> > #include <linux/psci.h> > #include <linux/slab.h> > -#include <linux/string.h> > > #include "cpuidle-psci.h" > #include "dt_idle_genpd.h" > @@ -122,14 +121,9 @@ static void psci_pd_remove(void) > } > } > > -static const struct of_device_id psci_of_match[] = { > - { .compatible = "arm,psci-1.0" }, > - {} > -}; > - > static int psci_cpuidle_domain_probe(struct platform_device *pdev) > { > - struct device_node *np = pdev->dev.of_node; > + struct device_node *np = pdev->dev.parent->of_node; > bool use_osi = psci_has_osi_support(); > int ret = 0, pd_count = 0; > > @@ -181,7 +175,6 @@ static struct platform_driver psci_cpuidle_domain_driver = { > .probe = psci_cpuidle_domain_probe, > .driver = { > .name = "psci-cpuidle-domain", > - .of_match_table = psci_of_match, > }, > }; > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index e4fd4572472f..d18655d76172 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -2374,6 +2374,18 @@ config MFD_KHADAS_MCU > additional drivers must be enabled in order to use the functionality > of the device. > > +config MFD_PSCI > + bool "PSCI MFD for psci child cells" > + depends on ARM_PSCI_FW > + depends on OF > + select MFD_CORE > + default y > + help > + PSCI MFD registers PSCI child cells and exposes them as > + platform devices. Child drivers are probed only if enabled in the > + kernel configuration. Select this option whenever a supported PSCI > + child driver is selected. > + > config MFD_ACER_A500_EC > tristate "Support for Acer Iconia Tab A500 Embedded Controller" > depends on I2C > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 72d3944b0ad8..f3edfad702ff 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -24,6 +24,8 @@ obj-$(CONFIG_MFD_EXYNOS_LPASS) += exynos-lpass.o > obj-$(CONFIG_MFD_GATEWORKS_GSC) += gateworks-gsc.o > obj-$(CONFIG_MFD_MACSMC) += macsmc.o > > +obj-$(CONFIG_MFD_PSCI) += psci-mfd.o > + > obj-$(CONFIG_MFD_TI_LP873X) += lp873x.o > obj-$(CONFIG_MFD_TI_LP87565) += lp87565.o > obj-$(CONFIG_MFD_TI_AM335X_TSCADC) += ti_am335x_tscadc.o > diff --git a/drivers/mfd/psci-mfd.c b/drivers/mfd/psci-mfd.c > new file mode 100644 > index 000000000000..7affd6bb09dd > --- /dev/null > +++ b/drivers/mfd/psci-mfd.c > @@ -0,0 +1,43 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. > + */ > + > +#include <linux/mfd/core.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/platform_device.h> > + > +static const struct mfd_cell psci_cells[] = { > + { > + .name = "psci-cpuidle-domain", > + }, > +}; > + > +static int psci_mfd_probe(struct platform_device *pdev) > +{ > + return devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, psci_cells, > + ARRAY_SIZE(psci_cells), NULL, 0, NULL); > +} > + > +static const struct of_device_id psci_mfd_of_match[] = { > + { .compatible = "arm,psci-1.0" }, > + { } > +}; > + > +static struct platform_driver psci_mfd_driver = { > + .probe = psci_mfd_probe, > + .driver = { > + .name = "psci-mfd", > + .of_match_table = psci_mfd_of_match, > + }, > +}; > + > +static int __init psci_mfd_init(void) > +{ > + return platform_driver_register(&psci_mfd_driver); > +} > + > +core_initcall(psci_mfd_init); > + > +MODULE_LICENSE("GPL"); > > -- > 2.34.1 >