The platform driver is dead code. It is not used by DT platforms since
commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from
platform devices") which said:
For non-DT based platforms, this patch keeps syscon platform driver
structure so that syscon can be probed and such non-DT based drivers
can use syscon_regmap_lookup_by_pdev API and access regmap handles.
Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
we can completely remove platform driver of syscon, and keep only helper
functions to get regmap handles.
The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
commit failed to remove the rest of the platform driver.
Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
drivers/mfd/syscon.c | 66 ------------------------------------
drivers/mfd/vexpress-sysreg.c | 1 -
include/linux/platform_data/syscon.h | 9 -----
3 files changed, 76 deletions(-)
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index 72f20de9652da2d7bad12e4bc2c43ac0c9a97f76..bfb1f69fcff1d3cd35cf04ccd4c449e7d0395c79 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -12,22 +12,15 @@
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/hwspinlock.h>
-#include <linux/io.h>
-#include <linux/init.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/of_address.h>
-#include <linux/of_platform.h>
-#include <linux/platform_data/syscon.h>
-#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/mfd/syscon.h>
#include <linux/slab.h>
-static struct platform_driver syscon_driver;
-
static DEFINE_MUTEX(syscon_list_lock);
static LIST_HEAD(syscon_list);
@@ -337,62 +330,3 @@ struct regmap *syscon_regmap_lookup_by_phandle_optional(struct device_node *np,
return regmap;
}
EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_phandle_optional);
-
-static int syscon_probe(struct platform_device *pdev)
-{
- struct device *dev = &pdev->dev;
- struct syscon_platform_data *pdata = dev_get_platdata(dev);
- struct syscon *syscon;
- struct regmap_config syscon_config = syscon_regmap_config;
- struct resource *res;
- void __iomem *base;
-
- syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL);
- if (!syscon)
- return -ENOMEM;
-
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res)
- return -ENOENT;
-
- base = devm_ioremap(dev, res->start, resource_size(res));
- if (!base)
- return -ENOMEM;
-
- syscon_config.max_register = resource_size(res) - 4;
- if (!syscon_config.max_register)
- syscon_config.max_register_is_0 = true;
-
- if (pdata)
- syscon_config.name = pdata->label;
- syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config);
- if (IS_ERR(syscon->regmap)) {
- dev_err(dev, "regmap init failed\n");
- return PTR_ERR(syscon->regmap);
- }
-
- platform_set_drvdata(pdev, syscon);
-
- dev_dbg(dev, "regmap %pR registered\n", res);
-
- return 0;
-}
-
-static const struct platform_device_id syscon_ids[] = {
- { "syscon", },
- { }
-};
-
-static struct platform_driver syscon_driver = {
- .driver = {
- .name = "syscon",
- },
- .probe = syscon_probe,
- .id_table = syscon_ids,
-};
-
-static int __init syscon_init(void)
-{
- return platform_driver_register(&syscon_driver);
-}
-postcore_initcall(syscon_init);
diff --git a/drivers/mfd/vexpress-sysreg.c b/drivers/mfd/vexpress-sysreg.c
index d34d58ce46db2ad0d53b3daeabc9d3763883b39a..ef03d6cec9ff6927668d051ca459eb1d8ff7269e 100644
--- a/drivers/mfd/vexpress-sysreg.c
+++ b/drivers/mfd/vexpress-sysreg.c
@@ -10,7 +10,6 @@
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/of_platform.h>
-#include <linux/platform_data/syscon.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/stat.h>
diff --git a/include/linux/platform_data/syscon.h b/include/linux/platform_data/syscon.h
deleted file mode 100644
index 2c089dd3e2bda3baf5cef201ef43bca709e12c0b..0000000000000000000000000000000000000000
--- a/include/linux/platform_data/syscon.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef PLATFORM_DATA_SYSCON_H
-#define PLATFORM_DATA_SYSCON_H
-
-struct syscon_platform_data {
- const char *label;
-};
-
-#endif
--
2.45.2
On Tue, Dec 17, 2024 at 12:11:41PM -0600, Rob Herring (Arm) wrote:
> The platform driver is dead code. It is not used by DT platforms since
> commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from
> platform devices") which said:
>
> For non-DT based platforms, this patch keeps syscon platform driver
> structure so that syscon can be probed and such non-DT based drivers
> can use syscon_regmap_lookup_by_pdev API and access regmap handles.
> Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
> we can completely remove platform driver of syscon, and keep only helper
> functions to get regmap handles.
>
> The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
> syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
> commit failed to remove the rest of the platform driver.
This removed the only driver claiming pmgr nodes on Apple silicon
platforms. The nodes use compatible strings of the form
compatible = "apple,t8103-pmgr", "apple,pmgr", "syscon", "simple-mfd";
The description still holds as the removal of the driver did not result
in functional changes and went unnoticed. The missing driver became
apparent with pmdomain's sync_state() support in 6.17 which prints
following messages on a M1 mac mini
| [ 11.789419] apple-pmgr-pwrstate 23b700000.power-management:power-controller@420: sync_state() pending due to 23d280000.power-management
| [ 11.792414] apple-pmgr-pwrstate 23b700000.power-management:power-controller@448: sync_state() pending due to 23d280000.power-management
None of the other compatible are claimed by any driver. There is no
driver for "apple,t8103-pmgr" or "apple,pmgr" and simple-pm-bus.c binds
"simple-mfd" only if it is the first compatible string.
The easiest solution would be to probe via simple-pm-bus.c if the device
is compatible with "apple,pmgr". The generic compatible is justified by
not having any device specific code. The other option would by to add
the growing list of SoC specific "apple,*-pmgr" compatibles to the match
table.
The alternative of writing an Apple pmgr driver which does nothing
except successfully probing devices does not look appealing.
There is second problem though. The device link between
23b700000.power-management:power-controller@420 and
23d280000.power-management should not exist in the first place. See
following excerpt from arch/arm64/boot/dts/apple/{t8103,t8103-pmgr}.dtsi
omitting only unrelated child nodes.
/ {
pmgr: power-management@23b700000 {
compatible = "apple,t8103-pmgr", "apple,pmgr", "syscon", "simple-mfd";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2 0x3b700000 0 0x14000>;
ps_atc0_common: power-controller@420 {
compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate";
reg = <0x420 4>;
#power-domain-cells = <0>;
#reset-cells = <0>;
label = "atc0_common";
};
};
pmgr_mini: power-management@23d280000 {
compatible = "apple,t8103-pmgr", "apple,pmgr", "syscon", "simple-mfd";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2 0x3d280000 0 0x4000>;
ps_atc0_usb: power-controller@98 {
compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate";
reg = <0x98 4>;
#power-domain-cells = <0>;
#reset-cells = <0>;
label = "atc0_usb";
power-domains = <&ps_atc0_usb_aon>, <&ps_atc0_common>;
};
};
}
To my understanding the fw_devlinks should only exists between
&ps_atc0_common and &ps_atc0_usb. Herve Codina reports and posts a patch
for what sounds to be the same issue in [1] for simple-pm-bus. I can't
reproduce the report though. As soon as simple-pm-bus successfully
probes the pmgr devices the spurious devlinks are gone.
So I think this needs to be fixed in either of/platform.c for all
devices handled in of_platform_default_populate() or in
driver-core/devlink considering the issue appears without driver for the
bus device.
Janne
[1]: https://lore.kernel.org/lkml/20250613134817.681832-6-herve.codina@bootlin.com/
On 17/12/2024 19:11, Rob Herring (Arm) wrote:
> The platform driver is dead code. It is not used by DT platforms since
> commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from
> platform devices") which said:
>
> For non-DT based platforms, this patch keeps syscon platform driver
> structure so that syscon can be probed and such non-DT based drivers
> can use syscon_regmap_lookup_by_pdev API and access regmap handles.
> Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
> we can completely remove platform driver of syscon, and keep only helper
> functions to get regmap handles.
>
> The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
> syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
> commit failed to remove the rest of the platform driver.
>
> Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
> -----Original Message-----
> From: Rob Herring (Arm) <robh@kernel.org>
> Sent: Tuesday, December 17, 2024 11:42 PM
> To: Lee Jones <lee@kernel.org>; Arnd Bergmann <arnd@arndb.de>; Pankaj
> Dubey <pankaj.dubey@samsung.com>; Heiko Stuebner <heiko@sntech.de>;
> Liviu Dudau <liviu.dudau@arm.com>; Sudeep Holla <sudeep.holla@arm.com>;
> Lorenzo Pieralisi <lpieralisi@kernel.org>
> Cc: Peter Griffin <peter.griffin@linaro.org>; Will McVicker
> <willmcvicker@google.com>; John Madieu <john.madieu.xa@bp.renesas.com>;
> Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org
> Subject: [PATCH v2 2/3] mfd: syscon: Remove the platform driver support
>
> The platform driver is dead code. It is not used by DT platforms since commit
> bdb0066df96e ("mfd: syscon: Decouple syscon interface from platform devices")
> which said:
>
> For non-DT based platforms, this patch keeps syscon platform driver
> structure so that syscon can be probed and such non-DT based drivers
> can use syscon_regmap_lookup_by_pdev API and access regmap handles.
> Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
> we can completely remove platform driver of syscon, and keep only helper
> functions to get regmap handles.
>
> The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
> syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
> commit failed to remove the rest of the platform driver.
>
> Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
Reviewed-by: Pankaj Dubey <pankaj.dubey@samsung.com>
Tested on arm64: Tesla FSD
Tested-by: Pankaj Dubey <pankaj.dubey@samsung.com>
Thanks,
Pankaj Dubey
On Tue, Dec 17, 2024 at 12:11:41PM -0600, Rob Herring (Arm) wrote:
> The platform driver is dead code. It is not used by DT platforms since
> commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from
> platform devices") which said:
>
> For non-DT based platforms, this patch keeps syscon platform driver
> structure so that syscon can be probed and such non-DT based drivers
> can use syscon_regmap_lookup_by_pdev API and access regmap handles.
> Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
> we can completely remove platform driver of syscon, and keep only helper
> functions to get regmap handles.
>
> The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
> syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
> commit failed to remove the rest of the platform driver.
>
> Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
(Mostly for the vexpress-sysreg.c part, but hey, it's all code being removed):
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Best regards,
Liviu
> ---
> drivers/mfd/syscon.c | 66 ------------------------------------
> drivers/mfd/vexpress-sysreg.c | 1 -
> include/linux/platform_data/syscon.h | 9 -----
> 3 files changed, 76 deletions(-)
>
> diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
> index 72f20de9652da2d7bad12e4bc2c43ac0c9a97f76..bfb1f69fcff1d3cd35cf04ccd4c449e7d0395c79 100644
> --- a/drivers/mfd/syscon.c
> +++ b/drivers/mfd/syscon.c
> @@ -12,22 +12,15 @@
> #include <linux/clk.h>
> #include <linux/err.h>
> #include <linux/hwspinlock.h>
> -#include <linux/io.h>
> -#include <linux/init.h>
> #include <linux/list.h>
> #include <linux/mutex.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
> -#include <linux/of_platform.h>
> -#include <linux/platform_data/syscon.h>
> -#include <linux/platform_device.h>
> #include <linux/regmap.h>
> #include <linux/reset.h>
> #include <linux/mfd/syscon.h>
> #include <linux/slab.h>
>
> -static struct platform_driver syscon_driver;
> -
> static DEFINE_MUTEX(syscon_list_lock);
> static LIST_HEAD(syscon_list);
>
> @@ -337,62 +330,3 @@ struct regmap *syscon_regmap_lookup_by_phandle_optional(struct device_node *np,
> return regmap;
> }
> EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_phandle_optional);
> -
> -static int syscon_probe(struct platform_device *pdev)
> -{
> - struct device *dev = &pdev->dev;
> - struct syscon_platform_data *pdata = dev_get_platdata(dev);
> - struct syscon *syscon;
> - struct regmap_config syscon_config = syscon_regmap_config;
> - struct resource *res;
> - void __iomem *base;
> -
> - syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL);
> - if (!syscon)
> - return -ENOMEM;
> -
> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!res)
> - return -ENOENT;
> -
> - base = devm_ioremap(dev, res->start, resource_size(res));
> - if (!base)
> - return -ENOMEM;
> -
> - syscon_config.max_register = resource_size(res) - 4;
> - if (!syscon_config.max_register)
> - syscon_config.max_register_is_0 = true;
> -
> - if (pdata)
> - syscon_config.name = pdata->label;
> - syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config);
> - if (IS_ERR(syscon->regmap)) {
> - dev_err(dev, "regmap init failed\n");
> - return PTR_ERR(syscon->regmap);
> - }
> -
> - platform_set_drvdata(pdev, syscon);
> -
> - dev_dbg(dev, "regmap %pR registered\n", res);
> -
> - return 0;
> -}
> -
> -static const struct platform_device_id syscon_ids[] = {
> - { "syscon", },
> - { }
> -};
> -
> -static struct platform_driver syscon_driver = {
> - .driver = {
> - .name = "syscon",
> - },
> - .probe = syscon_probe,
> - .id_table = syscon_ids,
> -};
> -
> -static int __init syscon_init(void)
> -{
> - return platform_driver_register(&syscon_driver);
> -}
> -postcore_initcall(syscon_init);
> diff --git a/drivers/mfd/vexpress-sysreg.c b/drivers/mfd/vexpress-sysreg.c
> index d34d58ce46db2ad0d53b3daeabc9d3763883b39a..ef03d6cec9ff6927668d051ca459eb1d8ff7269e 100644
> --- a/drivers/mfd/vexpress-sysreg.c
> +++ b/drivers/mfd/vexpress-sysreg.c
> @@ -10,7 +10,6 @@
> #include <linux/mfd/core.h>
> #include <linux/module.h>
> #include <linux/of_platform.h>
> -#include <linux/platform_data/syscon.h>
> #include <linux/platform_device.h>
> #include <linux/slab.h>
> #include <linux/stat.h>
> diff --git a/include/linux/platform_data/syscon.h b/include/linux/platform_data/syscon.h
> deleted file mode 100644
> index 2c089dd3e2bda3baf5cef201ef43bca709e12c0b..0000000000000000000000000000000000000000
> --- a/include/linux/platform_data/syscon.h
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef PLATFORM_DATA_SYSCON_H
> -#define PLATFORM_DATA_SYSCON_H
> -
> -struct syscon_platform_data {
> - const char *label;
> -};
> -
> -#endif
>
> --
> 2.45.2
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
On 12/17/2024, Rob Herring (Arm) wrote:
> The platform driver is dead code. It is not used by DT platforms since
> commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from
> platform devices") which said:
>
> For non-DT based platforms, this patch keeps syscon platform driver
> structure so that syscon can be probed and such non-DT based drivers
> can use syscon_regmap_lookup_by_pdev API and access regmap handles.
> Once all users of "syscon_regmap_lookup_by_pdev" migrated to DT based,
> we can completely remove platform driver of syscon, and keep only helper
> functions to get regmap handles.
>
> The last user of syscon_regmap_lookup_by_pdevname() was removed in 2018.
> syscon_regmap_lookup_by_pdevname() was then removed in 2019, but that
> commit failed to remove the rest of the platform driver.
>
> Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
I verified this works on my Pixel 6. Thanks!
Tested-by: Will McVicker <willmcvicker@google.com>
Thanks,
Will
© 2016 - 2025 Red Hat, Inc.