From: Rob Herring <robh@kernel.org>
To: Linus Walleij <linus.walleij@linaro.org>,
Liviu Dudau <liviu.dudau@arm.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Sudeep Holla <sudeep.holla@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
linux-pm@vger.kernel.org, Stephen Boyd <sboyd@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Kevin Brodsky <Kevin.Brodsky@arm.com>,
Sebastian Reichel <sre@kernel.org>, Will Deacon <will@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Lee Jones <lee.jones@linaro.org>,
linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: [PATCH 14/17] bus: vexpress-config: simplify config bus probing
Date: Sun, 19 Apr 2020 12:08:07 -0500 [thread overview]
Message-ID: <20200419170810.5738-15-robh@kernel.org> (raw)
In-Reply-To: <20200419170810.5738-1-robh@kernel.org>
The vexpress-config initialization is dependent on the vexpress-syscfg
driver probing. As vexpress-config was not a driver, deferred probe
could not be used and instead initcall ordering was relied upon. This is
fragile and doesn't work for modules.
Let's move the config bus init into the vexpress-syscfg probe. This
eliminates the initcall ordering requirement and the need to create a
struct device and the "vexpress-config" class.
Cc: Liviu Dudau <liviu.dudau@arm.com>
Cc: Sudeep Holla <sudeep.holla@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
drivers/bus/vexpress-config.c | 118 ++++++----------------------------
1 file changed, 21 insertions(+), 97 deletions(-)
diff --git a/drivers/bus/vexpress-config.c b/drivers/bus/vexpress-config.c
index 43f5beac9811..43deb4df140b 100644
--- a/drivers/bus/vexpress-config.c
+++ b/drivers/bus/vexpress-config.c
@@ -56,7 +56,6 @@ struct vexpress_config_bridge {
static DEFINE_MUTEX(vexpress_config_mutex);
-static struct class *vexpress_config_class;
static u32 vexpress_config_site_master = VEXPRESS_SITE_MASTER;
@@ -121,9 +120,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)
struct regmap *regmap;
struct regmap **res;
- if (WARN_ON(dev->parent->class != vexpress_config_class))
- return ERR_PTR(-ENODEV);
-
bridge = dev_get_drvdata(dev->parent);
if (WARN_ON(!bridge))
return ERR_PTR(-EINVAL);
@@ -146,94 +142,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)
}
EXPORT_SYMBOL_GPL(devm_regmap_init_vexpress_config);
-static struct device *vexpress_config_bridge_register(struct device *parent,
- struct vexpress_config_bridge_ops *ops, void *context)
-{
- struct device *dev;
- struct vexpress_config_bridge *bridge;
-
- if (!vexpress_config_class) {
- vexpress_config_class = class_create(THIS_MODULE,
- "vexpress-config");
- if (IS_ERR(vexpress_config_class))
- return (void *)vexpress_config_class;
- }
-
- dev = device_create(vexpress_config_class, parent, 0,
- NULL, "%s.bridge", dev_name(parent));
-
- if (IS_ERR(dev))
- return dev;
-
- bridge = devm_kmalloc(dev, sizeof(*bridge), GFP_KERNEL);
- if (!bridge) {
- put_device(dev);
- device_unregister(dev);
- return ERR_PTR(-ENOMEM);
- }
- bridge->ops = ops;
- bridge->context = context;
-
- dev_set_drvdata(dev, bridge);
-
- dev_dbg(parent, "Registered bridge '%s', parent node %p\n",
- dev_name(dev), parent->of_node);
-
- return dev;
-}
-
-
-static int vexpress_config_node_match(struct device *dev, const void *data)
-{
- const struct device_node *node = data;
-
- dev_dbg(dev, "Parent node %p, looking for %p\n",
- dev->parent->of_node, node);
-
- return dev->parent->of_node == node;
-}
-
-static int vexpress_config_populate(struct device_node *node)
-{
- struct device_node *bridge;
- struct device *parent;
- int ret;
-
- bridge = of_parse_phandle(node, "arm,vexpress,config-bridge", 0);
- if (!bridge)
- return -EINVAL;
-
- parent = class_find_device(vexpress_config_class, NULL, bridge,
- vexpress_config_node_match);
- of_node_put(bridge);
- if (WARN_ON(!parent))
- return -ENODEV;
-
- ret = of_platform_populate(node, NULL, NULL, parent);
-
- put_device(parent);
-
- return ret;
-}
-
-static int __init vexpress_config_init(void)
-{
- int err = 0;
- struct device_node *node;
-
- /* Need the config devices early, before the "normal" devices... */
- for_each_compatible_node(node, NULL, "arm,vexpress,config-bus") {
- err = vexpress_config_populate(node);
- if (err) {
- of_node_put(node);
- break;
- }
- }
-
- return err;
-}
-postcore_initcall(vexpress_config_init);
-
static int vexpress_syscfg_exec(struct vexpress_syscfg_func *func,
int index, bool write, u32 *data)
{
@@ -430,7 +338,8 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)
{
struct vexpress_syscfg *syscfg;
struct resource *res;
- struct device *bridge;
+ struct vexpress_config_bridge *bridge;
+ struct device_node *node;
syscfg = devm_kzalloc(&pdev->dev, sizeof(*syscfg), GFP_KERNEL);
if (!syscfg)
@@ -443,11 +352,26 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)
if (IS_ERR(syscfg->base))
return PTR_ERR(syscfg->base);
- /* Must use dev.parent (MFD), as that's where DT phandle points at... */
- bridge = vexpress_config_bridge_register(pdev->dev.parent,
- &vexpress_syscfg_bridge_ops, syscfg);
+ bridge = devm_kmalloc(&pdev->dev, sizeof(*bridge), GFP_KERNEL);
+ if (!bridge)
+ return -ENOMEM;
+
+ bridge->ops = &vexpress_syscfg_bridge_ops;
+ bridge->context = syscfg;
+
+ dev_set_drvdata(&pdev->dev, bridge);
- return PTR_ERR_OR_ZERO(bridge);
+ for_each_compatible_node(node, NULL, "arm,vexpress,config-bus") {
+ struct device_node *bridge_np;
+
+ bridge_np = of_parse_phandle(node, "arm,vexpress,config-bridge", 0);
+ if (bridge_np != pdev->dev.parent->of_node)
+ continue;
+
+ of_platform_populate(node, NULL, NULL, &pdev->dev);
+ }
+
+ return 0;
}
static const struct platform_device_id vexpress_syscfg_id_table[] = {
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-04-19 17:12 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-19 17:07 [PATCH 00/17] Modularizing Versatile Express Rob Herring
2020-04-19 17:07 ` [PATCH 01/17] ARM: vexpress: Move vexpress_flags_set() into arch code Rob Herring
2020-04-20 15:17 ` Arnd Bergmann
2020-04-22 10:15 ` Liviu Dudau
2020-04-22 19:04 ` Sudeep Holla
2020-04-19 17:07 ` [PATCH 02/17] arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS Rob Herring
2020-04-20 15:18 ` Arnd Bergmann
2020-04-22 10:16 ` Liviu Dudau
2020-04-22 19:08 ` Sudeep Holla
2020-04-19 17:07 ` [PATCH 03/17] arm64: vexpress: Don't select CONFIG_VEXPRESS_CONFIG Rob Herring
2020-04-20 15:18 ` Arnd Bergmann
2020-04-22 19:09 ` Sudeep Holla
2020-04-19 17:07 ` [PATCH 04/17] power/reset: vexpress: Support building as a module Rob Herring
2020-04-20 15:23 ` Arnd Bergmann
2020-04-20 17:23 ` Rob Herring
2020-04-28 19:31 ` Sebastian Reichel
2020-04-22 19:11 ` Sudeep Holla
2020-04-19 17:07 ` [PATCH 05/17] clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE Rob Herring
2020-04-20 6:44 ` Linus Walleij
2020-04-22 9:47 ` Stephen Boyd
2020-04-22 22:34 ` Rob Herring
2020-04-22 19:17 ` Sudeep Holla
2020-04-19 17:07 ` [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default Rob Herring
2020-04-20 15:26 ` Arnd Bergmann
2020-04-20 17:48 ` Rob Herring
2020-04-20 20:07 ` Arnd Bergmann
2020-04-22 9:48 ` Stephen Boyd
2020-04-22 10:20 ` Liviu Dudau
2020-04-22 20:52 ` Sudeep Holla
2020-04-23 15:38 ` Rob Herring
2020-04-19 17:08 ` [PATCH 07/17] clk: vexpress-osc: Use the devres clock API variants Rob Herring
2020-04-20 15:26 ` Arnd Bergmann
2020-04-22 9:51 ` Stephen Boyd
2020-04-22 10:21 ` Liviu Dudau
2020-04-22 20:56 ` Sudeep Holla
2020-04-19 17:08 ` [PATCH 08/17] clk: vexpress-osc: Support building as a module Rob Herring
2020-04-20 15:27 ` Arnd Bergmann
2020-04-20 17:18 ` Rob Herring
2020-04-22 11:01 ` Liviu Dudau
2020-04-22 21:08 ` Sudeep Holla
2020-04-23 13:45 ` Sudeep Holla
2020-04-23 15:53 ` Rob Herring
2020-04-23 16:58 ` Sudeep Holla
2020-04-19 17:08 ` [PATCH 09/17] mfd: vexpress-sysreg: Drop selecting CONFIG_CLKSRC_MMIO Rob Herring
2020-04-20 15:29 ` Arnd Bergmann
2020-04-22 11:02 ` Liviu Dudau
2020-04-19 17:08 ` [PATCH 10/17] mfd: vexpress-sysreg: Drop unused syscon child devices Rob Herring
2020-04-20 15:30 ` Arnd Bergmann
2020-04-22 11:18 ` Liviu Dudau
2020-04-19 17:08 ` [PATCH 11/17] mfd: vexpress-sysreg: Use devres API variants Rob Herring
2020-04-20 15:31 ` Arnd Bergmann
2020-04-22 11:18 ` Liviu Dudau
2020-04-19 17:08 ` [PATCH 12/17] mfd: vexpress-sysreg: Support building as a module Rob Herring
2020-04-20 15:32 ` Arnd Bergmann
2020-04-20 17:05 ` Rob Herring
2020-04-19 17:08 ` [PATCH 13/17] bus: vexpress-config: Merge vexpress-syscfg into vexpress-config Rob Herring
2020-04-20 11:45 ` Greg Kroah-Hartman
2020-04-22 11:22 ` Liviu Dudau
2020-04-19 17:08 ` Rob Herring [this message]
2020-04-22 11:58 ` [PATCH 14/17] bus: vexpress-config: simplify config bus probing Liviu Dudau
2020-04-19 17:08 ` [PATCH 15/17] vexpress: Move site master init to vexpress-config bus Rob Herring
2020-04-22 9:51 ` Stephen Boyd
2020-04-22 12:03 ` Liviu Dudau
2020-04-23 0:54 ` Rob Herring
2020-04-19 17:08 ` [PATCH 16/17] bus: vexpress-config: Support building as module Rob Herring
2020-04-22 12:04 ` Liviu Dudau
2020-04-19 17:08 ` [PATCH 17/17] ARM: vexpress: Don't select VEXPRESS_CONFIG Rob Herring
2020-04-22 12:05 ` Liviu Dudau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200419170810.5738-15-robh@kernel.org \
--to=robh@kernel.org \
--cc=Kevin.Brodsky@arm.com \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=gregkh@linuxfoundation.org \
--cc=lee.jones@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=sboyd@kernel.org \
--cc=sre@kernel.org \
--cc=sudeep.holla@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).